Good designers come from a continuous observation, scrutiny and practice of the reflective conversation with the situation at hand.
“[The designer] works in particulars situations, uses particular materials, and employs a distinctive medium and language. Typically, his making process is complex. There are more variables—kinds of possible moves, norms, and interrelationships of these—than can be represented in a finite model. Because of this complexity, the designer’s moves tend, happily or unhappily, to produce consequences other than those intended. When this happens, the designer may take account of the unintended changes he has made in the situation by forming new appreciations and understandings and by making new moves. He shapes the situation, in accordance with his initial appreciation of it, the situation “talks back”, and he responds to the situation’s back-talk.
In a good process of design, this conversation with the situation is reflective. In answer to the situation’s back-talk, the designer reflects-in-action on the construction of the problem, the strategies of action, or the model of the phenomena, which have been implicit in his moves.” —The Reflective Practitioner: How Professionals Think in Action by Donald A. Schon
If you ever have the opportunity to observe master designers taking design decisions, you should know what Mr. Schon is talking about.
Other design professions at their infant stage, like software design is by now, grouped in craftsmanship guilds to preserve and evolve design knowledge passing it by means of craftsmanship traditions like master/apprentice connections.
How is design expertise preserve in our software discipline?
Yes, there are books documenting catalogs of design patterns and pattern languages, those are ok. But something very important is lacking: live descriptions of design expertise. Not marketing-oriented, toy demonstrations but the real thing of what it takes for good software design that makes a living, just like other design professions in their time.
Of course there are people in our industry that know this and do something about it; many of them are in the trenches along with many from the agile movement.
Nonetheless design expertise shortage is huge, for example, many people in our industry write classes with a bunch of methods inside and then call this object-oriented design, whereas that is just information modeling or representational modeling or at most modules of old structured design—all are good techniques themselves in proper context—but ignore the whole point of object design: to manage behavior and dependencies of the underlying abstractions.
How can we advance our profession with this state of affairs?
Comes to mind a very important first step:
"Be the change you wish to see" –Gandhi
What comes to your mind?