How to Learn to Be a Programmer
Tags: programming, habitforming
Published: 2021-04-01 17:45:43

This is a loose curriculum meant for anyone with negligible coding experience, or who has tried online coding tutorials before but with little success. After following this guide, you'll have the skills and preparation to land a job as a programmer.

After jobs across high-growth startups, Amazon and Google (where I currently work), and building my own startup, I've learned quite a bit on what's needed to embark and excel as a programmer. In response to numerous friends and family asking me where to start programming, I'm condensing my knowledge in written form.

Today, I'm going to write about what "becoming a programmer" means, and how to succeed in learning and changing your habits to become one.

## Mindset

First of all, you'll need to convince yourself learning to program is worth it. If you're considering software engineering as an alternative to your current role, here are some of the advantages:
* Fulfilling, challenging work
* Unbeatable salaries
* Large amount of jobs + geographic flexibility

Now, if you are interested in making this change, it's good to set expectations. Learning to code (at a professional level) is an investment in yourself, and often a very good one. From a monetary standpoint, compare your salary to the median salary of a software engineer in a US metro area at $150,000¹. Multiply that difference by how many more years until you are 55 years old. This is a trite example, but consider that number as a potential yield from your 6–12 month investment into learning to code. There is a cost to investing in yourself, but the yields and expansion of opportunity far outweigh anything else.

I preface the technical portion of this article with a focus on mindset for multiple reasons. One is because many of those learning to code give up². Another is because for many in their lives this may be the first large self-initialized change in lifestyle or habits. Most significant writers did not focus on "becoming a writer", they focused on consistently writing. Similarly, our biggest focus while learning to code will not be on just "becoming a programmer" by the end of a year, but rather instilling the habit of programming. For this reason, one of the resources I'm going to strongly recommend is "Atomic Habits". It's changed the way I see habits and behaviors in my life. The audio-book on Audible is an excellent listen with 15–20 minute chapters, making them perfectly bite-sized.

Now that we've discussed changes in mindset, let's take a look at the tangible changes we'll be spending our time making.

## Learning Path

There are different areas that one can specialize in in programming. Some notable ones would include:
* Web development: Building websites, apps (frontend) and the servers, databases and data pipelines that power them (backend)
* Machine Learning: Building advanced analytical models and applying those models for data-based decision-making
* Mobile Development: Similar to web development, but with a focus on serving clients using smaller devices limited by power and bandwidth

If you didn't begin this article with one of these in mind, I'm going to recommend generalist / web development. This will give you tangible feedback while coding, in the form of a website being built before your eyes. It also results in projects which you can use to create a portfolio to show potential employers. Job availability continues to grow in this area, and it's a generalized and transferable skill-set if you find a topic that interests you more at a later time.

##### So, how do we build the habit of learning web development?

We're going to begin our focus on free, online classes that will provide a broad base of programming concepts, such as abstraction, data structures and algorithms. Then, specialize in a single language that you can use for a multitude of projects. Focusing on a single language early will allow you to progress further without being overwhelmed by learning multiple syntaxes and coding styles. Note: If you have the availability of attending a coding bootcamp, that will likely accelerate your journey, at the cost of more time and capital. I won't spend time on the pros and cons of these programs, as this article is primarily aimed at those who don't have plans to attend a bootcamp.

To start, you should take [Harvard's Introduction to Computer Science online course](https://online-learning.harvard.edu/course/cs50-introduction-computer-science?delta=0). This is one of the most prominent online classes (across all subjects) and was one of the courses that helped kick off the global revolution of high-quality, free online education. It's recommended across the board, and covers a good base of both technical and conceptual topics.

After that course is finished, it becomes time to move on to studying with a deeper, more narrow focus. For web development, the great options for language choices are Javascript, Python, and Ruby on Rails, in no strict order. Here are some brief pros and cons of each, but know, there is no wrong choice.

![Javascript](https://i.imgur.com/44hwu1f.png)
![Ruby on Rails](https://i.imgur.com/AwAFTTZ.png)
![Python](https://i.imgur.com/8uRwTm5.png)

Each of these choices will lead to great job availability and salary, just choose whichever sounds most interesting for now. The skills are transferable, and overlapping (Did I mention Python and Rails projects often import Javascript for interactivity on their pages? Also, some websites are built with a Javascript frontend but a Ruby on Rails or Python backend!). Again, no reason to worry or delay on this decision, as you cannot make a wrong choice.

Which language you choose could also be influenced by the next step in the process, which is selecting a resource to learn from. There are many free online resources to learn coding, here are some of the highest rated:

For Javascript, check out https://www.freecodecamp.org/. This has a massive amount of online free content that is relevant, high-quality and bite-sized.

You can also check out the [Odin Project](https://www.theodinproject.com/paths). They have comprehensive paths for both Javascript and Ruby on Rails. They also have a "foundations" path for those who aren't interested in Harvard's CS50 course.

For Python, I recommend [this syllabus and plan to learn Python with Django from Reddit](https://www.reddit.com/r/learnprogramming/comments/i9vuhr/i_wrote_a_syllabus_for_learning_python_and_django/). It comes with an actionable syllabus that provides similar structure to an online course.

After finishing one of these paths, you'll be well on your way to entry-level programming, and will be able to effectively gauge where you want to head next. General ideas include building websites to create a portfolio or contributing to an open source project. Now, let's talk about some things to help you stay engaged while learning.

## Join the Community

Communities can be one of the most potent influences in reinforcing habits (something I've learned from Atomic Habits). There's a huge community of people learning, coding and building online that will help motivate you. The [learn programming subreddit](https://www.reddit.com/r/learnprogramming/) has 2.1 million people that share your journey. On Twitter, some of the accounts I've learned most from are Daniel Vassallo (https://twitter.com/dvassallo), Sahil Lavingia (https://twitter.com/shl) and [Peter Askew](https://twitter.com/searchbound?lang=en). You can also [follow me](https://twitter.com/forrestwbutler) if you'd like, I tweet about building my own Software as a Service startup in public.

Even if you've never tweeted in your life, now is a great time. Share the news that you are even just beginning the path of coding. It could help others to make the leap also. You could set yourself the habit of making a weekly tweet about new concepts you've learned, or even just things you've heard about that interest you. [As an apprentice, your perspective is sometimes more valuable than the master's](https://twitter.com/dvassallo/status/1375538223397675010).

## Tips and Tricks
Lastly, I want to share some miscellaneous advice which could be helpful to hear once and forget, so that next time you hear them it might stick.

#### You have to google better.
Many wouldn't intuitively call "googling" a skill, but software engineers know better. A search engine is a mathematical function: it takes a phrase as an input, and gives knowledge (in the form of links) as an output. For topics that are highly documented on the internet like programming, learning to index that information is critical. You'll quickly come across a website https://stackoverflow.com/, a Q&A styled programming forum. Learn to use it well, as many of your google searches will lead you here anyways. A few months down the line from starting, it will be well worth your time to spend 15 minutes researching "how to google better", especially in context of programming. For now, I'll leave you with one advice: Google is meant for searching topics, not questions. Example bad search: "why is my python server not starting?" Example good search: "python server 404 [X ERROR MESSAGE FROM LOGS]".

#### Most beginning courses will give their recommendations of tools to use, here are mine.
To edit code, you'll use what's called a text editor. Think Microsoft Word or Google Docs, but instead of options to help create written documents, they'll have features to support writing readable and correct code. A surefire beginner tool is Sublime Text. This is as simple as it gets, and will always be fine for your first few weeks, with an easy to use interface. If you want to use a more powerful tool, you should use either VsCode (if you are writing Javascript or Ruby) or Intellij IDEA Community Edition (for any other language). Intellij is my preference, but the free version doesn't support Javascript or Ruby, so your mileage may vary.

#### You will learn to think differently.
This isn't as crazy or foreign as it sounds. For example, you likely spent decades of your life in English courses learning critical thinking, or in science classes learning the basis of the scientific method, structuring your thoughts in the form of "hypothesis > experiment > conclusion". Similarly, programming will require different patterns of thinking than other areas. As a programmer, you are in some ways a "logic architect", building large systems out of the smallest blocks of yes/no logic. One of the reasons I recommend CS50 is for the concepts that may be new to so many. One such example is abstraction, "to pull away from" or "to look at the bigger picture", which defines many of the ways we interact with the world around us. For instance, when you walk into a bakery you are less likely to think "I need a bread loaf with X% moisture content and Y factor of gluten entanglement during the kneading process", but instead think "I'll have the Italian loaf today". Those details about the breadmaking process are "abstracted over" for convenience of the average grocery-goer. Concepts like this will influence the way you put together your own blocks of code to interact with others.

If you read this far, [you should follow me](https://twitter.com/forrestwbutler) to add value to your twitter timeline. You could even tweet @me and tell me you are going to start coding! I tweet about building a software business from scratch, hacking on side projects, and leveling up as an engineer and entrepreneur. Good luck on the journey, and stay tuned for Part 2 of this series where I'll outline a killer interview strategy to land the programming job you've prepared for.

---

[1] https://www.levels.fyi/
[2] https://javascriptissexy.com/a-significant-number-of-students-quit-their-programming-education-find-out-why-before-you-sign-up-for-a-program-and-suffer-the-same-fate/