Being a self-taught software engineer, I always wondered what I could take away from more academic paths to computer science. If you had asked me a couple of years ago, I would have probably said that a university CS class wasn’t for me, but in the end, people just have different ways of learning, and there are countless ways to pick up software development.
So when things came full circle and I found myself enrolled in introduction to computer science (IN0001 at TUM), I received the opportunity to revisit the basics of computer science, including object-oriented programming, multithreading and synchronization, virtual machines, abstract syntax trees, binary trees, binomial heaps, and more.
Having leaned more on the hands-on side for the past years, having to think about the fundamentals of handling references, memory through stack and heap, recursion with stackframes was a completely different but rewarding challenge from “build feature x” or “deploy service y”.
Compared to other introductory classes, we spent a fair deal of time in the beginning focusing on references, pointers, and Java’s call-by-value approach, as those are historically more challenging for students to grasp than control structures and data types. Since passing class references around makes up the biggest part of Java, starting by building a solid foundation on that end was a good decision of the chair of software and systems engineering.
Of course, going over the language fundamentals in a lecture just doesn’t translate to deep knowledge and the ability to write and navigate software. So the lecture was accompanied by weekly homework tasks, infamous for their time consumption (spending upwards of ten hours per week on homework is the norm).
I believe that having gained some experience made the course even better, as I could relate topics to problems at work and vice-versa. Some of the more abstract topics like abstract syntax trees might seem irrelevant at first, but since a big part of my work around GraphQL involves interacting with ASTs, it just helped to solidify my thoughts.
I’m confident that after around 14 weeks of lectures and homework, everyone who actively participated was able to pick up the fundamentals of programming with Java, and while you might think that Java isn’t a particularly great choice, a lot of the content does apply to other languages as well.
I think one of the most important takeaways was the notion that there’s no single definition of good or bad when evaluating a solution, it completely depends on the objectives. Sure, an implementation might not be as fast as it could be, but if it’s readable and your team values maintainability, that’s just better, so the classic answer of “it depends” wins once again.
Beyond the scope of this course, I believe one of the best things a class can do for you, is help get a foot in the door on any topic you’re interested in, and give you the tools to expand your knowledge past the curriculum. When you’re completely self-taught, it can be hard to pick up something new if you don’t know what to search for.