Filed under: Developer
Dev Chair : Do we want scientists or engineers?
Good computer science graduates do not make good software developers. Really, I mean it. But for the polar opposite reason that these two New York University computer science professors think.When I was in high school my physics teacher once told us, "All physics experiments work. They just may not work the way you want them to."
This encapsulates neatly what software development is all about. On one hand, it is science. It is deterministic. Each programming language statement performs exactly as stated (baring bugs in the compiler, or the SDK, or the OS). On the other hand, software development is closer to engineering where years of experience allows a software developer to spot patterns in the model and apply them to build a system.
Unfortunately, just as in physics, computer science courses do not prepare students for what comes after graduation. Skills that are considered crucial in almost all commercial software projects are either not taught in college or are only touched upon. This disparity between the skills graduates possess and what the industry is looking for means it generally takes one to two years of working in real life project for a graduate to become fully trained.
Where do students learn about project management, requirement gathering, testing, builds & deployment? Or soft skills such as how to interact with customers and clients? Do colleges expect students to acquire these skills by themselves on the side? How would the students know they are picking up the 'right' skills, and not just acquiring bad habits?
Look at it from another angle. How useful is it for students to know how to design and program an OS kernel? Or to know object oriented programming in C++, verses a 'modern' languages such as Java, C#, Ruby, or even VB.NET? How many OS programmers do we need compared with the number of regular commercial software application programmers? Unless the products are a new OS or a new programming language, I would rather have engineers who build applications on my team than computer scientists who theorize and argue the merits of a design pattern.
One explanation given by colleges is that they are not there to dictate what type of role a graduate would/should take in the industry and therefore they are there to teach the fundamentals so the graduates will have the basic skills to further specialize. One may wish to be a developer while another may wish to be a tester, but personally I feel it is more of an excuse than an explanation.
Yes, the industry changes rapidly. Tools or techniques fashionable a last yeara are replaced by something new and shiny this year. Does it not sound oxymoronic to anyone that a computer science department is unable to react to these changes like the industry? Why bother teaching students how powerful and wonderful computers are and how they can improve our lives when the very people teaching these concepts are not keeping pace with the industry?
If computer science departments are not willing to prepare students for real life jobs, perhaps another department (Electrical Engineering for example) or a completely new one should take over that role? After all, you wouldn't want a scientist to build a bridge now, would you?
Get a WordPress.com Blog
With Halloween fast approaching, it's a great time to get in some practice defending your territory against zombies. In Graveyard Shift, you take aim at zombies and other creepy-crawlies, blasting them into splatters of cartoony green guts. It's a casual first-person shooter, and it's very easy to get the hang of - use the mouse to aim, click to fire. Graveyard Shift has at least 15 levels, and it might even have some secret stages I haven't unlocked yet.
They key to getting good at Graveyard Shift is learning to use ...

Reader Comments (Page 1 of 1)
Freddy said 10:41PM on 3-09-2008
There is one major assumption in the article which is controversial: "University programs should train people that the industry needs."
While many departments in the university do not design their programs to prepare a student for the work place (examples: Philosophy, Art, Physics, etc, etc), I am asking the author to explain why Computer Science should be different.
Reply
Alex Hung said 11:00PM on 3-09-2008
Freddy, the difference is that the subjects you mentioned are arts or science which as you said do not prepare students for the workplace. My contention is that computer science is more on the engineering side than science and thus should have more workplace relevant courses.
Reply
Nathan said 10:36AM on 1-10-2008
Actually, I think the professors are just about spot on. The one thing I disagree with them about is that they, like you, talk about the skill set taught in CS curricula, by which I understand them to mean the languages or tools covered. I consider that to be of minor importance.
For a career in software engineering, your starting skill set is almost worthless in the long run. The primary language you use in school is likely to be different from the language you use in your first job, which is likely to be different from the language you use in your second job. The same goes for tools, and even development techniques evolve quickly.
The most important thing a programming-centric CS education does is _separate_ those who can deal mentally with the kind of complexity and abstractions that engineering involves from those who can't, and hone the ability to think in the necessary ways. This is one reason to teach C/C++ or a Lisp derivative like Scheme. If you think learning to program little programs in those languages is hard, you're in for a hard life as an engineer.
Second to that, it should provide an understanding of how computers work. This should include a course in operating systems. Have I ever written a single line of production code for any operating system? No. Has knowledge of how operating systems handle resource management (memory, disks, etc.) been useful? Very much so.
There are several knowledge domains where if you have a basic understanding, it's very easy to extend your knowledge using books/google, etc., but more difficult if you start on your own from zero. Operating Systems, Networking, and Programming are all such domains, among others, so a CS education should give an introduction to these areas.
Reply
Alex Hung said 10:24AM on 1-10-2008
I agree with you on the languages and tools point. At ThoughtWorks, we always look for the potential in the graduate candidates rather than focus on their existing experience. My concern is more on the process side of the skill set, project management, requirement gathering, etc. as I mentioned in the post. A graduate that possesses these skills is easily 6 months ahead of one that don't in terms of career path.
Dustin said 10:25AM on 1-10-2008
Good article.
The biggest problem I see is that students coming are out are two main types.
1) Most "code monekys" (They know what they were taught and thats about it) They are almost robotic in programming.
2) Code Engineers (What I consider myself and most important in our industry.) We can develope on any platform, any langauage, and our real job is "Problem Solver." Whether its our products problem, customer, whomever.
3) Scientists (Who tend to be older gentleman from the past who won't come into the present day.) Though there are those coming out of school too, who think they know everything and its their way or bust.
I prefer a team of #2s all day long.
Reply
Shawn said 10:59AM on 1-10-2008
I agree to a point. The University should teach the Comp. Sci. students (and all other students) how to think, analyze, etc. Concentrate less on which language (as long as it is marketable) because tools will change rapidly.
I'm contracting at a university now and we have seniors working as interns who can't write a simple test case and don't know enough about OOP concepts to understand JavaScript. How are these graduates going to add any value to their employer? 2 year tech. schools do a much better job of giving their students skills for the "real world" of software development. The university needs to provide graduates who bring more to the table than tech. school graduates... they need to provide skills and reasoning.
Universities should concentrate on teaching these kids how to think about their tasks/programs and then how to solve the task using marketable technologies/skills.
Reply
James said 11:46AM on 1-10-2008
Speaking as a Computer Engineering undergrad with a master's in CS, I would say that there's still merit in CS departments still focus on C++ and OS development. There are probably bad reasons for doing so (because the CS department is full of Linux geeks more interested in "beautiful software" than delivering what a customer wants), but there are good reasons too. C++ strikes a pretty good balance between high-level abstractions and low-level hardware interfacing, and building your own OS forces you to learn how an OS works, which is important to understanding the non-code parts of good software design.
It's like the difference between academic study of a natural language to understand its grammatical constructs and the history of its development, and learning a language in a month from a couple lessons on CDs. Sure, in both cases you may be able to speak well enough for a native to understand you, but in the former you gain more appreciation of *why* the language is the way it is, while in the latter you learn just the way it's *used* today. Both approaches have pluses and minuses.
Of course, none of this addresses dealing with business practices and customers, but that sort of thing is hard to address in a classroom environment for *any* profession -- you could be training as a graphic designer or a journalist and your classes are still unlikely to teach you what you need to know about the business aspects of the job you'll wind up with after graduation. That's why I think everybody should do an internship or co-operative experience during their school career. I did, and it helped me get perspective as to what was most important with my school lessons. I just don't see any way for *any* class to show students what it's really like "out there".
Reply
Wes said 11:58AM on 1-10-2008
Shawn's comment about the readiness of students out of a 2 year tech school versus a traditional 4 year college education is an age old comparison. On the surface, it appears that a student out of 2 year tech school is more prepared, as they learned specific skills that the school expects will be marketable. The job of that 2 year school is to train a student to get a job. So they learn C#/Java, the fundamentals of requirements gathering, design, testing, etc. But, they learn it superficially so that they can land their first "tech job" and get that "big raise" that is promised on TV.
The 4 year college lays the foundation with theory, critical thinking and problem solving.
I agree with Nathan in that having a solid CS background is important. But, my experiences have shown, as have others that I've talked to, that employers seem to prefer EE/ECE over CS. My guess is that engineering disciplines do a better job at teaching students how to solve problems (in general) over CS and they feel the actual technology skillset can be learned (since it changes so rapidly).
Having said that, and considering myself as a #2 (according to Dustin) with my undergrad in ECE and masters in EE, I find myself at a disadvantage at times against my CS coworkers. They have a much deeper understanding of many concepts that I was never exposed to, such as database theory, algorithm efficiency, etc. They have a much deeper understanding of how computers work and how software can be optimized.
To Alex's point that graduates who have some familiarity with the software development lifecycle have an advantage...I agree. But, I don't see how that relates to the CS versus engineering argument. If a CS student doesn't take a class on the software development lifecycle, you better believe traditional engineering disciplines won't either.
In the end, I would agree that I would rather be on a team of engineers than pure CS, as I feel the details and topics that we aren't exposed to are concepts more easily learned through books than the "engineering thought process" that a CS person might have to acquire.
Reply
Josh said 1:40PM on 1-10-2008
The University of Michigan has a Computer Science Engineering degree in addition to the traditional computer science degree.
The engineering degree focuses more on developing skills like project management, design patterns, and reasoning and logic skills. It replaces liberal arts areas with several additional semesters of calculus, physics, and advanced abstract math. It also has project management classes, and requires electives to be in other fields of engineering.
Reply
James said 2:43PM on 1-10-2008
Complaining that computer science students are not ready to be software engineers is like complaining that a physics graduate cannot build a bridge.
Maybe the problem is that too many people take CS when they should be doing something more vocational.
Reply
Man said 5:32PM on 1-11-2008
Taking those Civil Engineering classes in my college I can understand everything about steel, concrete, and bridges from building to failure.
None of which were used during the time working for companies. You write more on Word, Excel, Access, AutoCAD, and speak on phones then actually work. This is why so many interns are needed because the actual engineers/scientist can't do this stuff.
Internship should be a part of the curriculum in every science program.
Reply
Samar said 4:44AM on 1-13-2008
I believe you're right in that other departments are trying to provide the experience computer science majors are not receiving to cope with the demands of a industrial project as opposed to a class project.
At the cooper union, Electrical Engineers who choose to follow the Computer Engineering track are given more advice in proper coding standards, file organization, and other aspects.
Also I believe that the longer the professors have been teaching, the longer they've been out of touch with the industry's break-neck pace, and the more antiquated their methods are. In this field, as opposed to slower moving ones such as plant biology or entomology, it is up to the department to continuously re-evaluate the content of their curriculum to better prepare their students.
Reply
Alex Hung said 9:44PM on 1-17-2008
Oren Eini explains my points much more elegantly. http://www.ayende.com/Blog/archive/2008/01/12/Academia-in-Real-World-Development.aspx
Reply