Moisés Daniel Díaz Toledano, http://www.moisesdaniel.com
1.-
What a software architecture is and what it is for.
2.-
Architectures and Methodologies.
3.-
Types of Systems.
4.-
Pattern Languages.
5.- New Designs.
1.- What a software architecture
is and what it is for.
|
|
|
|
Blowball 1943 wood engraving, M.C. Escher |
Cubic Space Filling, M.C. Escher |
The concept of architecture is used
in a wide sense and in very different fields, so that its meaning is somehow …
vague.
In the software field, the
architecture identifies the more important elements of a system as well as
their relationships between them. So, it show us a global vision of the system.
Why is this so important?
Because we need an architecture to understand the system, organise its
development, plan the software recycling and make it evolve.
Determining the elements that
define an architecture is difficult and very important.
Usually, the development
methodologies establish guides to identify and design an architecture,
although, until now, the real help they can offer is very limited as these guides are very
generic. In this article we are going to describe some techniques that can be
very useful to build up software architectures.
The software architectures do
not respond only to natural requirements, but they are related to other aspects
such as performance, usability, recycling, economic and technological restrictions,
and even to aesthetic questions.
2.- Architectures and
Methodologies.
|
|
|
Drawing Hands 1948 Lithograph, M.C. Escher |
Nowadays, there are many
software developing methodologies, going from very “hard” and bureaucratic methods,
methods that are adaptable to the project and to the developing conditions, to
“light” methods that emerge as a response to the formal excesses of other
methods.
Obviously, bearing in mind the
guides given from so many and son different methodologies, it is very difficult
to have a unified vision of the architectural design. However, we can remark
some common elements to those that are more focused on this subject.
So, what are these common
elements? The first one is the existence of a phase where a basic architecture
is established or designed, and the second one is the very high dependence they
define between the use cases and the architecture, defining a use case as a
typical interaction (actions sequence) between the user and the system.
From an architectural point of
view, not every use case have the same importance, being more remarkable those
that help us to reduce the more important risks and, above all, those that
represent the basic functionality of the system we want to build.
This basic architecture will be
specified by diagrams that show subsystems, interfaces between them, components
diagrams, classes, diverse descriptions, and by the basic group of use cases.
This group of specifications let
us validate the architecture with the clients and the developers, and make sure
that it is right to implement the wished basic functionality.
From this point, we would
develop the system in an iterative way
until having it functionally complete.
Up to here everything is
perfect, isn’t it? Now we really know how useful a software architecture is,
but… we still don’t know how to design one.
3.- Types of Systems.
|
|
|
|
Ant 1943 Lithograph, M.C. Escher |
Mummified Frog 1946 Mezzotint, M.C. Escher |
An alternative vision would be
to identify the type of system we want to build. Everybody knows that there are
not two equal applications, but we know that there are clear parallelisms
between applications that are built to solve similar problems.
Looking at applications of the
same type has many advantages as that help us to understand the client needs
and the what has been done to cover them.
Whereas using a traditional
development methodology:
·
Makes us focus only on a part of
the problem (knowing deeply the problem, its requirements and its
microstructure), getting round subjects like performance, security,
communication protocols, hardware, software and economic restrictions, and so
on.
·
Gives us a narrow view, as the
client does not usually present all his/her requirements in a suitable way,
because he/she does not know them.
Let’s imagine that we are developing a web site. Experience shows us that from a certain number of pages, it is useful to develop a system based on Xslt templates, because of the decrease of maintenance costs it all implies.
This is something that any functional requirement will show us, it will not arise either in a “natural” way with the design models.
We get to this type of solutions
(design pattern) by the experience of web system developing and by the
knowledge of the technologies existing on the market.
Thanks this experience, from the
beginning of an application developing, we can search for components which are
capable to implement these technologies or certain functionalities, and so we
can integrate the searching of components and their use into the software
developing process.
Identifying the type of system
we have to build lets us examine the architecture of systems already built,
understand the requirements they are facing and contrast them with our clients.
If we have in mind that there are similar needs in any type of system (e.g. web
sites), some components used on their development are usually the same (e.g.
Xml parsers, Xslt transformation engines, data access components, search
engines, shopping trolleys, content managers, and so on).
The methodologies that manage in
a direct way the architectural and structural subjects will be able to produce
not only products of higher quality but with a lower cost and in less time.
This is due to fact that the architectural risks are lower and are more
controlled, and also because being able to integrate a component-oriented view
increases the possibilities of reusing already developed software, with all its
advantages.
Building an architecture is both
an activity to develop new ideas and an opportunity to use the gathered
experience. The developer has usually the responsibility of creating a product
of quality, and then, of knowing the type of system he/she has to build. Luckily, pattern languages can help us to do
that.
4.- Pattern Languages.
|
|
|
Plane Filling II 1957 Lithograph, M.C. Escher |
“Pattern Languages” can be
defined as it follows: “Specification of a series of elements (patterns) and
their relationships (patterns) in a way that let us describe good solutions to
different problems indifferent contexts”.
The objective of the design
patterns is to capture good practices that let us improve the quality of a
system design, determining elements able to support useful roles in that
context, encapsulating complexity and making it more flexible.
Usually, it is said that the
function defines the form, that means that the structure or the architecture of
any system is very related to what that system has to do.
This is the reason why systems
with very similar objectives have also a common architecture, well defined
processes and a group of very similar elements (design patterns). Similar
functionality and service, similar structure.
When we develop a system which
can be classified as a certain type, it is very useful to consult pattern
languages that deal with the field we are in. A pattern language acts as a
conceptual reference of the field of the problem, as they are given as a
solution to a group of use cases and interactions with specific actors.
Besides, they constitute a conceptual frame for the design of our systems architecture,
since, as the function defines the form, they summarize architectural and
structural solutions that are well proven and very useful in the type of
problem they shape.
In some way, patterns let us
identify and complete the basic use cases proposed by the client, they let us
understand the system architecture, build their problems, and search already
develop components that complies with the requirements of the type of system we
have to build (that means that they let us obtain in a easy way tha basic
architecture we search during the architectural design phase).
Unluckily, pattern languages are
not either the panacea, they present many gaps. Above all, we must remember
that all this documentation of design movement starts in the middle nineties and,
though a hard work has been done, there is no standardisation yet of how to
deal with these languages development, nor a classification that relations them
to each other.
From my point of view, a pattern
language that shapes a type of system should be described including the
following information:
· Basic characteristics that define and
differentiate it. For example: a we system is characterized by
q
microlight clients,
q
using of protocols without a state,
q
centralization of the execution
software in servers in such a way that the applications is shared by all users,
q
distribution of the information in levels of magnitude to its recording,
q
the vast majority of the
transactions in this type of systems are very simple,
q
the system is the responsible of
building the interface of the user in a more diligent way than in other
systems,
q
and so on.
· Definition of the main actors that
participates on the system as well as the basic use cases, obviously described
in a generic way.
· Specification of the main functional components of the system as
well as the relationship between them.
· Logic architecture and information flows that
structure the different subsystems, the exchange of their information, and so
on. For instance: reflexive architectures, model-view-controller, and so on.
· Components architecture. That consist of mapping
the functional components in the logic architecture of the application.
· Physic architecture. Specification of the deployment of the components.
These languages should also have
a view oriented to software building and to build this software as elements
able to integrate into the applications development process.
5.- New designs.
|
|
|
Metamorphosis II 1940 woodcut in black, green
and brown, printed from 20 blocks on 3 combined sheets, M.C. Escher |
I have talk a lot about
recycling of the already gathered experience, however, it is to emphasize that
in such a changing field as it is software, everything needs to evolve, and nothing
is definite. The need to innovate and think about will continue being a very
important element for the applications development.
Nonetheless, as Isaac Newton
said “If I have seen further [than
others], it is by standing on the shoulders of giants”.
Let’s profit this piece of advice and let’s build and innovate using the
experience others have left to us.
Moisés Daniel Díaz Toledano, http://www.moisesdaniel.com