# PSA: Learn to code

Presumably you read Less Wrong because you're interested in thinking better.

If so, you might be interested in another opportunity to improve the quality of your thinking: learn to code.

Like nothing else, coding forces you to identify flaws in your thinking. If your thinking is flawed, your program won't work, except by accident. There's no other discipline quite like this. If you're a mathematician or physicist and you solve a problem wrong, your paper won't tell you. Computer programmers have to measure their thinking against the gold standard of correctness _constantly_. The process of uncovering and fixing flaws in a program, usually called "debugging", typically takes up the majority of the time spent on software projects.

But this is only the beginning. You've probably heard something like "there are some problems that humans are good at and some problems that computers are good at". This is true. And once you learn to code, you'll be able to exploit computers to solve the problems they are good at. Having a computer to write software with is like having a hi-tech mental exoskeleton that lets your mind run harder and jump higher. Want to know what the second most common letter for an English word to end in is? That's a 15 line script. Tired of balancing chemical equations for your homework? Automate it.

Two more benefits that have less to do with thinking better:

*   [Employment](http://www.bls.gov/ooh/Computer-and-Information-Technology/Software-developers.htm). You probably don't need a computer science degree. I know of _two_ Less Wrong users who learned to program _after college_ and got jobs at Silicon Valley startups with just a project or two on their resume. ([MBlume](/user/MBlume) and [FrankAdamek](/user/FrankAdamek).) See [Advice on Getting a Software Job](/lw/di2/advice_on_getting_a_software_job/) by Tom McCabe for more on this possibility.
*   Productivity software. Writing your own is much nicer than using stuff made by other people in my experience. The reason there are so many to-do list applications is because everyone's needs are different. If you use the terminal as your interface, it doesn't take much effort to write this stuff; you'll spend most of your time figuring out what you want it to do. (Terminal + cron on Linux with JSON log files has worked great for my needs.)

Having enough coding knowledge to be dangerous may take persistence. If you tried and failed in the past, you probably either got stuck and gave up because there was no one to help you, or you just didn't keep at it.

I've take two different introductory programming classes now to meet college requirements. The students in both seemed substantially less intelligent to me than Less Wrong users, and most were successful in learning to program. So based on the fact that you are reading this, I am pretty darn sure you have the necessary level of mental ability.

**Starting Out**

I recommend trying one of [these](/lw/cpz/computer_science_and_programming_links_and/6p1n) interactive tutorials _right now_ to get a quick feel for what programming is like.

After you do that, here are some freely available materials for studying programming:

*   [Learn Python the Hard Way](http://learnpythonthehardway.org/). I like Zed's philosophy of having you type a lot of code, and apparently I'm not the only one. ([Other books](http://learncodethehardway.org/) in the Hard Way series.)
*   [Eloquent JavaScript](http://eloquentjavascript.net/). No installation needed for this one, and the exercises are nicely interspersed with the text.
*   [Think Python](http://www.greenteapress.com/thinkpython/thinkpython.html). More of a computer science focus. ("Computer science" refers to more abstract, less applied aspects of programming.)
*   [Codecademy](http://www.codecademy.com/) (uses JavaScript). Makes use of gamification-type incentives. Just don't lose sight of the fact that programming can be fun without them.
*   [Hackety Hack](http://hackety.com/) (uses Ruby). Might be especially good for younger folks.
*   [How to Design Programs](http://www.htdp.org/). This book uses an elegant, quirky, somewhat impractical language called Scheme, and emphasizes a disciplined approach to programming. Maybe that will appeal to you. [Structure and Interpretation of Computer Programs](http://mitpress.mit.edu/sicp/full-text/book/book.html) is a tougher, more computer science heavy book that also uses Scheme. You should probably have a good understanding of programming with recursive functions before tackling it.

[Here's](/lw/cnp/what_is_the_best_programming_language/) a discussion on Less Wrong about what the best programming language to start with is.

If you're having a hard time getting something up and running, that's a system administration challenge, not a programming one. Everyone hates system administration I think, except maybe system administrators. Keep calm, put your error message into Google, get help on a relevant IRC channel, etc.

Once you've got the basics, a good way to proceed is to decide on something you want to write and try to write it. If you don't know how to get started, start making Google searches. Soon you'll figure out the sort of libraries/frameworks people use to write your kind of program.

At first you may just be aping what others do. For example, if you want to learn something called "bleh", searching on Google for "bleh tutorial" is a great way to start. Finding a working program and modifying it to see out how it changes is another good option. Soon you'll graduate to appropriating sample code from documentation. As you write more code and see more of the software landscape, you'll be better prepared to craft original approaches to writing software.  
  
See also: [On the Fence? Major in CS](/lw/f2/on_the_fence_major_in_cs/), [Teach Yourself Programming in 10 Years](http://norvig.com/21-days.html), [Computer Science and Programming: Links and Resources](/lw/cpz/computer_science_and_programming_links_and/).