Who should learn to program?

Recently, there’s been a lot of talk in the tech world and beyond about getting more people to learn computer programming. I think this is a worthy goal*, but the question should be considered from various angles.

1. Jobs & the economy. Businesses all over the world need more programmers. Every company I know is hiring engineers (e.g. see this list of NY tech startups). Top programmers can make $100K+ right out of college. Yet there were only about 14,000 computer science (CS) majors last year. Meanwhile about 40,000 people got law degrees even though demand for lawyers has been shrinking. America is suffering from what economists call structural unemployment:  jobs are available but our labor force isn’t trained for those jobs.

2. Programming is a great foundation for a tech/startup career. CS is a great foundation to do other things in tech industry like starting a tech company (although I’d argue that design is an increasingly valuable foundation for web startups). I suspect one of the reasons for the low number of CS majors is people don’t realize all the non-programming opportunities that are opened up by a background in programming.

3. Programming is an important part of being “culturally literate.” Algorithmic thinking is as fundamental a type of thinking as mathematical thinking. For example, Daniel Dennett convincingly argues that the best way to understand Darwin’s theory of evolution is by thinking of it as an algorithm. (I haven’t read it yet but I’m told the premise of Stephen Wolfram’s A New Kind of Science is that algorithmic methods should be applied much more broadly across the sciences). Teaching algorithmic thinking – which is what CS does – should be a core part of a liberal arts education.

4. Programming is a great activity.  Most people who program describe themselves as entering a mental flow state where they are intensely immersed and time seems to fly by. It feels similar to reading a great book. You also feel great afterwards – it is the mental equivalent of going to the gym.

5. Should non-technical people at tech startups learn to code? This is where I disagree with some of the conventional wisdom. Certainly it is worthwhile learning programming, at least for reasons 3 & 4 above. You should realize, however, that to become a good programmer takes thousands of hours of practice. I’d also argue that if you are a non-technical person working at a web company the the first thing you should learn is internet architecture (DNS, http, html, web servers, database, TCP/UDP, IP, etc). Learning some programming is good too, to help relate to technical colleagues. But if your goal is to build a large-scale web service, your time as a non-technical person is better spent recruiting people who have been coding for years.

* Disclosure: I’m an investor via Founder Collective in two companies related to teaching programming:  Codecademy and Hacker School.

58 thoughts on “Who should learn to program?

  1. Great thoughts. I’m really keen to feed my 7yr old’s interest in the area. I’m tech literate but not a programmer and he’s smart but not a child genius.

    Any thoughts on a good place to start?

  2. Most people I know who started programming young (including me) started by making video games. Back then the obvious starting point was Basic. I’m not really sure what the best language for kids is today.

  3. Irving Fain says:

    The structural unemployment issue is a massive problem. I’m amazed at how many people are out of work, yet how much difficulty we have in filling many of our open positions.

    You posted the CS majors by year chart a while back which I was very surprised by….

  4. Great points, Chris – but I think this misses a big point - coding is how we take full advantage of our greatest tool – the computer. This is true for everyone in all professions and walks of life. Coding/programming is not software engineering, but learning the mindset and logic required to get a computer to do what you want are invaluable (not to mention transferrable) skills!

    So I believe we should be teaching *everybody* to code – as I laid out in my post for the Kernel last week, which generated quite a buzz.. I’d appreciate your thoughts when you have a moment:
    http://www.kernelmag.com/comment/column/1264/coding-for-success/

  5. tobias peggs says:

    On #3. I programmed Genetic Algorithms for my PhD, and the first thing i did to understand them was to read Darwin. It goes both ways. 

    I also agree with #5. Despite the PhD, i’ve never coded professionally – i’ve always been on the sales and marketing side of the web. But being able to “talk tech” has helped enormously. Not at the level of code and specific technologies – which have all evolved beyond recognition since i was dabbling as a student – but at a logical level that can contribute in some way to problem solving. Crucial, if you want to play a key role in a team. 

    Great post. thanks. 

  6. Thanks – I’ll read the article. But it sounds like we basically agree. I think programming should be mandatory in high schools and college “core curriculums”.

  7. TY for point #5. I’ve seen a lot of “just learn to code!” being tossed around. If you’re interested in doing it for a career then definitely. But as you’ve said, it’s much better to play to your strengths and if you’re a non-tech co-founder, trying to learn how to build the service rather than find someone who can and lets you get back to the biz/sales/marketing/etc stuff that is ALSO so important, is really just misusing resources.

  8. prakash_murthy says:

    My interest in programming began when my father enrolled me into a week-long BASIC programming camp! 

    I know there are quite a few resources in the ruby community to teach programming to kids. Check out http://kidsruby.com/ & http://shoesrb.com/ – might be useful in this context.

  9. Yup, exactly in agreement. Your title posed a question, my post gives my answer ;)

    Next question: how? As an investor in Codecademy I hope you enjoy the post – I touched on them with some (very brief) thoughts as to what might be a better approach. Those folks seem well on the way to addressing it, either way.

  10. chorezone says:

    I might try that one out myself!  

    But as a non-technical person trying to start a webapp, I think I’ll abide by point #5.

  11. Long time listener, first time caller.  :-)

    This is awesome — I have been thinking about this, too.  

    I agree with you on #5, though I think it’s totally fine for non-technical people to spend some time learning the basics, but mainly for purposes of empathy (and everyone was a beginner at some point).  I recall a moment early in my coding career when I had spent a year or two learning how to code (working 12+ hours/day on my own) and building some actual web applications being used by people, just for fun.   At the time, I had a non-technical manager and she thought what I was doing was interesting, so she said she wanted to block out an afternoon for me to “teach her how to program.”  I remember being offended by the idea that anyone could learn what I had fought to learn in months in a single afternoon.  I’m hoping the newcomers to coding don’t make those same sorts of assumptions about what it means to code, since I can imagine a little collective eye-rolling amongst the long-time coders.  

    The real lessons come when you make a mistake that causes a site to go down and you have to fix it “under fire,” or you’re working on a team and have to write code with other people who disagree with you on your approach, or you inherit a gnarly codebase with no comments or documentation and you have to make it work anyway.  That’s hard to teach! 

  12. Points 1-4 are reasons why every child should be exposed to programming in elementary school.  Just like learning a foreign language, it’s more likely that you’ll reach fluency if you’re exposed to it early. 

    Who among non-children (“adults”) should learn to program is a different question. I always think of Jeff Atwood’s sheep vs. goats post, which I think has been making the rounds again recently. :) 

    Do you think the CS foundation is necessary?  A lot of the best engineers I know didn’t major in CS; as someone who did, I felt like CS taught me how to think but left me very poorly prepared for an actual career as a developer.

  13. I don’t think studying CS is necessary. A lot of the best programmers didn’t even go to college. I was just using it here (e.g. the number of CS majors) as a proxy for learning to program. I probably should have made that clearer.

  14. I’m a designer by trade and new to code. I was hacking away on some JS as part of Codecademy lesson and was surprised by how enjoyable and engrossing it was. I had this realization and put it up on my blog:

    “Creatives have an inherent affection for every process involved in realizing their creative vision. No one that likes to design for the web hates code; they hate the pain associated with not knowing how to code.”

    I have had a few opportunities to contribute a bit of code here and there to the project I’m now working on. It’s intensely rewarding to be able to contribute at all levels of execution. I agree with every part of this. When people ask if they need to learn code I always tell them they should puruse it only if they are interested, but for anyone interested in building or designing products for the web, I believe that interest is inherent. Y’all just don’t know it yet.

  15. mattgattis says:

    Soon enough they will start teaching it in elementary school.  As Chris says, it takes thousands of hours of practice, and adults learn it much slower than children, so you should get started immediately if you don’t want to be treated as an illiterate. Once everyone grows up learning how to program, user interfaces will be dramatically different than today’s design for the lowest common denominator.

  16. Bruknahm says:

    I think you bring up a very important and overlooked point-  If a non-technical person wants to learn more of the tech aspects of the business they work in, to be more “hands-on” or just to have a better understanding of how the business works, learning to program is probably going to be one of the least valuable skills in terms of effort vs reward.   Understanding basic internet architecture, how web servers and cookies work, even learning how to query the database(s) your company uses are all going to provide you more actionable knowledge with a far smaller time commitment than attempting to learn to program.  

  17. Hi Chris,
    Great blog post, I am a VP Finance guy, over my years at work I got involved w/ internet architecture (DNS, http, html, web servers, database, TCP/UDP, IP, etc).  Never learned to “Code”

    I have signed up for Codecademy, still need to do my first lesson.

    Too bad there are not more CS/Math majors

  18. The sad truth in this statement is how much of a deterrent a parent’s misconceptions of a chosen major can be in a student’ decision of what to study. That’s an entirely different problem. It’s a reason why design has remained a relatively obscure and misunderstood discipline. 

  19. I was the non-technical cofounder of a startup and now I work on product at a scaling company. I have a decent grasp of internet architecture, can get my own data from the db, have worked with engineers for long enough to have some understanding about (roughly) where things sit on the trivial to non-trivial spectrum and why, and can once in a while make investments in longer-term platform health and development speed at the cost of short-term (superficial) product wins. These learnings are more valuable for a role like mine than learning to code would be.

    That said, learning to program is pretty fun so far. Look – I’ll start another company at some point, and I’ll almost certainly never be a ‘technical founder’ or a source of engineering competitive advantage past 2 or 3 people (/less dead weight). It’ll still be valuable (and awesome), though, to be able to hack together decent-enough prototypes to feel out certain product ideas.

    Part of this is triangulating between @dens’ suggestion along the same lines, @bryce’s push of “So did you build it?” in response to a story about the genesis of an idea, and @zsims’ ‘programming as the literacy of the 21st century.” And we’re clearly not the only ones talking about it.

    I’ll always think more about users and experiences and markets and business + company building than I will about software design, but the freedom to explore those things without anyone else’s de facto permission is an important thing, or at least a good one.

  20. superdo says:

    I agree with your point that anyone who wants to be in a web industry should have passable knowledge of internet structure.  That being said, it is pretty useful to use tools like codeacademy.com or the upcoming codepupil.com to get a brief understanding of the languages.

  21. Roy Bahat says:

    On whether people should learn the architecture of the Internet over learning to code, seems to me that — as a non-technical person myself trying to learn how to code — building your own web app is the best way to learn how the Internet works.  Coding learning that’s focused on building stuff is a fast way to get literate — learning the CS fundamentals (e.g., recursion, polymorphism, etc.) feels less valuable per hour spent.

    FWIW, I think the emphasis on college CS degrees is also probably overdone.  We’ve had great success at IGN hiring coders without regard to educational pedigree. http://www.fastcompany.com/magazine/160/ign-self-taught-coders

  22. College CS degrees: I agree. I’m just assuming college will continue to be the main method of educating people post high school. I was also using the CS graduation stats more as a proxy since there doesn’t seem to be other data about number of new programmers.

  23. Roy Bahat says:

    Totally.  One other thought: 60% don’t go to college.  It already isn’t the main thing people do after high school (though it is the main way people get educated after college).  Hacker academies of all shapes and forms should be the next mass apprenticeship… blogged related thoughts at http://also.roybahat.com/post/15307941431/could-coding-be-the-next-mass-profession

  24. Hi Chad – Thanks for listening / calling :) 

    I agree. Part of the point I was trying to make with #5 is for people to give proper respect to the art/skill of programming. I’ve been bothered a bit by the idea that it’s something you can just pick up quickly and perform at the level of people who’ve done it for years. (Personally, I spent a good percentage of my life programming but when I look at the programmers at Hunch and other NY startups I realize how mediocre I am and how hard it is to be great).

  25. Yeah, I was thinking of doing an entire blog post about that. It would be nice to come up with a list of “essential technical things you need to know to work at a web business.”

  26. The UI question is interesting. Simple interfaces like the iPad’s seem so natural (just watch a 2 year old use one). In a world where everyone programmed do you think a command line interace would be better? I’m not sure.

  27. mattgattis says:

    No I don’t imagine we’d go back to the command line.  I think the user interface could become more of an API where we go beyond simple customizations and start actually reprogramming applications to maximize our own efficiency or just to suit our tastes.

  28. nevdull says:

    I think that one of the great things about programming is that it gives you a framework to test a model.

    I think that the real value learned from programming is problem decomposition, and that the feedback from testing the code in the iterative cycle teaches skills applicable to any time of iterative refinement.  Or, as some like to call it, science.

  29. JamesHRH says:

    I don’t get this line of thought, despite the large number of people (including ChrisD & FredW) who like to talk about it.

    I will be transparent – I basically have half a CS degree from the mid-80′s (B Sc. Math w a lot of CS courses). I have a lot of other non-technical education to, to be honest.

    I am a non-technical founder of a startup and I don’t code (and I won’t code, out of choice).

    I also agree with PMarcA that software will eat world.

    I strongly agree with Stewart Butterfield and Albert Wenger that the Internet will have historical impact that equates to the domestication of animals.

    Let’s say, for argument’s sake, that I am leading a highly innovative and disruptive opportunity that will become a pillar of the consumer internet for the next 40 years.

    What I need to know is my customer, my market and my value creation drivers. And a lot about taking a company from concept to market to growth to mainstream acceptance.

    I do not need to code to eat my section of the world. I could argue, in detail, that there are many, many other skills that I would prioritize above knowing how to code.

    I have often told people that I deliberately do not try to understand how SW is built, deployed or maintained, because 99% of the people who interact with successful internet services never touch, think about or care about the software.

    Those are the people that occupy 95% of my mindshare.

    And, all they care about is what the service can do for them and how easy it is to use (‘Hi, my name is Pinterest.’).

    When @fredwilson:disqus argued that people who invest in social media should use social media, so that they understand it, I did not hear him say they needed to understand how to code it.

    I took that argument to be that investors needed to understand the impact and they could only do so by immersing themselves in the experience of publishing and consuming social media.

    As for algorithmic thinking, I would need an explanation to comment. I don’t know what that means.

    I can tell you that people I went to Law School with said that it ‘taught them to think like a lawyer’. I know what that means, I grew up as the son of fantastic criminal lawyer and showed up to Law School thinking like a lawyer.

    No one has ever said that thinking like a lawyer had been a net benefit to society as a whole……..can anyone explain why thinking like a programmer would be?

    I can’t.

  30. JamesHRH says:

    Programming is an extreme art of modelling reality through abstraction.

    Introducing it at the elementary level would contravene every tenet of Montessori teaching methodology.

  31. I’m a corporate lawyer who’s been teaching himself to code over the last several months.  I’ll never be a pro, but I’ve been having so much fun doing it and learning so much that I would definitely repeat the time investment so far.  The main benefit is just being able to make decent prototypes of ideas I have and to automate certain tasks to save time.  So far it seems like a really valuable life skill even if I don’t expect to be a developer full time.

  32. I think that’s great. It’s a wonderful thing to do and helps you intellectually on many levels. If you can create interesting software, that’s even better. (But not necessary – coding is a self-rewarding activity).

  33. Very informative and though-provoking post.

    Encountering top-notch programmers and their work, be it developers, interdisciplinary scientists or artists, always is (or at least should be) a humbling experience.It’s a bit like magic how they combine the highest levels of abstraction with tangible results.

    They also form a heterogenous bunch of people, so it’s very hard to pinpoint how they became so proficient. Someone should perform a qualitative study on this.

    Not sure about the best way to become “culturally literate”, I guess it’s more important to focus on algorithmic thinking than on actual implementations in specific languages. Especially for children, the algorithmic thinking should come first imo (maybe combined with pseudo-code).

    As regards to adults learning how to program on e.g. CodeAcademy: it’s a bit like reading popular science. You’ll get a limited grasp of what it means to practice science, but it shouldn’t be confused with the real deal. It should be seen as mental exercise, a great pastime, just like reading a good book.

    Of course there will always be people who think they’ve grasped Hegel after reading “A Short Introduction” :)

  34. Agree agree and agree.
    I also think there’s a bit about playing to strengths, Chris. 
    Not everyone has the capability to be insanely good at programming.. and I think we should focus on strengths – sales, marketing and everything else are important for running companies as well after all. 

  35. JamesHRH says:

    I did, although I could see how my post would make you think otherwise!

    I just don’t get this conversation. There are several adjectives I could use to describe programmers talking about how programming rocks and that everyone should program…but I would offend a lot of people.

    I experienced a similar thing in first year of law school. There were people that were so geeked up about being a lawyer that they could not stop talking about it. They also tended to think that everything would be awesome if everyone went to law school.

    If it is what you should do, then do it. Enjoy it and that’s awesome.

    But, hopefully, over time, you (not you Chris, which is maybe unclear in my last post, as you seem to have your usual balanced viewpoint here as well) will come to realize that what you wish for others is an alignment with what they should be doing and what they are doing.

    Not that they do what works for you; what works for them.

    Or, you could sit them down and have them watch High Fidelity!

  36. Some kind of CLI, yes. The main strength of the CLI is that it is way easier how to do something with a command line: “for i in *.png; do convert $i $(basename $i .png).jpg; done”. Man evolved when he learned how to speak (and then write), before that he could only show how to do things and it was not efficient.

    But not everybody likes keyboards, so a possibility is that Siri-like systems are the terminals of the future.

  37. Not a huge fan of the “everyone should know how to code” movement — and this comes from someone dedicated to building a significant enterprise software company in New York.

    VC’s learning to code is rather humorous development. I can only imagine the amount of noise that will introduce to board meetings…

  38. Reddy_s says:

    Great Take away points

    - Top programmers can make $100K+ right out of college. 
    - Yet there were only about 14,000 computer science (CS) majors last year.
    -  Meanwhile about 40,000 people got law degrees even though demand for lawyers has been shrinking.  

    - one of the reasons for the low number of CS majors is people don’t realize all the non-programming opportunities that are opened up by a background in programming.

  39. Looking4ans says:

    Hey Chris,
    In #2 you indicated that you believe that design is going to be very valuable and critical going forward. What’s a good way to get started in this. From my understanding it should be studying human and computer interactions and not just core designing such as graphic or web design. Your thoughts?

  40. Sorry for the late reply on a two week old post, but you say:

    “the first thing you should learn is internet architecture (DNS, http, html, web servers, database, TCP/UDP, IP, etc).”

    That’s quite an array of technologies! As I’m beginning the transition from “idea guy” to technical by learning Ruby, I was wondering if anyone had any suggestions on what resources to use in order to get a good understanding of internet architecture?

  41. Pingback: Google
  42. Pingback: Trackback
  43. Pingback: Trackback
  44. Pingback: Trackback
  45. I’m no longer certain where you are ggetting your
    info, however good topic. I needds to sppend a while learning
    more or understanding more.Thanks for faqntastic info I wass in search of this information for
    my mission.

  46. The structural engineering is a field of technology treating the structural analysis and the structural design which support or
    resist loads economically. An architect takes care of the design and shape of a building whereas a civil engineer takes care of
    the technical nitty-gritty like the strength of the building.
    If the time comes when private sectors are no longer looking for a
    structural engineer for hire, there are always public sectors that are need of professional civil engineers to work
    on government projects and the like.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s