Musings on Self-Studying Computer Science
Theory, practice, and climbing the mountain
I’ve been exploring compilers, PL theory, and other areas of computer science recently, and I’ve been thinking a lot about my experience.
I’ve been programming professionally now for a while, albeit in web development and nothing quite as daunting as compiler work. But as I’ve been learning about it, I’ve noticed that certain parts of the learning process feel particularly difficult to me.
There are two parts to learning to create software from what I can tell: learning how to actually construct programs, and learning the domain knowledge required.
People have talked about the former at length and the phenomenon of getting stuck doing tutorial after tutorial and not getting anywhere. The latter, however, seems to be the real challenge once you’ve gotten programming down.
I want to explore both of these a little bit further, starting with building programs and talking about my own experience as someone who knows how to program, but is exploring new domains and trying to acquire knowledge there.
Maybe you’ll be able to relate.
Thinking in algorithms
What people usually talk about and struggle with when it comes to programming is learning to “think algorithmically”.
New programmers are inexperienced at program design, and have to learn how to construct programs step-by-step. Eventually you build up experience using the concepts and data structures you know.
Once you understand algorithmic thinking, you can break up your program into smaller pieces, create functions, model input/output, and the act of programming becomes less tricky. This is combined with the fact that code is malleable: there’s no rule saying you can’t refactor or improve your code.
For me this felt like the easy part compared to the Herculean effort required to actually acquire domain knowledge.
Let’s take web development, for example. When you want to build a new full-stack CRUD app, depending how far into you want to get into it you’ll have questions like:
How does authentication work? What are session cookies? How do I create a session in my database and persist it in the frontend? How do I manage state for this? What even is a database transaction? What is row-level security? Do I need it? Do I need to start caching data? Why am I getting a CORS error? What even is CORS?
I’ll stop the rant now because I think you get the point. I end up starting to feel like this dude from Jujutsu Kaisen.
This is obviously true for anything new you want to learn, but now feels much more apparent to me.
The “build it” attitude and complex domains
Being able to program almost gives me a false sense of confidence when I’m exploring these domains which actually require quite a lot of rigor and prerequisite knowledge.
The builder in me is like, “woo, I want to make a programming language!”, but then I’m like “…okay, where do I even begin?”
So it’s onto learning about lexers and parsers, and parsing requires you to know about ASTs, which requires you to know about trees in general, and that’s without even getting into semantic analysis, IR (Intermediate Representation), or any other backend stuff yet.
Of course, this is true of anything new you start learning. In fact, thinking about it, it’s not all that different from the domain knowledge in the web development example I mentioned.
However, certain CS topics do feel a little harder to me though. Maybe this is because it’s as much abstract as it is practical which makes it very easy for me to get yanked down rabbit holes and not emerge for a number of weeks, or maybe it’s just unfamiliarity.
I’m just so eager to build sometimes that I end up trying to walk before I can run, and I need to sit down and actually study for a bit first, and not trick myself into thinking that acquiring this knowledge is somehow “unproductive” because I’m not putting fingers on a keyboard and writing code.
Outside of the technical stuff there’s also another part which comes along with self-learning these topics.
It’s a lonely journey
Self-studying CS and software development can be quite a solitary journey.
When you’ve taken it upon yourself to a learn a topic (and you don’t have a classroom full of peers to discuss answers with, or a professor to consult), it’s just hard.
Luckily the internet exists and it’s pretty easy to find forums, books, websites, and other resources that you can use. That being said, sometimes I think more focused and smaller groups can make for better learning experiences.
The need for a community is part of the reason I formed this newsletter. I hope to eventually build a place where people interested in CS (and programming languages in particular) can come and learn, chat, and grow.
If that’s something that would interest you, please comment/reply and let me know.
Thanks for reading.
If you want to read more posts on functional programming, PL development, and self-learning, feel free to subscribe.






Cool stuff, hope that you keep it up and can find people to give you some community scaffolding.