There are many fad methods around that give you absolutely guaranteed recipes to design great software system.
We have only one of such recipe: understand what has really to be done. This is a method and a moral duty: do not start coding until you have really understood the system you are going to design. But understanding is hard work and it is not for free. Of course, users or customers have bombed you with requests, some of them realistic some other fanciful but never mind what is the system you have to realize? It is really a bad policy to rely only on what the customers asked you to do. Was he/she aware of what he/she was requesting? Was he/she naïve, superficial or simply not technical enough to provide you with the right requisites?
In principle, there exist customers perfectly aware, deep in their judgments and wills but the great part of the time such a customer is only in the dream of the programmer.
No problem. Write down a document where any requests from the customer has been detailed and do not start your work until the customer signed this contract document.
This legalistic approach, widely spread in the IT arena is counterproductive. The customer will never receive what he/she really need and you software provider will never have a satisfied customer and, at the same time, you will never fully practice your profession in full. Minor details will be your daily bread and the essence will fly away forever, unrecognized.
What has to be done, then, to achieve great software design? I’ll say it again: you must understand deeply what the system your customer want is, how it must behaves, how it must interact with the external, i.e. real, world.
We have had customers who hated us in the process of software design and even after the first delivery. They commented: “This software is so complex that no one will understand it. It will be a failure”. In fact such software, once delivered to tens thousand of users has been highly successful, one of the best piece of software ever realized.
To understand a system you have to follow some rules:
- Define systematically the system. Whenever possible define it through genus and species or specific difference. Define it also using division, dividing the system in its most fundamental parts;
- Apply the Aristotelean four causes (formal, material, final, efficient) plus the fifth – exemplar. When developing the efficient cause consider not only the agents of the systems but also the patients;
- Build and re-build a model until you feel in the deep of yourself that the model is right, right evidently, right without any possible doubt.
Of course, to develop such careful analysis you must not be lazy, you must be inclined to hard work and, above all, you have to be honest, firstly toward yourself and secondly after with your customer.
Is this kind of methodology viable in practice? Is it economically convenient? Yes of course it is, it is the cheapest and the most rewarding economically, morally and intellectually.
Believe us, it is really true.