How to Become a Good Programmer (With Open Source)
A sequel to "Hackathons Are Ruining Students"
In my previous post, I explained why modern hackathons are doing more harm than good for computer science students. But that piece felt incomplete—I criticized without offering a path forward. So here’s the constructive follow-up: how I learned to become a good programmer, and how you can too.
A note before we begin: this advice won’t apply to everyone. Web developers, for instance, may find some of this less relevant. But I believe most programmers will recognize these principles as foundational.
The Best Way to Learn Is From Good Teachers
This holds true across every discipline—music, mathematics, art, science. The fastest, most reliable path to expertise is learning from someone who’s already mastered the craft. Think of teenage pianists who travel across countries to study with legendary tutors. Programming is no different.
Here’s the problem: computer science is barely a century old, yet it’s become one of the most popular fields in the world. The demand for great teachers far outstrips the supply.
But that doesn’t mean you’re out of luck.
We have something better than a scarce handful of mentors: hundreds of excellent books written by legendary programmers. Yes, many students avoid them—they’re long, dense, and admittedly boring at times. But progress in any field has boring parts. Computer science is no exception. And I promise you, working through these books is infinitely more valuable than churning out throwaway projects at hackathons.
For fundamentals, I recommend Computer Systems: A Programmer’s Perspective and Computer Architecture: A Quantitative Approach. For the C programming language, start with C Programming: A Modern Approach, then move to The C Programming Language and Modern C.
Now, some of you might argue that starting with C is outdated—that Python is a better entry point. That’s a reasonable position, but here’s the truth: you’ll need to learn C eventually. No exceptions. Even if you’re a web developer, understanding what C teaches you will make you more effective—whether that’s tracking down why your app is slow, profiling performance, or occasionally digging into browser internals. Languages like C++, Rust, and Zig exist, but C remains the simplest and most direct way to understand how machines actually work.
After that, learn algorithms. Introduction to Algorithms is the gold standard. Once you’ve read it, you’ll find that understanding new algorithms becomes straightforward—often just a matter of reading a Wikipedia page and some example code. LeetCode has its place, but don’t grind through hard problems for the sake of it. Focus on easy and medium difficulty. Instead of memorizing solutions, learn to recognize patterns. When you face an algorithmic challenge at work or in an interview, you’ll spend less time both planning and implementing.
Open Source Is Your Classroom
Now you need real-world experience. But before you start writing code, study how others have done it.
Remember what I said about learning from good teachers? The open-source world is filled with them. Want to see exemplary object-oriented, modern C++? Study the LLVM project. Curious about how operating systems work? Explore FreeBSD, XNU (macOS's kernel), Linux, and FreeRTOS.
Here’s the catch: not all open-source code is worth studying. Even the Linux kernel has its infamous staging drivers—poorly maintained code that exists in a kind of purgatory for a reason. But as you read more, you’ll develop the ability to distinguish good code from bad. You’ll start to sense when something is off.
This “smell”—the instinct that tells you code was written by a beginner, by an experienced developer new to a codebase, or by AI—is hard to articulate, but unmistakable once you’ve internalized it. After reading a few hundred thousand lines, you’ll know. If you ever want to advance to senior-level work, this skill is non-negotiable.
Whatever your area of interest—databases, web servers, quantitative finance, cryptography, blockchain, AI, GPU programming, video games—find the most respected project in that space. Ninety percent of the time, you’ll be learning from the best. (There are exceptions; GPU kernels written in CUDA, for instance, leaves much to be desired.) If you’re unsure, ask around—forums, communities, and colleagues can point you toward the gold-standard implementation of whatever you’re studying.
Unless you’re working on classified military software, you can find source code for almost anything online—including, as a fun fact, leaked Windows XP kernel code.
Conclusion
So yes, becoming a good programmer involves a lot of reading—books and real-world code. Sounds boring? Welcome to professional-level work in any field.
If you’d rather stick to hobby projects and hackathons, that’s fine—but then why pursue a computer science degree? You can do those things without one. Once you’ve committed to this field, it’s time to do what students in every other serious discipline do: learn from the best examples, written by the best teachers.
The shortcuts aren’t shortcuts. The fundamentals are the path.