The poster-child for what’s wrong with postsecondary education is the computer science program. Despite the enormous need for competent programmers, database administrators, systems administrators, IT specialists and a host of other technical professionals, computer science programs seem to explicitly ignore the professional skills of which western society has growing deficiency and proceed with materials and teaching styles that are outdated, ineffective, useless and just plain wrong. This is due to the absurd misconceptions held by computer science faculty members across many universities.
I have personally met computer science professors who believe each of the following things. I make no claims as to how widespread these beliefs are; you can judge that for yourself.
1. Java is a good first teaching language
I don’t know how many computer science programs start teaching programming using Java, but there are more than a few, and that’s too many. When you’re going over variables, loops and conditionals, the object-oriented overhead of a language like java is unnecessary and confusing. Inquisitive students can’t just memorize things (i.e. public static void main (String args[])) without demanding to know what it means and why it’s there.
2. Machine language is “basic”
Comp Sci people seem to be terribly confused about what ‘basic’ means. When one learns to drive a car, starting the car, making a right turn, a left turn, parking, etc. is basic. Building a parallel gas-electric hybrid engine is not basic. Driving a car is more basic than building one because the latter requires significantly more expert knowledge than the former. In the same way, using a simple scripting language requires less depth of understanding that writing in machine language; therefore, computer science education should start with higher level languages and proceed to lower level ones, not vice versa.
3. You should write code on paper before you write it on a computer
Writing code by hand is stupid. It is entirely inconsistent with the interactive and iterative design process that comes naturally to hackers and painters alike. Professional software developers make extensive use of API documentation, reference guides, forum discussions, etc. to make troubleshoot problems and make their code more efficient and effective. Writing code by hand tests your ability to write trivially simple software without making errors. Real programmers must be capable of making complex software and detecting their errors with a variety of automated tools. Teaching or testing coding using pencil and paper is inconsistent with both the natural mode of human action and the practical realities of software development.
4. Lectures are an effective method of teaching programming
Programming is like algebra. You can’t learn how to write code by watching someone write code on a blackboard or listening to elaborate explanations from professors. You can’t learn math from watching someone do math. You learn to do things by doing them.
5. Algorithm design is learned by reading existing algorithms
Designing algorithms is about finding innovative solutions to difficult problems. Algorithm design courses are about studying existing solutions to rather simple problems. Learning how a particular problem can be solves provides approximately zero insight into how to solve problems you’ve never encountered before.
6. You can just ‘pick up’ prolog in a week for a course
There’s this crazy belief among Comp Sci. faculty that all languages are basically the same, so after learning the principles behind languages you can use whatever. This is bullshit. This is like claiming that since someone studied Spannish grammar in grade school, they can speak Spanish fluently, in any of Spanish, Mexican or Columbian accents. The leap between structured and object-oriented programming is huge, and it pales in comparison to the leap between object-oriented languages and declarative languages.
7. Exams measure understanding of programming
Teams of professional programmers spends months and years building intricate software systems in response to poorly-understood, ill-defined and changing problems. To accomplish this, they employ API documentation, online tutorials and forum discussions, team problem-solving sessions, reference books and an infinite number of phone-a-friend lifelines. Exams test your ability to write simple code to solve a trivial, well-defined static problems, without consulting and references. One is about resourcefulness, the other about memory. Exams test the wrong thing.
8. GUI’s are not an important aspect of learning to code
At the university where I did my undergrad, it was easy to finish a B.Sc. in computer science without ever building a graphical interface. While I agree that many software projects do not have graphical components (e.g., developer APIs), to marginalize GUIs as some kind of specialty endeavor is short-bus crazy!
9. Programming Requires Calculus
I have been told that development involving sophisticated work with graphics and animation involves calculus. Outside of this particular subfield, however, I haven’t seen much calculus in software development. Certainly I’ve seen a lot more GUI development than graphics.
10. Linux will rapidly overtake Windows among consumers
Comp. Sci. profs have been saying this for years. Hasn’t happened. And it’s not going to happen until Ubuntu and company take the dicking around out of computing the way Apple has.
11. LaTeX will overtake WYSIWYG text editors because LaTeX gives you more control
Yes, believe it or not, a computer science prof said this during one of my classes in undergrad. It goes directly to a deeper misunderstanding among Comp. Sci. academics that power and control are the primary factors driving adoption. They’re not. Simplicity and ease of use are far more important.
12. You can buy gates at RadioShack
The same idiot who thought LaTeX was the future also told his class to go buy gates (the things transistors are made of) at RadioShack and play with them to see how they work. Again, this evidences how completely out of touch some of these people are. Gates are microscopic. You can’t go buy them at an electronics store.
Conclusion
I have long argued that society needs a professional certification for software developers and that universities need undergraduate programs dedicated to training people for these certifications. It’s worked for accounting, engineering and medicine. There’s no reason it can’t work for software development. One of the primary barriers to this sort of progress is the raging incompetence of academics in computer science, computer engineering, management information systems and related disciplines.
Have one or a few to add? Comment away.
Related Posts
Why on Earth do Business Schools Teach Microsoft Access?
Abolish Universities?
Nine Reasons why Bad Grades Don’t Mean Squat
| Comments | Published in | PREV | NEXT |
|---|---|---|---|
| 56 |
education list |
I tend to agree with Brendan. Java’s not a bad first language (although Python would be better IMHO). It teaches your at a reasonably high level about object oriented programming without so many of the opportunities to shoot yourself in the foot as C++ provides.
@Izkata: Why on earth would you want to waste time re-writing code which other people have already written for you? Do you implement string handling routines each time you write any software or do you use the STL? If CS degrees teach you one thing; that it’s okay to make use of other people’s hard work to help you solve really interesting problems then why waste time on the little things?
Odds are, they are not available at most radio shack stores, any more. disappointing, because they are easier to find than dedicated electronic component retailers.
You can still purchase a FET at radioshack and make a logic gate. The OP didn’t know what he was talking about. Yes, there are cheaper places. No, the prof’s advice didn’t make a lot of sense because configuring a logic gate at the transistor level relies on electronics experience that most CS guys don’t have.
Mostly a reasonable position.
I take exception to 8,9 and 12 though….
8 GUI’s not important to learning to code.
They are not important.
Just like parsing is not important to learning to code.
And algorithms are not important to coding.
Knowing how to properly write a novel is not important to learning
how to write.
Algorithm’s are important tools. GUI’s are important tools.
Neither of them is coding.
Coding and design are separate but inter-related. I can design
algorithms without knowing anything about coding. Coding is the
process of converting the algorithm’s into executable form.
9) Programming needs Calculus.
Animations/graphics are not the only fields that need calculus.
Advanced financial analysis, datamining, engineering, physics,
advanced chemistry, protein folding all require calculus at
some level. Some more than others.
12 Gates at Radio Shack: Yes you can buy gates, those are the 7400 series devices that have 4 nand gates (or other things like DFF’s) in a 14 pin package. Though it is getting harder to find in many of the Radio Shacks as they cater less to the hobbyist. You can even buy experimentors borads and some simple “toy” learning kits. You can not actually see the gates but you can play with them and learn about them.
Skip anything you like son, the real world will soon kick that 13 year old emo-fag attitude out of you. As smart as you think you are, it counts for nothing. The world is full of failed geniuses. I strongly suspect that companies turn you down because you’re an insufferable, immature little drama queen. Don’t feel bad, though, you will mature with time.
While i do agree with most of what you wrote, i have certain quibbles with some of them.
1. I agree, Java is difficult to learn at first but it’s biggest advantage compared to many other languages is it has a very very well documented API. If you need anything, you can just look it up there. I cannot say the same for C even if. Also, most of the things you need are already provided like parsing libraries or linked list libraries which isn’t provided with C.
3. While writing on paper may seem stupid, it does help to organize your thoughts. You don’t have to write perfectly correct code. It helps you see the logic flow. I write pseudocode on paper so i could see the flow. Then when I’ve got it down, i’ll write the proper code. This also useful when you’re in a team. If other people see the way your code works with the psuedocode, it will be easy for them to read your code and improve on it. That’s why there are whiteboards everywhere in Software Engineering companies.=D It reduces cost because when you’ve sorted the kinks out on paper first, you don’t have to redo everything if something happens.=D
4. Lectures are needed. They teach you the programming concepts that you need to know. If you need actual programming lessons, internet tutorials are better. But again, they won’t teach you new algorithms.
5. There aren’t really new algorithms. “New” algorithms are actually mashups of different existing algorithms. Unfortunately, most of them involves problems you’ve never seen before so it is unavoidable that you will have to learn an algorithm which solves a problem you think is stupid.
6. You don’t need to pick it up immediately. Short “prolog” courses are there to get you started. Also, if two different programming languages follow more-or-less the same paradigm, it’s easy to switch in between, like C or Java
9. Amazingly enough, I’ve seen a lot of math in programming. It’s just not as obvious as you’d think.
All in all, i think you’re mixing up computer science and programming. Big difference. Programming’s the tool. Computer science is the knowledge needed to use it.