Tianjin University of Technology and Education
2013 — 2017
What I learn in a 4 year Computer Science degree
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.
Data Structures
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.
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.
Web Development
This class had the most skills that were directly applicable to a job in tech. I learned about HTML,
CSS, JQuery, JavaScript, PHP, and JSON. I learned how a request is sent from a website front end to a
back end, how its processed on the back end and then sent back to the front end
with a response. I learned how to create UI and how to interact with a data layer that then interacts
with the network.
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
..................
Computer Architecture & Assembly Language
..................
Operating Systems
..................
Introduction to Computer Networks
..................
Introduction to Usability Engineering
..................
Mobile and Cloud Software Development
..................
Capstone Software Project
..................
Final Thoughts
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.