« Visit to Princeton | Main | How "Opal Mehta" Got Published, Got Withdrawn, and Got Expensive »

May 01, 2006

Software as an Engineering Discipline

One of the topics that came up at Princeton last week was the gap between what students learn in college and what they do on the job at Microsoft.

I feel that Computer Science is different from other engineering disciplines in that as a Chemical Engineer, say, you would tend to look up formulas in a book more and rely directly on the training you had in your classes. In CS, you learn job skills indirectly: in an Algorithms class you may write a large program, and although you may never use those algorithms, at least you have written and debugged a large program, which is useful experience.

My boss in Engineering Excellence wrote a paper for OOPSLA 2003, titled "Things They Would Not Teach Me of in College" which discusses 5 classes that he woudl like to see offered in college. They are: Design Analysis, Embracing Diversity, Multidisciplinary Project Teaming, Large-Scale Development, and Quality Code That Lasts (if you have an ACM Portal login, you can read the paper here; I think this will work from the Microsoft corporate net). I don't necessarily agree with those five, but it's a rough approximation ("Embracing Diversity" is about writing code that can be localized without recompiling, support accessibility guidelines, etc).

Princeton does have one class, COS 333, which covers software engineering. It's good to see this, since it wasn't offered when I was there. But it's only one class, and it has a lot of ground to cover.

We were discussing this and someone looked at the list and said great, he would like to be able to teach all that too--but he wouldn't know what to teach. It's true that some of the current industry thinking on how to do design, or how to write secure software, has not withstood the long test of time. At the same time, there is definitely something there, and to not expose students to it at all seems wrong. In the end the advisory committee didn't recommend anything in this area, but it bears further thought.

Posted by AdamBa at May 1, 2006 08:55 PM

Trackback Pings

TrackBack URL for this entry:


At the risk of upsetting lots of perfectly nice and very intelligent people, I'll offer my opinion on why Computer Science is different from other engineering disciplines: because it isn't one. We have told ourselves that it is so that we can feel respectable and justify courses that result in impressive strings of letters after names, but software really has as much to do with engineering as it does with accountancy. By an accident of history (and a logical convergence of need) many of the people who've written software have perforce been engineers, but that does not make the discipline itself a branch of engineering. Software is frankly, for all that habitual suit-wearers throw their hands up in horror at anyone suggesting this, an activity that relies very largely on human creativity (although as with scupture there are realities that can't be ignored). This obviously does not apply to anything that can be satisfactorily produced by code generation, but there's no reason for anyone to be writing that sort of code anymore anyway, other than to learn how it works.

Posted by: Kevin Daly at May 1, 2006 10:37 PM

So becuase software engineering involves too much creativity and ingenuity, it's not really engineering? I don't find that to be a particularly convincing arguement. I'm sure any engineering discipline involves a fair bit of creativity. How else would unsolved problems ever be solved? By just following the defined ground rules for the displince you expect the problem to just uncreativitly solve itself?

Im not convinced.

Posted by: adamp (not b) at May 2, 2006 03:28 PM