Design Process - Architecture & Design
How do you decide upon an architecture given
the vast choice of languages, APIs and libraries? How do you prove the
chosen architecture meets your non-functional requirements? How do you
decide which platform and topology is right for you? How good is "good
enough" and which tools really do add value during development? Visual
Studio, Eclipse, IDEA, Netbeans or something else?
The answer to the above questions are not
easy and the chosen architecture is highly dependent on the project
scope, resources and time line. Deciding on the right architecture is
often based on the architect's intuition and past experience. Our motto
is to keep the architecture as simple as possible while still being
flexible enough to meet the user requirements and future enhancements.
We are certainly guilty of over-engineering an architecture and had to
learn things the hard way. It's very easy to be seduced by the latest
and greatest frameworks that often have a poor track record and may
have a steep learning curve. Our experience with Corba and J2EE Entity
Beans can attest to that. Often the simplest solution is usually the
We are also big believers in open source
frameworks for the simple reason that application developers should
focus their attention on core business logic. Developing database and
web frameworks is a big waste of time since there are mature and well
documented frameworks freely available. Open source frameworks (e.g. Spring, Hibernate, Struts) provide all of the plumbing required to get an application up and running in no time.
Finally, we are strong advocates of
prototyping before finalizing on the architecture. This is especially
true when dealing with relatively new open source frameworks. Nothing
is worse than a paper architect that comes up with a poor design that
doesn't scale or perform. It's best to take sufficient time to fully
test and finalize the architecture before significant coding begins
since the architecture will form the foundation of your system and it's
critical to get it right.
We use CRC cards extensively in designing
the object model. A CRC card is a 4X6 index card that represents a
class along with its responsibilities and collaborations. Back when
most applications consisted of a two tier architecture with a fat
client, it was easy to have each class responsible for its actions.
Today with a multi-tier architecture, the object model typically
consists of dumb data objects that are passed from tier to tier. Most
of the logic which used to be in the object model is now stripped out
and resides on the server tier. This makes defining the object model
much more difficult since you now have to take into account the server
side classes that contain the bulk of the business logic.
The object model diagram describes the types
of objects in the system and various kinds of static relationships that
exist between them. At this point, we gather all of the CRC cards and
take a first pass at the object model and relationships. We can use UML
notation for this exercise. We will also make extensive use of common
design patterns in order to create an efficient object model. At this
stage, we will also attempt to determine the class attributes and
methods based on the CRC cards. This step normally requires several
These are often called interaction diagrams
and/or message sequence charts. A sequence diagram represents an
interaction between objects with particular focus on the message
broadcast chronology. Sequence diagrams provide developers with a
general idea of the flow of the system. This step will usually provide
additional confidence to the design team prior to coding.
Return to Design Process