Computer Science learning pathways

Categorizing essential Computer Science knowledge

 29 June 2018  |   13 August 2018
  teaching phd

Also worth reading: Reverse engineering a curriculum.

I happened to come across a very interesting study path for “game programmers” published at https://github.com/miloyip/game-programmer. It’s a nice visual representation of books that help you become a better (game) programmer, starting from zero (game programming for kids) and ending at advanced game physics and Artificial Intelligence. I am not keen on becoming a game programmer but the reason this is interesting is that the author has done a great job trying to categorize the different requirements - what it takes to be a programmer in general. Let’s take a closer look at that.


A cut-out part of the study path, copyright Milo Yip

Study paths for any programmer

Starting at Computer Science (CS), many of my favorite books on the subject are prominently displayed: Structure and Interpretation of Computer Programs (SICP) and Introduction to Algorithms. Milo also identifies 3 categories within CS: CS Foundation (SICP), Algorithms, and Mathematics for CS.

After the required1 CS path, we move on to Programming Languages. For the game industry, C(++) and C# are important. Sadly, C++ is a horrible mess and requires different levels of specialized books to completely grasp. I was actually researching C++ books as I’m preparing a “Software design in C/C++ with Qt” course for the coming academic year.

Okay, what’s next after a basic CS layer with some intermediate language knowledge? Software development, being the practice (TDD, refactoring, clean code, legacy code) and the design (patterns). I’m ignoring his UML reference here. Why would you separate programming languages from software development? You need basic understanding of a language to speak. Grammar (syntax) and speaking (development) are useless separately but a lot of books focus too much on only one of these.

After that path, the in-depth game development parts begin. Let’s look at it this way: the bachelor years are over, time to specialize in the master years.

Study paths for an academic Master

As a little experiment, I decided to map out my own master education in order to compare the above to some academic reference material. You will see that the abstract “study paths” are very much alike.

The Bachelor years

These are the courses I followed in 2003 to reach the grade of Academic Bachelor in Informatics (Computer Science), at UHasselt.

First year:

Extremely heavy on the mathematics and logic, more than 50% of the students stop at this point and because of that. Almost everything is theoretically interesting but practically unprocessed.

Second year:

Slowly building upon the first year, introducing algorithms, extending on logic, moving from imperative to object-oriented programming.

Third year:

Finally a lot of freedom for the student as I remember 40% of those courses were optional as I picked data mining and bio-informatics to fill up on points.

The Master year(s)

These are the courses I followed in 2007 to reach the grade of Master in Informatics (Computer Science), specialization human-computer interaction, at UHasselt.

I ignored the obvious thesis and internship. The master year included a lot (+60%) of optional courses but I can’t remember exactly which one is and which one isn’t. The master year has changed a lot since 2007: it’s now 2 years and the specializations have expanded: I could choose from 3 (databases, the theoretical oriented one, multimedia, the graphical oriented one, and human-computer interaction, the engineering oriented one). Now there are six at that university!

There has been a lot of shoving-around (from bachelor to master and the other way around) since I graduated. Things like compilers for instance, and legal aspects seems to be an obligatory course now. But looking at the list from a distance, we can clearly distinguish the following trends (only looking at the Master years now!):

  1. (Big) “Data” became more apparent.
  2. Entrepreneurship is encouraged with some new courses dedicated to that and project management. (both required, rejoice!)
  3. Networking (security, IoT) became more apparent.
  4. AI and machine learning became more apparent. I was interested in this but in 2006 you could only follow a Master after Master in AI in another university.
  5. “Agile” is a thing and part of policy informatics. (Huh?)

According to the “Computer Science Education in 2018” interview2, CS education has been relatively static, with core classes still focused on programming (languages, algorithms, data structures), mathematics and systems design (operating systems, computer architecture). The objectives stay the same but the content has obviously been evolving among with us.

Over the years, I have seen curricular changes to make room for breadth courses unrelated to CS, and to make the programs more accessible to those who are not strong in mathematics. I believe that these changes come at the expense of a deeper understanding of computation.

Something has to be cut if one intends to make room and that something usually is mathematics - for better or for worse.

Essential Computer Science

It seems to me that most courses map quite well with Milo’s requirements on game programming. Would that also be the case with other source material?

Yes.

Look at this well-documented Google Coding Interview University. I’ll let the author speak for it’s contents:

I originally created this as a short to-do list of study topics for becoming a software engineer, but it grew to the large list you see today. After going through this study plan, I got hired as a Software Development Engineer at Amazon.
This is my multi-month study plan for going from web developer (self-taught, no CS degree) to software engineer for a large company.

This clearly suggests a (big?) difference between a developer and an engineer.3 The latter sounds a lot cooler for sure. But what exactly would be required to make the jump from one title to the other, according to jwasham? The list is too long so let’s make some abstractions:


Which of these is the most important one?
SICP of course!

It’s an unordered list but you can easily map those subjects onto the previous bachelor years. It’s a bit more practically oriented though: a lot more in-depth algorithms and less logic, probability and mathematics. Prerequisites are knowing C so imperative programming got you covered. You can read more about his personal story on Medium.

A more hands-on approach is to be preferred to keep students engaged. Google’s Tech Dev Guide or classic pair programming brain teasers on Code Wars suggest the same but a close inspection reveals a rather theoretical approach!

In Applied informatics

So what about the professional Bachelor in Applied Informatics? Is this the road to become a developer but not an engineer, as explained by jwasham? Take a look at the programme from a nearby graduate school, PXL:

First year:

Second year:

The third year is a specialization year with three choices: application development (mobile development, programming “expert”, software engineering), software management (modeling, management) and networking (cloud & automation, OS expert). I can only guess at the contents of the very vague course descriptions but almost anything from the computer science path seems to be completely vanished.

That leaves me to conclude that the “2. Programming Languages” study path with a bit of “3. software development” apply for a professional bachelor4. Advanced principles might as well be learned on-the-job if you’re hired (“6. Game development”) but it’s sad to see that not even a little bit of the essentials are integrated into the plan. I know this to be true because I was a guest lecturer for courses like the essential and advanced application development parts.
Of course as an academic I’m highly biased, but I have worked for 11 years in the software development industry where practicality is most important and most colleagues came from the applied trajectory.

Conclusion

Is basic Computer Science knowledge required to be a great software developer? I think that will depend on what kind of software you’ll be working on. If it’s domain-driven enterprise software then most of the complexity will come from unclear business rules that drives miscommunication. In that case common sense and critical thinking will be enough5. If it’s a game engine, a deep learning network or a new distributed protocol then the right mindset alone won’t cut it.

That also seems to clarify the difference between developing and engineering. There are a lot of articles on this subject to be found and the explanation is never clear but bound to the industrial context.


  1. According to the github link, and according to all academic educations. Applied informatics seems to completely (or partially) skip this step, see later on. [return]
  2. February 2018, DOI: 10.1109/MITP.2018.011021350 [return]
  3. To quote the source: “Large software companies like Google, Amazon, Facebook and Microsoft view software engineering as different from software/web development, and they require computer science knowledge.” [return]
  4. Remember, other graduate schools offer other trajectories. [return]
  5. Those skills are also trained while learning CS so it’s not to say that it will be useless! [return]

The Startup of a Lean Doctorate

Using agile practices to tacle a long-term research project  19 October 2018

Reverse engineering a curriculum

Can a unified software engineering philosopy shape the right context in a curriculum?  15 June 2018

A Ph.D. Thesis Proposal

Bridging the gap between software development requirements in the industry and eudcations in the academia  4 June 2018

 Top