|
Over the last months I've spent a lot of time thinking about good software. I've asked some close friends and coworkers for examples1 of what they think are good. Although the answers have far ranging there is one common thread in the reasoning for every one given: there is no mention or emphasis on how the software was made. Even for the most attuned developers this was a lesser matter. Most software was noted for its use and how well the user understood it rather than the style or approach in which it was delivered.
In the same passing months, like most developers, I find myself under siege by things which are either new, fashionable, or overlooked. The new is what comes with product cycles and innovation; things like the recently announced Windows 8. The fashionable is what's abuzz; going to "HTML5" or doing "SOA." While fashions may have value in their underpinnings, there is usually a beast of hype that creates cynicism in those of us who have lived through some previous wave of marketing related euphoria toward a technology that will change everything. The overlooked are usually valuable things that, although they have been around for some decent amount of time, escaped my notice. I have a long list of overlooked technologies that I want to experience at a deeper level.
As a developer, it's hard to balance the "good" with that steadily accumulating stream of new, fashionable and overlooked. I usually forget or minimize this disparity without data points that are a constant reminder. It's not hard to find data points. What I usually do is make a note of software in use when I'm either the primary user or close enough to see a person interact with it: when I'm a customer at my bank, when I'm at the check out counter and a clerk uses a point of sale system, or when I'm leveraging something surprises me with its utility.
The balance, for me, comes in those data points. At each one I realize that whether the software was written in Visual Basic or the most advanced Test Driven Development style, it makes no matter. My goal as a user for the software to serve my purpose.
Joel Spolsky, in an old essay on the topic of elegance, wrote:
"Unless [the users are] software reviewers for a living, they don’t really care about the software itself, and the more they notice it, the more annoyed they’re going to be."
My modest emphasis from Joel is that elegance is a component of software serving its purpose well and yet it is not always necessary in order for people to find real value. When I go to the bank and I notice the teller open up the VB6 or Windows Forms app that time forgot, aesthetics or elegance are much less in question than how quickly and easily they can perform their task at hand. It's interesting how many times a piece of software like this is rewritten and users complain it is not like "the old system."
This brings up one last point on the definition of good: it is largely in the eye (and, indeed, the use) of the user. As a person builds experience with software, despite design flaws or aesthetic problems, the software will become "good" or "good enough" as long as they are able to more accurately address the need the software is designed to fulfil. To be sure they'll have a list of things they wish were different but for situations like this an objective measure for "good" can come from their productivity.
I read a lot of fantasy fiction and not too long ago found myself surprised by a sentence in a blog post by George R.R. Martin, arguably one of the best living authors within the genre, on his writing process. He wrote: "I write with WordStar on a DOS machine, so that number is my own page count."
Dos. WordStar.
But my argument is that those are good pieces of software! Not because they were developed with Ruby or TDD or MVVM or SOA or HTML5, they are good, specifically for Mr. Martin because he understands them and can be fiendishly productive in that environment. It goes without saying that he's an anomaly (I can imagine how the publisher has to go to lengths to cater to the habits and preferences of a popular author) but it doesn't change the focus upon how something is used rather than how it is built.
As a developer, beyond the usual slogan to "focus on the user," my take away is to try to connect with use rather than the technology. All of the techniques I employ are in support of building things that people find useful. The best software is the kind in which a broad group of people can be productive. The best software is driven by its quality in addressing needs, not in the quality of its architecture. The wrong way to read this is that software architecture does not matter. It's not that simple. In the sense that the jury of your software will not care about it, it doesn't matter. In the sense that the goal of software architecture is to position you to focus on the user (make it durable, easy to make changes, etc...) then it is critical.
1People favored small scoped utilities: Linqpad, Evernote, YouSendIt as examples. I think this factors into my idea that these utilities can be well understood and are very productive in the singular tasks they address.
|