I approach software architecture through the
medium of human language. I do make liberal use of diagrams but the
diagrams serve as illustrators of what, to me, is always a linguistic
conceptualization of a software architecture. In other words, my
mental model is nouns and verbs and adjectives and adverbs. I look
for nouns and verbs first. This is the dominant decomposition for me.
What are that things that exist in the model? Then I look for what
actions are performed on/by the things in the model. (Yes, the
actions are also “things” after a fashion...)
This first level of decomposition is obviously
very high level and yet, I find it very useful to pause at this level
of detail and do a gap analysis. Basically what I do is I explain the
model to myself in my head and look for missing nouns and verbs.
Simple enough.
But then I ask myself how the data that lives in
the digital nouns actually gets there in the first place. Most of the
time when I do this, I find something missing in my architecture.
There are only finite number of ways data can get into a digital noun
in the model. A user can enter it, an algorithm can compute it, or an
integration point can supply it. If I cannot explain all the data in
the model through the computation/input/integration decomposition, I
am most likely missing something.
Another useful question I ask at this level of
detail relates to where the data in the nouns goes outside the model.
In most models, data flows out at some point to be of use i.e. it
hits a screen or a printout or an outward bound integration point.
Again, most of the time when I do this analysis, I find something
missing – or something in the model that does not need to be there
at all.
Getting your nouns and verbs straight is a great
first step towards what will ultimately take the form of
objects/records and methods/functions/procedures. It is also a great
first step if you are taking a RESTian approach to architecture as
the dividing line between noun-thinking and verb-thinking is the key
difference between REST and RPC in my experience.
It is hard to avoid prematurely clustering nouns
into types/classes as our brains appear to be wired towards
organizing things into hierarchies. I do this because I find that as
soon as I start thinking hierarchically, I close off the part of my
brain that is open to alternative hierarchical decompositions. I try
to avoid that because in my experience, the set of factors that steer
an architecture towards one hierarchy instead of another are
practical ones, unrelated to “pure” data modelling. i.e. concerns
related to organizational boundaries, integration points, cognitive
biases etc.
Take the time to explore as many noun/verb
decompositions as you can because as soon as you pick one and start
to refine the model, it becomes increasingly hard to think “outside
the box” of your own architecture.