Software Engineers vs. Computer Programmer
I think a key issue here is that the definition of Computer Science has become somewhat fuzzy. There are now a number of different aspects of computing that one could choose to focus on, and each has its own unique elements. I think this professor is talking primarily about Software Engineering, which is in fact somewhat different than what I think a "pure" computer scientist tends to focus on. For example, a computer scientist might be interested in computational theory, which is concerned with the fundamental capabilities of computing machines, or complexity theory, which involves determining how computationally difficult a problem is to solve.
A software engineer, on the other hand, is more interested in the practice of creating software systems using a set of realized computing machines. Software engineers take advantage of the body of theory developed by the computer scientists in order to do their job.
What this professor is saying is that rather than turning out competent software engineers, we are turning out marginally skilled computer programmers.
A software engineer must be a computer programmer and a whole lot more. The word "engineer" in the job title says it all - they must not just understand how to write software, they must understand the system that underlies it, including the logical organization of the hardware. A good engineer also understands design issues such as risk assessment, how to make tradeoff decisions, consider performance and scalability, generality, etc. They must also be quantitatively oriented and have a good mathematical grounding in combinatorics and statistics. In other words, they must have many of the same basic skills as an electrical or chemical or civil engineer. And oh yes, they should be able to communicate effectively (a skill that is sorely lacking).
Is this problem limited to recent CS program grads. I think not. I recently had a programmer with many years of experience that I let go because he couldn't think beyond cobbling code together. On the other hand, I have a young CS grad who thinks and acts like an engineer and has been a terrific addition to our team. So obviously not all CS grads are poorly educated - I think a lot of the courses are there if they want to take them.
One thing I think every CS program should insist on is taking several courses in machine language, compiler design, and perhaps even logic design. Many programmers are completely lost when their code crashes - they have no clue what the underlying problem really is, and are poorly equipped to troubleshoot it.
Perhaps part of the problem is the splintering of the CS curriculum. It seems that most schools now offer different "tracks" - you can focus on IT, for example, which is a very high-level system view that eschews many of the details of hardware and software systems, or you can go the more intense software engineering route. However, the IT students I have talked to can seldom describe what Internet Protocol is, for example, or how it is different from Transmission Control Protocol or User Datagram Protocol. How can you hope to troubleshoot networking problems if you don't understand how the fundamental underlying protocols work???
This dispersion of the students into different strata is watering down the requirements and letting many skate by with only superficial skills.
Just my opinion. But don't get me started.
|