Working Definitions

I find it difficult sometimes to communicate exactly what I mean, so I will resort to metaphor. This quite often makes people even more confused. So let me elaborate on some of my the metaphors I use when talking about tech:

The Tech Industry == War.

The industry itself is a war fought my multiple armies(companies) over scarce resources(Users). This is interesting in its approaches to execution whether in a victorian/feudal form( think pre revolutionary form or Braveheart-esque monolithic armies moving back and forth over a piece of ground) or to more modern gorilla/insurgent ones( see battle for Fallujah, which was fought block by block). Some plans/tactics work better in some situation over others for a given set of resources and can be easily translated from a militaristic context into an industrial counterpart.

Software Engineering == Politics. 

Any time two or more people attempt to make a decision, politics will emerge. Software engineering is more about what to and not to build, sell, and execute on. Carl von Clausewitz once said politics is an extension of war by other means, it would then be accurate to state that Software Engineering is the war within ones own organization. How the sausage is made, no one wants to see it, except your competitors.

Code == Engineering + Art == Craft.

To continue with the militaristic metaphors, imagine a blacksmith, making swords in medieval times. He had to understand both the properties of the mediums he was using, iron and steel, as well as the properties of what what made a good sword. The balance of the science and art, the craft of making a sword.

Creating code, in my mind, is no different. once must balance the properties of the medium you are working in( the given language, algorithms and data structures) and the properties of what makes a good product( maintainability of the architecture, and the experience of the user using the architecture or product). The balance of art and science, the craft of creating code. Lean too heavy on the engineering, you will have something that is a computational masterwork, but no one will be able to use it. Lean too heavy on the art, and you end up with something that is an aesthetic masterwork, that is completely useless. Balance must be found in software, just as in making a sword.

I will be elaborating on these definitions in the future, but I thought this would be a good start.

Dec 05, 2010