Programming and college CS education

Moving things up on the skill ladder, going to higher level skills and discarding lower level skills where “higher” means “more abstract”, doesn’t necessarily lead to a better education, but to a worse one. You should not discard lower level skills, you should value them: they are our foundation. If you can’t use a broom, don’t use a computer.

Here are a few things you may hear on your campus about CS education:

  • Since this is not a community college, we should not teach more than one OOP language.

    Yes, of course. But even community colleges probably choose either Java or C++ or C# or (gasp!) VB. I have no problem with a school teaching only rudimentary Java as long as the students really know Java. I don’t mean knowing the syntax well or the API well… I mean, being able to do non trivial programming in it. And just generally being fluent with programming: if things go wrong, know how to debug them even when a debugger can’t be used; understand how to do research on newsgroups to help you out; know how to file a proper bug report.

    Either we are saying that a student who knows Java can pick up C++ on his own easily, or else there is something fundamental different about C++. You can’t get around it: it is one or the other. So, can the students who graduate from your program learn C++ easily on their own? If not, you failed to teach them about modern class-based OO. Can they recognize the STL data structures and understand their characteristics immediately, or are they stuck trying to reinvent the wheel?

    In short, teaching only one language is fine, as long as you do it because picking up other languages will be easy for your students, not because programming in various languages is not important.

  • Now that we are using Java, there is no obvious excuse why we have tons of students who cannot program well… before, I thought I knew why!

    Part of the answer is what you value and what society values.

    University professors, generally, don’t know how to write industrial-strength software. They don’t know because they never had to do it and were never involved in real projects. So, they cannot teach it. Period. Note to self: I just made a lot ennemies.

    They have the same problem in the humanities or in business. Several managers can’t write 10 lines of English or French without filling it up with childish sentences. We don’t know about it because these people never really write anything beyond a note. Why should it matter? All they need to do is sign paperwork and attend meetings.

    So, if CS graduates are just supposed to attend meetings and sign papers, then why should they know how to program or how to write in English for that matter?

    The next logical step is… why do you need a degree at all? Oh… you need the degree for the resume… but why do you need the education that comes with the degree?

    We are back at what society values… If all that matters is to direct and manage, then fine, but I don’t think this is a safe road. It will certainly lead to a commercialization of university degrees.

    Of course, the really good students already know programming by the time they get to university, or at least, they can pick it up on their own. Others will never learn programming because it is too hard. But most students won’t learn about data structures and algorithms on their own so a university degree can really take the best students to a higher level. What to do about the students who can’t pick up programming (and in some places, it seems like very sizeable fraction)? Please don’t water down the education for their sake. Help them the best you can and then, let them sink.

13 thoughts on “Programming and college CS education”

  1. Universities shouldn’t teach any programming language; they should teach programming, with the language being just a means to that end. College is not the place to learn the special tricks and ins-and-outs of Java. It’s the place to learn algorithms. It’s a computer science degree after all.

    I run into far too many people in the workplace who can tell you all about the most minute details of J2EE, yet don’t really know what object oriented programming is all about, how to deal with probabilities, and how to think about hard computational problems.

  2. Many CS students learn basic algorithms, and some languages (C/Java/LISP…). But if they don’t know API, they can’t even make a simple Window software.

  3. No, college is not the place to learn the special tricks of Java. Beside, your instructors or professors don’t know them all that well. The overwhelming majority of professors don’t know the ins and the outs of J2EE.

    Teaching “programming” is fine, what does it mean at the college level? To me, it means being able to do some pretty hard stuff like implementing those nifty algorithms you see in class and applying them to real problems and real data. What about the API? Well, this is part of the skills you need to have: you should know enough about Computer Science to be able to read and understand APIs quickly.

    Alas, we push things up and say that programming altogether is not important. Afterall, plenty of smart Indian programmers work for cheap. No, instead, we’ll focus on the business process and let the Indian guy do the coding. Well, that is fine but, to me, it is like saying that English is not important in business or in the humanities. If you have the ideas, other people will write them down for you. Sure they will, but writting is part of the thought process. Coding is part of the software design process. If you can’t code, you can’t design software.

    But, just to make sure, this doesn’t mean you should know about the APIs, you should merely be able to learn about them on your own, quickly. You shouldn’t know what the generics are in Java… who gives a damn, but you should be able to figure it out on your own quickly.

  4. Hello,

    The best place to know the programming languages tricks is on the Internet, no doubts, it’s his best utility.

    However, Daniel is right when he say that CS degree is not the place to teach programming trick (language oriented). However, the CS degree should learn how to find the things you know you need but do not know how to implement it. It is how some to see how students are unable to search things; they do not know how-to or they just do not want to.

    Put semester projects in your courses that involve programming. Do not specify the language: just tell them to do in C++, Java or C#. A cryptography course? Let them program a whole (but simplified) bank system thank will take them 30 or 40 hours in the semester to do. It will teach them how to implement a RSA algorithm, other hash functions and symmetric encryption algorithms. Then they will learn on cryptography while increasing their programming skills.

    They, we, anybody do not need to know an API in deep. We just need to know how to search for what we want to do. How someone could know the whole .NET framework without referring to the doc? Impossible, even the .NET developers do not know it.

    Salutations,

    Fred

  5. “So, if CS graduates are just suppose to attend meetings and sign papers, […]”

    Oh God, why take the fun out of CS? 😉

    “Universities shouldn’t teach any programming language; they should teach programming, with the language being just a means to that end.”

    Can we agree that professors should know the language well enough then? The most irritating thing is to see a professors trying to guess how do do such and such in a language during class time.

    Also, I think al lot of universities do only teach programming using one language. The part they need to emphasize/encourage is the “learning more than one language” part. I’m not saying that they should start teaching perl, python, etc. I’m saying that they need to stop acting that C++ and/or Java are the only languages out there.

  6. d: Professors don’t know the languages well, and they never will because that’s not part of their job description to be good programmers. At no point is the skill “good programmer” rewarded in a professor’s life.

    As for why they make it seem like there is only one language… well, if you teach Java, and the students, after 3 years of taking courses with Java in them, still can’t program an elementary algorithm in Java, you can bet that the instructor/professor won’t go out of his way to teach other languages.

    All in all though, I agree, the programming training students get is poor in general. Not necessarily the professors’ fault, but it is poor… and I’m saying that it does matter. It is not sufficient to know about UML, database schemas and business processes. You need to know how to program, just like a manager should be able to write in English.

  7. Anyone wanting to undertake undergraduate studies with an aim to becoming a professional software developer should be taking a degree in software engineering, not computer science. Getting someone with a CS degree to write production code is like asking a physicist to build a bridge.

    Similarly, trying to cram professional software development knowledge into a CS degree dilutes the CS degree, preventing it from accomplishing its true goals (which have nothing to do with developing production software).

    My guess is that it will take another 50+ years for universities to figure this out. In the meantime, organization will continue to foot the bill (in time, money, and low productivity) for the training required to teach newly-minted CS hires how to develop production software.

  8. Software development is where most of the jobs are, and most students are going to university to land a job, so CS departments want to offer it to keep the students coming, even if it means compromising on the science part.

Leave a Reply

Your email address will not be published. Required fields are marked *