Chris Dixon

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.

  • http://twitter.com/MattRowley_ Matt Rowley

    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?

    • http://www.cdixon.org chris dixon

      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.

      • http://jackdempsey.me Jack Dempsey

        There’s a passionate kids focused community within the Ruby community. Great place to start: very useful but highly approachable language. http://kidsruby.com if you’re interested.

        • Anonymous

          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.

      • http://noupside.tumblr.com Renee

        Logo! Does anyone do that anymore?

        • http://justinhileman.info/ justin hileman

          Hackety Hack and KidsRuby have the Turtle, which is pretty much the same thing, but in a language that’ll do you some good as an adult :)

    • Anonymous

      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.

  • Irving Fain

    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….

    • http://www.cdixon.org chris dixon

      Yeah, the low number of CS majors is suprising. I think it’s still perceived as a “trade” by many parents of students. 

      • Anonymous

        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. 

  • http://insomanic.me.uk/ AndyY

    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/

    • http://www.cdixon.org chris dixon

      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”.

      • http://insomanic.me.uk/ AndyY

        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.

  • http://twitter.com/tobiaspeggs tobias peggs

    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. 

  • http://jackdempsey.me Jack Dempsey

    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.

  • http://twitter.com/chaddickerson Chad Dickerson

    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! 

    • http://www.cdixon.org chris dixon

      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).

  • http://noupside.tumblr.com Renee

    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.

    • http://www.cdixon.org chris dixon

      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.

    • JamesHRH

      Programming is an extreme art of modelling reality through abstraction.

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

  • Anonymous

    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.

  • Anonymous

    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.

    • http://www.cdixon.org chris dixon

      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.

      • Anonymous

        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.

      • http://catwell.info/ Pierre ‘catwell’ Chapuis

        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.

  • http://twitter.com/joshreznick Josh Reznick

    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.  

    • http://www.cdixon.org chris dixon

      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.”

      • http://twitter.com/markdchou Mark Chou

        Yes! “Technical Things for Non-Technical Co-founders” would be a great post. I think it’d be helpful for me, even now.

  • Anonymous

    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

  • http://ventureswell.com LukeG

    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.

  • Anonymous

    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.

    • http://www.cdixon.org chris dixon

      I agree (and am an investor in codecademy as noted in the post)

  • http://twitter.com/roybahat Roy Bahat

    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

    • http://www.cdixon.org chris dixon

      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.

      • http://twitter.com/roybahat Roy Bahat

        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

  • Pingback: Who should learn to program? | Learn Computer Programming

  • http://twitter.com/aortenzi Anthony Ortenzi

    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.

  • JamesHRH

    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 code.

    They needed to understand the impact.

    As for algorithmic thinking, I would need an explanation to comment. I can tell you that people I went to Law School with said that it ‘taught them to think 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.

    • http://www.cdixon.org chris dixon

      did you read my #5?

      • JamesHRH

        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!

  • http://www.jamesalonso.com/ James Alonso

    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.

    • http://www.cdixon.org chris dixon

      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).

  • http://twitter.com/ViorelCosmin Viorel Cosmin Miron

    Having only programers when we can program programs to program for us. Way ahead!

  • http://twitter.com/baetsie Benjamin De Baets

    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” :)

  • http://www.alearningaday.com Rohan

    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. 

  • http://www.the-makegood.com Matt Straz

    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…

  • Pingback: Last Year, There Were Only 14,000 CS Majors « Learning…

  • Anonymous

    Great Post

    - 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.  

  • Pingback: Wednesday links: hedging on hedge funds | Abnormal Returns

  • http://twitter.com/toms Tom Limongello

    For learning internet architecture, is this a good place to start? ‘Internet Architecture and Innovation’ http://www.amazon.com/Internet-Architecture-Innovation-Barbara-Schewick/dp/0262013975/

  • Pingback: Wednesday links: hedging on hedge funds

  • Pingback: Chris Dixon asks: Who Should Learn How to Code? » Process for the Enterprise

  • Pingback: Who should learn to program? – Chris Dixon | Dmilll

  • http://customresearchpaper.net/ research papers

    This Post gives me lot
    of information 

  • http://www.internationalpatentservice.com/patentapplication.html USPTO PATENT APPLICATION

    Structural unemployment is a form of unemployment
    resulting from a mismatch between demand in the labour market and the
    skills and locations of the workers seeking employment. Even though the
    number of vacancies may be equal to, or greater than, the number of the
    unemployed, the unemployed workers may lack the skills needed for the
    jobs; or they may not live in the part of the country or world where the
    jobs are available.

  • Anonymous

    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?

  • http://twitter.com/lakshmansankar Lakshman Sankar

    Point 5 is spot on- learning high level architecture and how things fit together is the most important thing for a non-technical person at a web company to understand.

  • http://www.linkedin.com/company/academia-research academia-research.com

    Thank you for sharing this article. I love it. Keep on writing this type of great stuff. 

  • http://www.internationalpatentservice.com/patentapplication.html USPTO PATENT APPLICATION

    Structural unemployment is a form of unemployment
    resulting from a mismatch between demand in the labour market and the
    skills and locations of the workers seeking employment. Even though the
    number of vacancies may be equal to, or greater than, the number of the
    unemployed, the unemployed workers may lack the skills needed for the
    jobs; or they may not live in the part of the country or world where the
    jobs are available.

  • http://www.internationalpatentservice.com/patentapplication.html USPTO PATENT APPLICATION

    Structural unemployment is a form of unemployment resulting from a mismatch between demand in the labour market and the skills and locations of the workers seeking employment. Even though the number of vacancies may be equal to, or greater than, the number of the unemployed, the unemployed workers may lack the skills needed for the jobs; or they may not live in the part of the country or world where the jobs are available.

  • Pingback: Top 5 Reasons to Learn to Code in the Student Sandbox

  • Pingback: Why you should learn to program | 5dividers

  • http://www.about.me/briankung Brian Kung

    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?

  • Pingback: To learn code or not to code… | George Y. Lee

  • Pingback: The Trouble With Non-tech Cofounders

  • Pingback: Learning: Who should learn to program? | ninjafei

  • Pingback: SEO & Internet Marketing Automation Tool

  • Pingback: Why should I learn to code? | The "...er" Blog

  • Pingback: Thursday Linkfest | @jatinshah

  • Pingback: Guest Blogger: The Next Generation Site-Taught Programmer | The Programming Assistant