There is something I heard at work the other day that I wanted to discuss. In my many years in various development departments I have often heard about “Feature factories”, or how your process is like building a bridge or something similar.
It seems as though we like to make comparisons to manufacturing for some reason. Maybe this is because that is where many managers came from in the past. Another possible explanation is because software engineers need to explain things to managers who have never written software. Whatever the reason is there seems to be a general misunderstanding around writing software, and that it is in fact very different to manufacturing.The downside is that, in my opinion, this has consequences for developers.
When we explain everything in a manner related to manufacturing we make it sound as though writing software is something that can be done once and then repeated easily. This is often not the case. When we are given a problem to solve in software, there are often differences to what we have done in the past. These subtle differences mean that we need to treat the problem as being new and different. Sure some components can be re-used and we can use various frameworks. Still it is quite different to manufacturing.
So what is a better analogy for writing software? I think that something like writing a book or doing a scientific experiments is closer to the mark. I think that experimentation is a better analogy than manufacturing. Writing a book is not a repeatable thing, each one is a bit different. The process might involve steps like brainstorming, create a rough draft and continue to refine it, etc. In the same way science is about trying things until you find what works. Software is like that, a little different each and every time.
Ok so it’s about experimentation, but why is that different to manufacturing? It is different because it is like the design phase of making something new each time. You wouldn’t want people to experiment with how to build a road each time they have to build a new road, you wouldn’t want every possible design of bridge built one after another in the same place to find the best fit (Well you’d have to knock the previous iteration down between each build as well so that’s kinda bad and wasteful too). Building something, even something complex like a car, is something we understand very well. It is the design that is a little different each time. Writing software is like that design phase, not the manufacturing phase.
When we think of car production lines we aren’t thinking of the design phase but the production phase. That is analogous to making a new copy of the same software. If you remember the glorious times of software on CDs and DVDs, then the production line is the act of producing the copies of the software to be sold by writing the CDs/DVDs. The act of writing software is like designing a new model of car.
In summary
When we talk to management and they make the mistake of using a poor analogy, we should stress the difference and that we cannot have a team of developers working like a “Feature factory” similar to how a car assembly line works. We are more like car designers or scientists trying to find the right solution to a new problem. The target is always in motion and we will make “Mistakes” and learn along the way.