Looking through my GitHub repositories, I noticed that I had a few private repos with school projects. Given how my private Github profiles are about to expire and how salty professors get about posting homework online, I decided to use this post to discuss what I learned during my Computer Science degree.
With the help of a full scholarship, I was able to attend Wartburg College, a small Lutheran liberal arts college located in the rural Midwestern US town of Waverly, IA. I won’t lie, it wasn’t my first choice. Nor second. Nor third. Even as they sent the acceptance letter and paperwork a week after I applied far ahead of my other options, I still had hope that I’ld get into either a University of X, University of Y or a really good liberal arts college.
That didn’t happen, so Wartburg it was. While it isn’t a bad college, I would only recommend going here if you’re getting a steep discount like mine. It’s definitely not worth the $50k asking price1. Throughout the program, I was thankful to be taught by my CS professors Dr. John Zelle, Dr. Joseph Breutzmann (now emeritus), Dr. Terry Lestche and Ms. Peggy Hamilton. The accompanying math requirements were taught by Dr. Joy Becker, Dr. Brian Birgen and Dr. Mariah Birgen. Thanks to then tolerating my presence, I was able to get my Bachelor’s degree in Computer Science.
As for what I learned, let’s go through that.
CS 120: Intro to Computer Science
The very first computer science class I took. Because of this class, I discovered that programming wasn’t that hard. We learned the essentials of Python I’m this class, a language that would be used throughout my major2. I remember getting so stuck on the final project, a replica of Missile Command, that my team camped outside the professor’s office at 7 am where he was more than willing to help us.
CS 220: Introduction to Object Oriented Programming
At the end of CS120, we left off on object-oriented programming. This class continued that topic and it convinced me to declare myself as a CS major. We learned about object orientation as well as a few data structures like linked lists, queues, stacks, and trees. It wasn’t as analysis based as the Data Structures and Algorithms class however. The big project in this class was Boggle, a simple word game.
During this class, I tried to apply for one of those freshman experiences, but I got turned down.
MA 250: Applied Calculus
I’m not sure what the point of this class was, let alone why it was a CS requirement besides it involving computers. Here we just told a computer to do calculus for us. I’m still pissed at the time I had a team project and one of the members shared our work, giving us all 0s.
CS 280: Internet Programming
I really wanted to learn web programming so I took this class. Sadly, it was way too fast for me given everything we had to learn and the fact we only had 1 month to do so. We went from building an HTTP server to HTML, CSS, JS, Ajax, jQuery, PHP, Ruby, Rails, ASP.NET, MySQL and SQLite. It wouldn’t be until the next academic year until I would learn how to code for the web.
CS 330: Operating Systems
God this class was intense. There was a lot of material to cover and we weren’t paced enough to cover it all. Here I had my first experience with C and it wasn’t pretty. Didn’t help that we were hacking the kernel.
MA 251 & 252: Foundational Differential and Integral Calculus
For some reason, I thought it would be a good idea to git gud at math. So I put myself through calculus instead of “baby stats”. I should have had a better reason to learn advanced math. The highlight of this class was this really hard integration problem which had two easy solutions which were wrong on their own but were correct when put together in the most convoluted way possible. Quick tip: while Wolfram Alpha is your friend, it won’t save you from having to understand, even if you find a way to get the method. Also, Desmos is great for visualization.
CS 149: Java Programming Seminar
Sick of learning Python, I decided to branch out and learn Java. While I have a good grasp of the fundamentals, I don’t know how to make interesting things with it, like Java apps or web servers3. The highlight of this class was how I finished my final project in just 3 hours starting from a place where I knew absolutely nothing about UI design.
CS 349: Data Structures and Algorithms
This class is a partial follow up to CS 220 where we went into greater detail on various data structures and we can use them to implement algorithms, algorithms we would then analyze. While I was great at the implementation portion, I wasn’t as good at the analysis part.
CS 330: Computer Graphics
As fun as this class was, it was crazy difficult and slow (we were still using Python and even with Pypy, ray tracing took hours). To be honest, I doubt I got a meaningful understanding of computer graphics through this class since it’s a topic that deserves far more than a month of study. For my final project, I decided to lecture on how Pixar renders hair, a presentation nobody, including me, understood.
CS 350: Software Engineering
This class was also a follow up to the object-oriented programming class, although it was more practical as we applied OOP techniques to software engineering.
MA 301: Discrete Mathematics
Honestly, I have no idea what I learned in this class. It’s supposedly the most relevant math class in computer science, but I was terrible at it. I hadn’t developed the mathematical maturity needed to perform advanced statistics and mathematical induction. I should have built a strong foundation before this class.
MA 303: Linear Algebra
Again this is supposedly a relevant class in computer science, but I also struggled in this class. With how bad I am at math, I try to convince myself that I can do math just with computers before I realize that I need to tell the computer what to do in the first place.
CS 310: Computer Organization
Oh, Org. This was the hardest class out of all my CS classes. There were just so many concepts to learn and I couldn’t keep up. Didn’t help that I was having a rough semester personally. I just passed although it was only just. I hope I get to revisit this topic in the future.
ID 315: Historical Roots of Mathematics in The British Isles
I was fortunate enough to take this class where we visited the UK. I plan on writing about my trip, but in short, there was so much to learn about prominent individuals who furthered the field of mathematics and a lot of historical sites worth seeing. I do plan to write about this trip so stick around.
CS 250: Systems Analysis
To be honest, I wish I took photography instead. It wasn’t very interesting, much like CS 110.
MA 214: Statistics
Easy A, but I’m not complaining. Not much insight into statistics on this class beyond using a calculator.
CS 460: Capstone (Computer Ethics)
One of the two final CS classes I had to take. This class touch on computer ethics and for the discussions I lead, I talked about patent law and fair use, two very exciting topics. Sold have talked about Bitcoin and IoT.
CS 461: System Design Project (Senior Project)
There’s more detail on the revisitation of my senior project, but while I wasn’t able to finish my lab assistant project, people really enjoyed my demo at my college’s senior STEM fair.
The reason I majored in Computer Science was that it was the closest to what I wanted to do since Software Engineering wasn’t offered. I wish pursued Software Engineering since it would have focused on the practical elements rather than the theoretical ones I picked up getting my CS degree.
Given how much I struggled with Discrete Math and Linear Algebra, I really wish I had built a stronger mathematical foundation earlier in my life so I could handle more advanced topics. As much as I want to build that mathematical foundation again, I don’t know where to start or how significant it would be to my career.
Along with my poor mathematical foundations, I was scared of tackling hard problems, often taking the easy way out. I wish I developed the bravery needed to weather the hard topics. After all, that’s where you learn.
One thing I wish I got programming experience through an apprenticeship before pursuing a degree in computer science. Having job experience beforehand would make me more intentional going into college so I know what to focus on rather than fumbling around every CS elective.
Then again, I would have never known what I’m bad at. While bad grades suck, having the odd good grade elsewhere is probably an area you want to focus on. After all, you don’t expect a database expert to be highly proficient in computer graphics for instance.
To further aid that exploration, I should have had multiple internships to discover my interests and understand how programmers actually work. I’m envious of people who have had these opportunities. At the same time, which a shift is expensive a career is long and there’s always room to grow and change.
This experience has made me think of how the industry is having a hard time grooming engineers. It might be my naivety from my lack of job prospects, but I don’t think I’ve been adequately prepared for the job market. College has been marketed as a sure way to get a job, but every post I find only want people with multiple years of experience. Not sure where it comes, but nobody seems to be willing to groom it4. This is something worth discussing as an I industry given the many people trying to break in.
Specific to my classes, I learned that there’s nothing wrong with asking for help. However, you should make sure you try to don’t understand before getting help. You shouldn’t be quick to shy away from hard things, that’s how mastery is formed.
Throughout my academic career, I wish I took more classes out of my CS major. It would be cool to learn about ceramics, photography, politics, languages and so on rather than droning through my CS classes. Then again, some of my explorations weren’t that fun. I guess you learn a lot about what you don’t like.
I might write about non-academic aspects of college at some point and once I’m 3 years into the industry, I’m planning to write about how I broke through. Why then? I want to stay grounded so I understand just how much of a PITA the job application process is, as it is at the time of writing this.
- Thing is, nobody pays that $50k outright. Thanks to “generous” scholarships, that typically goes down to about $20-30k. This encourages perverse incentives where colleges charge tuition far beyond what it actually costs because they can. Of course, this can’t go on forever especially given how questioned the value of a college education is, but nobody wants to be the first one to cut tuition in half, so this charade continues. ↩
- This got really annoying, especially when performance is something to be considered, like graphics and computer architecture. The reason they insisted on Python was that it included batteries. In other words, it did a lot of things for you. That way, you can focus on learning the concept instead of the quirks of the Java Runtime Environment. They had seminars to pick up other languages, but those weren’t hosted often. ↩
- Funny enough, it’s only relevant during job interviews. In the times I used Java, I was doing a TDD loop. One time, I even had to pair on a problem the company was working on. Although I didn’t get a job, they had a great interview process. ↩
- Unemployment really skews your perspectives on things. Evidently, there are plenty of internships and a lot of CS majors and career changers get jobs as programmers so it’s something I’m missing. I guess there’s one good thing to take away from this unemployment– you’ve got a lot of time to reflect on yourself. ↩