Letter to a Young Programmer
By: Matthew Macdonald
Tags: Careers, Programming, Personal Development, Computer Science, Education

Hello again! I got your message last week, and was excited to hear that you’re thinking of studying programming — maybe even making a career out of it. I can just barely remember my own first steps, when I stared up at the immense wall of theory, languages, and design patterns. There were layers and layers to peel back, like Feynman’s onion. Back then the layers were the databases, networking, and desktop front-end that made a client-server application. Today it’s the cloud on one side and a tangle of JavaScript frameworks on the other. (The more things change, the more they stay the same!)

The craft of computer programming has been very good to me. I don’t have all the answers — and some of my wisdom is probably just foolish luck in disguise. But I’ve learned a few lessons, some more painfully than others. Maybe some of it can be useful to you now.

Here’s what I know to be true.

Time is on your side

When you’re a beginner, you often look at the vast world of computer science and wonder how you’ll ever develop true, deep expertise. Yes, you can learn, but how can anyone learn everything in a field that’s growing so relentlessly, expanding with new ideas day by day?

What you don’t realize yet is that time is not on obstacle, but an equalizer. Senior programmers are also looking at new developments and today’s trend-setting languages. They’re wondering how they can keep up with new technology, how they can prevent their best skills from becoming obsolete, and what to do when their hard-won knowledge becomes stale.

Every programmer who still cares about the craft is juggling current-day work with the need to acquire new skills.

You envy them for what they know, but they envy you because you have the time and opportunity to explore new horizons. You haven’t tied yourself to a favorite language, or developed habits with a single code editor. You don’t need to worry about defending your margin of expertise.

Always remember: Programming is the only discipline that naturally resets itself with new learning. It’s a subtle way of leveling the playing field. The expert coders of today will still be the expert coders of tomorrow, but you’ll all get the chance to be beginners in the face of something new.

Remember to get sidetracked

Plenty of people will tell you to specialize in a narrow slice of computer science. They’ll tell you that it’s the only way to be employable. Ignore them.

In fact, I’d suggest the exact opposite. When you start, you should try as many different things as possible. Give new languages a whirl. Read up on fields like machine learning and natural language processing, even if you don’t plan to pursue them in depth. Get a basic background in cryptography, try making a native phone app, indulge in functional programming alongside the traditional OOP. Contribute to an open source project. Get to know what’s out there.

Yes, there comes a point — usually when you’re searching for a programming job — when specialization is an asset. But if you go deep in one field too soon, you’ll lose out on one of the most important abilities a young coder can develop: instinct.

The broader your view, the better you can see the patterns in systems, including the common problems that challenge projects, and the places similar solutions reappear.

Having a broad perspective is the only way you’ll be able to compare different ideas and evaluate different architectures. It’s the difference between a furniture-builder that follows a scripted IKEA instruction booklet and a woodworker who can craft a perfect piece that fits seamlessly into its surroundings.

Once you’re more experienced, you should… keep exploring! Because there is really no better way to renew your skills and refresh your enthusiasm than learning something new.

Make time to play. You never know where it might go. The passion project that starts out as self-improvement can morph into a money-making side hustle, or even a new business. The world of software programming is filled with happy accidents.

Don’t overthink your education

You’re going to wrestle with the question of where to learn your coding skills. A formal college computer science education is definitely valuable. It gives you a broad foundation to start with, and lets you begin learning without worrying about what you should be learning.

Even if you choose to get a computer science degree, you still need to take the next step. The people you work with, the companies you work for, the open-source projects you contribute to will all expect you to be familiar with platforms and languages beyond the academic ones you mastered in school. It’s up to you to fill the gap. If you’re a person who loves lifetime learning, you’re in the right place.

If you don’t have the time or money for formal schooling, the road starts out steeper but isn’t as intimidating as it looks. The world is full of articles, tutorials, and smart people willing to contribute their time and insight to help you be successful. Seek them out.

Few disciplines have information so widely distributed and essentially free. You can’t be a self-taught doctor or nuclear engineer.

One day — and it will likely happen before you expect — you’ll suddenly find yourself in a position where you can contribute back to community by sharing your own ideas and advice. You’ll do that, and then realize that you’re learning even more in the process.

Accept that will you write bugs forever

Programming is a bit of a paradox. Some days it feels like a superpower. The tasks you once struggled with are suddenly easy. You can imagine something, and then make a lifeless assemblage of metal and silicon follow your vision.

Other days, programming is a humbling experience that reminds you how little you know. Every non-genius-level coder struggles with this reality. Just accept that you can meet every coding challenge, just not on the first try. Remember to accept criticism and lower your ego when you need to learn something new from someone who’s been there before. Strive to keep your code as simple as you can, because premature cleverness is the root of much evil.

And above all else, remember that writing code means writing bugs. If you understand this painful reality, you will take the time to hammer and polish the dented metal of your first attempt until you have something gleaming and strong. And you’ll remember to test your vastly improved code before you release it to the world. Because the simplest of tests can find innocent mistakes that have catastrophic results.

Writing good code comes from writing bad code — but only if you learn its lessons. Plenty of people write bad code forever.

And be ready for the final lesson. Eventually you will fail, and if you are a great programmer, you will learn more from that than anything that came before.