There is a good design process shared by design professions like architecture, urban design or engineering, of course there are stylistic variations of this process but it is essentially the same for all schools of design within this family of design professions.
Good designers practice this process and software design profession can learn from them, see:
Good designs come from good designers, good designers come from…
The typical design advice from master to apprentice in those professions could go as:
“you should begin with a discipline, even if it is arbitrary…the principle is that you work simultaneously from the unit and from the total and then go in cycles…”
In software design, an essential part of the reflective design process is to convey design decisions using a distinctive medium that records the current state of design with complete fidelity; this medium represents the blueprints for the subject of design, this medium represents the construction plan to render the executable stream of bits.
There is one medium of design expression in software development: source code.
The design blueprint in computing is the input to the automated tool chain that renders executable deliverables; for several years, this input medium has been the notation of the 3rd generation of programming languages (3GL) like C++, Smalltalk, C#, Java, Python, CLOS, Eiffel, etc.
There have been a number of attempts to supersede 3GLs as the primary medium of design expression, but nowadays what has been accomplished are just executable notations that focus on domain-specific application areas like real-time software or specialized family of business applications (although these can also be designed with a 3GL and proper configuration mechanisms).
An increasing number of practitioners in the software design profession are observing that good design always depends on context; in fact they detect this notion of “best practice” as a harmful notion that prevent thinking and good design judgment because is commonly perceived and practiced as a silver bullet that just divulge the form but preclude the essence of the design process.
Certainly, there is no such thing like “best practice” in software design; the notion lacks too many things to be useful for the advance of our design profession. A much better concept is that of a “good practice” or even better a design pattern which complete definition—accordingly to ‘Pattern Hatching. Design patterns applied’ by John Vlissides—is composed at least of name, problem, context, solution, recurrence and, teaching to tailor for variances.
So, by now 3GLs are a very good medium to convey general-purpose designs in computing.
3GLs are tools for software designers, tools that help them to apply a good and efficient reflective design process; as more programming languages they master, the better spectrum of design expressiveness they get, as well as proficiency with multi-paradigm design techniques.
Microsoft .NET CLR is a wonderful choice to practice multi-paradigm design, and provides the medium of expression for polyglot software designers.
3GLs and .NET CLR are indeed a very good platform to design software nowadays, it is what good software designers should master as part of their design expertise.