by Colin Smith
What you learn in a 4 year Computer Science degree
I recently wrote an article on whether you need a computer science degree to get a job in tech. I thought that going over my transcript would be useful. Discussing what I studied will hopefully help people. I want everyone to be able to make the most informed decision possible when choosing their path for pursuing a tech career.
Disclaimer: This is written from my recollection of the classes and from the perspective of a mobile developer. A lot of the topics of these classes could be specialized in and turned into a career. So they are all important to someone in the world. I am writing from my perspective and from the viewpoint of someone who chose the career path of a mobile developer.
Programming I, II
This was the meat of everything that I learned and got me going with programming. These were the classes where you learned to program. Before I took these classes, I had barely even programmed at all. I had tried getting a head start but didn’t get much further than loops.
This class started with creating an empty file and making it compile in an IDE (I used Code::Blocks). And we worked ourselves all the way up to creating our own text-based battle game. Looking back at the code I wrote makes me embarrassed. I have come a long way since then. Here is the repo if you’d like to have a laugh (I only use a main.cpp file with 1063 lines of code).
So what did I learn here? I want to say everything. These courses were insanely valuable and got me at least 70% of the knowledge I needed to work professionally as a programmer. I learned if statements, loops, boolean logic, class creation, struct creation, creating interfaces, polymorphism, inheritance and more. There was also some use of basic data structures like arrays and vectors.
Discrete Structures in Computer Science
This class was added to the transcript to get people used to boolean logic. Which we had down in the first two weeks of the class. Unfortunately for us, unsuspecting students, it goes pretty far down the rabbit hole. Here are some of the topics it covered: “logic, set and set operations, methods of proof, recursive definitions, combinatorics, and graph theory”.
Now, these are all useful things to know. But the issue is that students were encouraged to take this class early. Usually alongside Progamming I and II. And these are some advanced topics. I would struggle now to use mathematical methods of proof. And I remember I really struggled back then. Also, I just had to google what combinatorics is so I obviously don’t use them too much.
The fact is a lot of the things they taught in this course didn’t seem applicable to a computer science career at the time I took the course. I now know that logic, set and set operations, recursive definitions and graph theory can be useful. But that is only with the hindsight of being a programmer for a few years.
What I apply daily in my current career is logic and maybe set operations. Recursive definitions and graph theory have really only been helpful for interviews. But take this with a grain of salt because I am a mobile developer. A back end dev would probably find graph theory very useful.
This class was good. Very good. Data structures are used all over computer programming and are the backbone of most of the code people write. They allow us to store data in a way that is useful to the programs we write. The ability to look at data and know the best way to store it for time and space performance is a very useful skill to have.
I learned about arrays, stacks, linked lists, doubly linked lists, trees, graphs, heaps and all the different flavors of these data structures (like self-balancing trees). This class not only helped me understand data structures but also helped me to better organize the data that I was storing.
This class was done in C which made it even more interesting. C can be very finicky but also very powerful if used correctly. I had to be very careful with how I allocated and cleaned up memory which was also very good for teaching about memory management.
There were so many useful things in this class that it is hard to cover all of them. I haven’t even mentioned the fact that this is a key knowledge component for interviewing in tech. If you are shaky on data structures, then start brushing up on some basics because they are very important.
Analysis of Algorithms
This class was somewhat useful. Algorithms are useful. They drive the best software in the world and make them powerful enough to stay relevant in the modern world. But this class had some issues.
The most useful part of this was learning Big O notation. Big O notation allows you to evaluate code and understand how well it would perform time-wise and space-wise. In general, if you are measuring code performance at a company, you will use a timer to track time between interactions. This allows you to see how well your software is performing. This requires you to write code and evaluate the results afterward.
Big O notation allows you to do evaluations of code performance by just looking at the code. I don’t want to get into this too much, but if you don’t know about Big O notation, read this blog post.
The actual algorithms we went over weren’t as useful. All I remember is the knapsack problem and the traveling salesman problem. I also had to write code for these in groups which wasn’t great because there was one person in my group that went beyond what he was scoped for. That meant I ended up writing less code towards the final implementation each time than I would have liked to.
A basic understanding of what famous algorithms exist, their purpose and how they are implemented can be useful (mostly for interviewing). Big O notation is the key here. It is very useful on the job and it is also incredibly useful for interviewing.
At the end of the class, I had built my own website and took the initiative to learn Angular. I used Angular to make my site look flashy which ended up getting me my first internship. I also acquired a good understanding of how a website works under the hood.
This knowledge alone was great but I also learned how to pick up and learn an unfamiliar language, framework or data format and work with it on the fly. I did a lot of googling on these topics to see concrete examples. I learned how to use documentation and online investigation to better understand a concept that I needed to apply directly in a short time frame. This is a key skill in being an adept programmer.
Introduction to Databases
I mostly just learned SQL in this class. I am sure we went over some other concepts like sharding and clustering but I don’t remember them. I sometimes use SQL at my current job to run data queries for events I’ve logged. SQL is either going to be integral to your job or you will barely use it. If you need it, learn it and become an expert. If you don’t, then don’t worry too much about it.
Software Engineering I, II
Also another class I can’t really remember. I believe we went over a bunch of broad concepts in this class. We covered Scrum and Waterfall project management methods. We went over testing and all the different types of testing there are. We covered some usability and accessibility concepts. It was really just a catch-all for concepts that didn’t really fit into their own classes.
Due to the patchwork nature of the class, I didn’t really internalize any of the concepts too well. It was good to have a basic overview of the concepts covered but I wish more time was spent on the important individual topics such as testing.
Computer Architecture & Assembly Language
I remember this class vividly. This class goes into how a computer works. How machine instructions are sent around and processed by the computer. We also got to write some code in MASM which is an assembly language that interacts very closely with machine code.
Most of the programming languages I had used up to taking this class were high-level languages. High-level languages tend to be closer to human language than machine code. MASM is very close to the machine code and I would say is closer to the machine language over human language.
The most important part of this class is getting an idea for what happens to your code once it gets compiled. Understanding the different logical units in a computer and how your code gets handled by them was very interesting to learn about.
For practical purposes, I don’t think this class was very pivotal in contributing to my tech career. I haven’t used much of the knowledge I gained from this class during my career so far.
I’ll be honest, I am having a really hard time remembering what I learned in this class. The only thing I can remember is building a messaging program that used socket programming in C to communicate. I also learned about opening files and manipulating folders using scripts.
I want to be upfront about what I remember from my degree and the fact is, I don’t remember much from this class. I just didn’t use much of the knowledge gained from it in my current career.
Introduction to Computer Networks
This class was very useful. It went over how computer networks functioned. This included going over network protocols such as HTTP, HTTPS, TCP, IP, FTP, IMAP, POP3, SSH, and DNS. I got to learn about what each of these protocols is used for, how they are implemented and gained an understanding of why they were created.
The networking protocols I mentioned above are used for critical functions of modern software. This includes email handling (POP3 & IMAP), sending network requests between client and server (HTTP, HTTPS) and handling devices securely through a network (SSH). This really gives you an understanding of how the internet works and how devices across the world can interact with each other.
This is not only fascinating but it can be useful. I have used the things I learned from this class to debug issues I came across when I was getting errors from the network. I was able to pinpoint the issues I was running into and help the back end dev that I was working with find the bug on their end.
Introduction to Usability Engineering
This class covered how to make an intuitive app but also how to make an app or website accessible. Accessibility refers to making a piece of software usable for anyone, including those with disabilities. This covers things like text to speech use and designing software that isn’t completely reliant on audio elements only.
The topics covered were useful if you have never heard about accessibility before. It at least made you consider these things when you design software. It also got me to really start thinking about user experience and how important it is to good software. If no one is using the key functionality of your app because it is confusing, then your software will eventually lose all of its users.
While the knowledge was interesting, the specific implementations of how you would create a usable and accessible piece of software depends on the platform. For example, Apple has its own set of user interface guidelines that describe general design principles and specific details of how you should design software that will run on any of Apple’s platforms.
Because of the specific information needed per platform, I am not sure that this class was incredibly useful. It was a nice intro, but I ended up having to learn Apple’s interface guidelines which went over all the topics covered in this class.
Mobile and Cloud Software Development
I’ll keep this one short. I was already a mobile engineer when I took this class. I built a crappy mobile app in a few hours in order to finish my degree ASAP. At this point, I had already achieved my goal of getting a job as a software engineer but just needed to finish up my comp sci degree since I was almost done. My heart was not into learning at this point.
Also, it was clear to me the person running the class didn’t know about all mobile app platforms. We were required to write a small back end portion but I really didn’t want to. I ended up faking a web request by instead reading from disk and returning a canned response after a few seconds. This worked because I only had to submit a demo and the source code. And I have a feeling the person grading only looked at the demo.
Overall, the class taught outdated and unused tech, wasn’t properly evaluated and really didn’t offer much guidance. This was not a very good class.
Capstone Software Project
Speaking of outdated tech, this project required us to build a GUI for accessing a database using curses. Here is the full project if you are interested. We didn’t get to choose what our capstone project was, it was assigned to us. And everyone had to do the same project. It was also done in groups of 3, so you only really covered one small portion of the project. This was a really poorly run class.
The interaction with the teacher was pretty much non-existent. I had zero interest in the project and what we were learning seemed absolutely useless. To create an interest in a topic, you need to let people have some free will when it comes to choosing what they learn. Having no choice in your capstone project is just silly. This project is useless for a majority of career paths and it doesn’t make sense to force it on people.
The class should have made every student submit a proposal with rough estimates for a timeline of when they would finish each sub-portion of the project. This accomplishes two things: getting people to start practice estimating work and allowing people to work on what they are interested in. The class would have been 100 times better this way.
I could have not taken a good portion of the classes and still be the software engineer I am today. But I think missing out on some of these courses could leave a huge gap in your knowledge as a dev. The topics I think every software engineer should have some knowledge in are Data Structures and Algorithms.
The other classes depend on the career you path you choose. If you decided to go into embedded development, you should learn about computer architecture. If you decide to become a front end engineer, you should learn about computer networks.
The key takeaway here is that a good engineer is constantly learning. If you’re missing some knowledge that you know would be useful and applicable in your job, then go take a class to gain that knowledge. That is how you get better at writing good code. Always be learning.