I distinctly remember a few years ago reading Zen and the Art of Motorcycle Maintenance. I recall that at about halfway through there’s a discussion on Quality. Specifically, the speaker asserts that Quality itself is not truly definable, and Quality is the breakpoint between rationality and…whatever the opposite of rationality is. One interesting thought experiment was that if you remove Quality from the world, you end up with pure process and a world that’s not much fun.
I was thinking, naturally, about how this applies to software engineering. How coding becomes less fun when you introduce too much process. How, in fact, you seem to lose Quality in software when you become focused on process. How, in fact, brilliant software comes from a pure craftsmanship approach, which is not someone who tries to create a rubric-based, process-driven formula for how to write software but just someone who knows what they are doing hammering the code into shape. (Incidentally, this is probably why so many 4GL and auto-code-generation tools just aren’t very good).
There’s so many things that I’ve worked on that seem easy to do as a human but hard to get software to do well. Mostly around pattern recognition or heuristic-based data analysis. Its easy for humans to look at a wall of text and notice how many dates, for example, in a list of travel events all seem to correspond. But ask a computer to look for patterns and suddenly its a big-data-ish programming challenge.
At my job we are constantly trying to introduce more and more automation, process, quality checks, etc. There seems to be a vision that eventually the code will almost just write itself! Put up a BaaS backend that automagically throws any POSTs into a NoSQL/Dynamo backend, build a simple draggy-droppy-interface HTML5 builder, we’ve just automated the entire forms and data entry process for the entire organization! Never seems to work out that well in practice though, eh? (see Note 1)
I can’t shake this nagging feeling that these two things are connected. That true Quality in software engineering is almost the opposite of rationality and process. That you can automatically generate all those forms, or you can lovingly, individually craft each form app to have Quality and the users will like them better. Why? What is it that’s different? What is this mysterious Quality? Just as Phaedrus was unable to easily define Quality, thus am I in the realm of software engineering. (See Note 2)
Note 1: I’m not anti-process automation. Anything that makes things easier for my work is aces in my book. Automated unit testing and doxygen builds (i.e. basic CI)? Sounds awesome to me.
Note 2: There are some alternative measurements of quality for software that are important. Correctness. Robustness. More pragmatically, unit test/system test pass percentage. But how do you measure the Quality of “The Users Love It!”, which is really the most important metric?