February 10th, 2010

Pain. Or, Why Learning to Code is like Learning Chinese.

If you really love something, you should want to know everything about it, right?

I am currently in an ongoing love affair with the internets. This, mixed with the liberal dispensing of tech-related kool-aid that goes on at MIT, has provided enough of an impetus for me to begin learning how to actually write beautiful code. The hack-job e-commerce sites I had developed and run and SEO-ed like mad before school just will not do. No, this is a completely different undertaking.

And guess what? Writing respectable code is REALLY EFFING HARD.

Genius conclusion, I know. I wanted to write this post though, not to announce to the world that hey-guess-what-coding-is-hard, but rather to analyze why I believe business-y people like myself tend to abandon ship at this point in the learning process.

I do not plan to quit. In fact, I am only *more* determined and believe that over the next 2 years I can learn enough Python to be dangerous. That said, long-term-progress undertakings are really easy to quit.

The reason I’m not quitting is because I’ve been through this before, when I decided in 2005 that I just had to learn Chinese. So I did what any normal/sane person would do and packed my bags and moved to Beijing. I was not leaving until I could speak Chinese. Period.

I wanted to learn Chinese because my ultimate plan was to get a PhD in Chinese-American relations and become a badass diplomat (translation: spy). I really believe that in order to understand something at the most intimate level you need to learn the entire chain – ie, in order for me to understand the inner workings of the Chinese government, I had to be able to understand how the interactions take place in their most basic form.  Same thing with computers and the internet. In order to truly understand macro trends, it seems like one needs to be familiar with the most granular aspects of the trade.

I enrolled in a beginner (level 0) Chinese class here and off I went. What I did not realize is that any Chinese class worth a damn will spend at least the first month going over the fundamentals of the language. This means you don’t even learn how to say a single sentence until at least one month in – and keep in mind this is full-time studying. See the video below. Welcome to my entire life, September 2005.  I’ll call this the “bopomofo” period. Day after day it was “bo po mo fo”, again! repeat! You learn sounds and tones and initials and finals and radicals and you leave each day not one bit more prepared to go and order lunch than you were the day before.

I was frustrated, and wanted to quit. Why was I wasting my time learning how to shape my mouth and twist my tounge just right and listen for the difference between first tone and fourth tone? Hello! I had dumplings to order, and fake-North-face vendors to haggle with!

With Chinese, you can’t just take what you know from English or Spanish or German or whatever and apply it. You have to start from scratch and completely re-conceptualize how you think about language and structures and communication fundamentally.

After three months, it started to make sense. If I wanted to actually become good and not just some dummy with a phrase book, I had to have a strong grasp of the fundamentals. I couldn’t go straight to learning phrases otherwise I would have to eventually unlearn all of my bad habits. So I sucked it up and went back and really really mastered all those mouth formations. And then I skipped two levels of class and ended my year having an all-in-Chinese throw-down with a military doctor in Tibet. Good times. (Though sadly now I’ve forgotten a good chunk of what I learned).

Seems to be the same in the world of developers. There are probably more than a few who have some knowledge here and there but don’t really have a clue how the entire system works together. These are the people with the phrase books who can say enough to sound impressive but in reality have a really shallow knowledge-base.

I am in the “bopomofo” period of learning to program, which is fine with me only because I know it’s going to be these micro-incremental teeny tiny baby steps for a while. But man, it sucks.

Now I understand why so many business students and other non-technical types who love technology make the attempt to learn how to code and then quit right around now. In non-technical professions there really is no equivalent to this particular type of learning. Spending an entire day to get the “name” field to work on a form for your website is easy to dismiss as a “non-optimal” use of time, especially when there’s someone you can hire who can do it in 5 minutes.

Though I think that is completely missing the point.

Knowing the “bopomofo” of the web world can be extremely helpful for non-technical people when interacting with a technical team. And once you make it through mastering the fundamentals, your ability to learn new concepts improves exponentially.

At least that’s what I’m hoping.

Share This Post:


  • http://www.ironmonkeyventures.com Larry M

    Totally agree. It's hard, it's time consuming, but it's fun – at least to some people.
    Once you learn the basics of good coding it becomes easier to pick up other languages.
    And unfortunately, learning Chinese is singular effort. You start from scratch and it is its own thing.

  • http://naveenium.com naveen

    yeah, it's hard when you're first starting off. a few thoughts

    - i find that it's easier to learn when you set a goal. ie, “i want to make a webpage that shows me statuses where people have mentioned me on Twitter and Tumblr”. “i want to survive for two weeks in japan without English”

    - once you learn enough with a single language (the basics of coding and language and program structure), it's easy to learn most of the others. in that sense, it's not like learning a natural language. ie, the jump from python to ruby is many times easier than the jump from English to Spanish (i think)

    - you can make something from nothing. how awesome is that?

  • http://blog.botfu.com Kevin Marshall

    Awesome post and thoughts! Coding and all this stuff eventually gets easier, but thanks to the pace of technology and the internet, it will ALWAYS feel like you're carrying around a phrase book of one form or another…it's just that you'll know just what page to flip to and be much better at using it once you've got the basics down (much like I suspect you would be if/when you were thrown back into a Chinese speaking situation — you might struggle a little, but no where near as much as the rest of us who don't have the background would)…

    Anyway – keep at it and keep us updated as you do! :-D

  • http://amandapeyton.com amanda peyton

    oh for sure. i am definitely in the “it's fun” category.

    as for chinese, it's not completely singular – you can transition to japanese fairly seamlessly (written only though) and once you understand the construction of asian languages it's easier to pick up others (chinese dialects, japanese, korean, etc.).

  • http://amandapeyton.com amanda peyton

    it IS awesome! yes.

    so i have been trying to do the two in tandem – ie, make simple projects but try to learn conceptual underpinnings as well. problem is that projects are way more fun and better for self-esteem.

    yes, that is what i'm looking forward to – once the structure is in place I will be a machine! just you wait naveen, just you wait…

  • http://amandapeyton.com amanda peyton

    thanks! yeah, you're right – i still have a Chinese dictionary that I use whenever I go back, but I know exactly what to look for and how to find it, as opposed to when I first got there and even the dictionaries themselves didn't make sense.

  • http://naveenium.com naveen

    in all the free time i have, i've been thinking about teaching an intro to programming class (for non-engineers). perhaps take out a classroom for a saturday and see where it goes


  • http://amandapeyton.com amanda peyton

    if anyone can get through to the untrained masses, it's you. i think that would be super fun and *when* i move back to NYC i will be in attendance.

    have found these two video sets really helpful: http://bit.ly/d4o5qs and http://bit.ly/Dkk11 for conceptual stuff and intro projects that I think are fun usually involve doing something cool with the API for a product you already use (you wouldn't happen to know of any APIs that fit that description now would you? heh).

  • http://www.victusspiritus.com/ Mark Essel

    Dig your disqus layout Amanda.

    Got directed here by Kevin's share on twitter, and the trip was all worthwhile. You had me guessing about how the syllables sounded as I read them out loud “bo po mo fo” a few times :D .

    Your quest is a fine one Amanda. I see programming as the ultimate communication language between my imagination, and the machine that interprets the ideas and does all the heavy lifting.

    My background is engineering and simulations c++ programming for 14 years now. Mid to late last year I finally buckled down and began poking around with php, and web coding. I wanted to do something that I couldn't easily do with c++ and that was to build a living web framework that connected to many different APIs and processed that information and visualized it for each user. You can see how it looks now, and how it looked in the beginning before I teamed up with my friend and web coding sensei Tyler).

    Well maybe I could have used c++, but I abandoned using the known, and embarked on an adventure. Not just html/php but python, the Google App Engine, Java, Scala, Lift, and finally Ruby on Rails & Javascript (and now git). I know very little individually about any of the above languages, but I can rapidly understand web code flow as I read it now. I'm most comfortable Ruby/Rails out of the above, but only a part time developer (2-3months on the side).

    I've never been happier :)

  • http://amandapeyton.com amanda peyton

    This is great to hear and thanks for the links – really appreciate hearing how your experience has been and glad you're enjoying the adventure!

  • http://www.victusspiritus.com/ Mark Essel

    Solid point Naveen. From desktop (c++) to web programming (many) has been a HUGE jump, but from web language to web language not so terrible.

    Although the deeper I get, the more I find, so there appears to be infinite complexity in the interrelation between all web programs, databases, APIs, open source, scaling issues, etc.

    I can only tackle one slice of the pie at a time and make it mine. Hopefully shortly I can begin sharing that with others (my only git share so far has been a lift/scala template for the GAE).

  • fendien


    I just found your blog for the first time through a friend's tweet, and really dig this post. I find myself in a similar position as you, and just recently started learning PHP.

    I really agree with your conclusion “And once you make it through mastering the fundamentals, your ability to learn new concepts improves exponentially.” That's what has kept me going as I've been busy with so many other things and want to lay down my PHP books.

    To build on this point a bit, often times yes “there’s someone you can hire who can do it in 5 minutes” as you mention, but many times if you want to launch your own startup it's important to know technical capabilities and at least have a sense of what's going on. I think by having a basic understanding of programming this greatly would increase your ability to manage a coder. I'm working on a few side projects with outsourced coders, and often times feel limited by their delays and coding methods. The desire to be able to take their basic work and then fine tune it to my project is what is really keeping me going with it.

    What language are you starting with?


  • Venthor

    Great post, I wish some of my peers would read this and take it to heart. I've been developing software for the past 20 years or so. I believe it is more in kin with being a doctor. Anyone can fix a scrapped knee, administer Tylenol for a headache and do other 'quick' fix things, but understanding the true nature of what are causing the symptoms requires someone who knows the body inside and out.

    True developers understand how implementing code, hardware or changing settings can affect the entire system. Unfortunately most people think they can copy/paste some script, modify it to work for their needs and they are off and running. A true software engineer then comes and tries to fix things. But bad coding is like a cancer and sometimes like doctors we can't always fix it. The software can die. Most software projects fail. http://news.cnet.com/8301-13505_3-9900455-16.html

    I commend the fact that you are trying to have a technical understanding to communicate to technologists, however unless you plan to keep your technical skills up to date (unlike your Chinese) you will be talking to those who you won't understand. The key is to work with people who know their shi..stuff and be able to trust them. I've worked with too many NonTechnical people who have technical management positions and don't understand the issues I deal with and cannot make a good decision. (http://forums.construx.com/blogs/stevemcc/archi...)

    Probably more feedback then you wanted…

  • http://www.ludamix.com Triplefox

    I found that my own learning experience with programming was that at each new level, the concepts I had known before – the simplistic “rules” that you'll see blithely repeated across the web – had to be broken to accommodate an expansion of reality.

    Natural language has many of those characteristics – idioms and preferences of formality come to mind – but they're buried underneath the emphasis on vocabulary. Vocabulary isn't a huge deal in programming because you're either working off a reference(API docs or old source code) or you're making it up as you go along.

    For that reason, I always recommend that new programmers work through the fundamental CS literature – TAOCP, SICP, Little Schemer, etc. The concepts in CS are universal, but specific domains of application – Web apps, games, operating systems, etc., each rely heavily on a certain subset of those concepts, thus to get really good you have to write a variety of apps as well as study the literature.

  • Clark

    Two words: Learn assembly.

  • http://agilefocus.com/ William Pietri

    Bravo, Amanda.

    A dirty secret: even a lot of full-time programmers (I almost said “professional programmers”, but I think they don't qualify) skip the bopomofo stage. And they think that's fine, because they can order dumplings with a fair bit of success.

    But as a guy who gets called in to sort out problems, I can tell you that a lot of teams suffer because nobody is willing to go back to basics. What's the processor up to? What's happening at the level of bits in RAM, of packets on the network, of physical movements of the disk drive?

    Those fine details seem irritatingly basic when you're just trying to get that form to display. But, like your own breathing and heartbeat, just because you can ignore it a lot of the time doesn't mean it isn't critically important.

  • http://amandapeyton.com amanda peyton

    I am starting with Python – it is fun but often frustrating. I've had similar experiences with outsourcing, which was part of the impetus to just crack open the books.

    Thanks for your comment!

  • http://amandapeyton.com amanda peyton

    I plan to keep it up to date for as long as I work in this field and I have seen time after time how non-technical management can really screw up projects and lack empathy.

  • http://amandapeyton.com amanda peyton

    This is a really great suggestion – thanks.

  • http://amandapeyton.com amanda peyton

    Yeah, I do love the role of “the fixer” – mostly because I've always been drawn to very complex problems. But then, you have to know the entire system before you can actually fix something well. So it's a process, for sure.

  • iamwilhelm

    Hey there, I applaud the effort and tenacity, especially coming from a non-technical background. Like cooks, I think great programmers can come from anywhere.

    I'm coming at it from the other side, going from technical to entrepreneurial. The difficulty is that things are less tangible and fuzzy, but I'd agree on getting the fundamentals down.

    Lemme know if you ever have any questions about programming. Will be glad to help. iamwil at gmail

  • DHW

    My class didn't have to spend that long on learning piyin at all o.o

  • niels_bom

    The more I learn about computers and programming, the more I see there's a hell of a lot to learn. You could try and learn about how a processor works internally and spend 10 years learning how to program at that level, but you might as well spend 10 years on top of the stack learning the ins and outs of a high-level programming language framework, or doing stuff with webscrapers, adwords, microformats etc.

    As I see it, the best way to go about is to learn a lot about one specific subject and a little less about all the subjects directly related to the specific one. For example, if you want to write PHP also learn design patterns, version control, Apache, databases, HTML, CSS, Javascript. But, as I see it, learning language recognition or assembly programming won't directly help you be a better PHP programmer.

  • wally

    Use emacs. That is more than enough to get you through.
    Learning and using emacs is like learning and using kanji/chinese characters. That is how you get through the whole stack, of course really going through the whole “stack” is way too much. You have to start imagining things.

    Sorry this what occurred to me after reading your post.

    Also, I though that learning japanese first, and later chinese made chinese seem to be a hundred times easier. Maybe because chinese grammar seemed to be easier than japanese.

  • leprakhauns

    I know a few languages, and I am a freelance web developer. If you can get the fundamentals of programming down, then you can pretty much take that and apply it to any language, all you'd need is the syntax for that language.

  • crystalasia

    Living in Beijing now, and doing a lot with the LAMP stack, I had a good chuckle at your post. We all learn differently and I'm self taught Chinese/PHP/Whatever. In coding, once I figured out the structure, I didn't try and memorize everything, I just had to know where to find it.

    I also made sure I had some “cookbooks” and a good framework like CakePHP so I'm not re-inventing the wheel (and security holes) at every late night shift. It also mean't, that I was having fun which one of the most important things.

  • http://amandapeyton.com amanda peyton

    Thanks Will – glad you liked the post and thanks for your support. If I can be of any help with “bizness” stuff definitely email me.

  • http://amandapeyton.com amanda peyton

    Sure – and I think it's the structural part that is the most crucial but also the most frustrating.

    Hope you're enjoying Beijing! I miss it.

  • http://www.ztownsend.com/ Zac

    I disagree with those who suggest a website or other such project as an early goal, if you already have the motivation. I would suggest going through something like How to Design Programs (http://www.htdp.org/), which is in a language that can look very much like math (PLT Scheme), teaches you all kinds of fundamentals, and quickly makes you see that languages are all variants on the goal of mastering computation.

  • http://twitter.com/imrehg Gergely Imreh

    Wow, they do “bopomofo” in Beijing? I thought it is a completely Taiwanese thing to teach kids to read, and to have one more way of typing…

    And maybe it's hard to write respectable code, because things are changing much faster than to settle in any language for long enough time?

  • http://jhw.vox.com/ james woodyatt

    “you can pretty much take that and apply it to any language, all you'd need is the syntax for that language.”

    This is the opposite of true. Don't take my word for it; go walk over to the computer science department, find a professor there— any professor— and ask for an authoritative opinion.

    There is a lot more to writing useful code than learning the syntax of your programming language.

  • http://popupchinese.com/ trevelyan

    Hi Amanda,

    Just on the Chinese front, most people who pick up Chinese in China end up with decent tones so it isn't true you need to start from bopomofo. I'd be irritated with any school that did that to me or anyone I know. The school shouldn't be holding back the student.

    In the case you're still looking to keep up your Chinese, I'd suggest checking out Popup Chinese (http://popupchinese.com). Our users make a lot of progress quickly, but they're not babied on their way up the ramp which seems to make a real difference.



  • ashlin

    Have you heard of Head First Programming book?

  • Pingback: Pain. Or, Why Learning to Code is like Learning Chinese. « Coding for begginers()

  • leprakhauns

    I said if you learned the fundamentals first, then the language itself is just the syntax. The fundamentals are the flowcharts, pseudocode, the theory of an object, etc. Once you learn and understand the fundamentals then you can move on to any language.

  • mynameissmeall

    RE: the above two comments–learning “bo po mo fo” as Amanda describes it isn't about tones, nor is it equivalent to the Taiwanese shortcut reading system. It is about learning to pronounce Chinese sounds properly, i.e. accent, which is something many students of Chinese never learn. I am surprised how many people I meet who have studied Chinese for years, and have excellent tones, but still can't reliably differentiate between “lu” street and “lü” green.

    Now if only there was a fascinating and diverse land you could go live in where you would be unable eat or enjoy yourself unless you spoke Python.

  • Intrawebs

    “over the next 5 years I can learn enough of the LAMP stack to be dangerous.”

    That takes less than 1 minute and is achieved by simply the boot of L in LAMP.

    Also, those that dont stick with it are just like anybody else with anything else, they either grok it too soon (not likely with programing) and get bored or it becomes “too much work” and lately people just hate that.

    It takes 10K hours at something to get to a professional level. Want to learn blues guitar and be as good as BB King, you have a long road ahead of ya.

    Point being, doing what you love for those your love turns work into something thats easy. For you, ….. do you love pc's, servers, hardware, technology, and being a Shaman with all of them so to speak….then programming might be something fun for you!

    If not, be honest with yourself. You are only competing with yourself, everyone else can f'off.

    Good luck, onward and upward with your bad self. ;-)

  • Pingback: links for 2010-04-29 « that dismal science()

  • http://www.speakspanishdaily.com/Teach-Yourself-Spanish.html Teach Yourself Spanish

    If you are
    willing to learn, then have passion on your work.
    Knowing your weaknesses will be an advantage for you in becoming a
    good learner. Learn from your mistakes.