Crafting Software – avoiding the waste
In the last couple of months i have gotten attracted to a notion of crafting software which focuses on avoiding the waste. Allow me to explain :- Once we decide what a software should do and how it should behave then we give it to the software developers. Since software is so malleable you can create the required software in so many ways, using different components, databases, architectures, design patterns etc. The act of selecting the right components for the problem at hand and combining them in such a manner that the software is easy to extend and maintain is what i term as crafting software.
The problem is, the behavior of the software we are about to craft changes often. Especially in a product company you need couple of iterations before you get to know the exact nature of the software. You need to test it on a lot of different people to get a very good idea on what features to include,discard or change.
I guess the notion of software development should be such that you start with a vague idea of what you want to develop and in time with more testing and real world use you get more insights and things will get more clear. But current notion of software development goes more like this :- you release your first version after careful crafting and then as you observe people you keep on adding or changing features. After some time it comes to a point where you realize the choices you made initially before release weren’t appropriate now as there were so many changes in the assumptions you made during the first release. You throw out most of the code and start crafting the software which is apt for the insights you got. Then one more release happens and the same thing repeats. Users will have new set of problems, marketing will get some more ideas after observing user’s behavior etc etc. The software really smoothens out only after couple of iterations which might mean throwing out existing code and re-crafting it couple of times.
So you must be willing to iterate, test and then allow yourself to throw out the code and craft from scratch again if you are serious about crafting software. So much software doesn’t have that luxury today. Some things you can do to smoothen this process are – try and choose high level languages and frameworks with emphasis more on developer productivity compared to amount of computing resources it consumers. Computing infrastructure is relatively cheap while quality developer time is not. So optimize for developer productivity. While crafting software avoid premature optimization. you will be spending time optimizing something and after launch you will see that it really doesn’t matter. All in all if you see yourself as a craftsman of software try and reduce the amount of waste while you craft the software. Like many things in life you will get better at it with experience.
