Software: do you write it like a book, grow it like a plant, accrete it like a pearl, or construct it like a building? As Steve McConnell notes in Code Complete 2, there's no shortage of software development metaphors:
This is a companion discussion topic for the original blog entry at: http://www.codinghorror.com/blog/2008/11/tending-your-software-garden.html
Jeff, your blog used to be interesting. Since you’ve started your new project it’s gone way down hill. This post is a case in point - like the poster above me says: So what?
You used to write about things I could actually put into practice straight away, and I looked forward to new posts, but over the last few months I find less and less value in your blog and it seems you have dissapeared up the arse of the blogoshpere like too many other previously interesting people.
Today I have decided to stop reading you blog.
You scared me. I saw Code Complete 2 and thought Steve McConnell wrote another must read book. But I clicked the link and realized that it was just the second edition. I was about to have to read another book and I just don’t have the time for that
Here’s an idea: Stop making metaphors and start making plans.
I treat programming as like every other engineering discipline. Works great for me, I’m sure it doesn’t work the same for everybody though.
Construction is a better metaphor, except it is generally better managed.
We would most likely have a bad reputation like the building industry if people understood (or was interested in) our industry.
I see software as like sculpture. Removing redundant information until all you are lef with is the essential product.
Ever experienced the reverse, wherein software development becomes the metaphor for things in everyday life?
I think it’s helped me keep my house neat.
All the time, i just refactored my house by knocking down a wall between my kitchen and living room.
Definitely agree with resting, I get bored of software projects after a while and try to find a new challenge. When I do come back to the original project I am usually ready to go with fresh ideas.
Software development is a skilled discipline full of unique (relatively minor repetition), mentally hard but physically easy labour.
Farming is a skilled discipline full of repetitive, mentally average and physically hard labour.
Typistry is a marginally skilled discipline full of repetitive, mentally and physically easy labour.
Garbage disposal and traffic light cleaning are unskilled disciplines full of repetitive, mentally and physically easy labour.
Godhood is an indescribably skilled discipline full of indescribably easy tasks (for those so skilled) which are repetitive by virtue of being absolutely predictable.
Farming and Software Development come out smelling like roses in the comparisons. Although farmers more often smell like shit and software developers more often smell like Cheetos.
As someone having experienced both career paths, farming and software development are not really alike. In farming, your costs are relatively well known, and easy to predict (both in dollars time). It’s your revenue that’s hard to predict (yield dollar value).
If I want to start farming a new field (buy a new tract of land), I know how many man hours dollars it will take to put the crop in. I can give an accurate number of man hours dollars (+/- 10%) in maybe 15 minutes of crunching numbers. Software doesn’t work like that.
Coding isn’t like farming… the best analogy I have heard thus far is GENE SPLICING.
Many projects go astray because people believe there is a right way to do software… probably because they bought into the concept of it being similar to designing a building, or slapping gears together.
Software design is vastly different… we’re more like MAD SCIENTISTS. Good software designers understand the potential for chaos, and use techniques to control it.
This is especially true for distributed teams, or integrating multiple applications across a network.
Perhaps you could even take a specific trade of gardening to better refine the example.
For instance, gardening olive trees takes quite a bit of grafting and care; without such planning and care, the plants grows wildly out of control and produces unsuccessful fruit. I like the idea of grafting as well as we often do take existing modules from applications and graft them into other applications.
Gardening is a close metaphor because it’s a very organic process, but I’d rather prefer something more biological like genetic engineering. You build little objects or classes, which become the basis for more sophisticated ones; other classes can ‘consume’ the outputs; etc. And if you mess with the genetic code of a perfectly good working class you can easily cause a cancer which degrades, possibly kills, the whole organism.
Good thoughts, Jeff, good discussion.
Brooks’ The Mythical Man-Month came out in 1975 not 1995.
Maybe because I grew up on a farm and one of my summer jobs was to clean out the stalls in the barn. No automation here, it was pitchfork and wheelbarrel. Today farm equipment is equipped with technology that records GPS location, crop yield, and soil data. Technology is heavily integrated into each piece of farm equipment, input/output is closely monitored, and changes immediately applied. Every acre, every animal is a product. Even cattle are GPS monitored to check their grazing patterns, not only to check their intake of water and food, but also the impact on the surrounding environment (i.e., erosion and water pollution). Agribusiness is very technical.
The whole garden metaphor reminds me too much of Stephen R Covey and his 7 habits… barf
A lot can be learned from Deming, Drucker, and Weinberg. The later, Becoming a Technical Leader: An organic problem solving approach.
Seed manufacturering trend, among many, is to turn on the terminator gene, which renders the seed sterile (seed from the parent will not grow). They also manufacturer their seed to work with other products they produce (i.e., insect repellent). I suppose this could be similar to buying a library without source, that will only communicate with the developer’s other products
I also think of it has gardening, to a point.
If you are in a point where you can analyze the actual growth of a project (4-6 months at least), from design to finish ( although i never consider any of the projects i was involved at that state, everything evolves ), with all the charts, task lists, to-do’s and every single byte you write/direct you do get that feeling.
there was even a project my team finished a couple of months ago that remembered me my dear little bonsai. It grows, and sometimes takes paths not expected ( even wildly ), but i tend to it and the result usually is within my parameters
This doesn’t work for me, since I develop on my own, and I am my own costumer in most cases. It’s more like I’m the plant, and I have to work on extending the roots and building the leaves on my own, then stand back and look at myself.
I like the sculpture metafor mentioned earlier. You have an end product in mind, with some specs. You start forming the basic structure and slowly chip away at the finer details, so that a finished product begins to emerge. If your initial structure was wrong you may find the end product is unachievable and you either adapt the end product to match what you have so far created or you throw it all away and start again. And because there are too many variables and ways to skin a software cat, with no one precscribed recipe, the process does indeed approach art.
Nice post, Jeff, and it inspired an unscheduled post of my own explaining my metaphor for programming: