advice for an aspiring programmer


Last week we interviewed a candidate who we really liked but who was much too green. He asked for some advice, so here’s what I wrote — might as well put it online. Hopefully it’s a little more specific and opinionated than these things tend to be.


It was a real pleasure to meet you, but your instincts are right: at this point we have to invest in people with a bit more experience under their belts. I do want to stress, though, that your enthusiasm and interest in software engineering came through clearly, and made us all enthusiastic about the developer you will no doubt become.

Toward that end, let me offer a little more advice than I usually put into these sorts of emails:

  • Pick a technology and invest time in it. There is tremendous value to understanding the repetition of patterns across engineering domains, but you need to gain deep expertise in one before you can do so effectively.
  • I’ll be more specific: pick one of these technologies — Ruby, Python, Node/Javascript. All have vibrant open source communities from which you can learn a lot for free. All have bustling job markets. All have bindings in a huge variety of domains. All are abstract and widely supported and will spare you many of lower-level languages’ headaches. All have robust web frameworks. Personally, I’d suggest Python, because it is the most stable and widely supported. It’s everywhere– it is Google’s noncompiled language of choice, for instance, and widely used in scientific computing and a huge number of other areas. But its community is less fun and accessible than the others, and it’s more sedate. The others will take you on a wilder ride, but you will probably have to learn things a few times as the community changes its mind about how to solve a problem. This is extra true for Node and less so for Ruby — which reflects each community’s age.
  • There is a premium for mobile dev work, but I wouldn’t invest in that right now because it’s too specialized to be a great way to learn. Also iOS will be in turmoil thanks to Swift, and Java dev is a drag outside the genuinely-exciting opportunities of Android.
  • Focus on the web and the key tasks associated with it. Skim the topics that other languages’ web frameworks cover — they all solve the same problems in slightly different ways. Invest a little time in learning jQuery — being able to build out web templates is a very plausible starter job, and one you can get good at fast. Also, make a point of learning regular expressions and the network libraries and functions necessary for using APIs.
  • You do not need to know much about data structures, compiler design, sorting algorithms, recursion or most of the other things that they teach you in a CS program.
  • Microsoft technologies can earn you money but will never fully integrate with the world of open source software, which is where the best engineers and most exciting projects exist. I have written Visual Basic for a living; I don’t think you should write any more of it. The .NET frameworks are okay but basically a less-open version of Java. Everyone hates Java.
  • I wrote PHP for many years professionally and still think it is a cheap, useful tool. It gets zero respect in programming circles, though — I would not suggest spending more time learning it until/unless you have mastered something more prestigious and just want it for quick personal projects.
  • You should probably learn with a good text editor (but not an IDE) and the command line as your primary tools. On OS X I like Sublime Text 2. Speaking of which: you should be developing on OS X or Linux (people around here tend to favor Ubuntu or Mint). If you’re on Windows now this will be painful, but you will never fully connect with the open source world and its idioms unless you get used to the *nix command line interface.
  • There is no substitute for working with engineers who are better than you are. This is tough until you get yourself hired somewhere, though! On the far end there are code bootcamps, but those cost money. On the near end there are technical meetups — shop around and find one that seems technical enough to teach you things. Contributing to open source projects is a good idea, too — writing an IG scraper for Sunlight might be an approachable task (he said selfishly). Online tutorials can take you a long way if you put in the time.
  • Get active on Github! Follow how people like Eric Mill (@konklone) and Tom Macwright (@tmcw) and Josh Tauberer (@govtrack) do their work. Recognize that filing tickets is a valid way to contribute, as long as they are well-informed. It doesn’t have to all be pull requests.
  • Master the art of googling for error messages. Using search engines, Stack Exchange, mailing lists and IRC properly to uncover unknown answers is maybe the most important skill in real-life programming.
  • Once you identify superstar programmers, follow them on Twitter or their blogs. The writing of people like Ian Bicking will get you familiar with the cultural context surrounding your programming language of choice. Speaking of which: conferences can be pricey but once you’re ready they can be a really good way to learn — if you pick the right one. Pycon is excellent. I know less about the other languages’ marquee cons.
  • Spend some time reading about diversity in technology. The situation is not good, and a lot of people are working very hard to change it. This is a huge topic of discussion right now and you need to be able to talk about it intelligently.
  • If someone mentions linked data or the semantic web and they have never held a job at Google, assume they are about to waste your time.

There! I think that’s all the advice I can come up with for someone in your shoes. Ask me questions when you have them. And good luck.

About the author

Tom Lee
By Tom Lee