My friend Sean has this painfully accurate riddle:
Q: What’s the difference between problems and issues?
A: Problems can be solved.
Here’s another one –
Q: What’s the difference between programs and software?
A: Programs can be completed.
A software system is never done, it always needs upgraded and tweaked and fixed and enhanced and the UI updated. It’s a complex interaction of many components.
Yet there are programs – such as little unix/mac utilities like ls, cat, grep – that are complete. They have the features they need, and when we need something more we hook multiple ones together instead of changing existing programs. They’re done.
Part of the microservices movement is about finding programs inside our software system, and breaking them out. Programs can be understood, predicted, and controlled. When we find them and break them out, we’ve solved one problem well and for good. A little diamond in the ball of mud that is any system.
It’s a worthy goal, well worth doing. And the problem remains of connecting all these programs together. Any software that is performing meaningful work for a variety of different people still needs to be a system, evolving and growing along with its users. Programs give us the tools to build ever-more-useful software systems.