The standard answer is pretty simple right now: draw UML diagrams.
In those years that were answered: "draw flowcharts", "draw Nassi-Schneiderman diagrams", "draw Warnier / Orr diagrams", "draw data flow diagrams" ... etc.
All of them will be good answers and bad answers at the same time. The reality is that there is no single right answer to the question for the simple reason that no one really knows what the software really is .
Before people jump in my throat, let me explain what I mean.
When the architect creates the blue font of the building, the final product is clear: it will be a physical structure with walls, doors, windows, etc. Our architect draws a line and says: “This is a wall”; justify one more line and say: "this is the TV antenna cable from the roof to the basement." Using some convention on the sizes (scale), colors and types of lines, he will be able to communicate with other people, what needs to be built, and how everything fits together.
There may be some misunderstanding in the details, but no one doubts that the 2D model they are looking at is actually a building. Even if you need several diagrams (for example, one per floor), it is quite easy to link them.
For a software system, we have not reached that level! The first question is, "How will you simulate the software"?
If you use an object-oriented approach, you will describe your software as a set of “objects” related to “classes” that are related to each other (as described in the “class diagram”) with the specified behavior (“state diagram”) and which interact in a certain way (as described in the set of “collaboration diagrams”).
There is no single diagram that will show you all aspects of the software system. This is why UML includes many different types of diagrams.
If you use the Structured approach, you will describe your system as a set of processing components that convert their input to outputs (DFD) and as installed data objects (in the form of an ER diagram).
Any diagram will work until its meaning is clear to all parties involved. In fact, it’s usual to start a design session by drawing two squares on the blackboard and a line between them: "It's good that the browser connects to our web server ...".
The problem is exactly what each chart means.
In fact, we have a good general way of representing a part of the system data: an entity relationship diagram (or the “static part” of a class diagram) can be directly transferred to a live database. I attribute this to the fact that relational databases are well founded in relational algebra and at the same time they use simple concepts that anyone can understand (tables, foreign keys, joins, ...). All other data representations were destroyed (there is no longer a hierarchical database!).
We lack a generally accepted understanding of the dynamic aspects of software; some kind of unifying view, which would be theoretically substantiated, and not difficult to use.
Here is my suggestion.
- Remember that the minimum goal of architecture is to create a common understanding of the system.
- Find out as many chart types as possible.
- Use the most appropriate chart to illustrate the aspect you want to focus on.
- Provide a way to link different diagrams (in my experience, this is the most neglecting aspect, and you get a bunch of extremely detailed models that don't fit together !!!).
- Constantly review models to reflect the new insights you gain during the design process.