Where to find them
We can find some pattern sources by looking at the human aspects of software. Those we find can be interpreted and assessed through the objective measure of wholeness. We can look at studio layout, UI, and the design of applications in general. We can look for patterns in human resources and patterns for rewards. Through the lens of survival, we can hunt for patterns providing a better working environment, both locally and at the scale of corporations. We can look for patterns of how we should develop processes, design code, and test our software. All these systems can influence and be influenced by other elements, hence the systems theory aspect.
The physical environment seems the most obvious. We have a long history of
working in offices and have worked with other humans for thousands of years. We
will have a sense of quality for these areas. We can trust some of our
instincts on what will make things better.
The quasi-physical world of the end-user experience is the next most obvious. Applications are lived with. They need good geometry and follow the patterns of breaking symmetry to indicate information. Mostly, you can appraise them by the same overwhelming agreement method. Beyond feeling, we have many good rational metrics supporting us, such as measuring time and motion—but not for evil this time.
User stories are bountiful hunting grounds for patterns. There are undocumented
patterns, such as
In his book
It should be possible to identify some patterns from a current situation via the negative forces that are present. Some lack or some present pain is often the motivation. Deduce from what is clearly or not so clearly missing. In the work on the Eishin Campus, ‘paths connecting classrooms exposed to rain’ and ‘separate classroom buildings’ were latent behind the ‘covered passages’ and ‘one building for all classrooms’ requirements naturally supposed by System B ([NoO2-02] page 366). Look at what you presume and think about why it’s assumed and what it means. Look at the opposite options. Remove an obvious requirement to identify whether change is needed. What nice things are killing you?
If you are in a monolithic codebase, the ability to reach all other code from anywhere is an anti-pattern but also a guide to the pain. Before splitting the code into smaller pieces, you will likely have long build times because monoliths tend to have lengthy build processes, collecting everything together at the last minute. These pains might not be noticeable until you consider what you don’t have. When making architectural decisions, we trade one pain for another, but often, there is a path to solving both when you look hard enough.
James Coplien’s commonality and variability analysis[MPDfC98] is a good source of patterns in software. Most GoF patterns fit this structure. We view something as a static attribute, so we introduce an object or abstraction to allow it to vary. You can often find patterns in software in how we deal with different kinds of design requests.
For example, when we must vary what we construct, we make our constructors into
variables: the
What is common to some data is a transform. What is common to some transforms is an algorithm. What is common to some algorithms is a paradigm of programming. What is common to different paradigms is goal definition. Commonality and variability analysis allows you to find patterns, no matter the scale, but it also helps you find the hierarchy in your language.
Yes, I made this one up, but it seems a reasonable pattern resolving forces in a context.