thraxil.org:

What's wrong with the standard undergraduate computer science curriculum

by anders pearson Sun 03 Oct 2004 23:46:46

Link: http://philip.greenspun.com/teaching/undergrad-cs

TAGS: education computer science

comments

this essay is frighteningly accurate. at work, we hire lots of CS masters students as part-timers (being at a university, we're pretty much tripping over them). these are bright kids. most of them graduated at the tops of their undergraduate CS classes. they are, almost without exception, totally unprepared for actual, real world programming. they usually only know the languages that their coursework was in (mostly Java these days). they write the most hideous code without any hint of style or readability (but always with a million useless comments (someone needs to go around strangling all the CS professors who insist that code be heavily commented)). they can write code but have no idea how to design or architect it. they are unfamiliar with basic software engineering techniques and tools like version control and unit testing. robustness and error handling aren't in the picture at all. they couldn't debug their way out of a paper bag. i've met high school students that could code circles around them. as Phil Greenspun points out, it's not that they're not smart. they've just spent the last 4 years or so in an institution that seems geared more towards creating CS masters students than towards creating programmers. of course, a friend points out that masters programs are the real cash cows of universities so maybe it's not such an accident... my experience with undergrad CS classes certainly backs up the essay. there were only about three CS classes that i remember taking that involved any semblance of real world programming. Software Engineering involved working on a team to develop some software for an actual client (in our case, a search engine for "guitarnotes.com":http://www.guitarnotes.com/). Operating Systems involved modifying the linux kernel, which was the first time i was ever really exposed to a *large* codebase and had to make sense of it. it also involved team projects. finally Microprocessor Lab culminated in a team project to come up with, design and build our own device out of a Z-80 processor. we had to present our designs, develop schedules, and we had a final demo day where it was made clear that nothing could go wrong. the professor even promised (or threatened) to grade based on the coolness of our projects (our team built a "digital theremin":those three classes all had in common: working on teams and on projects that were larger than and more open ended than traditional problem sets. none of the other classes i took were any preparation for the real world. aside from those classes (which probably wouldn't have been enough on their own), i think i came out better prepared than most for CS students for a couple reasons. first, instead of Computer Science, i was a Computer Engineering student. that at least exposed me to the engineering mindset. second, i was poor. that meant that i had to get jobs to support myself. that meant i was exposed to real world programming early on. if i'd had rich parents and didn't have to spend my summers and vacations working, i'd probably have come out as helpless as the rest.
sorry. the digital theremin link should be: http://thraxil.org/e3940/project.html
I complain about this all the time; especially when dealing with interns. They have absolutely no grasp of basic software engineering concepts, instead they spend most of their time learning language specific things that don't translate well when you need to use a language you've never seen before. You can't blame the students because, for the most part, they have no idea what they're supposed to learn. Most of the blame has to fall on the faculty's shoulders for implementing courses that have little bearing on real world application. Whenever I talk to students about what they need to get out of school, I'm forever stressing software engineering and communication skills. Invariably I get the "you've got three heads" look and have to spend way too much time explaining how nobody really cares how well you can program in Java; they care about not only how well you can solve problems (especially in a team environment), but also how well you express yourself (which is readily apparent during your interview).
yeah, the only thing I take issue with is his complaint about moving the schedule around. As Anders points out, summers are good times for jobs/internships--not just yacht vacationing. If it weren't for these jobs/internships then students would never get exposed to a 'real-world' environment until after school. No matter how much CS depts are reformed, this exposure in essential--because curriculums will always be behind in one way or another. I like his idea of setting up places to study/work together on projects.
The only reason why I have a software engineering career is because I worked jobs developing software. I have no degree, and even if I got a degree it was going to be Electrical Engineering. Most of the people I work with either don't have degrees or their degree's are non-technical. You'd be amazed at how many English majors I work with. There are, in fact, a couple CS majors that come in every once in a while ... fresh out of college. They invariably fail because they are completely unprepared for this. I believe software engineering should be taught at a technical college with a technical and job-oriented mindset which will prepare people for the reality of a software engineering job. I also Computer Science should be a seperate degree taught at universities which pretty much models what the current curriculums are ... a lot of theory but not a lot of practical application. I see the need for seperate degrees here. The engineer is practical application, the scientist is theory. Neither is better than the other but right now the industry wants engineers not scientists.
in my experience, the number of programmers i've met who have abysmal software engineering skills is far greater than those who write well engineered code. this is not only true of people coming fresh out of college (with their shiny degrees), but also of the people who have been working in industry doing actual 'real world' programming for 20 or 30 years. i think, in general, technical colleges are second-rate and welcome software engineering curricula in universities; they'll invariably get more qualified people to teach the material. i think the majority of the problem stem's from people's thinking that code is 'written' and not 'engineered'. taking the time to hash out a complete design that can be scrutinized and revised before code is written not only makes the code easier to write in the first place, but, if done with extensability in mind, can ease servicing the code later. as far as industry is concerned, there isn't a terrible focus on software engineering because it's a lot of up front cost for return down the road and, especially when dealing with wall street, that's not always acceptable. so, anyway, i think the 'engineer' you refer to is really more of a 'programmer' (someone who knows how to write code well). while a 'programmer' is much more suited to working in industry than a 'scientist' (theory based individual), 'engineers' should be the hiring standard; and few if any 'programmers' will become 'engineers' without sufficient exposure to 'good' software engineering techniques either in a classroom setting (probably best) or based on requirements in their job (the DoD has strict software engineering guidelines). the problem with the latter is, many times the developer is coding within those guidelines simply because those are the rules, without a clear understanding of why things are the way they are; which is why i say the classroom route is probably best. anyway, i'm busy so i'm going to stop typing now...

formatting is with Textile syntax. Comments are not displayed until they are approved by a moderator. Moderators will not approve unless the comment contributes value to the discussion.

namerequired
emailrequired
url
remember info?