Our friends who live down the road from us, always have such a beautiful garden and take amazing care of their animals. The way they’ve built their life, blending art and homesteading is an inspiration!
In the software development field, manufacturing metaphors abound for what we do. It is a leaky abstraction, and I wonder if we can do better.
Much of what we do is informed by visionaries from the manufacturing sector, Taichi Ono, Eliyahu Goldratt, even more directly folks like Mary and Tom Poppendieck. Software development, however, is not the same as manufacturing. Framing our challenges here within that context can be informative, but it can also be misleading.
All too often in this context, our constraints look like people. That doesn’t sit well with me.
So, what about farming metaphors?
Before European settlers came to North America, indigenous peoples had evolved a deep respect for the land, and an agricultural understanding to match.
When corn, beans and squash are planted together, they thrive. These “Three Sisters” support each other in many ways:
- the corn stalks provide a tall column for the beans to climb upwards for sunlight
- the beans bring nitrogen to the soil nourishing herself and the others
- the leaves of the squash provide ground cover and mulch, shading the soil to keep it moist and discourage weeds
- the leaves of the squash are prickly, which can deter animals from snacking on them
The industrial revolution taught us to coalesce and optimise. The challenge with optimising for efficiency is our blind spots. We optimise for one metric and accidentally suppress some other desired metric.
White flour was a great invention we thought, excellent shelf life, pleasing to the palette and brain when used, but it turns out it’s all carbohydrates and no nutrition. Turns out the wheat germ and husk were an important part of the food.
But what did the food industry do? They invented another technology, vitamin enriched bread, to preserve their investment and legacy.
Oh, they made whole wheat bread too, but by then we’d had a taste and time to develop our addiction to this sugar-rich food and the industry that conveniently provided it.
Agrarian Culture to Factory Farms
Only a few generations ago we were largely an agrarian society. We grew a good portion of our own food and used markets to supplement. Now we depend on commercial farms and even commercial kitchens to feed ourselves.
We invented a food industry so efficient it destroyed nutrition and have spent a hundred years waffling over what’s important, vitamins, cholesterol, fat, anti-oxidants, allergens, what’s next?
People are so baffled by this mess we are in they’re going back to “eat food” kind of advice, shop around the edges of your grocery store and avoid the heavily optimised products in the middle.
Goldratt’s key point in his book, The Goal (1984) was that a (factory) system 100% utilised is inefficient. It feels like we are falling over the agricultural equivalent. We’ve optimised for local metrics without enough attention or knowledge of the overall system. Welcome to Systems Thinking.
Building Software – Co-location
The software industry started like an agrarian system. We wrote our own business software, supplemented with purchased tools like operating systems and compilers. Many operations continue in this way, you’ll find them working in 30-year-old COBOL, REXX, or PL/I code.
Our desire to optimise has lead us to silos and separation in seeking optimisation. We put the developers over here, the project managers over there, the testers in the corner and the business across the street.
Like a garden, some plants may not do well together, but some will thrive if given the chance to be together. Co-located teams is a core tenet of agile development because we have seen it work. We may still not fully understand the dynamics of why it works, but we have at least anecdotal and more and more empirical evidence as years go by.
Building Software – Dependencies
We rely heavily on outsourced tooling that reaches deeply into the code we write. UI controls libraries, architectural framework tooling like MVC, rules engines and document publishing tools. Then, more often than not, we write code that is so tightly coupled to it that we could never extract it without rewriting.
As with a garden, we can realise the systems around us. We can take the time to separate our food waste and compost it. Stop stockpiling code we write that is waste and instead use that time to ferment and distill new skills, which will enrich the smaller and more important code we must write. Measure the soil and sunlight so we know where to put people and what nutrients they need. Build an abstraction over here, grow a tall plant over there.
Your garden will grow best with some things together, and some things apart. Just like your code. Transplanting is a common task of the experienced gardener. How much of your code would survive transplanting?
Building Software – Farm to Plate
We hire offshore developers from remote developing economies seeking to optimise on an hourly cost. Or bring in migrant farm hands working for less than our minimum wage.
With a garden we could nurture and watch over it while it grows in front of us. We can see which bugs are on the leaves, how the rabbits make it through the fence to eat the lettuce. Plant some prickly squash plants to repel the racoons.
The people around us best understand our needs because they live beside us and have some level of intrinsic understanding. We grow up with a certain mix of allergens, they become part of the fauna, we consume them and build immunity. Eating food from far away is tasty, but doesn’t always agree with our digestive system.
Sometimes this is demonised by the “not-invented-here” syndrome, and it can be taken too far, but there is a certain intimacy you have with locally grown code that just isn’t present with imported code. Are your choices to import food driven by a lack of food, or by a desire to have tastier or exotic food? What does food safety look like with imported code?
Building Software – Farmers Almanac
Over the years we’ve sought help from design patterns, object-oriented development, functional development, looking for guidance and help in writing good software.
Our Coders Almanac hasn’t fully materialised, but we see chapters written here and there. A little on animal husbandry over here, some companion planting advice over there, some weather predictions over the top. We have some well recognized published advice and a growing body of knowledge in both realms. We shall see what stands the test of time.
Farmers grow food. We grow software. I think there’s lots more to explore in this metaphor. I hope this has whet your appetite a little 🙂