During your quest to become a software developer, you’ll encounter some domains that may or may not merit study in their own right. Everything on this list is valuable but dispensable. You could get a job as a developer (as a member of our Accelerator, for example) without knowing what static analysis is, for instance.
And yet, I’d suggest choosing a few of these areas to study. It’s difficult to imagine a strong entry-level software developer candidate for whom everything on this list is a revelation. And if you want to make software for a living, you’ll eventually pick up a lot of the skills on this list anyway.
Theory of Computation
This subject is essentially the story of Turing machines, but you have to build up to the idea of a Turing machine by understanding various kinds of state machines first. The Theory of Computation (ToC) is interesting because it contains a lot of the Big Questions in Computer Science, like, “What sort of problems are unsolvable? And what sort of problems are solvable, but only if you have a trillion years to crunch numbers?” If you want an accessible overview of the big questions, I’d suggest reading Lance Fortnow’s The Golden Ticket: P, NP, and the Search for the Impossible.
Study this if:
- You want to build a compiler.
- You want to dig really deep into parsers and language grammars.
Things you should learn:
Get to know what a state machine is, how to use one to describe a system, and that static analysis isn’t perfect. (Wow! You already got part of this just by reading the previous sentence.)
Stuff That’s Close to the Hardware
There are many CS subjects that get really close to hardware. Some languages (like assembly language) have constructs that model physical pieces of hardware (like moving bits into a register of a CPU).
As an academic subject, the study of operating systems falls into this category. It is concerned with how information is stored in memory and how programs are separated and managed by a CPU. This is really neat stuff, but it is not something that you’ll definitely need deep knowledge of as an entry-level software developer…though you might! It just depends on what you want to do.
Study this if:
- You think you might be interested in real-time computing.
- You want to do scientific simulations or some other performance-bound task.
- You just really like operating systems.
Things you should learn:
You should understand the idea of a CPU cycle and the Stack/Heap memory models. How does a stack overflow happen? What is a process, and how is it different from a thread? How many items of a particular data type (string, Boolean, integer, float) can a modern computer hold in memory?
Databases
I took a really top-notch database course and loved it. We did some straight-up relational algebra, which forms the basis for the logic behind relational databases. This might be a good “reach” class; if you can spend some time digging deeply into databases, I’d recommend it. However, ORMs are pretty good at preventing you from having to know too much about a database, so I don’t think a semester of work is justifiable. You’ll likely use databases a lot throughout your career and learn incrementally.
Things you should learn:
You’ll learn what normalization is and how to write a basic query without Googling the syntax*, along with how to make an ER diagram to model a simple system. (If I’m being completely honest, I sometimes have to Google basic SQL syntax. So maybe you should aim for knowing how to write a basic query that would seem like it would work on a whiteboard, divorced from a specific implementation of the SQL standard.)
Networks
You’ll be dealing with this subject quite a lot, but 95% of what you’d learn in a CS networks class will be abstracted away from you by the time you’re writing Python/Java/whatever.
You need to understand how HTTP requests work and how they’re used to communicate information via REST APIs. The Beginner’s Guide to Creating a REST API is a good starting point.
Things you should learn:
It’s helpful to have a high-level understanding of the OSI Model, not because you’ll use it specifically, but because the concept is helpful for software design.
You should also get this joke, and why a TCP joke is too tedious to be funny.
Modeling & Design
I don’t have much to say about this subject since there’s just not a lot of use for heavyweight Unified Modeling Language (UML) diagram creation in the flavor of Agile software development that I have practiced. Some kinds of diagrams are helpful for communicating constraints or design to stakeholders, but when it comes to design patterns and programming paradigms, an abstract approach is the wrong one. The way you learn useful design patterns is by getting into a code base and either witnessing or creating bad patterns.
Study this if:
You care more about designing theoretical systems than building them (in which case, this guide might be the wrong guide for you).
Things you should learn:
Figure out how to draw a sequence diagram and an entity relationship diagram.
Advanced Algorithms
Once you know how to implement a good graph algorithm like Dijkstra’s and get a grasp of dynamic programming, you hit a wall of diminishing returns. Academic courses in this subject also tend to have a more mathematical/theoretical focus than a practical approach. You’ll probably never need to know what little omega (Big-O’s “loose” counterpart) notation is, for instance, unless you want to teach the subject in an academic setting.
Study this if:
- You want to be a computer science professor (in which case, you are reading the wrong guide).
- It’s just something that you like to study! It looks good in a GitHub profile.
Things you should learn:
Figure out a good graph algorithm, like Dijkstra’s.
As long as you spend your time making stuff, you will get enough exposure to these concepts, but it is helpful to think about them as their own domains, too. As I’ve said before, this discipline is incredibly broad and deep, and my series is just looking at the traditional components of a computer science degree.
You might end up really digging into some of this stuff, and you might not–maybe you’re too busy figuring out how to train the machine-learning model for your virtual reality app’s natural language processing feature.
If you’re working on becoming a software developer, get in touch! My home email is [email protected]. Let me know how it’s going, what worked for you, or even where you need help.
You should also check out the rest of the series:
- A Roadmap
- Understanding Algorithms
- Learning to Think Like a Programmer
- Expanding Your Skills into Other Domains
- Finding a Community
Good luck!