Often, I have pondered as to how much of the designing process
can be qualified as 'Art'? But then, this question is kind of fuzzy without qualifying the
intended definition of art. Art can mean many things.
- The product of human creativity
- The creation of beautiful or significant things
- A superior skill that you learn by study and practice and observation
- Visual representations in a printed publication
It brings a smile to my face thinking that this is turning into a recursive game. I had
intended to choose the first definition, i.e. art is the product of human creativity
but then creativity is a very broad term. In this context, I look at creativity as
the stroke of ingenuity (power of creative imagination).
I would decompose the process of design into the following ingredients:
ingenuity, domain knowledge, technology knowledge, design patterns, heuristics, hands on
development experience, analytical reasoning and prior
design experience. I would further qualify these attributes into two broad categories,
ingenuity and elaboration techniques. The nucleus is the art, the stroke of
genius, while the rest of the process is intelligent elaboration. Post zygotic stages
are well understood and predictable but it's the nucleus which takes that rare stroke
of lightening in the primeval broth for life to emerge.
Although elaboration techniques form the bulk of the design process, it's the art
which infuses the soul in the design.
In almost all the cases, design processes turn out to be elaboration exercises.
Structured elaboration forms the key to any iterative endeavor, may it be design,
building a clay sculpture or cooking dinner. If we introspect on the elaboration
techniques, we will quickly realize that everything rolls up under 'heuristics'.
"A commonsense rule (or set of rules) harvested from prior experiences which are intended
to increase the probability of solving some problem", is how heuristics is defined :).
Experience or heuristics is of two types, collective experience and individual
experience. For example, design patterns is a collective knowledge base while
hands on development experience is individualistic. You can assimilate design
patterns, but you have to strive to aggregate prior design experience.
Having made all the above profound statements, let me try to supplement philosophy
with tangible data points. Let me give you an example. Once upon a time, I was faced
with a unique problem. I had to design an offline batch system with high throughput
requirements. It was a porting project with emphasis on staged migration of
functionality, design catering to functional scalability (resilient to business logic
changes), high reliability etc.
After a few
days of brooding and listening to Nirvana, I came across the following diagram
(to the left top). Looking back, this was possibly the most demanding effort in
terms of creativity in designing the solution. The conceptual solution formed
the nucleus of the design, which was iteratively elaborated to form the final
design (shown below).
Each of the iterative elaboration phases were quite easy in themselves, essentially
turning out to be optimization problems. For example, in one of the
iterations we dealt with the problem of sweeping the processors before reaching the
terminator to ensure that no workers were left operative before the terminator was
invoked. The solution (second from top) flowed quite logically in terms of the need to
wait on each processor for it's workers to finish. The waiting in turn was controlled
by a count-up-count-down latch which was incremented/decremented during the
pre-processing and post-processing stages of the workers. So on and so forth.
For many weeks, I thought that the initial pen sketch design was the bolt of lightning, the art,
which could not be arrived at by deductive analysis of the problem. But then, I
realized that even the pen sketch was heavily influenced by the constraints I was
dealing with and my previous experiences. For example, you can clearly see
influences of 'service bus' (mediator), 'chain of responsibility', 'activator' and 'executor'
patterns. I had worked with each of them individually in the past but possibly never
in this permutation.
It was quite disheartening to see my feeling of ingenuity dissolve away. I have
observed that in most of the cases, ingenuity is expressed in assembling prior
knowledge in a suitable permutation to solve the problem at hand. It is the art
of assembly and the swiftness with which one is able to evaluate multiple alternatives
against the constraints and choose the optimal one, that makes the difference between
a good design and a not so good design.
The success of a design, I have realized, lies on three pillars.
a) It is very important to realize all the
constraints that the design needs to satisfy. Constraints include documented
requirements (functional and non functional), implementation platform limitations,
team strengths etc. The cost of missing out on constraints goes progressively
high as you elaborate through the design.
b) Knowledge of patterns, tools, techniques and reusable components. It
is said that design should be tools/technology agnostic. I find this statement
to be grossly misinterpreted. It's only the conceptual design that has minimal
influence from the platform of implementation, rest all start getting progressively
influenced by implementation tools and techniques. For example, the knowledge
of the Executor pattern was quite fundamental is coming up with the specification
level design. If I have had no clue of the executor pattern, the design most
probably would have been radically different.
c) Solutioning and their evaluation. Each of the design constraints can be
solved in a multitude of ways. However only fixed combinations of solutions cater
to all the constraints put together. It is important to understand that a design is never
right, wrong, good or bad on an absolute scale. A design is good or bad in reference
to the constraints it tries to solve.
Well, so what's new? These three points form the basis of any solution irrespective
of domain or kind of work. Understanding constraints, having the required knowledge
to solve the constraints and evaluating possible solutions are things we do even when
shopping for vegetables or shoes. What's so special about designing a software solution?
Is it just that the tools, knowledge and evaluation criteria are different than that
for vegetable shopping? And what about the philosophy of 'art' being a part of design ?
I had started off this blog trying to project designing as a by product of a superior
thought process, but then it is not true. Software design is just like solving anything
else, it's just the knowledge of technology, understanding of constraints and ability to
evaluate solutions that makes the difference. And none of them is rocket science. All it
requires is knowledge, practice and logical thinking.
Oh btw, forgot to mention, to acquire these three qualities it takes time, devotion and
practice, lots and lots of it.
|