Software engineering is laborious. Regardless of whether you teeter on the cutting-edge of machine learning, build beautiful new user experiences or bridge the virtual-physical worlds with robotics, it is always, eventually, laborious. And because of this strong guarantee of laboriousness, were you to graph all software engineers' moods, the graphs would assume a similar shape; wide troughs, narrow peaks. The troughs are where code doesn’t work. This is the majority of the time, so the troughs are wide. They are always followed by short, sharp, peaks of delight – the code works, for a bit.
The cure for me is to embrace software’s ephemerality, something nearly unique amongst engineering disciplines. In those other disciplines – whether they’re producing bridges, electricity networks, or vehicular safety systems – the outputs tend to be finite. Objects are engineered so that their lifespans are maximised; perhaps with predictable need for future maintenance, but this is to preserve the object as it is.
But this isn’t true for software. Codebases are pseudo-organisms that can be young, adolescent or mature. They have their own idiosyncratic quirks and unique flaws. Some are universally regarded as beautiful, but others have a face that only their mothers could love.
Software is made with future demolition in mind. We wrap our code in unit tests, contract tests, or a million other types of tests – because code is designed to change, break, and eventually die when new set of requirements obsolete the previous generation. I try to remember software’s ephemerality when I enter a trough, struggling to re-animate functionality that worked moments before my stupid, premature optimisations.
Eventually I realise the required hieroglyphs, and how to arrange them so that The Thing I Need To Happen begins to happen. They’re no longer hieroglyphs, they are words, punctuation and exquisitely architected whitespace. As soon as the big realisation happens, I leap out of the trough into the peak, and my peers laud my work with a code review.
The words, punctuation and exquisitely architected whitespace will be compressed together, forming a new generation of the application. The evolution is carried through a pipeline where it aces the various tests like the generation before it did. Graduation is a violent act: suddenly the once-mollycoddled code is transmitted to hundreds of devices in disparate locations. As quickly as possible, it’s reduced into electrical pulses, making billions of microscopic switches represent ones and zeros. One or more humans eventually interact with it again. And this will actually affect something, in some minor way, for some period of time.
Next week a new sprint begins, the cycle repeats, and I watch the code evolve again.
If you do not love the craft of software engineering, then the laboriousness wears you down. However, if you truly love the art, and it is an art that demands appreciation, then the ephemerality sustains you. This week’s production, the new evolution of your code, may have been imperfect. But next week you can return to perfect it. And every week, you do what you love.