The Joy of Programming to Learn
Eric Normand Aug 11 '17
What is your main motivation for programming?
Back in the 90s I was reading something online (I don't remember where) that was saying the consensus was that it's the joy of absolute control of the machine. Being an impressionable youth, I felt alienated. This was certainly not my main motivation.
Now, don't get me wrong, I can enjoy control over an inanimate object like anybody. Programming in C gives me that feeling. But there is something else that drives me to program. It wasn't until about nine years ago that I started finding others I could resonate with and further understand my own joy in programming.
I love ideas. I love the history of ideas. I love how ideas are shaped by your environment. I love how fun it is to explore bad ideas. I love how ideas can be communicated to another person through time and space. And I love that some ideas have power.
It's one of the things I do in my newsletter and on my blog -- I develop ideas. I've developed a lot of wrong ideas and a few right ones. But it's through the process of developing them that their contours and characteristics are known. Far from being an expression of my beliefs, the essays are an expression of that process and the love of ideas in themselves.
Programming, to me, is a way to develop ideas. You set up a system with code and you can then empirically determine its properties. The thrill of programming, for me, is found more in the exploration of ideas than in the joy of controlling machines. I have written neural networks to learn about neuroscience, genetic algorithms to learn about evolution, and other simulations to learn about the thing I'm simulating.
About ten years ago I discovered Alan Kay, specifically The Computer Revolution Hasn't Happened Yet and his work at VPRI. I found someone who had explored programming as a medium of ideas. He was interested in understanding how computers could be made easier so that anybody, including children, could develop, explore, and communicate ideas -- perhaps ideas that would simply be impossible to explore otherwise.
I read Seymour Pappert and his ideas of the computer as a tool to explore difficult ideas. Really, go read Mindstorms. Nicholas Negroponte paraphrased Pappert's vision best: "Programming is like thinking about thinking. And debugging is a close approximation of learning about learning." When you program, you translate your thoughts into executable form. Debugging your program is close to debugging your thoughts.
The person carrying this torch now is Bret Victor. He's obviously going deep on these ideas and seems to be dedicating his life to them. What's more amazing than that is his ability to communicate the ideas. Put Media for Thinking the Unthinkable on your must-watch list. If you don't feel a little sad for what might have been, then watch The Future of Programming. He takes Alan Kay's ideas and makes them super-accessible.
I don't doubt that there are more people like them. They are using the computer as a medium in the Marshall McLuhan sense. And while computers are pervading our environment more and more, the power for them to enable new kinds of learning and thinking goes largely untapped.
Lisps and other highly expressive languages help a lot. They let you express the problem much faster -- without dealing with much of the minutiae of controlling the computer. I've always been on the lookout for a system I could use to quickly implement the ideas in papers. It's crazy how long it can take, even when the algorithm is written right there for you! The best languages, Clojure included, are still nowhere near where we could imagine them being.
I'm sending this out, like a beacon, to attract others who enjoy programming for the immense potential it has for helping us learn. Are you one of them? Why do you program? Comment below and let me know :)
BTW, if you're interested in the big ideas behind why we program, you should check out the PurelyFunctional.tv Newsletter. It's a weekly romp through the history, present, and future of Clojure and functional programming.