In the January 2008 issue of CrossTalk The Journal of Defense Software Engineering, Drs. Robert B.K. Dewar and Edmond Schonberg sound the warning bell that CS education has been dumbed down in recent years. They relate that mathematics requirements in CS programs have been disappearing, programming skills are being put aside to give way to cookbook style programming, and that--by focusing on highly demanded technologies instead of fundamentals--CS programs are training easily replaceable (read: easily outsourced) professionals with skills that are insufficient for today's industry.
Some thoughts:
- My experience has been different. I was required by my CS program at George Mason University to take a formal methods and models class, a numerical methods class, computational theory classes, system architecture classes, and some fairly intense mathematics. Of course, I would not pretend that my experience is universal, or that these two men--who are directly involved in academics--don't know what they are talking about.
- Learning multiple languages should be required. I think these men are spot on with this recommendation. Many people have said learning different languages (from different language families) will improve your ability to think when working with any language. During the course of my undergraduate education I learned Scheme, Lisp, and Prolog in addition to the languages I already knew (C, C++, Java). Learning functional programming and declarative programming expanded my understanding the kinds of tools that languages can provide, which up to that point had been limited to mostly C-style imperative languages. Unfortunately, I had to take an elective (Comparative Programming Languages) to get that kind of exposure. We studied the semantics of all kinds of language features from modules to functions to parameter passing. We studied the differences in dynamic and lexical variable scoping, and on and on. That course was absolutely the most valuable course I took, and it should have been required.
- I'm not sure about the universal value of formal verification methods. I can certainly see the value in formal verification in certain circumstances. They use an example of re-engineering the United Kingdom ground-based air traffic control system. I don't think anyone would disagree that formal verification should be applied to a critical system like that, but what about non-critical systems? Just like you use different materials and techniques to build a skyscraper or a hospital than you do to build a residential home, you should also use different techniques for critical and non-critical systems. That's not to say that non-critical systems couldn't benefit from formal verification. They would certainly be more robust and error-free in that case, but it may not always be worth the cost. I think CS students should at least be exposed to the techniques (like I was), so they can make use of the tools when needed.
- Cookbook style programming happens. I think this is one place where they go astray. There is great value to the "cookbook" style of programming. Code reuse gives you high quality code in a fraction of the time. The use of libraries provides a higher level of abstraction that frees a programmer to focus on the problems that really matter to his company and clients. I agree that programmers should still have a basic understanding of the tools they use, but the fact is we have tools so we don't have to sweat the details. Tools make us more productive.
I have worked with many people who were trained in areas other than CS, and I have lamented the lack of understanding the fundamentals. However, I have also worked with people who have graduate degrees in CS and were terrible programmers, and some of the better programmers that I know do not even have a degree.
I've heard Chad Fowler talk about his book "My Job Went to India" and during the question time someone ranted about their co-workers lack of education and the lack of CS degrees. Chad pointed out that he does not have a degree in CS. Does that mean that he could never be a great programmer? My impression is that many people respect his abilities.
I tend to see software engineering and formal methods as a continuum, not a binary choice. People should be trained in them because any system no matter how large could benefit from some basic software engineering, and its growth and evolution will be limited if it is designed and implemented poorly. However, I don't believe that every software program should make use of formal verification methods.
But that's just my 2 cents.
Originally published on January 9, 2008 at 8:49 am
|