Monday of this week I synthesized a combination of two obvious observations into a pair of aphorisms:
When hacking while wearing a black hat, one must string together a sequence of bugs to do one's 'job'.
When doing anything else in life, one's job must be done by stringing together a sequence of bug workarounds.
Ordinarily you would expect this sort of thing to be posted to a trendy proprietary platform that purports to peddle truncated, dubious drivel such as this in a charade of public commons. But then I'd have to bedazzle it with emoji, hashtags, and frustrated urls and who really has time for all that? Perhaps I don't, being thus anachronistic. If so, it is an intellectual compliment, as time as a parameter or a metric is a tool of ignorance, for enlightenment arrives when you know it's only a dimension with the opposite signature: anachrony. Observe the metric tensor:
I remember the first time someone in my family used the word 'facebook'. After recovering from the initial surprise, I began to realize that pop culture was finally beginning to track geek culture. For over a decade now this has been true and it manifests in everything from 'nerd' protagonists, rather than nerd sidekicks or flat, stock nerd characters, to hipstergrammers cargo culting code in decrepit brick warehouses.
Now that code literacy and science promotion have gone viral in a big way and no royal roads have been discovered, it seems that we may be approaching an evolutionary juncture where futurists will invent some new economy full of professions that make hard engineering and software appear again as the dreary difficulty they always have been. Then I can go back into para-autistic anonymity and be awkward with confidence.
When I was younger, my family decided to gather all of the surface rocks in our back yard into a large hole. However, this was to practice a deception as anyone from Utah can tell you, the purpose of dirt is to fill the spaces between the rocks. Digging a hole is an exercise in rock removal. Shovels are a lie and shouldn't be sold in Utah. With their deep scooping blade, you're made to think digging is a matter of gently sliding the blade into the ground and hefting out luxurious scoops of pure dirt. In reality a digging shovel is going to get you at most 1 cm of depth on the first try. You bend down and spend 5 minutes prying out the rock you've found with your fingers and think, 'great, now I'm ready to do some serious digging' only to be thwarted by the rock that that rock was resting on. After the 19th rock, you begin to realize that it's rocks all the way down and the shovel is no more than a rock finder. This is the same pattern with modern software and the whole glob of the computer infrastructure industry.
AWS or Azure may have a snazzy (if frenetic) UI, but don't expect anything to work as easily as it is advertized. You're better off with a real digging tool, like a pick or a digging bar or an API and a command line. Though less frustrating and more honest, when working at the lower level, more effort is required. You are still going to find rocks (bugs) but you will be better adjusted to process them intelligently and necessarily than otherwise.
One of the more successful software development methodologies I have been using can be summarized with the following list:
- Identify the goal
- Start as near the goal as is prudent
- Write the minimal code to get from the start to the goal
- Attach structure to this minimal case until the feature is sufficient or revise and replicate the minimal case as an atomic motif
If you imagine the multidimensional state space containing the start and goal states, you can easily recognize that there are myriad paths from start to goal. Moreover, the minimal path you've just constructed is very likely within 0.8 of the optimal path regardless of the hoard of rocks menacing the state space. The path you've found neatly edges around the intervening stones with unburdened alacrity and has neither awareness nor care for any other hazards in the space.
Even if the feature requirements impose severe constraints on spacetime complexity, or portability, or you are compelled by existing code to significantly contort the path, starting with this approach will still exact less effort and sanity than fantasy programming a grand opus. The latter's august design, because it is not pathfinding will have its elegance distorted beyond comprehension by unanticipated edits when the time arrives to actually use it. At that point, technical debt is an understatement, or parabole, if you will.