"You cannot protect yourself from sadness without protecting yourself from happiness." — Jonathan Safran Foer
There has not been a day in my life where Google has not existed1. My generation is the first to have ubiquitous access to an enormous amount of technology and information, and people such as Mark Zuckerberg, will.i.am, and President Barack Obama are advocating for the importance of implementing universally mandated computer science education in hopes of creating the next wave of innovators.
Students are slowly catching on, and events such as hackathons, the Hour of Code, and developer conferences are fueling the fire. In the Silicon Valley, the competitive culture combined with the plethora of corporate and academic giants surrounding the students increases this drive by several orders of magnitude. However, many of them have no idea where to start. I get asked questions like "What online courses should I take to become a good coder?" or "What language should I learn to get an internship at X?". I want to clear some misconceptions as well as provide some great tips for anyone wanting to learn.
Many of the people who ask me for advice often get the terms programmer and computer scientist confused or think of them as the same thing. Let's see what the Oxford Dictionary has to say.
Although related, the two are quite different.
In essence, programmers make computers do things for them (e.g. search the web, grade a paper, host a website, etc.). You do not need to have a strong math background to be a great programmer. However, having your fundamental math and computer science principles down are always an added bonus. Some great programmers include Facebook CEO Mark Zuckerberg, Linux creator Linus Torvalds, and Reddit co-founder and CEO Steve Huffman. In contrast, computer scientists study the theoretical principles behind computers (i.e. algorithms, data structures, machine learning, encryption, etc.). Having strong mathematical intuition is (in almost all cases) a requirement. Some great computer scientists include Alan Turing, self-driving car expert Sebastian Thrun, and the University of California's Brian Harvey.
Now that we've cleared up the difference between programmers and computer scientists, I want to talk about this strange group of people that identifies as neither computer scientist nor programmer: hackers. There are two kinds of hackers. Those that want your money, and those that like to tinker. From here on out, when I use the term hacker, I'll almost always be referring to the latter.
Hackers can be described as make-it-happen machines. Give them an idea, and they will find a way to make it work. They are not limited by their experience, the languages or technologies they've worked with, or the hours of sleep they sacrifice. It's because of their rapidly iterative workflow that they are able to do what they do. Hackathons are built on top of this mentality of "move fast and break things". It's because of hackers that companies like Google, Facebook, and Snapchat exist2.
I wouldn't call myself a super hacker or an amazing computer scientist or an ingenious programmer. I'm honestly just a student who likes to build things. But, I have learned a thing or two over the last 10 years that may help someone new.
Like most kids, I played with LEGO when I was young. To be fair, I would probably still be playing with LEGO today if I had the time3. At some point, I stopped following the instructions that came with the LEGO kits and I would mix and match pieces from different sets to create something different. I kept building more and more complicated things from very simple blocks. This is a very simple mentality and has stuck with me since then.
This became more relevant when I started coding after my neighbor introduced me to the MIT Scratch Programming Environment in 2008. I continued building, just with a different set of (virtual) blocks. I thought I had gotten pretty good at the whole Scratch thing when I finally outgrew it in 2010, only to find that people were building insane web experiments and tools using what I thought was an environment for kids...
A lot of stuff happened in between those vital first steps. I interned at a couple of startups, did some freelance work, attended (and won) numerous hackathons, learned a variety of technologies, and won a couple of cool scholarships and awards at tech conferences and robotics competitions. Right now, I continue to learn and grow as a hacker by exploring new technologies. I'm currently trying to figure out how to effectively combine music-making and machine learning.
I'm going to keep this short and simple. You don't need to take tons of online university courses or finish Advanced Placement BC Calculus by the time you're done with middle school in order to get good at programming. Here are some things you should try:
This is a pretty rough guide, and I'm sure it'll improve as time moves on. If you have any questions, feel free to shoot me an email or ping me on one of my social network channels.
Sometimes the best way to learn to swim is to get thrown in the ocean.