How to Become a Great Programmer
Over the past 6 months, I’ve been asked many times by new grad engineers how to land that internship or job out of school. It’s a tough market out there for junior people. I was quite lucky to have graduated in 2019 and had a good new grad offer in a company with great engineering culture. The market right now is significantly tougher.
Part of the question they’re asking is: how do I even get the experience required to land one of these jobs where all of my experience is just algorithms classes in python in school? Having grown from student to new grad / intern to mid to senior engineer to now YC startup CTO over the past ~decade, I thought I’d put together a guide for how to become a great programmer. There’s a lot of generic advice out there (ie you gotta do side projects and build your portfolio), but I think a lot of it misses the mark on how to become truly great.
Personality Traits of Great Programmers
Suprisingly common threads I’ve seen with great programmers I’ve worked with:
Persistent, willing to keep digging into bugs for hours (or even days) at a time
Ambition, have a genuine desire to *actually* build something
Curiousity and passion for technology - see sites like news.ycombinator.com - this is where these people are day in / day out constantly learning
A pretty big component of success is just not giving up and having something that drives you to just keep trying. Learning to be good at programming is a compounding game and it actually gets exponentially easier the longer you’ve been doing it. The hardest time you will have while you’re programming is when you’re just starting out, because it’s when you know the least, are the most prone to getting stuck. When you know *nothing* you’re going to spend quite literally *days* on stack overflow and chatgpt just trying to piece together fundamental concepts for how things work. You need to be persistent to get through that phase.
Even senior engineers will run into bugs that will stump them. Slowly that persistence turns into an “art of how to unblock yourself“ which I actually think is one of the most important and not talked about skills of programming: knowing which resources to go to in order to solve problems (sometimes this can even be other progammers - senior engineers aren’t afraid to ask for help). Over time, engineers become experts in quickly finding the solution to these problems. It starts with persistence though of just trying everything and not giving up until you have a solution.
Where to Start
The side project / portfolio advice is kind of a misnomer. You need to have built something and know how to write basic code, but that doesn’t mean you need a portfolio of 10 side projects to get a job. Ultimately you just need to be able to convince a perspective employeer that you’re capable and will add value, and at the end of the day they will be taking a chance on *you* to deliver. A lot of this comes down to ambition instead of pure skills. Better ways to really wow them are to show initiative. Show up at their office with a pizza and your resume. Find an issue in their docs and put up a PR to fix the bug. This kind of thing is much more likely to land you a job than more side projects.
My advice: work on 1-2 things that teach you the basics. Get stuck, then unstuck yourself, do that a few times to get reps out and have something to show for it. Don’t obsess over building a side project portfolio though.
Finding Your Mentor
The single most important factor in an engineer’s progression is the mentors and engineer culture they find along the way. There’s your expensive college CS degree, but what you find is when you get out into the real world there’s almost a second education of going from knowing how to program to knowing how to be a great engineer. These are two very different things.
After learning how to program, which your college classes will get you, the best way to learn how to become a great engineer is to watch great engineers work. For me personally, I found this as an intern at Coinbase. I interned summer 2018 through my last year of school, hopping on video calls between classes with my team. The engineer I worked with the most on my team was a senior staff level engineer named Rob. Between classes, Rob would slack me “wanna pair?“ and I’d spend hours literally just watching Rob ship code, debug issues, solve problems, run comms across the team etc. It was those pairing sessions where I really learned how to become a good engineer (all of the parts besides the programming). Give it 6-8 months and I was very independent. To this day, I still love pairing with folks and learning from them.
The most important factor in your learning will be the engineers and the engineering culture you surround yourself with. At the very beginning there can be this extreme level of imposter sindrome where you can feel like “I should know this.“ What you don’t see is that most of the time when companies are hiring junior engineers, really their making an *investment* on the future of that engineer. They expect you to pair and learn from their senior folks for good chunks of the day, learning through osmosis. They’re betting that you’ll become just as good and stick around to make impact at the company. My main takeaway: you gotta find your Rob to really learn how to be great.
I still do this for junior folks. What you’ll find is that most if not all senior folks actually really love paying this forward and make it a big part of their job to mentor junior engineers as part of their impact. After having done this for a while, I have engineers and friends who I started pairing with and they could barely write code, and now they’re senior engineers. It’s incredibly gratifying to see that process unfold.
Impact
Once you know how to program and how to be a good engineer, going from good to great is all about the impact you drive and knowing what to work on. This is the part that I don’t forsee chatgpt being able to do soon, if ever. The most senior engineers at companies like google and meta are these principal, distinguished etc engineers who exist at the same level as senior directors and VPs at their companies (they get paid the same too, which is a lot). The question you have to ask yourself is: how can a single programmer make the same impact in the organization as a VP managing hundreds of people?
The answer is they’re laser focused on the places that drive the most bottom line impact, and essentially they hop from project to project driving many millions of dollars in impact every year. They often position themselves at the infrastructure or platform layers so that they can make broader impact across companies.
A good example is load times on some of these consumer apps (think google, instagram). If you can reduce the load time by 20ms on average, that drives tens if not hundreds of millions of dollars in additional revenue for these companies because more people use the app over time with those improvements. These “super senior“ engineers are kind of like swiss army knives at solving these problems, and they do it faster and better than anyone else. There’s a startup CTO equivalent where knowing what to focus your time on that drives bottom line impact is oftentimes the most valuable skill, not the programming itself.