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.