LOADING

Software Engineer Fundamental

Aug. 13, 2024 | Categories: CS

As someone who grew up with a bad sports history, I had instead been ignorant about acknowledging the craft professional athletes put in their bodies and mindsets. This, of course, has changed due to my recent involvement with fitness and martial arts, and, just yesterday, finishing Mamba Mentality by Kobe Bryant in 1 day. Now, I can say many great things about this book that can probably be its entire blog, but for this purpose, I want to focus on just one aspect that is highlighted: training your fundamentals.

In the world of sports, the objectives of the end game are more fixed. Try not to punch others while avoiding being punched, try to shoot a ball into a hoop, try to reach a finishing line before everyone else, etc. The clearer the line between winning and losing is, the more obvious the fundamentals are (shooting, dribbling, guarding, ...). Now, translating to software engineering, you see a much more chaotic world. Crowdstrike, for instance, was considered one of the safest and most trusted pieces of software until the recent crash incident. Facebook, one of the most popular apps of all time, had one of the worst code-hygiene cultures that would take them many years and multimillion dollars to fix. You will always hear these kinds of stories in software design books. However, I'm not writing this to critique coding practices, but rather, how to create a fundamental framework in a world where success can hardly be defined (Note that since this is my personal list, some of these might change in the future)


  1. Programming: This is your CS 101. It is the only thing non-technical people will see you as someone who writes code for a living. It involves knowing a programming language's syntax, features, and community. This will be the most intimidating learning curve for people who have never written a single line of code before. Still, once you get through this via BootCamp, YouTube, and classes, ... You will feel more confident in your ability to learn computer science. The real work will start from below.

  2. Software Design: If writing code feels comfortable, try writing more code! Learn how to abstract and simplify your code base so that many different components can communicate with each other so that they are scalable in the future so you can communicate your intention to readers, and so that you can work with other engineers but not be afraid of them stabbing you at night. This is the stage in which you can experiment with different coding frameworks and work on personal projects.

  3. Computer Architecture: Knowing what a computer is made of will make you feel less intimidated when tackling high-level errors in your code (core dump, null pointers, etc.). Here, you can start learning about low-level languages like C and assembly and get better by trying to replicate different parts of your computer like operating system, file system, hardware drivers, server, etc.

  4. Algorithm and Data Structure: I am not a big fan of algorithms and data structure, outside of the fact that you need them for technical interviews :'( It is still important to understand the importance of speed and being able to either replicate complex algorithms or make up your algorithm for a specific niche. All CS majors will have to learn this in school and can get better through competitive programming.

  5. Computer Network: Any big-scale software project that you work on will definitely involve communicating back and forth with a server from the client’s device, so learning how to set up network infrastructure to handle network traffic is definitely an essential skill. You don’t want your server to crash within the first hour of launching.

  6. Database: Designing and building a database is an undervalued but important skill. A well-designed database would allow the company and software to access information safely, conveniently, and, most importantly, helpfully. I have never taken a database course, so perhaps this will be one of my priorities.

  7. Language and Compiler: If coding is learning how to cook, then this is learning how to make the tools and ingredients to cook. At this level, you should be able to understand the structure of how a programming language is created, the intention of the people who created the language and its compiler, how to take advantage of these design intentions, and even how to improve upon them. 

  8. Math: Discrete, Linear Algebra, Probability theory, Type theory, Complexity theory, etc. The more difficult a problem you try to solve, the more likely you will run into different kinds of math. I truly believe that being good at math is one skill that separates a sound computer engineer from an irreplaceable, 10x computer engineer. This bullet point 100% deserves its blog post, so I will make a math-fundamental blog in the future.

  9. Emotional management: Programming to me is 10% coding, 40% problem solving, and 50% fixing bugs. There will be moments when you must stare at a screen for many consecutive hours, sometimes even days. This, of course, doesn’t mean no progress at all. To survive these moments, you will need the mental toughness to keep track of your progress and not be anxious that you can’t enter flow (This is the first blog I wrote about).

That is my list of Software Engineer fundamentals for now. In the future, I will probably write more similar blogs about math, physics, cybersecurity, and AI. Remember, I am still just a student and am only writing these blogs for my own personal sake of learning, so if there is anything I said that is wrong or missing, feel free to contact me and criticize my writing.