Twitter  Diversification is *so* 20th century. Media companies today are looking to undiversify…  
Nieman Journalism Lab
Pushing to the future of journalism — A project of the Nieman Foundation at Harvard

In praise of impractical programming

It’s great that it’s gotten easier for non-programmers to write code and build things. But that doesn’t mean we should forget the merits of weirder, whimsical, gloriously impractical approaches.

Although it’s become a cultural mainstay now, I still remember when I first saw that thick book — the one with the wizard on the cover — about a school for magic where wonders are easily conjured by those who know the proper spells. Of course, I’m talking about the Structure and Interpretation of Computer Programs. There was that other book with the spells, but the “Wizard Book” sincerely claimed to teach magic.

For the past few years, I’ve been working as a software developer in the newsroom, where perceptions of my kind have changed from novelty to a necessity. Recognizing this, some journalism schools now even require programming courses to teach students practical skills with databases or web frameworks. It’s thrilling to contemplate a generation of web-hacking journalists — but I wish we could somehow squeeze a little magic into their course load.

Learning to program is an important skill; learning how to be a programmer requires a far different type of course. For that, I have to thank a truly impractical introduction — my first programming class at MIT, 6.001, taught in the very impractical language of Scheme.

Scheme is an academic dialect of Lisp (LISt Processing), an old-yet-advanced language designed for the theoretical work of artificial intelligence. To the beginner’s eye, Lisp looks like sentences turned inside out and nested in a truly maddening numbers of parentheses. Eventually, you learn to see it as the language of angels, because the language is not narrowly designed towards a specific purpose like matrix manipulations or building operating systems. Lisp is designed for representing symbols (and also included other important features lacking in other languages), which means it’s capable of representing anything. Because Scheme’s core syntax is remarkably impoverished, the student is constantly pulling herself up by her bootstraps, building more advanced structures off simpler constructs.

At the start of the semester, it was enough to learn how to learn about procedures; but the end, we were casually manipulating infinite streams of data and simulating the workings of a computer chip. The most radical lesson was in the middle of the term, where we learned the seemingly paradoxical exercise of writing the Scheme interpreter in Scheme itself. Appropriately, the metacircular evaluator introduction was not so much lecture as an dorkishly adorable induction into the MIT Scheme society, complete with costumes, flashpots, and each of us issued buttons emblazoned with the logo of Scheme to mark our initiation. By the end of the semester, I was entranced.

But I was no more skilled at the practical work of programming; learning theory was the point. Which is why such impractical introductions to programming is a hard sell at most universities. If students only take one programming course, professors want them to be able to build something when they’re done. Even MIT itself replaced the Lambda Mystery Cult in 2009 with a simplified course based on Python and robotics meant for students who might not be majoring in computer science. The reasoning was that programming itself had changed since the ’80s; developers no longer built whole systems from nothing; now they merely plugged together existing libraries to get something that worked. This is true for much of the programming work out there — but I am gloomily reminded of Prospero renouncing his magic.

And yet, I feel like 6.001 (and the rest of the gloriously impractical CS program at MIT) made me a better programmer. Its very impracticality forced me to understand the broader world of computer science instead of just focusing on a very narrow end-of-term goal, like building a website or learning SQL. This might be a mawkishly unconvincing argument, but at least I’m in good company; as usual, Paul Graham expresses this better than I ever could. I may not have used Scheme in years — in fact, I use the same practical tools as you. But I don’t just use a hammer: I know how its form was derived and how it could be adapted to new problems. I think this is what impractical computer science instruction gave me.

I won’t argue that journalism schools should squander those dearly-won computer-science credits on whimsical introductions to programming. But if you want to advance as a programmer, you need to take some impractical detours. If you don’t know how to program, it’s fine to pick something practical; there are fine introductions in languages like Python, Ruby, or Javascript. But then try learning a programming language that’s far different from the one you work in. Clojure is a pretty cool modern LISP. You could even take a Grand Tour through several languages at once. In the opposite direction, finally learn C, and read how your favorite language is implemented by reading its source. Read the source code of libraries and tools you admire and those you hate. Do some genealogy — learn about the languages your favorite programming language was derived from (e.g., Ruby borrowed from Smalltalk, Eiffel, Lisp, Perl, and a really key feature in CLU). Learn how to write a parser. Learn about algorithms. Learn how operating systems work. Start random projects; fork random repos. Always be coding. Ignore my suggestions and make your own. And have a blast doing it.

All that matters is that you strike out on journeys without clear destinations in lands you hardly know. Be impractical. Cast spells.

What to read next
John Wihbey    
When journalists factcheck politicians (or don’t), how to flag bad behavior on social media, and getting past slactivism: all that and more in this month’s roundup of the academic literature.
  • Joshua Benton

    One other suggestion: You can “take” the entire 2005 version of 6.001 via MIT OpenCourseWare here. That includes the textbook, videos of the lectures, all the readings, and more.

  • jonathanstray

    Spot on, Jacob. What all this arcane exploration does, in the end, is expand your technical imagination. Had I not studied computer science theory, I’m convinced I literally could not have conceived of some of the things I later implemented in real systems.

  • Dan Nguyen

    As I’ve become a better programmer, I enjoy looking at more esoteric topics. But I don’t think impractical programming will be great bang for the buck for the average journalist. In the same way that getting a master’s in criminal justice system is very helpful, but by no means necessary for a great cop reporter.

    I’ve always advocated practical programming because when you see how useful it is in your day-to-day life, you will naturally want to be better at it. I pretty much quit computer engineering after college but I’ve gotten much more into programming after seeing how it’s useful for all kinds of data-gathering and crap-automating work.

  • Jacob Harris

    That’s a fair point. I didn’t really want to discourage people from learning practical programming skills, especially since I think the theory could be off-putting to the casual student who just wants to get some things done. But ultimately though, I feel like it’s important to understand the why as opposed to just the how and I feel like I draw from my CS background on a regular basis.

  • Jacob Harris

    One aspect of writing is that I always think of how much clearly I would say it once it’s already been published. So, I’m going to comment here instead. 

    I’m not trying to scold universities for teaching pragmatic programming skills or students for having learned them. But while computer science is creeping more into other parts of the university, I am sad that its rich tradition of hacking and learning isn’t carried over, leaving students just thinking of their programming tools as complete, and themselves powerless to do anything to build their own (or use them in unconventional ways). Impractical programming is not required to shake the mindset, but it worked really well for me. And I think it’d work for you.

  • M. Edward (Ed) Borasky

    As someone who many years ago chose programming over journalism, though just barely, I have to disagree with you. The code and the data (for I’m also a statistician / “data journalist”) must *always* be subordinate to the story and the deadlines.

    Programming is tough – sometimes it takes longer than you have. Exploratory data analysis is fun, but sometimes the story evaporates or changes when you dig deeper. I believe that I came of age as a programmer when I learned Lisp and the Lambda calculus. But I don’t think a “computational journalist” should go that deep at the expense of, say, learning enough statistics to understand how political polls are mostly bullshit. ;-)

  • Jacob Harris

    I wasn’t really arguing that I can ignore covering an election to instead plumb the depths of type inference mechanisms in Scala for instance. But, I don’t think it’s an either-or thing either. And I’m not sure what else we can do to get students to think outside their current toolbox (ie, this situation described by Matt Waite

  • Medicalquack

    Learning any kind of coding will not hurt you as at least one learns structure and mechanics of it.  I wrote in VB and then quit, I had enough:)  But today what I learned does not hurt me as back a few years ago when other languages such as Ruby and PHR were not as popular and everything had not gone to the web, but I blog today and it helps me a lot to know structures and do some PHP modifications.  Those are easy compared to basic let me tell you, no “on error” modules to deal with. 

  • Ladycaren

    Amazons ability to deliver speedily is something to be admired in todays tary world.

    Webmaster of wi fi e reader

  • Abhishek Ghosh

    If Newton never thought of the apple which fell, there would not have been a man on the Moon.

    I agree :)

  • Jessie

    Can you explain in what sense Scheme is “very impractical”?  If it’s “advanced” and has “important features lacking in other languages”, it sounds very practical.

    Even if programming today is “merely plugging together existing libraries to get something that works”, doesn’t Scheme have roughly a billion libraries?

    For a truly impractical programming language, I think Brainfuck or INTERCAL would fit the bill much better than Scheme, especially since I got here from a link served to me from a Scheme system.  :-)

  • M. Edward (Ed) Borasky

    It looks like this thread is coming back to like, thanks to Jeff Atwood’s “Please Don’t Learn To Code” ;-)  But pretty much all “practical” and “impractical” languages these days support *all* the main serial programming paradigms well. They all support imperative programming, applicative programming, object-oriented programming, arrays, hashes and regular expressions.

    You can earn a living as a programmer knowing only vi, shell script-level imperative programming and regular expressions these days, at least in DevOps. To be a professional developer, add object-oriented programming, a model-view-controller framework, HTML / CSS / JavaScript, Git(hub) and an IDE.

  • Brian Cardarella

    Experimentation is the best way to broaden yourself. But there is always a tug-of-war. Should you concentrate and excel in one language at the risk of eventually becoming obsolete or should you go the polyglot route and learn only so much in a few languages, at the risk of never reaching your full potential in any one?

  • M. Edward (Ed) Borasky

    If your career path is software engineering, you need to follow the money. You need to have extensive application domain expertise, world-class people skills, be a lifelong learner and have impeccable time management habits.

    Bringing this back to journalism, the application domain and time management pieces are particularly important. Language choice is secondary IMHO – in a business setting, those decisions are often out of your hands. You use the tools you are directed to use and are compensated based on your contributions to the mission of the organization.

    I’m not a big fan of “polyglot” in general, especially since most languages today support the major programming paradigms fairly well, at least for serial programming. When it comes to concurrency, they all pretty much suck and every time someone invents a language that doesn’t suck at concurrency, few use it.

    Erlang is the only one that’s achieved *any* kind of market share, and there’s not a lot of Erlang code kicking around either. Most people just implement a C or C++ or Java layer over operating systems primitives and build scripting language wrappers.


    good job cuy cipto junaedy