If you read my blog regularly, chances are you write software and therefore can't, because your tools don't exist in the visual world. They're just magic strings of minuscule magnets on a rapidly spinning chunk of plastic…
I took my chef's knife to the sharpener a few days ago. Cost a whopping $4 to have him put a wicked edge on it, and I watched it happen. I saw him carefully run the blade along a belt sander (for lack of a better term) a few times to give it the rough shape, then he used a bench grinder to finish the edge, a steel to hone it, and finally a jeweler's wheel to polish it. Not five minutes elapsed before he handed it back to me, wrapped in butcher's paper for the journey home.
If he let me loose in his shop, there's no way I could have achieved the same result. But given ten knives, I bet I could get a pretty good edge on the last few (after undoubtedly destroying the first couple). Nothing like his result, to be sure, but significantly sharper than the initial state.
Sharpening a knife is a pretty simple task, because a knife is an inherently simple item, but it's just one example. Consider a master furniture maker. He can take the same wood you and I buy at Home Depot or Lowe's and with his tools and expertise turn it into a beautiful bureau or armiore. Turn me loose in his shop and I'd probably be able to make a functional dresser in twice the time it'd take him to make an exquisite one. With some more experience, both using the tools and in furniture construction overall, I've no doubt I could make something I'd be proud to have in my home. It wouldn't be the same quality as something the master craftsman created, no question, but better than the prefab stuff you might otherwise buy.
So what's special about these tasks? Nothing, really. Most things are of a similar nature: cooking, playing music, grooming dogs, surfing, etc. Attaining mastery of a given profession requires certain in-born characteristics, but attaining laudable proficiency is pretty much available to anyone willing to put in the time (barring physical disabilities and such).
Every chest of drawers provides a way to organize and store clothes. People spend a lot of money on well made dressers that are made of pretty woods, appeal to their personal tastes (mission, contemporary, etc.), or are simply of a higher quality of manufacture. None of which has the least to do with holding clothes. Every dresser I've ever seen holds clothes with about equal proficiency, but even though the drawers are a bit sticky, I still use the one I had as a child.
Now consider software development. The tools are invisible. The process is invisible. The result is intangible. As far as a profession for a craftsman goes, programmers are fucked. Sure, we get paid because people are willing to pay for the benefits of our software, but it's 100% functional. No one buys software because it's well made or "pretty". They might pick between two vendors because one is less error-prone, but that's still functional.
Every database application provides a way to organize and store data. No one spends extra money on a database system because it was made with snazzy buttons, appeals to their sense of style, or was produced by a higher quality process. Every database system I've used is inconvenient in one way or another (no OFFSET, no CTEs, etc.), and every one is built using some completely opaque process by unknown automatons in some office building somewhere.
It has occurred to me that the reason for this could simply be that programming is so damned hard it can't be automated. As a result, there's no way to produce the gradations of craftsmanship that you see in dressers (from the mass-produced pressboard affairs to the hand-crafted hardwood masterpieces). With software all you get are the hand-crafted versions. Sure, some of them are simply horrible, but they're all hand-crafted.
Which brings me back to the point: programming is opaque for everyone that isn't also a programmer. There's absolutely no way you can take your average Joe, sit him next to you while you write something, and then give him your workstation and have him do the same. Unlike the furniture maker where a simple demo is enough to get the gist of what is happening, with software it's all abstract and divorced from anything tangible. My mom (who is fairly technically adept) doesn't have any idea what the hell Subversion is, and even if I sufficiently explained it, there's no way she would understand how massively beneficial vendor branches are. Heck, a lot of programmers don't understand vendor branches. And yet a one-year old can run her fingers over a piece of wood and tell you if you need to keep sanding (if not run it through the planer again).
Further, there's absolutely no way Joe (or my mom) can look at two pieces of software and compare their "quality" on any meaningful level. He can make distinctions like "this one crashes more", or "that one has confusing icons", but that's it.  Even a competent programmer looking at a piece of software has the internals almost completely hidden from them. Very careful observation can provide certain clues (the query optimizer must be making decision X based on inputs A, B and C), but by and large, everything is opaque. Again, contrast this with a fine bureau where you can see the carefully planed wood, the perfectly matched dovetail joints on the drawers, and the complete lack of any visible fasteners.
I certainly consider myself a craftsman. I hope to justify calling myself a master someday, but today is not that day. And yet every evening, as I'm walking out the front door to head home, I think to myself at how completely impossible my work is to appreciate. My kids ask what I did today, and I have no meaningful answer to give. The best I can do is "fixed some bugs", or "had an architecture meeting". I can't explain to my non-programmer friends what I do, or why it has such appeal. I live a dual life: a "normal" one and a programmer one. They are as compatible as fire and ice. I greatly enjoy the praise and criticism I receive from my peers regarding stuff I share, especially when it helps make others' lives easier, but I'd trade it all to bring something home from work one day, show it to Lindsay and Emery, and have them say "Wow, Daddy, that's amazing."
Give Lindsay and Emery a few years and time really using a computer; they'll appreciate what you do. And while I can't truly compare two similar pieces of software, I can certainly appreciate the work that goes into their development. I do like well written software!!!! (Don't we all?!?)
Great post!! I have lately been trying to show my older daughter a bit more about what I do. I run Edubuntu on their computer and on a few occasions I have shown her that while we can download the 'program' we can also look at all the code that makes it work.
She also helps me work on my motorcycle and I've tried to make connections there – a motor isn't a magical block of metal that makes the car go. It's made up of lots of bits that when assembled in the proper order (I have problems with that part) it will run, a lot like software.
Nice post, Barney. Thought provoking, for sure.
Please know that the code you write really truly is fantastic, and I sure as heck admire what you do.
Non-programmers (especially kids) are not typically interested by anything but the finished product, except under one circumstance: other people are publicly praising your work. Yes, we get that great sense of self-accomplishment when we write something extraordinary, but nobody else really knows until someone else is talking about your work. This being the case, we should all make a point to be the one talking about others' work, as technical as it may be – publicly compliment the accomplishments and triumphs other people are doing, especially verbally. When a co-worker comes up with a new way to cut processing time, save memory, or they just makes something cool, especially when they go well above the minimum, make a big deal out of it. This has many other benefits as well, such as building a team attitude and encouraging code reuse when other programmers hear what a peer is doing. This is the golden "do unto others" rule as well. One day, it will be you getting the pat on the back.
I know what you mean about showing it off to the kiddos though, and I like where Jim was going with Linux. I've tried to introduce my kids (all 5 & under) to programming, in very general terms, "why computer programs are good" and "what computers can do" (basically: remember and decide) as well as a trillion-foot-view of the internet, and then specifically, I show them some easy programming tasks, usually javascript because it's easy with no compiling.
Funny story, Ramada ran an ad in Money magazine, so my wife clipped it out and hung it on the kids' art wall, saying "this is what daddy did." It was advertising one of my projects, then the kids see, abstractly, what I do.
I love the post Barney.
Just curious, have you done any wood working before? If not you may want to reconsider that thought on being able to do something on your first few tries that you'd keep in your home. My dad's always done woodworking and some of his early projects were fugly.
Firstly, I know people buy software based on the looks. I know that we constantly have to make visual updates to our CRM and websites that we provide to dealers, because 'X' product looks nicer or whatever. And aren't there legions of Apple fan-boys using Macs because their OS looks really nice (at least partly)?
Secondly, I feel your pain on not being able to 'show' people what I do (including my family). But, sometimes, if you did a nice job on an interface, you can 'show' them what you did. And recently there were commercials running for a local dealership that show-cased part of their website that I built. So, I rewound the commercial, paused it, and told my kids, 'See, I built that'. My kids thought it was cool. :-)