For the past week, I've been spending the majority of my time writing a design document for my current project. The document has been challenging for me to write because there was alot of material to cover and I wanted to communicate the design in a "low tech" way. The low tech requirement was driven by the amount of experience the client has with the technologies we'll employ in the project.

While I was writing this document, something struck me. I was writing about writing. I was writing a document about writing software. In effect, I was "metawriting". The concept struck me as funny and I wondered why it had never occurred to me before.

So, I started thinking more about that. It got me thinking. Do authors write formal documentation detailing the novel they are writing? Nope. Do painters write a formal specification for their next painting. Never. What gives?

I'm thinking that writing software is not an act of intensely personal expression that writing novels and painting are. Sure, writing chunks of code can be. But, in most cases, the process of writing an application is not.

Writing software is much more like architecture where you create a design specification (sometimes in concert with others) that details how something will be constructed. The architect exhibits personal expression in the beauty of the design. The builder can exhibit personal expression in the craftsmanship and interpretation of the design.

However, how much beauty and art do you typically find in a software architecture document. If you read mine, very little. I typically bang out a document following as many best practices as I can. I also try to leverage work that I've done or seen before and steal ideas and pieces of design from other places. In fact, I'll copy the format of the specification document or even large paragraphs from other documents.

Am I really practicing an art like architecture? I don't know. I don't think I've ever designed the software equivalent of the Eiffel Tower, New York's Guggenheim Museum, London's Tower Bridge, or even the Leaning Tower of Pisa. Sure, I've had leaning designs, but not with such style.

I feel like I'm missing something. Everyone wants to compare software design to architecture. On the one hand, I agree - you create a formal specification that details how something should be built. On the other hand, I'm missing the beauty - and believe me, I LOVE writing software.

I am sure that some of it has to do with either my level of talent or my skill level. I can think of some examples of beautiful software designs: Common Lisp, Emacs, the Apple/Next Cocoa Framework, and more recently Ruby on Rails. Perhaps the best thing I could do, just like apprentice architects, is study great software designs to understand what makes them great.

I'm well aware that software patterns are an attempt to do the same thing. However, I think there's more there. It's not just the classic design elements, it's how those elements come together to create something beautiful. That's what's missing from a pure pattern study.

So, perhaps the realization I've been metawriting and what that means has given me a new direction. Wouldn't that be cool?

No comments: