take for granted for a minute that professional software development is a _complex_ problem, in the sense of complexity theory. i have in recent months been fretting, then, at how to *optimize* for s/d given that fundamental complexity.
problems that are merely intricate have the property that when you strike them sharply they break into smaller pieces. you get problem-shards, smaller ones, and hence more soluble, less intricate. rinse, lather, repeat, and they eventually get “‘easy”.
complex problems don’t have that property.
when you strike a complex problem sharply, it still breaks into pieces, but most of them are still complex problems. i use the metaphor of color separation. photos are printed by first dividing them into color separation layers. the usual is cyan, magenta, yellow, and black, tho others are possible. one photo turns in to four separations, one for each ink.
notice that the separations aren’t themselves *simpler* than their combination. they are all as complex as the photo itself. so we strike a complex photo sharply, and we get four equally complex separation layers from it.
i am in the process of striking professional software development this way. and i have (so far) produced what i think are five separations. i caution the reader with the three P’s: this work is partial, preliminary, premature. partial cuz i don’t think i’ve got it all yet. preliminary cuz i don’t think i’ve got all of even what i’ve got. premature cuz go easy.
optimizing for professional software development means optimizing for drive, sustenance, collaboration, stepping, and narrative.
we optimize for drive, juice, energy, because wrestling with complex problems is much harder than wrestling with intricate ones. it demands a level of individual energy and focus and a kind of perpetual improvised preparedness that is simply exhausting.
we optimize for sustenance — the continuous reaping of partial value, a kind of “winning on the way” instead of “winning at the end”. we do this because complexity means we don’t actually know where we’re going OR when we’ll get there.
we optimize for collaboration, the direct interaction of humans, because dealing w/complexity is almost entirely about the flow of ideas. ideas are the scarce resource, and collaboration is a never-ending fountain of them.
we optimize for stepping — working in small doable/undoable “not definitely wrong” units — because “definitely right” is out of reach. stepping is the only answer to the knee of predictability, which is the binding constraint of complex systems.
we optimize for narrative — shared framing stories that explain & suggest local action to ourselves and others — cuz it’s how humans deal. humans are adept at complexity, we handle it using narrative-rational decision-making, and we handle it better when we’re intending to.
so. that’s my current take. drive, sustenance, stepping, collaboration, and narrative. five “color separations” for complexity in pro s/d. the separations aren’t “easier” problems, they’re just re-framing of the existing problem towards the end of actually getting it done.