Programming is widely regarded, at least among enthusiasts, as a creative act. Calling it a “craft” has gained widespread acceptance, and it’s not unusual to hear the term “art” thrown around (if sometimes a tad flippantly).
And yet, there’s something I see other self-identified “creatives” doing which seems almost entirely absent from the software field. It’s the act of explicitly and deliberately seeking and spreading inspiration.
Writers join groups that throw out daily “writing prompts”. Artists, designers, models and photographers join Pinboard groups and Tumblrs and all manner of forums that share images strictly for the sake of inspiration. In the world of electronic music, there are synthesizer plugins whose whole user experience is constructed expressly around the purpose of inspiration.
Compare the tools programmers use: there is an unwritten assumption that these tools exist solely to assist the user in getting a preexisting idea from their brain into code. Any UI niceties along the way are strictly window dressing.
Someone will make the argument that what programmers do is fundamentally different: we have to solve real-world problems. And if you believe that a real-world problem implies a “correct” solution, then it is true that we don’t belong to the society of creatives.
But if you believe, as I do, that the fundamental work of programming lies in constructing a consensus reality—and that there may be many unique consensus realities which might serve equally well to address the problem at hand—then I think the question of inspiration remains a valid one.
Certainly we have no lack of instruction and knowledge sharing. And I think we’ve taken stabs at inspiration, albeit under a different name: the “patterns movement”. Taken (as they so often are) as prescriptive solutions, software patterns are just another form of instruction. But some of the greatest value I’ve gained from patterns has been when a pattern language helped me see a domain in a new and sense-making light. At those times, the patterns were serving as inspiration, not as a set of directions.
Take the Circuit Breaker pattern, for instance. No only is it an evocative and instantly recognizable image, it immediately suggests a model for thinking about unreliable connections.
Or, if you’re not a patterns fan, consider the role of metaphor in software development. Where would we be without the metaphor of the “pipe”? Or consider the all-important “stack”. Which, if you were lucky, was first explained to you by analogy to the spring-loaded plate stack at the start of a cafeteria line, where plates are “pushed” down then “popped” off the top.
If metaphors play such a central role in creating powerful abstractions, why do we not deliberately set about exposing ourselves to as many potential metaphors as possible? Why is there no “metaphor of the day” blog?
If programming is creative work, why do so few programmers attend writers-workshop-like activities such as Code Retreats, where the same code is written over and over, each time with different creative constraints?
If we are “creatives”, why don’t we feed our creative centers the way other creatives do?
This article was adapted from a SIGAVDI newsletter originally published in April 2016.
@avdi
Metaphor was perhaps my favorite of @kentbeck's original XP practices.
@joshsusser @avdi Have you tried out Decker?
@avdi good article, thanks. Two popular (but still not at all common) examples that come to my mind are code golf and advent of code. I particularly see friends doing AoC each year in languages new to them. Do you think these count as inspiration acts? They're certainly creative and playful. Is that enough?
@avdi Interesting, I wonder if "inspiration" gets at the hard-to-nail-down quality that is especially found in the Ruby community (maybe Elixir and some others too). I mean things like Ruby meetups and conferences even more than the "I use Ruby at my job" part.
I have found my programming skills have improved as I’ve made a serious effort to expose myself to a variety of programming styles. I don’t mean functional vs OOP. I mean low level performance sensitive programming, vs holy-crap-this-is-unmanageable-levels-of-Clean-Code-madness level of code. My opinions form more and more. My craft refines itself 🙂