I have a major problem with how computer science is being taught to new engineers. In recent years, it seems that all anyone focuses on anymore is what programming languages that one knows and it seems to be shifting to all OO languages. This is a very wrong and dangerous attitude to take. However, this is not to say that knowing a broad range of technologies is bad – it isn’t. It will make you a better engineer. Universities that want to stay competitive in graduating competent computer science majors need to realize this and refocus their curriculum. At the same time, there needs to be a major paradigm shift in the industry away from obsessing over comparing who’s repertoire of languages is bigger.
Skills that are being taught are softening. Good old fashioned coding and algorithm design is giving way to using libraries of code that essentially do all the work for the programmer. But wait – isn’t code reuse a fundamental of good, quality programming. Yes, it is! However, this should not be the starting point for students to learn. When the libraries are used, the logic behind the code is lost. Good design principles dictate that when using an API, we shouldn’t care what’s inside the “black box” but rather just accept that if we feed the API good and proper data, it will perform as expected and we’ll get values out but students who are learning should care because they aren’t just learning to program, they are learning to think. Another example from Java: what is the complexity of .contains()? While this should be obvious to most engineers that it is O(n), universities that teach that it is acceptable to use APIs and libraries all the time are doing a major disservice to their students.
OO languages are becoming the de facto first course. This is a backwards approach because OO allows for advanced design with encapsulation, inheritance and polymorphism. We have to get back to the basics by learning to code as a function of learning computer science where one can appreciate architecture designs, compilers, memory management, language theory and the relationship between hardware and software. Knowing a procedueral programming language is an absolute necessity and the Linux Kernel, Git and Apache Server are all products of procedural languages. Not bad company at all.
My first programming language that I learned at Purdue was C. This was not the common path for most CS majors – the majority of people started with Java. Learning C first created a foundation that was later built upon by taking the required Java course. As a friend recently put it – it is like learning to drive a car or learning how to engineer a car. Anyone can drive a car and some people love it so much, they become cab drivers. That is why they have “X Technology for Dummies” books. But, if you want to dive into the internals of the car, look at how the engine works for example, you need the solid education of understanding the principles behind the application.
Being a “good developer” does not mean that you are practicing computer science, because in reality, coding is only a small fraction of what computer science is about. Programming languages are simply a means to an end.

Mostly agreed. However, there are other departments at Purdue that teach programming. Aero and Electrical/Computer engineering being two that come to mind. I’m sure the new Bio kids are learning it…and surely the nano-tech geeks have to know a bit.
Anyway, I agree that there’s a huge shift to OO, but that’s been going on since the 90s. I think there’s greater cause for concern in things like Chrome and the iPhone. It brings a lot of programmers out of the woodwork, but it’s even more abstracted from the science of computers.
Most of my work now-a-days is in consumer electronics. I can tell you that there are some amazing programmers coming out of school these days…in China. They care about websites, Flash and iPhone dev, but they also are experts in the world on embedded systems. It started when we stopped teaching good EE and board manufacturing went over seas. The Chinese learned and caught up. Now they excel. Their next step is to become a SW powerhouse in the world. They’re doing this. So is S.Korea and Taiwan, though. The US better get their educational acts together if we want to sustain our ability to compete with the rest of the world.
And like you would most likely agree, it comes down to good algorithm design as well as metrics.
When I was leaving Purdue, they were just in the process of revamping their requirements of all science degrees to include CS 158, C programming for engineers. I was a TA for this class for 3 years and some kids got it and some didn’t and never wanted anything to do with computers ever again. I think that it is important to give all the science majors exposure to computer science, especially since no science field doesn’t use computers. As computer science majors, we have to take other science classes as well.
You also make another good point that the Chinese did catch up. They have much superior math skills to the majority of Americans, which I think is mainly a failure in the grade schools and high schools. However, I disagree with the fact that they will overtake the US in software – quantity perhaps, but not quality.
I am glad that someone else thinks that the “basics” are important as well.
I’ve become a devoted admirer of your website for some time but not really supplied just one point back, I hope to change that within the future with more conversation.Thanks for another new addition to the web site.
this post its very usefull thx!
I would appreciate more visual materials, to make your blog more attractive, but your writing style really compensates it. But there is always place for improvement