Recently, I had the chance to peek at a university computer science program (at my local university), and I was a bit surprised — not much has changed since my time, which made me feel a bit sad and wonder. You see, I work with young graduates, and essentially, they need to be taught everything. They don’t even know half of the stuff a developer needs to know in order to get or do the job. Mind you, I work for a company that is pretty far from the technological bleeding edge. And even then, most students entering the workforce don’t have enough skills and knowledge for the job, so they have to learn on the job.
There is nothing wrong with learning on the job, however, I do wonder: why do young people pay tens of thousands of dollars only to be taught outdated subjects, skills, and practices? The traditional answer from any CS university department would be, “We are teaching science here…,” but that’s not entirely true. Many of the courses are not focused on science; they are focused on software development. Those courses will teach you how to sort an array in five different languages — that doesn’t seem very scientific to me. Ironically, these are the courses that will get you a job or at least give you the chance to learn on the job, because without that knowledge, no one would even take a chance on you.
Let me pick one course that really grinds my gears: assembly. This particular course is horrifically outdated. Twenty years ago, when I was studying at university, the assembly course was already old and riddled with generations of mistakes that the professor refused to correct. Now, 20 years later, the same nonsense has only gotten worse.
First, the course is taught only in Microsoft Macro Assembly (MASM). So you must get Windows and install gigabytes of software, libraries, and other stuff just to run a simple, one-page assembly code that wouldn’t even add up to a kilobyte once compiled. If you are running Mac or Linux, well, you’re out of luck. The course guide recommends you use virtualization to run Windows and install all the necessary software. The course suggests a couple of alternatives, such as using NASM, which will not be supported or explained by the teacher, or using a Docker container, which is created by students, untested, and once again not supported by the teacher. Remember, you’re paying for this! Isn’t it marvelous?
Why can’t the software be organized in a simple VirtualBox image or, better yet, a Docker container that contains all the instructions, examples, and runs on any OS? Is a student taking this course supposed to learn how to install Windows and set up Visual Studio with all the dependencies? It took me nearly five hours to get everything installed and configured, and I’m no stranger to this. Let me say, teaching students how to install and use virtualization is far more useful and important than teaching them how to install Windows and Visual Studio.
Second, why do computer science students need assembly? Let me be blunt: I learned it, passed the course, and forgot it, never to remember it again. I don’t think an assembly course is needed for a general-purpose computer science degree. There’s no use case. The industry is working towards replacing the C language, and no one even considers assembly for any meaningful work. Yes, there are cases where people are still using assembly, such as Steve Gibson. Perhaps CS students with a cybersecurity focus must know/understand assembly, or perhaps video game developers might find assembly knowledge useful, but for most, learning assembly is a waste of time.
Instead of an assembly course, perhaps students should be taught to use VCS like Git. Git is useful, and its design is fascinating from a CS point of view (graph theory and such). Another useful topic would be build systems, such as Maven. It’s hard to imagine a company that doesn’t use a build system for continuous integration and delivery. Unit testing is another good subject that is both useful and applicable to any language. Process automation is yet another important subject. From a programming perspective, software design, functional programming, and refactoring are much more valuable knowledge than assembly language. In fact, all of these topics could be combined into a highly useful course instead of learning a useless assembly language.
Ironically, computer science programs keep teaching the same old and sometimes flawed material without any regard for the current state of the computer industry. It’s quite interesting to observe that only the professors who have worked in the industry understand this and organize their courses differently — I’ve seen it! But they’re 1 in 10. The rest teach outdated material from papers written 30+ years ago…