Computer Science and Software Engineering
September, 25, 2020
When you are first getting into learning about programming, it can seem overwhelming at first. Computing has a wide variety of sub-topics and you might not know exactly where you need to start or what you need to know to obtain a full-time job. I want to write out my opinions and experience that I’ve had in the field to hopefully give some insight and guidance.
Algorithms, Compilers, Operating Systems, oh my!
I started my college career in Community College and took an intro computer programming class my first semester. Man, it was definitely exciting to learn about an unknown subject. This is what I was sticking to, so let’s finish up my Associate’s in the subject and transfer to a university! I really didn’t know what I was in for. In CC, you learn the ropes of programming in a few languages, but you only scratch the surface in what you should know in your undergraduate career, and going even further, lower division Computer Science coursework. I cannot speak for every CC, but this just seems to be the standard. I guess it makes sense, CC isn’t meant to be academically competitive. But once I transferred to a place like UC Berkeley, hey-oh. Since my CS courses didn’t articulate over, I started over in the lower divisions. When you compare how much content was taught in those lower division CS courses at Berkeley vs. what a CC CS course teaches you, they aren’t even in the same galaxy. You might be thinking, “Well of course, it’s Berkeley, #1 Public University in the World and a top CS school”. Yeah I realize that, but based on what companies ask for in Software Engineering interviews, the lower division CS courses and Berkeley’s algorithms course prepares you almost for what you need to be successful in those interviews. Not to say the content is easy and I struggled a lot (still do to this day), but if I started to interview for a Silicon Valley with just my CC background, I would have failed miserably.
So in these Berkeley classes, yes, you learn how to code and learn the intricacies of a few languages, but you also learn a lot of theory. The Data Structures and Algorithms are what are going to be most useful for a regular Software Engineer’s job, but the other classes are more useful for roles in their subject matter. For example, if you choose to pursue more Artificial Intelligence and Machine Learning, you are better suited to be a Machine Learning Engineer. AI and Machine Learning is certainly Berkeley’s thing and it isn’t taught in depth in many other places, but topics like Compilers, Networking, and Operating Systems are definitely a standard at most colleges. It really just depends on how much content your professor and course gives you. If one is so curious about these subjects and you are in a school that doesn’t teach too much about the topic, then I suggest finding really good textbooks and blogs if you are pursuing some self-study just to be able to understand that school can only teach you so much about a topic before running out of time.
Time to Code
So I told you all that I learned a few programming languages in school. That doesn’t necessarily mean that I can code well. We can all recognize how to have good syntax in our code and make it look pretty, but can the logic be simplified? What about Business Logic? What the heck is that? Working as a Software Engineer full-time has definitely taught me that school isn’t everything. It can get you started, but there’s a few key takeaways:
- 90% of the topics you learn in school, you don’t use on a daily basis.
- 90% of the tech that you do on the job, you don’t learn in school.
- Knowing some CS theory doesn’t mean that you can code well or design an elaborate system.
That’s not to say that everything that CS courses in school is worthless, but in your daily routine, you will probably NOT need to know how to write up a Machine Learning algorithm, solve complex cryptographic problems, or design a compiler from scratch. There are certainly people working in all of these fields but the goal of school is really to set you up with the fundamentals so you can decide where you want to be. Additionally, even if all you want to do for the rest of your life is design web pages for small businesses, it cannot hurt to enrich your own knowledge with a baseline understanding of these topics.
Now school only has so much time to hit you with the knowledge you need to know to have a foundation as a CS student. Once you start working at a company, you may feel overwhelmed again because you might not know any of the tools and tech stack that the company is using and now you’re going to need to know to perform your job. There’s going to be stuff that is unfamiliar to you - build tools, containerization, linting, frameworks, MVC, and maybe even Git. But this stuff is the standard nowadays and that’s another reason why interviewing may be hard. Tech Recruiters like to look at students who had a Software Engineering internship because you will have been exposed to these things in the internship. Not having that background does hinder you, but don’t lose hope! If you have the time to practice and understand, then it will all come to you! At the end, I will disclose some tips I have to try to learn this stuff.
What do I really mean by code well and designing systems? It’s really about thinking holistically and if your code makes sense for the problem you are trying to solve. Not every problem is theoretical - some of them are just practical. What makes sense for the users? Is the code maintainable so that another engineer can pick up where I left off easily? These are the things you learn by working on the job. You could learn these skills with side projects, but I think you need to have a disciplined mind and be seeking out how to improve your abilities as well.
What should I be doing?
Here’s some tips I have for keeping up with all of these topics and helping yourself:
Practicing algorithms and solving problems
If you are actively job seeking, you should be doing this daily. If you are working, I suggest practicing from time to time because you never know when your situation will change. The COVID-19 Pandemic brought layoffs from all sectors and you never know when you’ll be looking for a new job. To get acquainted with Data Structures and Algorithms, I suggest the textbooks from MIT, Berkeley, and Princeton. For practicing problems, Leetcode is one of the best places you can practice. They have enough problems to sharpen your skills. There are many others, but that is typically mentioned by every developer.
Side projects and getting more familiar with tech
Whether you’re working or not, it’s always good to have a small side project to further your knowledge on a framework or package that every front-end developer is using (assuming you don’t have an agreement with your current employer that you exclusively do work for them). This is where you can sharpen your technical skills for when you are on the job and just learning about current trends. When you come across something you don’t know, start Googling. Ask questions and try to get the answers, don’t feel like it’s too much to know. The software documentation can help as well so try to start there and then find out what people are saying about it. Also, joining a community or reading through StackOverflow can definitely teach you a lot.
Topics for your pleasure
Even if you don’t end up working as a Operating Systems Engineer, maybe it would be fun to read about it. Everyone is different, however, reading books or articles about subjects you learned about in school can help you feel like all that studying wasn’t worthless.