Learning to Write



Reese’s keyboard produces truth of complexity and beauty, admired from a distance by all.

With a violent strike of Master Aaliyah’s pen, Jorge is enlightened.

I set out in January to study the realms of finance, software, and my own desire, but found myself adrift with no laboratory for experimentation. Programming was my testing ground for the hypotheses that led to Puppet, but my new questions cannot be answered in silicon. Clumsy studies provided two conclusions: Writing itself can and should be how I express and test my beliefs, but only if I get much better at it.

I started Puppet with core hypotheses, considered stupid by the experts around me. There was no point in talking about them; anyone can talk, and listeners similarly get to pick their conclusions. Only those I could prove had merit.

Proof is complicated. Few of us live in the world of math, where there’s enough overlap between objective reality and our language for discussing it that we can be truly sure. Computer science is itself lacking the unsentimental judge that the natural world provides to actual science. In truth, I should not discuss proofs, but rather disproofs. My real challenge with Puppet was to get rid of my false beliefs and let the remainders shine through, and there, programming was the perfect foil.

The best product idea in the world is worthless if it can’t be expressed in software in a sufficient timeframe. Merely building Puppet forced me to discard many convictions, and early rejects often became critical axioms undergirding the whole system. Of course, in the world of software, the compiler is only the first test. The real arbiter is your user, your customer. Once you’ve expressed your belief in a form someone can use, do they? I remember arguing for hours with a customer against a feature he requested, but the cold hard reality of his problem had me spending that night in my hotel room fixing it.

I am often asked if I miss programming. I do not.

What I miss is the laboratory it provided me, and the complete world that enveloped me, pressing in on me with its constraints, requirements, and complexities. I miss the hours I spent focused on one problem, and the complex systems needed to turn my ideas into a form usable by others.

I am thrilled and relieved to see that writing can be a new and even better laboratory for me. When I was programming full time, problems would haunt me, refusing to leave. I wore holes in my shoes walking back and forth between my keyboard and the local coffee shop, trying to line things up so they made sense. I’d scrunch up my face while drinking the coffee, drawing enqueries as to my wellbeing.

Writing is harder than that. The problems are bigger, and yet deeper inside, and harder to extract. I was never afraid of programming, but every idea I fail to write frightens me at least a little. On the far side, successfully expressing something is cathartic, a release, and it washes everything out with it.

It’s a better laboratory, because I have far more opinions about the real world than about the software world. Like those hypotheses that led to Puppet, I don’t know if they’re good. But I do know they’re different. I’ve bounced off reality enough times, asking for help from the crowd of onlookers and then getting back up, that I have a good sense of which of my beliefs are widely shared, and which are rare. For better or worse, little of what I believe, of what I think is important, is widely shared.

I’m excited by disagreement. Alignment is critical to execution, but diversity is needed for learning.

More than anything, I look forward to sharing my ideas, and as I did with Puppet, either finding them useful to other people, or having them cut to shreds to reveal new constraints, insights, opportunities. To do that successfully, though, writing is not enough: People must be able to read it.

Writing is no easier than coding, and in both, it’s ten times harder to write for others as for oneself.

One of my earliest optimizations in building Puppet was to prioritize my own productivity wherever possible. I explicitly chose to program in Ruby because I was faster there, even if it was slow and unpopular (Puppet was started before Rails was released). It took years for my programming style to reveal itself as an implicit personal optimization, highly effective for me but inscrutable to others.

My writing turns out to have a similarly mixed legacy.

All of the great shifts I initiated at Puppet began life as an essay, some extruded in a single sitting but more often sculpted over months and years. Once a hypothesis could defend itself, I then spent months and (more often) years translating it, turning it into something people could execute.

I’m proud of that work - how can I not be, when it helped build Puppet into what it is today?

But it’s fair to define good writing as something that doesn’t need a translator into its own tongue. By that measure, I’d failed.

Like a young programmer, I used to see people’s confusion as a sign of my genius and the value of my work. Now I look back with my designer’s eye and see it as a missed opportunity. We could have been there years faster if my beliefs had come with a better user experience. Kanies’s Razor is as applicable in prose as it is in code: Never attribute to genius that which can be adequately explained by incompetence.

I sit at the keyboard today as thrilled and scared as I was at the shiny benches of my science classes in college. Today I smell tea instead of banana oil and denatured ethanol, and I have no lab tech to stonewall me when I ask for easy answers, but the feeling of hope, of optimism, of a world to be discovered, understood, and fought through lifts me up just the same. I believe I can enjoy writing as much as I ever enjoyed programming, I can develop and test a wider range of hypotheses with a greater impact on those around me, and I can even learn get those ideas across to other people.

This, to me, is joy.

© 2022 Luke Kanies. All Rights Reserved. Contact