Software engineers as gardeners

Explaining software engineering can be difficult. I was reading this analogy today:

Creating and maintaining software has a lot more in common with driving than playing chess. There are far more variables involved and the rules are based on judgment calls. You may have a desired outcome when you are building software, but it’s unlikely that it’s as singular as chess. Software is rarely done; features get added and bugs are fixed; it’s an ongoing exercise. Unlike software, once a chess game is won or lost it’s over.

But I don’t think it conveys what software engineering is. My favourite is comparing software engineers with gardeners.

  1. It’s possible to plan a garden before vegetables and flowers are planted. One can define an area reserved for strawberries and one for tomatoes. But if no boundaries are defined, one will take over the other.
  2. Weeds will grow. If they are not removed they might take over our plants.
  3. Environment plays a big role. The kind of dirt, weather conditions and bugs will influence the growth of these plants. A vegetable that might grow well in one place, might not in a different place.
  4. If one wants a plant to grow in a particular way, pruning and trimming is required.

Software engineering has a lot of these characteristics. A less experienced person might be tempted to say that water and sun is all that’s required. And to an extent that is true. It’s possible to build software with little care. But if one wants a garden that lasts throughout all year and against a variety of adversities, thought and skillful hands are needed.