An Alternative to Studying Computer Science (1): Dissecting the Curriculum

Marijn Scholtens
9 min readMar 7, 2024

--

It’s a public secret that although Computer Science study programs are useful, the curriculum does not exactly align with what is required in order to succeed in the industry as a Software Engineer. And although passing an exam for a course is useful, they are often not good indicators of one’s skills. Rather, they test how well you memorized things, and the level is often subpar compared to what you actually need in the industry.

Looking back, I wonder if a Computer Science program is still worth is it these days. Although twenty years ago it was the only way to get a qualification for a Software Engineering job, especially since around 2020 there are plenty of other qualifications one can obtain as well to make himself fit for working in the industry and a variety of roles that don’t really strictly require a Computer Science degree anymore. Instead, one could just study up for a bunch of certifications and perhaps be even more equipped than someone who only went through a degree.

In this article I will explain what is missing in a typical university curriculum, and how the gaps can be filled. A sample custom program based on certifications will be presented in a separate follow-up article.

A typical University Curriculum

Let us first go over a typical curriculum for a tertiary degree. In Europe, most university Bachelor programs in Computer Science take 3 years, and most Master programs take 2 years. More often than not, students don’t finish in time and may require 1 or 2 extra years. College Bachelor programs take 4 years, and sometimes offer the option to accelerate it to 3 years. But let us focus on universities.

A typical curriculum will often have some courses in the following areas:

  • Programming courses (mostly Java, sometimes C/C++, or Python)
  • Algorithms & Datastructures
  • Networks & Distributed Systems
  • Databases
  • Software Engineering
  • Mathematics (Calculus, Discrete Math, Statistics)
  • Computer Architecture
  • Introductory courses to various topics such as Security, AI, Compilers, Graphics and Biomedical Applications
  • Theoretical Computer Science
  • Bachelor/Master Thesis

With a 3-year Bachelor program and a somewhat more narrow 2-year Master program, the total studying time is 5 years, if not more. Although the courses were certainly useful, a lot of the content simply has little practical application and may only be relevant to a handful of students that will actually use them later. Since 5 years is a lot of valuable time, I would argue that the time invested could simply be used better for courses and content that have more practical use.

Example: Java Software Engineer

Let us take a practical example of a run-of-the-mill Software Engineer job. The engineer will work with the following technologies:

  • Java
  • Spring Boot
  • A database with an SQL-dialect like PostgreSQL
  • Docker & Kubernetes
  • Messaging queues like Kafka
  • A cloud provider like AWS

His task comprises of implementing REST-interfaces, testing them, and deploying applications in some cloud infrastructure. He will do this in a Scrum team.

Suppose that an aspiring engineer opts for a Bachelor and Master Computer Science program in order to prepare himself for this job. With the above curriculum, there is a significant discrepancy between what he will learn and what he requires for the job.

What he will learn that is considered useful

Let us start positively with the good things about the curriculum:

  • Programming in general, experience with languages like Java, along with Maven and Junit
  • Basic Algorithms and Datastructures (sorting, histograms, queues, hashmaps, binary trees, etc.)
  • Software Engineering fundamentals
  • Networks & Distributed Systems fundamentals
  • Databases & SQL
  • Some background knowledge and experience in a variety of areas

What he is most likely going to miss

Looking at the above job description, there is definitely some stuff that may be missing and would have to be learned on the job or elsewhere:

  • Using major frameworks like Spring Boot
  • Setting up REST interfaces and APIs, in practice
  • Using version control systems like Git
  • DevOps skills: Such as setting up a Jenkins server and using it
  • Containerization: Microservices, Docker, Kubernetes
  • Cloud Computing
  • Frontend skills using JavaScript/TypeScript and known frameworks like Angular, React and Cypress
  • (Optionally) Mobile app development

What he learned that he probably will not use

I am going to give my subjective opinion and list a few courses that could be largely scrapped from a curriculum, if not completely:

  • Theoretical Computer Science. You may remember Languages & Machines, as well as courses like Compiler Construction and Program Correctness. It’s nice to know as background knowledge where computers came from, but there really is no practical use in proving on paper that your program with one while-loop is working correctly.
  • Computer Architecture. While in the past this was certainly useful, these days it has become pretty irrelevant. This course would fit well in a program like Computer Engineering, but when you want to focus on building applications, you really don’t need to know that much about Hardware components, Parallel Computing, and Operating System structures.
  • Mathematics. This could be useful if you want to go deeper into Computer Graphics or Machine Learning, but in most cases, you really don’t need much of it.
  • The theses. It’s a student’s first step into doing scientific work. However, with most thesis projects I often wondered about the actual added value of the research project at hand, especially for the student himself which might end up not learning much at all and also might not learn how to perform proper scientific work. (Hypothesis, testing, conclusion, critical thinking)

College vs University

Some will argue that what I describe is basically the set-up of most college degrees that basically scrap the mathematical and theoretical parts, and have more focus on the practical side. I certainly do not want to argue that universities should become like colleges, or that colleges are better than universities. On the contrary, I think university degrees can have a lot more added value compared to college degrees, yet in order to stay relevant, the curriculum should adapt more to the industry.

What distinguishes a university from a college comes down to two main points: The overall learning level is higher and there is a higher amount of critical thinking involved when working with the subject matter. A higher learning level means that within the same period of time, university students can (or should) learn more than college students, and the topics discussed can be more complex. Furthermore, not only you learn how to implement something, you also learn to assess whether something is correct, measure performance and efficiency, argue pros and cons of design decisions, weigh in costs, etc.

In that sense learning something like Program Correctness is useful because it does help you to develop a critical mindset when it comes to assessing programs in general. Yet still: I believe that developing this critical mindset does not require a whole course and 90% of the time spent on such a course could be spent elsewhere.

Potential Solutions

Truth to be told: There is no ideal curriculum. Whereas Computer Science used to be relatively small in the beginning (being a spin-off from mathematics), in the last few decades the field has grown extremely large and new research areas are constantly opened up. Think of topics like Deep Learning, Blockchain and the newest kid on the block: Quantum Computing. This immense growth is part of the reason why it makes little sense to hold on tight to the traditional curriculum, because too much time is spent on things that have become less relevant and too little time is spent on things that have become more relevant.

Modernize the University Curriculum

While I would actually leave the curriculum largely in place, there should definitely be changes to the setup. One thing I would support is more hands-on practical work, more flexibility and earlier specialization. This means that already in the Bachelor phase some compulsory courses should become electives so students can still choose them (and may possibly be required for a Master program about the respective area). I recommend to make the following courses elective rather than compulsory:

  • Mathematics
  • Theoretical Computer Science courses
  • Computer Vision & Graphics
  • AI & Machine Learning
  • Computer Architecture & Parallel Computing

At the same time, introduce elective courses about the following topics:

  • Java Frameworks: Although programming shouldn’t be about one language, Java is one of the most important languages in the industry and some Java-based frameworks like Spring Boot or Quarkus have some complicated concepts that you don’t learn so easily on the job. It really pays off knowing how to set up a basic but proper Spring Boot backend application with REST interfaces and APIs.
  • Python for Data Analysis & Presentation: Just like Java, Python is an incredibly important language and is used for many applications such as Data Analysis. The goal of this course is not learning Python per se, but rather how to perform proper data analysis on given data sets and also create graphs so that you can write proper (scientific) reports where findings from an experiment can be neatly presented in a deliverable.
  • DevOps & Containerization: It is absolutely worth it to introduce a course (or multiple) about DevOps tools and containerization with tools such as Jenkins, Docker, Kubernetes and OpenShift. These tools come with a steep learning curve and it is good to already learn some of the theory and have some hands-on practice while being in university.
  • Cloud Computing: Since the cloud is growing by the day, it makes total sense to already get acquainted with various cloud-agnostic concepts that will come into play with whichever cloud provider you are going to work with later. Whether it’s Storage, Networks, Computing Power, or Security-related topics.
  • Frontend & Mobile Development: Apart from backend, you will find employers sometimes requiring you to design a frontend webpage or to create an app on Android or iOS. Only to find out that you never actually learned how to do that because you were too busy proving on paper that your program is correct. This course (or courses) should enable you to learn to develop an application on different platforms with languages like Swift or Kotlin, and earn credits for it.
  • Competitive Programming: Basically the application of Algorithms & Datastructures to problems that can be found on platforms like Leetcode or Hackerrank. The goal is to learn problem solving skills and learn algorithmic thinking, while learning about new algorithms, datastructures, and various programming languages on the fly. While you can do all of this on your own too (which you probably should), the added value of a course is that you can learn strategies and learn from the experience of a good teacher.

With the existing courses, some things should also be changed:

  • Scrap some of the theory and introduce more practical assignments. Make these mandatory to do and to pass.
  • Update the course each year to make sure that the taught technologies are up-to-date. Avoid teaching frameworks that have been superseded.
  • Stay in close touch with representatives from the industry to get their opinion on the taught content and make changes accordingly.
  • Encourage all students to take a side-job at a company in the industry. Actively support them to find a position for them by maintaining a network between the university and local companies.
  • Keep the curriculum flexible, allow students to take 1–2 years longer than actually planned for the curriculum, especially if they have a side-job.
  • Be demanding. Students should deliver work of the highest quality. Teach them how to do this, give feedback, and also allow them to make mistakes so they can grow. But keep the level high so that the diploma at the end carries a lot of value.

Take a different road: Custom Qualifications

Might it also be viable to create a DIY-custom program for yourself and collecting qualifications in order to prove that you are suitable for a Software Engineer job? Because let’s face it, you are going to need some sort of qualifications in order to prove that you are competent enough for the job. In this case, given that there are so many resources and certification out there, you could theoretically just pursue certifications only and prove your competence that way.

That said, there are some things to consider. Certifications are different from certificates. The former (usually) means that you passed an actual exam to prove your competence, where the latter only shows that you followed a course without doing an exam. Although many platforms offer certificates (such as Udemy and Coursera), these are unfortunately effectively worthless. You need certifications with an exam, preferably a closed-book proctored exam, because only then you know for sure you have achieved something that not everyone can do. Practical exams are of course even better, but theoretical exams with multiple-choice questions are mostly fine too.

In a follow-up article we will present an example roadmap of how you can mimic a Computer Science degree with certifications.

Conclusion

As time progresses, questions can be raised about whether the typical university curriculum is still suitable in order to prepare yourself for a job as a Software Engineer. While the university curriculum certainly has a lot of good points, typically there are also various courses taught that are less relevant to the industry and some things that are very relevant to the industry are not taught. While these courses are certainly useful, they may no longer be worth the time considering that pursuing a Bachelor and Master degree costs at least 5 years of your time. This time may better be spent on learning skills that have been relevance and direct practical application to the industry.

--

--