top | item 1716127

DHH: How do I learn to program?

145 points| pietrofmaggi | 15 years ago |37signals.com | reply

89 comments

order
[+] jrockway|15 years ago|reply
This is more a description of "how to type in code that appears to solve today's problem". But that's not programming, that's code monkeying.

To learn how to write real programs, you need to read real programs. Is Emacs bugging you? Open the source and see how it works. Web server crashed? Read the source and fix the bug. Not sure how to configure cron? Take a look at its config parser!

Many "programmers" spend their entire life treating everything as a black box. Take a look inside the box! That's how you really learn to program.

[+] jacquesm|15 years ago|reply
To tell someone new to programming to open the emacs source and start reading it is not really friendly.

I'd start with something considerably lighter than that, but I do agree that reading code is a really important part of really learning how to program (well).

As for 'code monkeying' not being programming, I disagree with that, programming is the creation of specific instructions in order for a computer to reach a certain goal and I couldn't care less what the goal was or the way in which you arrived at your program. I'd definitely not go so far as to demean anybody that got in to coding that way, just like not everybody can be Michaelangelo we can't all be Peter Norvig.

From Excel to LISP and everything in between, it's all programming.

[+] run4yourlives|15 years ago|reply
DHH is saying "do" rather than "try".

You can memorize every line of the emacs code base, but unless you have a problem with emacs itself that you'd like to solve, it isn't going to get you far.

On the other hand, if you can't find a web-app to manage projects that works for you, and you decide to code one, you will learn much, much more.

[+] helium|15 years ago|reply
Actually, I don't believe that was what DHH meant. Everyone is going to write a spaghetti mess starting out. The only way to learn from that is to write more and more code(that you'll need to maintain) and teaching yourself what well designed code is and why it matters.
[+] angrycoder|15 years ago|reply
Just curious, how much bigger did it make your e-penis to type out programmers in quotation marks?

At the end of the day, it takes all types to make software. Those who build the boxes, those who peer into the depths and improve or maintain the boxes, and those who use the boxes all work together to make great software.

[+] InclinedPlane|15 years ago|reply
Learning to program well is a complicated bootstrapping process. You can't start out writing full-fledged, high quality apps (because you won't have the skills), nor can you start out by reading production code (because most of it'll just go over your head).
[+] awakeasleep|15 years ago|reply
You could disagree with anything if you tried to. But can you see any merit to the 'need a goal to guide your learning' point of view?
[+] jshen|15 years ago|reply
nice strawman.

If you have a real concrete goal, and your web server crashes, you'd try to fix it just like you say.

[+] tnorthcutt|15 years ago|reply
Speaking as a non-programmer, this is spot-on, for me. I've tried to go through various tutorials and start learning to code over the past few years (all the while wishing I'd gotten a CS degree rather than finance), but could never force myself to get through a whole book and really start to understand what's going on. Recently, though, there's been a need within my business for a small, (theoretically) simple application to handle part of our workflow. I finally have a concrete end goal in mind, and have been flying through a PHP book (Head First PHP and MySQL, which I quite like so far), because I actually want to learn enough as quickly as I can to put together a working version of this application. Granted, I'm still following the tutorials in the book and going through the admittedly hokey examples, but now I can see how each of the different elements I'm learning will actually help me build something useful. It's a whole different experience for me, learning to code when I actually know what I want to build.
[+] nerfhammer|15 years ago|reply
You need smallish goals and little projects that you actually care about. Start with javascript for some UI effect for your blog, for example. Starting with a whole PHP/MySQL site may be too much at once. And let's face it: the first few sites you create are going to barely work. I am a database expert but it took me a really long time before I understood SQL well enough to be comfortable with it, and a really long time after that before my skills could gel enough to really take off quickly. But along the way I had a continuous need to use databases.

After time your smallish projects get increasing ambitious. Javascript can't do something you need, move up to PHP. I "learned" languages by reading books or even taking classes but I have long since forgotten everything that I never actually had a need to use in the real world. I "learned" C but I remember things from javascript that I learned 12 years ago because I've actively used javascript on and off since then.

You need a CS degree to answer some programmer interview questions and as a quality indicator for kids right out of school, but plenty of really solid developers started learning by taking up smallish web dev tasks that became increasingly and increasingly ambitious over time. To get really good it takes years and years of doing this though.

[+] jacquesm|15 years ago|reply
> all the while wishing I'd gotten a CS degree rather than finance

That's interesting, the prevailing opinion here on HN seems to be that being in 'finance' is better then in CS.

Why is that different in your case?

[+] atldev|15 years ago|reply
Disaster can also be a great teacher: Long ago, I started work at Oracle with 2 cohorts. We were asked to install the product locally as a sandbox to work in and learn. The install went flawlessly for my 2 buddies. My install was a disaster, and it was the best possible thing that could have happened. I learned more over the next 2 days of frantic troubleshooting than most learned over the course of 6 months. My cohorts laughed at the time, but they never caught up.
[+] GBKS|15 years ago|reply
Two things come to mind for me.

Flash 6 was how I learned programming. I realized I could create visual patterns and animations through code that I could never do by hand. The visuals were my goal, coding was what I had to learn on the way.

Copying and stealing is the best way to learn for me. Whatever I need to do, somebody has done something similar. So before I start, I find a code example or tutorial. First thing is to get it to run, then I make small changes until it does what I need it to.

This second approach works great for other things than coding, too. Taking apart and imitating successful designs, for example, is a great learning experience.

[+] edw519|15 years ago|reply
What made it click for me was programming in anger. Programming because I needed to. Programming because I gave a damn about what I was writing and I wanted it done sooner rather than later.

What made it click for me was programming in fear. Programming because I needed to. Programming because I gave a damn about my customer being satisfied and I wanted to get paid sooner rather than later.

[+] points|15 years ago|reply
I don't understand anyone who doesn't learn because they're curious. Because it's fun. Because they enjoy it. Intellectual curiosity.

It must be very odd programming 'professionally', only as a job and not as something you love first and foremost.

The problem with learning anything IMHO is when you don't enjoy it enough to want to learn it. And maybe that's a good signal that you shouldn't. Things are so much easier when you love what you do.

[+] jgrahamc|15 years ago|reply
This doesn't just apply to programming. You need to have a concrete goal when learning anything. That's what'll motivate you to actually spend the time learning.

That's how I learnt to speak French. It wasn't because I wanted to speak French, it was because I needed to. And you can only learn something by doing it. That applies to coding and speaking a foreign language.

[+] orblivion|15 years ago|reply
As DHH said, that's not true for everybody. Some people are really just curious, and aren't afraid to "waste" the time it takes to play around with it. I'm exactly like you though.
[+] ojbyrne|15 years ago|reply
From 2000-2004 I was kind of a dabbler in the web dev world. Built crappy sites for many clients that really didn't go anywhere, and so I concentrated on doing things as cheaply and as fast as possible. Then the whole Digg thing happened. I learned about scaling "in anger." And keeping up with programmers that were smarter than me at the task at hand. I probably learned more in 2 years than I had in the 20 years before that. Now I find myself dealing regularly with programmers that didn't go through that experience (and managers who embrace that "cheap and fast" ethic). I try to control my disdain.
[+] fohlin|15 years ago|reply
I've just left a workshop at our CS department, where we discussed new and old issues with teaching programming. Tutorials and assignment, based on completely made up cases and requirements, are still very much at the core of introductory programming courses. This is in sharp contrast to what DHH says in the post, as well as comments here and elsewhere.

May I be slightly selfish, and ask a question to all of you who have a CS degree? Did you learn programming as part of your CS education? Regardless, what's you opinion about the way programming was taught?

[+] drv|15 years ago|reply
I was a self-taught programmer (with a little parental help) long before I took a programming course in school; I started when I was about 9 years old.

I breezed through the college freshman-level programming courses (and pretty much all of the later CS courses too) because I already knew most of what was being taught. My friends (most of whom had minimal previous programming experience) were much worse off; I don't think I would have done even as well as they did if I were starting from scratch as I entered college. I had a 9-year head start on them, although I learned at my own pace and on a self-directed, meandering path without any structured classes or tutorials.

Most of those friends graduated with a CS degree while still not fully grasping concepts like how malloc() works (this particular example comes from one of my friends who invariably showed up at my door looking for debugging help near the deadline of every C project, complaining that malloc was breaking his program). I feel like I probably missed out on some useful tidbits because I mostly tuned out the CS classes, since I felt like I "knew it all" already (obviously not true, but close enough that I could do well on the finals), but I am certain I knew more about practical programming than most of my friends who studiously applied themselves in those same CS courses.

If I hadn't had previous experience programming, I doubt I could have become an effective programmer in just four years of academic instruction (I certainly didn't fare so well in my non-CS courses in which I had no previous experience). Observing my friends, I could tell they were having a rough time with the way programming was taught, but I don't know whether that is a solvable problem within the time constraints.

I doubt my approach to learning programming was the most effective possible, but I think it's worked reasonably well. I learned to program because it was fun, not because I wanted to make anything useful, and I enrolled in CS because it looked like a way to continue that fun. In the end, I was disappointed by the (lack of) depth in the CS courses I took and the amount they rehashed things I already knew, but I suppose it's not feasible to tailor undergraduate courses to people who are already programmers. Perhaps with the growing accessibility and popularity of programming, there is a place for "CS for programmers" that would skip the introductory content and get into the real meat earlier than the third or fourth year. Certainly the courses I took met neither the needs of myself (too basic) nor my non-programmer friends (too advanced too quickly).

[+] kd0amg|15 years ago|reply
May I be slightly selfish, and ask a question to all of you who have a CS degree? Did you learn programming as part of your CS education? Regardless, what's you opinion about the way programming was taught?

By the time I started taking classes, I'd already been programming for fun for a while. I continued self-teaching; it was both necessary and entertaining. In class, I was taught the basics of Java, LOGO, MIPS assembly, C++, Scheme, and Prolog, and course material also used BASIC (which my father had taught me), C, and x86 assembly (which I taught myself). The earliest classes spent a lot of time teaching the language, whereas later classes assumed that students either had prior knowledge of it or would learn it on their own (except for Scheme and Prolog since these were expected to be students' first exposure to functional and logical programming). I think the expectation of some self-teaching is really necessary to ensure that students learn to do so before they graduate. Putting together simple building blocks given on lecture slides only takes one so far; eventually, you'll have to do something you didn't learn to do in class.

[+] jamesbritt|15 years ago|reply

    May I be slightly selfish, and ask a question to all of
    you who have a CS degree? Did you learn programming as 
    part of your CS education? Regardless, what's you opinion 
    about the way programming was taught?
I learned about programming (aside from some casual observations) as a freshman EE student. After my first year I decided that the heavy math and physics requirements of EE would kick my ass, and that I much preferred the opinionated reality offered by writing software. So I changed my major to CS.

Programming per se was poorly taught. There was little emphasis on long-term code management, and only moderate emphasis on writing clean modular code. So I learned better coding practices from more skilled developers while school taught me language syntax and concepts.

All through college I was fascinated by cellular automata and artificial life, so every time I had a new language class I went off to write CA code, trying to make them run faster, cleaner, and provide nicer options. Pscal, Fortran, C; never got around to doing CA in COBOL though; dropped out of that class. :)

[+] jbarham|15 years ago|reply
I studied CS at the University of Toronto in the early 90's and in hindsight I'm amazed that we never formally taught how to program. (The one exception I can recall is a "theory of languages" course that gave us a brief exposure to half a dozen languages, but it was an optional course and wasn't part of the core curriculum.) We were basically given assignments by the profs and it was assumed that we would pick up programming in the tutorials with a little help from the TAs!

Personally I had the benefit of having done a fair bit of programming in high school and on my own (Amiga AMOS FTW!) so I survived but I know it was very difficult for students who hadn't had any programming experience prior to university, and the drop-out rate from the CS program was very high (> 50% IIRC).

[+] ghurlman|15 years ago|reply
The best CS classes I had drove a single project through a semester, with the lessons applying to the next development tasks you needed to undertake. By the end of the course, you had a reference project that you could carry forward, and even continue to work on if you wanted to.
[+] ptn|15 years ago|reply
"Programming in anger" is a very odd way to put it. I think it's best to say "programming because you need it".
[+] zwetan|15 years ago|reply
let me add a little something

programming is about languages and tools, whatever is your anger or need, some are more approachable than others

my dark beast for 10 years have been C and by extension C++, got this kind of stupid idea that to be a "real" developer you have to know how to program in C

and true for 10 years I tried to learn C/C++, just learning it for fun or curiosity, and for 10 years it went nowhere, could not wrap my head around it

I was just giving up after a couple of weekends, losing interest, and that was to blame on the fact I was just trying to learn it for the sake of knowing it, I didn't really needed it

and then on a somewhat big open source C++ project I found a little bug (really a shit of bug that can be fixed in 2sec), I could compile the project but not really write C/C++, but still could fix that bug

that's what I would call "anger", knowing that this stupid little bug can be fixed in no-time by someone like me (being a total noob)

but from this "anger" came a very unexpected thing

on my day to day work, wether it's ActionScript, Java, PHP, Python, etc. I can code it in my sleep, sure there are still some bugs and complexities, but still nothing that I can consider impossible

because trying to add features to that big C++ code base, was something very hard to do for me and to some extend "impossible" or "how the hell I gonna do that", it ended up being extremely rewarding and a kind of an obsession

so my little contribution would be to add: it's not only about the anger and the need, it is also about how hard it is for you to do it

yep, hard is fun

the harder the better ;)

[+] sahillavingia|15 years ago|reply
Exactly. You can't program by "ok, let's learn the syntax, now let's move onto strings, now objects..." you need a project, and then it's 100x easier to learn what you need to know. You'll never know everything, but that wouldn't have happened if you went the other way anyways.

Even after a year of iOS programming, I still consider myself a beginner, and I probably always will be. There's nothing wrong with that. :)

[+] wccrawford|15 years ago|reply
I guess I took that for granted. I never read things expecting it to teach me to program. I read things to figure out how to do what I currently wanted to do.

Now, I read things to see what new ideas and libraries are out there... But it when it comes time to learn them, I use them.

[+] omnigoat|15 years ago|reply
My first, my very first C++ project, started in Year 9 - coming from VB6 - was a 3D graphics engine. Yeah, that failed. It failed 5 times (fun fact - the fourth rewrite occurred moments after exclaiming "oh those are references!"). But the 6th one was pretty neat! I'd written a file-loader for 3D Studio Max, an event system, input, etc. The seventh rewrite would have gotten rid of the hardware T&L and used shaders instead. I was in Year 12 by then. Then I went to uni, studying CS, and afterwards got a job at a video games company, implementing a 3D graphics engine.

Honestly, sometimes you just have to do it, even without any training. Maybe do it six times.

[+] orblivion|15 years ago|reply
I feel the same way. Though I wouldn't call it angry. I really wish I could learn out of intellectual curiosity (I'm trying to do so with Haskell at the moment) but I can't help feeling like it's a waste of time. I'd rather do something useful. Or at least interesting, as an end. I love reading about new languages, I just can't seem to take enough interest to learn them. I'm going to try to do my next non-critical project in Haskell, see if that works.
[+] Locke1689|15 years ago|reply
Intellectually curious for the sake of it. I envy you.

Is this really that rare? I think I've always been that way.

[+] meric|15 years ago|reply
Powerpoint was how I got into programming. I tried to make an adventure game out of powerpoint slides and hyperlinks, see, but when I hit the limit of powerpoint "programming" I started on BASIC, which worked much better.
[+] ziadbc|15 years ago|reply
Learning to program is a function of interest, need and willpower.

It is fun to dabble and be curious, but curiosity will not get you through some of the minutia that it takes to build a real app, and thats when need and willpower get you through to learning.

One breakthrough for me was realizing that programming is now a social activity. You have to meld with the hivemind to really get anything done, and while its good to have a mental framework of whats under the hood (I recommend the book 'code' by charles petzold for those without formal engineering training) it's more important to realize how to model all the abstractions that are part of modern software.

As paradoxial as it sounds, understanding abstractions is often works out to be alot like 'code monkeying' than theoretical computer science.

[+] bl4k|15 years ago|reply
He might want to adjust the grammer of the title so that it is past-tense

Or he could leave it and I am sure a screenshot of it will pop during a flame war about rails :) (or somebody will respond 'Try PHP, David')

[+] jarin|15 years ago|reply
That is exactly what I tell everyone who asks me that question!