The HoPE Manifesto: How I Taught Myself to Code

Update: I’ve compiled a list of tools, classes and tutorials, in addition to this post, about Learning to Code over at SchoolOfCode.org

Introduction:
To-date, my career has been defined by being a NoPE — a Non-cOding Product Executive.

Sure, I’ve dreamed great things, learned enough about programming to “Be Dangerous” (dangerous to whom?)… I’ve even been called a “Hacker” by real programmers.

But until recently, I could never code. I could never take a simple idea, build it, and test it out with my closest friends. Until recently, most ideas would sit on my mental shelf, or tire the ears of my friends and loved ones.

Recently, that’s all changed. It started with a nudge from my friend Sam, accelerated with the energy from my girlfriend Jackie, and bolstered by the patience of my dear friend Kyle. And today — two short months after deciding to learn how to code — I’m a a NoPE no longer.

Today, I’m a HoPE — a Hacking-cOding Product Executive. I’ve released Ohours as my first production app, and now can produce prototypes of my ideas in only a few short days.

Below, I’ve outlined how I taught myself how to code in such a short time — call it the HoPE Manifesto, if you’d like.

The HoPE Manifesto

Table of Contents:

  1. Introduction
  2. Committing to The Sweat Lodge
  3. A Week in the Sweat Lodge
  4. 3 Rules for the N00b Hacker
  5. Conclusion

Introduction:

The HoPE Manifesto is a document I hope to maintain and update, so it serves as a helpful resource for all who want to make the transition from NoPE to HoPE. Today, it includes all I’ve learned to date.

But, since education is an ongoing process, expect the document to grow and change as I learn more about becoming a developer. If you have questions or want me to clarify part of the document, use the comment thread below the post.

And now, let’s get to work.

–Back to Table of Contents–

Committing to The Sweat Lodge

The first key to learning anything is real commitment. How many people have taken years of Spanish classes but can’t speak a word? Meanwhile, we all know people who studied abroad and immersed themselves for a few weeks and came away with the ability to communicate freely (though perhaps difficultly).

Learning to code is no different. If you think you can learn how to code by going to a few classes, being “taught” or sitting down for an hour or so every so often, you’re 100% wrong and will waste your time. If you truly want to learn how to code (or learn any other new skill, for that matter) you must find some serious time to dedicate to the cause. And the cause is teaching yourself, not being taught.

I call this The Sweat Lodge.

When I left AnyClip, I spent a few weeks playing around with online tutorials and reading books about coding. Not surprisingly, I felt like I was as much of a NoPE after a few weeks of this as I did when I began.

My real education started the second to last week of October, when I took five days of my life and commited myself to Change.

For five straight days, I sat at my desk, from the time I woke up to the time I went to bed, and obsessed over my education. I barely showered. I ate at my desk. I obsessed.

I went into my personal Sweat Lodge a NoPE and emerged a HoPE. Did I have all the answers? No. In the weeks and months that followed that week, I’ve learned a huge amount more than what I learned in that week.

But in that week, I taught myself the most important, foundational lessons that allowed me to emerge a new person: the skill of self-sustenance.

So this is your first test: Are you willing to commit to The Sweat Lodge? Are you willing to take 5 days — at least! — of your life to go through mental hell? Do you really want to code or are you just saying you do?

If you’re ready to dedicate yourself to your own personal Sweat Lodge, continue to the next session.

–Back to Table of Contents–

A Week in the Sweat Lodge — Your Curriculum

How you spent your week in The Sweat Lodge is all about curriculum and interest. But, since you’re starting from basically nothing, I recommend finding a tutorial/book that will serve as your main course material.

I went with Michael Hartl’s incredible book at RailsTutorial.org (here’s a list of other resources you could try, but I’m going to talk about RailsTutorial a lot).

A quick note about “Why Rails”:

I went with Rails for 2 reasons. The first may not apply to you: I had *some* exposure to Ruby on Rails in my past startups, so while still a mystery to me at first it felt slightly familiar. The main reason I went with Rails — and why you should consider going with Rails — is because of the unparalleled resources for beginners out there. Whether its the RailsTutorial itself, the amazing work Ryan Bates has done at RailsCasts, or a multitude of other tutorials, the Rails community has done a fantastic job of leaving educational breadcrumbs for new hackers.

So now you have RailsTutorial open, here’s a general outline for your time in The Sweat Lodge (I’ll go into more details on each part below):

  • Step 1: Follow Chapter 1 of RailsTutorial. This first chapter takes you far (you’ll deploy something to a live server!) and explains things unbelievably well. Congrats! You’re now a coder!
  • Step 2: Okay! Now do the rest of RailsTutorial.org and throw Michael $26 (price of the book in PDF form) if you’re as thankful as I am that he wrote such a fantastic document. Below, read my tips on how to get the most out of following the tutorial. Hint: Learning is about experimenting, and that starts now.
  • Step 3: Put RailsTutorial aside do Robin Fisher’s super quick tutorial on how to make a simple “todo” list application. The application is so simple, in fact, this is a great time to use a “Gem” and play around with someone else’s code.
  • Step 4: Spend a day playing around with Ruby, learning about Strings, Arrays, and Hashes. Embrace the fact that Ruby is just a cool calculator that handles more than just numbers, and that makes your write words for commands instead of pressing buttons.

Step 1 – Chapter 1 of RailsTutorial.org
In Chapter 1 of RailsTutorial.org, you cover everything from installing Ruby on your machine (if you don’t have it yet), updating Ruby and your gems, getting Rails working, and learning a bit about GIT. At the end of the Chapter you will have even pushed your first “application” to a live server.

This is your first test of the week. Getting everything working can be super frustrating for some people, but guess what: once you’re programming you’re going to have bugs that are many times more frustrating. Get over it and push through it.

The key thing to learn in this first step is that no matter how great the resource, you’ll always have questions. Installing RVM didn’t seem clear enough on RailsTutorial? Go Google something else. Your education CANNOT be tied to one resource. There are thousands of amazing resources you will use throughout your new life as someone who codes. Prepare yourself by going outside the tutorial for more information and to dig deeper in this very first step.

Step 2 – The Rest of RailsTutorial.org
Congrats! You pushed your first thing to a live server. Did that feel awesome or what?! Did you Tweet a link to all your friends?

Now it’s time to hunker down and finish the tutorial. It’s super long and you’ll have to go back over and read a bunch of stuff over and over again, but by now we know you’re 100000% dedicated to learning, so who cares? Each time you “get” something new it’s so exhilarating that you can’t wait to go back and read something again.

“Oh…. That make sense!”

As you’re following this chunk of the tutorial, I have a few suggestions:

  1. Do the software tests. Writing tests sucks. Its a boring process and you don’t see the results right away. If you’re a slob like me, once you’re out of the Sweat Lodge you may say “screw it” and forget tests all together. But while you’re in the Sweat Lodge you need to write the tests. First of all, you’ll pick up a lot of Ruby while you’re doing them, and second of all Michael uses the tests as a way to teach you about programming in general — and 90% of learning to code is learning to think about coding.
  2. Second of all, just like I stressed going off the tutorial for help in the first chapter, I believe it’s super important to start experimenting with your code as you’re learning. The first thing I changed while doing Michael’s book was the background color of the application we were building. One line of CSS cascaded into lots of little changes, from the copy to the underlying code itself. While you’re following his every step, get in the habit of being your own programmer and putting your own flavor into things.
  3. Lastly, unless Michael says (and he does sometimes) “it’s okay if you don’t understand this, we’ll come back to it” then don’t move on until you have some semblance of an understanding of what you’re doing. You don’t need to fully “get” everything you’re doing all the time, but also don’t gloss over what you don’t know. Take the time to understand what you’re doing. Again, by Googling for more info or looking at other materials you will always stumble upon a better way of understanding new concepts (like “MVC”).

With this, go forth and do the RailsTutorial. It will take a ton of time, but you will learn so very, very much. Have fun!

Step 3 – Todo List/Authentication Tutorial Mashups
Wow! You finished the RailsTutorial Book? Congrats!!! Now head over to this video tutorial and make a todo list application. It’s way, way simpler than what you just built, but you’re be exposed to some extra new skills (like nesting “resources”). By the way, while you’re doing the tutorial, skip the MySQL part. SQLite (what you used in the tutorial) is just fine for development mode, until you’re doing more hardcore stuff when you’ll want to develop with the same DB technology you run in production.

Now that you’ve built the little todo list, you’ve no doubt noticed there’s no authentication system. I know you’re not passionate about this little project, but sink a little extra time into things and expose yourself to Ryan Bate’s amazing RailsCasts — specifically his RailsCast about adding the “Devise” gem.

Again, a big part of your education is about synthesizing information from different resources and experiences. I had you do the todo list application because there will be times when you want to combine concepts from RailsTutorial and the todo list when you build whatever you decide to build next. Now, you need to add a login layer someone else built, using a tutorial someone else is giving. Exposing yourself to as many sources and tools as possible will teach you the art of triangulating and synthesizing information and tools.

Step 4 – Play Around with Ruby
You have done so much and I am so proud of you at this point. Truthfully, you could leave The Sweat Lodge at this point, but do you really want to? You’ve learned so much and you want nothing more than to go forth and start building the applications you wish more than anything existed.

If you want to, fine, but I recommend spending a solid day in your Ruby console (just type “irb” into Terminal) getting to know what Ruby has the power of doing.

For this part of your education, there’s no better resource than just Ruby-Doc.org. I recommend spending your time learning about a Strings, Arrays, and Hashes. You’ll be familiar with some of the methods from what you’ve done in RailsTutorial, but there are others (like the Collect method on Arrays, which I’m in love with) that you haven’t been exposed to yet and which will prove super useful as you try new things or debug code.

I think playing around in IRB and the Rails Console is a major part of experimenting and learning, and so I think it’s a perfect way to unwind your time in The Sweat Lodge.

–Back to Table of Contents–

3 Rules for the N00b Hacker

You’ve emerged out of The Sweat Lodge a new person. In only a matter of a week or two — while others were on vacation or at some conference collecting business cards — you turned yourself into a different person.

Congrats. Are you glowing? You should be.

As you go forth with your new life, I have 3 Rules for you to follow.

Rule 1: Always Let Your Passion Be Your Guide

You went through The Sweat Lodge because you were passionate about learning how to code. Now that you have a foundation of education, the only way forward is by working on something you’re incredibly passionate about.

Why? You’ve only learned a fraction of what you’ll need to know to create the tools and services you wish existed. And, if you try and build something you’re not 100% in love with, you won’t have the enduring strength to bang your head against the wall, day in and day out, learning the next skill you need in order to do it.

If you’re learning to code but already have other people working on “the real” application you want to exist, don’t shy away from building the exact same thing in parallel, if that’s the thing you want to exist most in this world. You can’t learn by working on an idea any less serious than the most serious idea in your life, because you just won’t find the energy to see it through.

In short, if you let passion be your guide, you’ll be able to keep up the momentum you got from The Sweat Lodge and take your n00b hacking skills you the next level.

Rule 2: The “24hr head on wall” rule

While you’re trying to build that awesome thing you always wish existed, you can bet that you are going to hit a wall along the way. There will be something that’s not working and it’s going to suck the life out of you as you try and get it working. It’s a fact of your new hacking life.

If you’re like me, you may have a friend or even someone you barely know who knows about Rails — maybe you just have a Forrst or StackOverflow account. Either way, some way or some how you probably have some level of access to someone who can tell you what you are doing wrong or how to fix your problem rather quickly, BUT DO NOT TURN TO THEM FOR HELP!

In my early days of coding, I created “24 hour head on wall” rule for myself. I knew at any time I could turn to my friend Kyle Bragger for help, but if I did that I also knew I’d never learn.

So, I forced myself to spend at least 24 hours trying to work through a problem before I reached out to him for help.

90% of the time, I managed to solve the problem before I needed Kyle’s help. But, 100% of the time I learned an incredible amount in the process.

You see, when you get help immediately you learn one thing. When you take a day to bang your head on the wall trying to solve your own problem, you run into so many tools and techniques that don’t solve the problem you have at hand, but are super useful things to know about for the future or to optimize something you’ve already done.

3. The Only “Right” Way is “Working”

One of the most important lessons about learning to code came from one of my first 24 hours head/wall periods. After a solid day of pain, I went to bed demoralized. I knew there was a “right way” of solving my problem, but I didn’t know what that right way was, and I didn’t know how to learn what the “right way” was.

The next morning, in the shower of course, I had an “ah-ha” moment. While I was looking for the “right way” I forgot to look for “a way that works.” I was looking for the wrong answer!

The one disadvantage to following great tutorials from great programmers is that they teach you the best, most elegant ways of programming something. What they don’t tell you is that the only “right way” is just “working.”

Since then, I’ve embraced the fact that what matters most is being able to string together a bunch of lines of code that eventually dump out what I wanted on the other side of things. I’ve accepted that I will always learn “more right” ways of doing things, but if I try to do it the “right way,” I won’t get anything done.

As my dear friend and mentor Kyle Bragger puts it: “Does it work? And do you understand why it works? These are the two conditions.”

Now, when I learn something new, I go back and re-write my older code in better ways, and I savor the fact that I would have never learned those lessons if I hadn’t just written bad-but-working code in the first place, moved on, and found myself where I was when I learned how to do it the “better way.”

–Back to Table of Contents–

Conclusion: A New Found HoPE:

People have always thought of me as a bubbly, positive, and enthusiastic person; but recently, people have made a point to tell me, “Nate, I’ve never seen you happier.”

It’s true. Once I committed to my education as a programmer — in fact, starting the minute I emerged from “The Sweat Lodge” — I felt like a totally new person.

Mixed together with my otherwise exuberant spirit and healthy sense of self-worth, I always felt like a piece of me was missing by not being able to code. Privately, I referred to myself as the “armless architect,” being that I could tell people what to build but couldn’t build anything myself. Literally… something was missing.

Today, I feel whole. In fact, though it was only a few months ago that I made the transformation from NoPE to HoPE, I have a hard time remembering what life was like before I embraced the idea that I could learn whatever I needed to learn to make whatever I needed to make.

My hope is that this document has helped you go on a similar path. No one can teach you like you can teach yourself, but hopefully this Manifesto has provided a helpful framework for that process.

Again, please let me know in the comments how I can make this document more useful for you as you’re making a similar transformation, thanks for reading it, and congrats on the decision to go from NoPE to HoPE.

– The End –
–Back to Table of Contents–

  • gordonzhu.com Gordon Zhu

    Love this post Nate.

  • lineswritinglines.com/ Natan Gesher

    For years and years, I’ve had people telling me that I should be programming. What you wrote above is an inspiration. I’m going to do it. I can’t say yet when in the next few months it will be, but I hope I’ll comment here by mid summer to say how well it went…

    • innonate.com/ Nate Westheimer

      Awesome. Please do keep everyone in the loop.

  • twitter.com/Inspirationf Igor Ovsyannykov

    Gosh this is so inspiring! I wish you could write something like this for us!

  • twitter.com/facecjf facecjf

    Thanks for sharing this! This is absolutely inspiring to many of us design/developers for I feel there are times we all feel like we don’t know enough to keep up. Most of my time is spent on learning and playing around with programming languages, techniques, and tutorials… because of this many feel as though the “self taught” approach is not as valid as a 4 yr eduction. I have found in my experience that regardless of the type of education, there are those that get it and those that memorize. I love the way you say :nn”The one disadvantage to following great tutorials from great programmers is that they teach you the best, most elegant ways of programming something. What they donu2019t tell you is that the only u201cright wayu201d is just u201cworking.u201d”nnSo true!nn

  • twitter.com/facecjf facecjf

    The one disadvantage to following great tutorials from great programmers is that they teach you the best, most elegant ways of programming something. What they donu2019t tell you is that the only u201cright wayu201d is just u201cworking.u201dnnMan you said it! Thanks for this. It’s truly inspiring and motivational! I have for years been playing around with PHP with a decent understanding, and there are many times I feel I could be better and a more solid coder. I will be taking a 5 day vacation to the sweat lodge.nn

  • www.kevinpruett.com pruett

    u00a0THANK YOU…I cannot wait to dive in. u00a0This is the roadmap I’ve been looking for.

  • BSise

    I’m also a businessperson (Columbia MBA; focused on product marketing and entrepreneurship for years). Because I was always brimming with ideas and decided that it completely sucked to be dependent on someone else to build prototypes for idea testing, I taught myself basic Rails about two years ago. My first side-project was iLearnWords (www.ilearnwords.com/), an audio-based language learning site. It’s now widely-used by people from developing countries who want to learn English but don’t have the funds to pay for classes or fancy software.u00a0nnI love Rails and the incredible community it has. I’m still just a beginner in web development but I feel empowered in a way I wasn’t before. Thanks for your own inspirational story Nate, and for encouraging people to empower themselves.

  • twitter.com/ralphwintle Ralph Wintle

    Wow. Excellent article and very timely for myself. I’m a 100% NoPE and I told myself I’d learn Ruby on Rails back in March and have been dabbling around with Ruby since then but never really fully committed to the ‘Sweat Lodge’. Coincidentally, next week was going to be my ‘Sweat Lodge’ week and now I’m pumped for it!u00a0nnI started with Ruby (Learn to Program – Chris Pine & Rubylearning.org – both excellent) as I had read somewhere that,u00a0″you can only be as good a Rails developer as you are a Ruby developer”… I suspect this is true but having glanced over the rails stuff and the railstutorial it already looks much more exciting and appealing due to it’s practicality.u00a0nnSo next week it’s to the Sweat Lodge to do the railstutorial and follow the manifesto and afterwards get stuck into some more Ruby. Thanks for posting this and best of luck!

  • twitter.com/ralphwintle Ralph Wintle

    Wow. Excellent article and very timely for myself. I’m a 100% NoPE and I told myself I’d learn Ruby on Rails back in March and have been dabbling around with Ruby since then but never really fully committed to the ‘Sweat Lodge’. Coincidentally, next week was going to be my ‘Sweat Lodge’ week and now I’m pumped for it!u00a0nnI started with Ruby (Learn to Program – Chris Pine & Rubylearning.org – both excellent) as I had read somewhere that,u00a0″you can only be as good a Rails developer as you are a Ruby developer”… I suspect this is true but having glanced over the rails stuff and the railstutorial it already looks much more exciting and appealing due to it’s practicality.u00a0nnSo next week it’s to the Sweat Lodge to do the railstutorial and follow the manifesto and afterwards get stuck into some more Ruby. Thanks for posting this and best of luck!

  • twitter.com/UnelectedDOTorg Unelected.org

    RON PAUL 2012

  • tony b

    Theres one question everyone wanting to be an actual developer/programmer/coder needs to ask themself before undertaking this – do I have a passion for it?nnIf its a means to an end, a way of getting a job, or an interest, then you shouldn’t even bother – you need a passion for it, otherwise you are never going to succeed with it or whatever you want out of it.u00a0 You also need that passion to constantly drive you to keep learning as tech changes from month to month.u00a0 nnProgrammers who don’t have a passion for it are a dime a dozen and write awful code, and NEVER end up doing anything of note.

  • Desperado9

    I would add… learn how to download and install the Ruby and Rails documentation on your computer and then get in the habit of looking there for answers to your questions and problems before searching online.

  • bx2

    I’d reaaaaaally like to see more PExecs learn how to code spacer

  • Banan

    great rulesu00a0nit’s all aboutu00a0commitment and self-motivation.ncurrently I’m doing my senior project in a team of 2 and it’su00a0actually hard to do such study habit “the sweat lodge” with 2 people involved in the learning process :/u00a0nI really wanna lock myself for a month and do it all myself specially that my partner is insisting that we should have some specialized person to teach us theu00a0language which is totally a wast of time ! because practically nobody will be dedicated only for teaching us and also it wont be as efficient as this way spacer nI really wanna do a good project and earn a good grade “A+” !u00a0ngod help meu00a0

  • twitter.com/kneelshah Neil Shah

    Hey Nate,u00a0nnI tried this for a while, and was really committed. Putting in 14 – 16 hours a day at the office and at least 2 hours every night trying to code.u00a0nnThen work got really busy and I fell off the wagon. I’m afraid that I lost a lot by taking nearly 3 weeks off since my last commit, I was so close to having a few different working prototypes ready!u00a0nnHoping that stuff will slow down a bit after the holiday season. But this post is always a continued source of inspiration.u00a0nnThanks

  • twitter.com/nartz nathan artz

    A good read, and congratulations on the transformation.
    You nailed it that the first thing you need to do is making something that works. Soon you’ll see that making things as simple as possible generally is a great rule (at least for prototyping).

    When you say you are learning how to do things ‘more right’, often it is dependent on the application you are building what is ‘right’ and ‘wrong’. However, almost across the board, ‘more right’ translates into at least a few specifics that you can think about while writing your code, mainly:

    - speed of execution (do i need to loop through all the elements, or just half the array?)

    - ease of use ( does it flow easily? have I named things well? do I only have to call a single method instead of 5?)

    - scalability ( if my data size gets larger or the load gets heavier, will my program crash or can it handle it? Up to how much can it handle?)

    Understanding the characteristics of how fast things need to be, and how they need to scale can help you write great code.