Sign In/My Account | View Cart  

advertisement

AddThis Social Bookmark Button

Weblog:   What would you put in a Computer Science Curriculum?
Subject:   The science versus the program
Date:   2005-09-11 10:27:22
From:   VincentWinterstrom
Dan, you’re taking on an important and difficult topic. It’s good to note that just because CS cirricula are manifested in their current form, it doesn’t mean that this is “the natural order” that should never be disturbed.


Perhaps I should state my biases first: I have a BS in Computer Science and an MS in Mathematics. Thus, I’m likely (rightly or wrongly) to be in favor of “theoretical subjects”. One assumption I’ll be making is that (budding) software developers are generally intelligent people, so when I say something such as “concept X is easy to understand”, the reader should take it to be a statement about the abilities of individuals in the above-mentioned group, and not a statement about my own oh so clever self.


I’ll first consider the points with which I agree, followed by my opinions on those points that I disagree with.


The writing skills of most software developers are atrocious (myself generally included). There is certainly a necessity for a course that teaches good writing skills and for one or two courses in the Commercial Sciences.


Furthermore some abstract but important software development concepts are generally ignored in CS cirricula, such as basics of software architecture (i.e. loose coupling, OO Design etc.). However, is it really necessary to spend much time learning about particular architectures, such as P2P? These concepts are quite simple and take little time to grasp.


Although some skills such as debugging, performance testing etc. are very concrete, they are quite essential for any CS student, since most of us ultimately want to translate our ideas into computer programs. Thus, it would be good to have a continuous (i.e. over 2-4 years) low load subject dedicated to these issues.


Some skills such as planning, UML etc. are a good idea, but perhaps students should be expected to learn these skills in a (industry recognized) post-graduate diploma course, since they are quite concrete. Project management, time management and programming methodologies should also be left to specialized diplomas, since the theory of these fields change relatively frequently.


There are a couple of skills that I feel are best left to experts in other fields–we should be aware of the issues pertaining to their fields, but we should realize that these fields are specialized and beyond the scope of CS. I consider UI design and security to fall into this category. I’ve seen people scoffing at UI design, insinuating that anyone can do it, but the sheer amount of bad UI design that is prevalent in Windows and Unix (except MacOS X) worlds tells another story. Security should be designed into a system from the start and it will always be difficult for developers to produce secure code for insecure systems.


My single greatest gripe is that some of the skills you list are either relatively minor (such as touch typing; I was a full touch typist after my 3rd year in my CS degree), or relatively easy to learn.


For example, the details of TCP or HTTP are not hard if the principles of layered protocols are understood (which itself is hardly rocket science, especially since layered abstractions permeate CS theory); should it really be expected of a student to learn the details of the protocols, considering how fleeting such knowledge is with the synaptic attentuation of our overstimulated brains? My opinion is that It’s quickly acquired if needed. I believe the same about database technology, XML, Internationalisation etc.


I’ve always had a gripe with the hype surrounding languages. A good software developer should be able to acquire knowledge of a new language with little effort. Perhaps it would be better to expose students to all the programming models–i.e. OO, functional, logic etc. programming. I think the value of hiring an experienced, say, Java programmer has less to do with his knowledge of Java (which is a pretty simple language), than with his knowledge of the truly massive library and the “ways of doing” in Java. With a system such as .Net, it will probably become very apparent that the langauge matters less than managers think, since .Net libraries can be accessed from any .Net langauge.


Finally, as a little (flame inspiring) nitpick that probably won’t contribute at all to my other opinions, I don’t want law mixing with CS. Nothing illustrates this better than the EU legislation regarding the patentability of software methods. Many lawyers imagine this to be a good thing, which is completely at odds with the way most software developers see it. The same is true of many other so-called “IP” laws.


As my closing statement I’ll say that many of the skills you list are undoubtably important in the working place. However, I don’t consider most of them to be fun or interesting, and certainly not mind expanding as some most “theoretical” CS subjects can be. I suspect many others feel as I do. Software development should be fun. I believe that the tendency to substitute “development” in “software development” for “engineering” is a sign that the fun is being squeezed out and that overbearing processes and “real world” concepts are making their way into our lives.
My desire is that we should always endaevour to remove as much “process” and as many “commercial concerns” as possible without forgetting that we work in environments which are business orientated. Sure, the business people are the ones with control over our paychecks, but no good software can arise in an enviroment laced with such threats and with distractions such as useless meetings, senseless project management spreadsheets that must be kept up to date etc.


So, I would like to see CS degrees remain theoretical and (what I consider to be) mind expanding.