DESIGN FOR EVOLUTION
WHITE PAPER
ABSTRACT
With rapidly evolving business needs and Internet technologies, competitive advantages
will be gained by those who anticipate and prepare for the future. Although Internet
applications are often backward compatible today, they are seldom forward compatible. An
application that exhibits a component-based architecture, extensible interfaces, and
appropriate use of abstraction will lend itself to forward compatibility, providing an
adaptable tool for its users and a foundation for its developers to move ahead on the
evolution curve. "Design for Evolution" is an exploration of forward compatible
design for Internet applications. It includes a case study of PowerQuery, an evolving
suite of Internet applications that supports material planning and provisioning for the
Columbus GPC, using ODBC, Server-side Scripting, COM, ActiveX and DHTML technologies.
INTRODUCTION
At a press conference in San Francisco, Microsoft Chairman Bill Gates remarks that the
"
Internet is a passing fancy." This was in October of 1995. Two months
later, Bill Gates recants saying "
not only is the Internet not a passing fancy,
but we are going to move aggressively to incorporate Internet access into all of our
product lines." At that time Microsoft had ZERO revenue from Internet or web-related
software. In December of 1996, just 1 year later, Microsoft closed its books with about
US$4 Billion in web-related revenues.
How did Microsoft do it? How did they change their strategy and technology in what
seemed to be over night? While many would argue that it was their sheer size and abundant
resources, they could not have pulled it off without an architecture that was designed to
evolve. For if it failed to evolve, it could have threatened their very existence.
Business and technology: two dynamics that command every developers
attention. Changes in business processes and strategies are inevitable and sometimes
radical. Technology is evolving at an increasing pace. We are in new age
digital,
genetic, information-based and wireless
an age where everything is changing. Since
developers work in this same environment, often building tools to facilitate it, they will
either design for evolution or extinction.
These dynamics should not be feared they should be prepared for. Any developer
can do this by following three fundamental design principles: extensibility, abstraction
and componentization. This paper explores the dynamics that are driving these principles,
as well as the principles themselves and how they enable applications to evolve. It
emphasizes design principles and while it may use specific technologies as examples, it is
not intended to make an argument for or against any single technology. The technologies
adopted to support the principles discussed in this paper are left to the discretion of
the developer.
EVOLUTION
Why do some applications seem to linger around forever while others come and go? How do
certain developers produce one successful application after another while the products of
other developers fail before they even get to market? What are the factors that determine
the success of a software product? In a large way, the deciding success factor for
applications is the ability to evolve. Business and technology are changing so fast
that if an application cannot evolve with them, it will become extinct. The ability to
survive depends on adaptability and natural selection.
The business climate is changing in many dimensions, making it increasingly harder to
keep up. The industrial revolution is over and we find our selves in an age of
information
many companies now sell information and tools for using it. The world has
become digital and virtual
cars are ordered on the Internet without ever being
driven
cameras use memory rather than film. We live in a culture of immediacy
6
to 8 weeks delivery is no longer acceptable, it has to be over night
9AM to 7PM no
longer works at a grocery store, they must remain open 24 hours. Its
chaos
companies make and break deals
everyone seems to be in a merger
or
split-up
corporations are bought and sold like candy. Applications can no longer be
designed for a given environment. They have to be designed for all possible environments.
When I first started working with information technology back in college, it was very
different and by todays standards crude. Since then, technology has evolved at such
a rapid pace that I strongly doubt Captain Picard will be reading bound classic
literature 400 years in the future. It will more than likely be a digital representation.
Internet technology alone has changed so much over the past few years. There are new media
types, new protocols, faster access, more people connected and new ways of building
applications. We have also seen an evolution in the World Wide Web
from static web
sites to CGI to server side scripting to distributed component technologies. The growth in
technology is not limited to information, it can be seen everywhere
genetics,
healthcare, space, etceteras. New technologies often mean better ways of doing things.
Surviving applications readily adopt the technologies that offer advantages.
Natural selection, in terms of Internet applications, is the phenomenon by which users
and developers naturally choose that which works best. Since so much continues to change,
the selection process is ongoing. What worked best yesterday wont necessarily work
best today and todays solution might not be tomorrows. For developers, natural
selection means adopting the development environment that works best. It is easiest
to use, most reliable, fastest to deploy, leverages existing knowledge, and is best
supported. Different developers will weight these differently. The long-term
successful developer will adopt development tools that allow him to build applications
that evolve quickly, cost-effectively and reliably. The tools developers use will play a
big role in which technologies are adopted. It isnt necessarily what is most often
chosen by the developer, however, it also depends on the user.
The users will naturally choose what works best for them. Even if 99% of developers
adopt technology A while the remaining 1% adopt technology B
if technology B works
better for the user or offers the user a competitive advantage, then this will be the
technology that is adopted. Developers must pay attention to what the user needs. Users
will choose what works best for them, not what works best for developers. Users that
change business rules frequently need developers who use technologies that allow business
rules to change easily and rapidly. Users whose mission depends on real-time information
need developers who use technologies optimized for delivering real-time solutions.
Application survival depends on the natural selection of both the user and the developer.
Here are a few questions that every Internet developer should be asking about their
application:
What happens to my application if the business rules change?
What happens if we enter a different market place?
How much additional work will be required to incorporate new technologies like speech
recognition, natural language query and hand writing recognition?
What about Internet devices that dont look like computers such as Web TV,
PDAs and cellular telephones?
What if the technology for storing data changes?
What separates the successful developers from the ones that come and go are the
questions they ask themselves. Designing solutions that provide good answers to the
questions above is what designing for evolution is all about. Since technology and
business processes cannot be accurately predicted, developers that design for evolution in
general will be better prepared for any change.
In this section we discussed how the environment is changing and the importance behind
designing applications that can evolve with it. The incredible rate of change should not
discourage the developer, however. By following a few fundamental principles, applications
can be designed to evolve. Concentrating on design principles rather than technologies,
results in principle-centered, rather than technology-centered, design. Principle-centered
design does not bind itself to technology or business rules. If you base your design on
the right principles, then the technologies chosen become less important. Three
fundamental design principles lend themselves to forward compatibility and evolution:
extensibility, abstraction and componentization. Use of these prinsiples results in
solutions that provide encouraging answers to questions about change. The balance of
this of this paper is an exploration of these principles and a case study that leverages
them.
EXTENSIBILITY
Extensible means having the capability to be extended. If an application is extensible,
then it is not limited to the methods, protocols, content, etc. that were considered at
design time it can be extended to handle new features. It can evolve gracefully. In
a client/server environment like the Internet, you will, at any given time, find
applications in various states of evolution. That is, technology "cuts"
arent made all at once because everything doesnt change at once. It may start
with just a few clients and a single server. This means that applications must be backward
compatible as well as forward compatible. It is easy to make a new application support old
technology, but making an old application support new technology can be tricky. The key is
to give applications the ability to negotiate usage-level details and to design them to
degrade gracefully with new technology rather than fail miserably. In this section, we
will look at several ways of doing this.
In the early 90s, work began on the now popular Hypertext Transfer Protocol,
better known as HTTP, by the W3C. HTTP was designed to be a generic, object-oriented
network protocol for retrieving resources located on a network (see Figure 1). Since the
original HTTP developers could not possibly know of all the different types of resources
that might be retrieved using their protocol, they needed an approach that would not bind
them to what they could think of at that time. They needed something that didnt care
about the type of resource being retrieved. The result was a protocol, extensible in at
least three dimensions, that has handled Internet evolution gracefully and effectively. By
employing the same principles that lie behind the extensible design of HTTP, developers
can design applications that extend just as well. The balance of this section will use the
HTTP protocol as an example to help explain design considerations for extensibility.

Figure 1
HTTP was originally designed to support three key methods or procedures (GET, POST and
HEAD). Basically these are operations to be performed on the Internet resource (or URL) to
which they are applied. For example,
GET HTTP://WCS.CB.LUCENT.COM/EVOLUTION/DEFAULT.HTM
applies the GET request method to the default.htm document located on the server
referenced in the URL. The GET method tells the server to retrieve the document. If GET
was replaced by HEAD, the server would return headers, but no document. HTTP is extensible
in terms of the request method; that is, new request methods may be used. All that is
required is that the client and server know how to handle it if the server
doesnt, it wont crash, it will just return "method not supported."
This means that new clients can be deployed that use new methods, but they can still work
with old servers. If they get a message from the server stating that the method is not
supported, then they should resort to an older method, which the server is more likely to
support. When a method is not supported, clients shouldnt fail, but rather
degrade gracefully. The same principle, method extensibility, can be added to virtually
any Internet application.
Similarly, a developer can design his methods so that the arguments for them may be
extended. Methods usually have a fixed number of possible arguments with a specific order.
For example:
PrintAddress(Name,Address, City, State, Zip)
But what would happen if you needed to add a company name to the address. You could
either force it to fit in an existing argument or you could recreate the method to handle
it as its own argument. A more extensible approach is to design a method that doesnt
care about the number of arguments or order. For example,
PrintAddress(Name=name, Address=address, City=city, State=state,
Zip=zip)
This approach includes the argument name with the argument so the order is unimportant.
What happens if you add a new argument? All you have to do is append it to the list. If
the process doesnt recognize it, it can just ignore it. This way, older
implementations of this method wont crash when being accessed by newer resources.
HTTP uses headers to communicate meta-information. The protocol is not restricted to
the headers that were conceived at design time. The specification only requires that the
headers be formatted as attribute and value pairs with a colon between them and a new line
for each pair. Basically this means that you can pass whatever meta-information you want.
All you have to do is follow the formatting rules. For example, lets suppose that
EVOLUTION : YES
is an HTTP 9.0 (by the way, there is no HTTP 9.0 yet) header telling the server to
evolve. This doesnt have much meaning to HTTP 1.0 proxy servers because the header
doesnt exist yet. Nevertheless, an HTTP 1.0 proxy server may see the header in
disparate environment. If the proxy server didnt have a way to deal with the header,
the request might not make it to the server. Instead, the proxy server passes this header
on, only caring about format (attribute : value). This facilitates evolution by allowing
new technology to be supported in an old technology environment.
The use of attribute and value pairs is an object oriented approach that allows
developers to design applications at the object level and not have to worry about every
possible attribute that could ever be used; new attributes evolve without a scrap and
redesign of the application. Lets suppose you were designing an electronic catalog
for a factory that manufactures cell sites. The catalog may have product attributes like
power, frequency and a digital image. If the supporting database table was designed so
that each of these attributes was a field, then what would happen when a new product had a
fourth attribute, like color? You would have to add a field to the table. Eventually your
table could have more fields then it did records. A better approach is to represent all
attributes with just two fields, attribute name and value (see Figure 2). This way, as new
attributes evolve, the application can be extended to handle them with no need for a
redesign. The same goes for the rest of the application that uses the information. If it
treats everything as an attribute and value pair rather than individual attributes, it
wont care when new attributes are added.
Instead of
Figure 2
New types of content continue to appear on the Internet. Five years ago, there was no
such thing as DHTML. Now everyone is talking about it. How do old applications exist in a
world with new content. The answer is negotiation. By the use of message headers, HTTP
clients can advertise to a server the types of content they support. A smart server will
try to return content the client can handle. For example, an image server can contain
multiple formats for each image and return only the format that the client supports. This
allows a new format to be adopted without cutting off service to old clients. This also
allows HTTP to leverage other Internet standards like MIME.
Similarly, applications can be developed to negotiate. This doesnt just mean
content type. As thin clients become more prevalent, they may not be able to handle large
content due to memory constraints. Size is something that can be negotiated. Data types
may be negotiated as well. Suppose an application designed to perform data collection on
the Internet was designed at an earlier time than the resources that it communicates with.
What happens when a Binary Large Object is sent to a resource that doesnt support
such a data type? It might crash or it might fail gracefully. The better answer is to
negotiate the content prior to exchanging it. This way something that the resource can use
may be sent.
In this section , we looked at design techniques that allow applications to be
extended. The HTTP protocol was used as a working example due to its great success in
surviving the changes in Internet technology over the past few years. Its success,
in large, is due to the extensible design principles on which it is based:, method
extensibility, attribute and value pair usage and content negotiation. These same
principles can render long-term successful results for developers that consider them at
design time.
ABSTRACTION
To abstract means to withdraw, take away or separate. A system with an abstracted
architecture isolates sub-components from each other and from the whole. This allows
pieces of applications to be built independently of each other and evolve with greater
ease. Consider a web server that collects user data, applies business rules, formats the
results and then returns them to a browser. What happens if you change the business rules?
It depends on whether or not the application abstracted the rules from the rest of the
application. If they werent abstracted, then most of the application will probably
need to be redone. If, however, the rules were abstracted then all that needs to be done
is to change the rules layer, a far simpler task than redoing the entire application.
Abstracted architectures let you replace any layer without affecting the others. All that
is required is that you follow the rules for interfacing with the other layers.
Abstraction makes evolution easier because it allows layers of an application to evolve
independently of each otherso whole applications dont need to be rebuilt, just
the layers that are affected by the change. This section will explore several examples of
abstraction in use to demonstrate its applications and benefits.
The Windows NT operating system abstracts the software from the hardware on which it is
built to run. It does this by putting a layer between the operating system and the
hardware. This is known as the hardware abstraction layer, or HAL (see Figure 3).
The advantage of this is that if a new hardware platform comes along, all that needs to be
done to make Windows NT compatible with it is to write a hardware abstraction layer
specific to the new platform. The result is an operating system that currently works on
four different platforms and is scalable from 1 to 256 processors. But, thats not
all, the real advantage is that this positions Windows NT to evolve when changes in
hardware technology occur without having to start from scratch. With the increase in
embedded Internet technology, developers have more reasons than ever to abstract the
software from hardware.
Figure 3
Similarly, the Java Virtual Machine (JVM) provides a layer of abstraction between the
platform and the Java code that runs on the machine. This allows you to write a Java
program once and run it on any platform. All that is required is that the platform has a
JVM. This also gives developers a nice mechanism for hosting foreign applications.
Almost thirty years ago, the Department of Defense (DOD) funded an effort to connect
some computers together. The project evolved from a handful of sites to the Internet as we
know it today. How could one model be so scalablefrom a few sites with limited
applications to countless sites with endless applications? The answer is that it was
explicitly designed to evolve. Out of the early work came the DOD Reference Model (see
Figure 4). It is a model for the Internet that abstracts an application running on it into
four layers: application, host-to-host, Internet and network access. The model specifies
how each layer interfaces with the other. By doing this, any layer can be replaced and the
model will continue to work providing that the layer is compliant with the interface
specifications. This is why your web browser doesnt care whether the physical
network is phone line, category 5 wire, coaxial cable or fiber optics. The network access
is abstracted from the layer that the web browser runs on, the application layer. This is
also why the HTTP could be implemented years after the Internet was launched. No changes
were required in any of the other layers, so building a new protocol meant just writing a
specification. By building applications that are based on layers of abstraction, the
developer is designing for evolution.

Figure 4
Todays client/server applications resemble their ancestors so little, they are
now called n-tier applications. In this model, the division between the client and the
server isnt as easily discernible, and often the server becomes a client itself. The
new model abstracts and distributes tasks more evenly between the client and the server
and often includes other resources as well. Viewed from a purely functional standpoint,
most systems will perform three main tasks: presentation of the user interface (UI),
business logic and data services (see Figure 5). The n-tier architecture isolates or
abstracts each major piece of functionality. The presentation is independent of business
process rules, which in turn is separate from the data. The result is a system that allows
you to change the business rules, something that is very common today, without having to
change the user interface or the data service. What if a new UI technology was becoming
popular, but not yet ubiquitous? This architecture will allow you to add additional
UIs without having to redo the business rules or data services. This is becoming
increasingly important as we see new UI technologies like speech recognition, PDAs
and embedded devices evolve. It would also allow multiple UIs to coexist
making evolution very smooth. What if you wanted to change your database technology to
another vendor? Would it require a complete rework? Not with this architecture, you can
plug in any database that meets the interface specifications of your architecture. In
todays data intensive environment where data exists in so many places and with new
data sources becoming available all the time, binding yourself to the technology of any
specific data source is likely to mean extinction. This architecture separates the data
technology rather than binding to it. Developers who harness the n-tier architecture are
rewarded with very flexible applications, applications that have few limits and the
ability to evolve.
Figure 5
In exploring abstraction, an approach to isolating the components of an application
from each other, we looked at hardware abstraction, a network reference model and the
n-tier architecture. We discussed how separating the pieces of an application requires
less overall work when business rules change, resulting in a solution that evolves rather
than becoming extinct. Layers of abstraction were discussed along with the need for an
interface specification between layers. The benefits of isolating business logic in a high
change environment were studied as well. We also looked at the need to abstract data in
data intensive environments. This discussion is not all-inclusive, but rather an
introduction. The developer should try to understand what technologies might change and
then abstract them from the application accordingly. Here are a few other items worth
considering: content-type, protocols, interface documents and the operating system. The
developer that invests the time in analysis and design up front greatly reduces
maintenance costs and increases the application's ability to evolve.
COMPONENTIZATION
Componentization is the breaking up of monolithic applications into separate binary
executables that connect with each other at run-time to form an application. Like
abstraction, componentization separates an application into sub-components, but it does
more. It offers a binary specification, a mechanism for upgrading and fosters dynamic
linking. The component-based architecture is a very specific way of designing an
abstracted solution. It is entirely possible to design applications that are abstracted in
more ways than just by components. Componentization allows applications to have components
easily replaced, making evolution on a component-by-component basis possible. The
principle also permits applications to be formed by simply gluing a bunch of components
together with script or code. In this section we will look at the benefits of
componentization and how such architecture is evolution friendly.
Traditional applications are usually made up of a single monolithic binary file (see
Figure 6). After being compiled, the application doesnt change until a newer version
is recompiled and distributed. Hence, these applications are static (and many times out of
date) when they ship. Today, information technology is changing so quickly that it is no
longer feasible for an application to behave this way.

Figure 6
By breaking up the monolithic application into separate components, change is more
appropriately addressed. Applications can stay up to date by merely upgrading components.
With todays technology, this can often be done transparently and dynamically on a
network.
The requirements for components are:
- Language independence
- Shippable in binary form
- Upgradeable without breaking old clients
- Transparent location and relocation on a network
- Dynamic linking
Application customization is one trait of componentization that lends it to evolution.
Lets suppose an application was designed with an embedded Java scripting engine.
What happens when you acquire another group of users, a group that prefers Visual Basic
script? This could mean a bunch of disgruntled users. If the architecture treated the
scripting engine as a component, however, it would just mean replacing it with a Visual
Basic scripting engine component, something that can be purchased over the counter with no
development necessary. What happens when someone wants to use Perl Script the same
thing!
Component-based architectures give developers the ability to isolate highly changeable
aspects of applications, like business rules, into components. Imagine the work involved
in modifying all of your applications when the rules change. When the business rules are
coded into components, a single set can be used to service every application that depends
on business logic. If the business rules change, all you have to do is change one
component, rather than every application.
In todays changing environment, the ability to easily upgrade an application is a
must. What if you needed to add new features to a component that initially only a few
clients would benefit from? Wouldnt it be nice to upgrade the features of a
component yet still have them behave the same to applications that dont take
advantage of them? Component-based architectures provide a facility for this through the
negotiation of interfaces one for the old client and one for the new client. This
allows multiple generations of applications to coexist making evolution graceful.
The shrinking of the developers time-to-market is making rapid application
deployment more prevalent than ever. By designing a set of linked, reusable components,
new solutions can be developed overnight by merely linking together a set of existing
components with script or code. Imagine the time saved by not having to re-code business
rules or data access. By developing to one of the popular component specifications, the
developer may also purchase off the shelf components to incorporate applications. This
would result in a library of components that could be reused whenever an application is
being created or modified, shortening the development cycle.
Componentization makes implementing distributed applications easy. A distributed
application divides tasks between two or more machines (see Figure 7). The client/server
and n-tier models render distributed applications. Since a component-based architecture
allows components to be transparently located and relocated, distributing them among
different systems is entirely possible. It allows applications that were originally
designed to be hosted on a single system (using older component technologies) to evolve
into a distributed system by replacing the older components with remoting components. The
ability to distribute components also facilitates architectures that centrally locate
business process components on a single machine for all applications to access.
Component-based architectures provide an effective solution for the evolving trend to
distribute applications.

Figure 7
When adopting a component-based architecture, the developer has two choices. He can use
an existing technology or he can create his own. First, we will look at leveraging an
existing technology. By adopting an existing standard, the developer will be spared the
cost and time associated with developing a standard. The developer can further shorten the
development cycle by using off the shelf components compliant with the existing standard.
Hiring additional developers becomes easier because the chances of finding candidates with
experience in a public technology is more likely than finding candidates with experience
in a private one. Development environments are also available to those that design
components compliant with an existing standard, making everything easier. Adopting an
existing technology clearly has its benefits.
What technologies are available? Although scriplets and applets offer some of the same
features of componentization, they arent full implementations of the architecture.
DCOM and CORBA are two competing specifications that provide a sound basis for
architecting a solution. DCOM, or the Distributed Component Object Model , is a standard
proposed by Microsoft. It currently runs on Windows platforms with implementations being
tested on UNIX. DCOM, COM , COM+ and ActiveX are all very closely related specifications
offered by Microsoft, some of which are subsets of the others. It is beyond the scope of
this paper to delve further into these technologies. The Object Management Group (OMG) is
a consortium of companies that have been developing a component communication standard as
well. OMG is responsible for CORBA, or the Common Object Request Broker Architecture.
Implementations of CORBA are available for various platforms, including Windows and UNIX.
Although DCOM and CORBA both offer standards for inter-object communication,
provide facilities to implement distributed applications, and encourage the separation of
business logic from the presentation layer, the implementation of these standards is
different and they should be considered compatible. The technology adopted is left to the
discretion of the developer.
What if you wanted to brew your own specification? This is entirely feasible, but you
would lose so much. You couldnt use off the shelf components or leverage development
environments designed for existing standards. You would have trouble finding developers
with experience in your proprietary specification. You would also have to invest the time
and money to design and test your specification. So, why do it? Maybe DCOM or CORBA
dont entirely meet your needs. Maybe you want something simpler. Maybe you want to
sell tools for your new specification. Although there are many factors that encourage the
use of an existing standard, the ambitious developer is not precluded from creating his
own.
In this section, we studied componentization: a technique for creating adaptable
applications out of separate components that link together at run time. By implementing a
component-based architecture, applications may quickly and easily evolve thanks to the
facilities provided by componentization. These include backward and forward compatible
upgrades, use of library and purchased components, abstraction and centralization of
business logic, dynamic linking, transparent location of components and application
customization. We also looked at the alternatives a developer has when adopting a
component technology. Whatever technology is adopted, the developer who implements a
component-based architecture is designing for evolution.
CASE STUDY: POWERQUERY
PowerQuery is an evolving suite of Internet applications that supports material
planning and provisioning for the Columbus GPC, using ODBC, Server-side Scripting, COM,
ActiveX and DHTML technologies. Since its inception just two years ago, PowerQuery has
gone through four major evolutionary steps. How could this be afforded? How could an
application remain in use while so much change was taking place? This was all possible
because PowerQuery was explicitly designed to evolve. This section takes a close look at
the design principles behind PowerQuery, the same principles discussed in this paper, and
demonstrates their effectiveness in creating applications that evolve.
PowerQuery is essentially an application that integrates data from 11 different sources
and serves up the results to a web browser. It provides hyperlinked cross referencing,
analysis and multi-system views of production, planning and provisioning information.
Interactive reports are also a product of the tool, replacing static paper reports. At
fixed weekly, daily and hourly intervals, data is assembled from the various systems. Web
pages allow the user to pass parameters on to PowerQuery, which results in a query
followed by the display of data. Results sets include active elements that allow users to
generate second-level queries by just clicking on a data element. The tool also provides
for analysis and standard reports.
PowerQuery started off as an experiment. Wewanted to see if an Internet application was
a viable means of allowing users to integrate, manipulate and process planning and
provisioning information. If the idea proved viable, then the application was to be
rapidly deployed Figure 8 illustrates the architecture of PowerQuery at each stage
of its evolution.
.
Figure 8
Phase 1 of the application involved using CGI (the Common Gateway
Interface), COM components, an ODBC driver for text files and a set of flat ASCII text
files. CGI technology was originally used because it was the best alternative at that
time. Since new technology was on the horizon, we wanted a solution that would allow us to
plug as much of our work into the newly emerging technology as possible. We used COM to
create a set of components that would provide the business logic and data services
required for the tool. This would allow us to reuse the components with the new
technology. It would also allow business logic to be changed without having to change the
rest of the application. To keep initial costs and development time low, phase 1 of the
application did not involve a DBMS (database management system). Instead, all data resided
in a set of raw ASCII text files, many of which were already available. Since we expected
to migrate to a DBMS if the application proved viable, we needed to abstract the way data
was stored from the data services provided by the application. Rather than accessing the
files directly, we accessed them via ODBC, providing the layer of abstraction that we
needed. This would allow us to use a DBMS later without having to change our components.
The result was a working system that was readily adopted by users. It also evolved into
phase 2 very smoothly.
With the success of the phase 1, the decision was made to continue with development.
The next steps involved extending the tools capabilities and use of a DBMS to
improve performance. At this time, there was a change in technology known as server side
scripting. Server side scripting would significantly decrease development and maintenance
cycles. We used Microsofts Active Server Pages (ASP) to implement the server side
scripting in phase 2 which replaced the CGI and added new features. Since our business
logic was embedded in its own set of components, the migration to phase 2 only involved
the creation of ASP pages that provided the "glue" to connect the existing
components with the user interface. The text files were being replaced with a DBMS, SQL
Server, but the work was still in progress after the ASP migration was complete. Since the
data services were abstracted using ODBC, we didnt have to wait for the DBMS effort
to finish in order to release phase 2. The integration of the DBMS was put off until phase
3 while phase 2 was well received by the users.
Finally, the DBMS was finished. It was loading itself with data from eleven information
systems at fixed intervals. Initial testing showed tremendous benefits in both performance
and capabilities. Once the DBMS was complete, integrating it with phase 3 was literally a
five-minute effort. All we had to do was change the ODBC connection string to reference
the DBMS rather than the text files. No other work was required and nothing had to be
compiled. Phase 3 was released, being transparent to the users except for the increase in
query speed.
At the time of this writing, phase 3 was being replaced by phase 4, a new generation of
the tool that provides a dramatically improved user experience. The improvements can be
attributed to DHTML and client side components. For these applications, ActiveX is being
used as the client component technology. Benefits of phase 4 include the caching of record
sets on the client, improved data access and client side data manipulation. Some of the
ActiveX components were designed with extensible methods so they won't break old clients
when new features are added. The improved solution uses the original server components, so
the only work involved in this phase is in the presentation layer and the glue that is
used to bind it to the existing business logic. Since most of the original infrastructure
remains the same, that is we are only adding to it, it allows phase 3 and phase 4 to
coexist. This permits phase 4 to be incrementally deployed with temporary support for
older browsers is offered by phase 3, providing a very comfortable and easy evolution. All
new work is implemented based on the phase 4 model. To the user, this phase is considered
the best overall experience yet.
In this section, we explored a case study on PowerQuery, an Internet application that
successfully evolved through four phases of development. The benefits of data abstraction
can be seen in use through the tools implementation of ODBC data access. COM, a
component technology leveraged by PowerQuery, which allowed the tool to make major
evolutionary leaps without recoding business logic, demonstrates the power of a
component-based architecture. We also noted that current development efforts harness
ActiveX controls with extensible methods in anticipation of new capabilitiesthere is
no "end state" for this tool. By following the principles of extensibility,
abstraction and componentization at design time, PowerQuery has demonstrated that it is
entirely possible to deploy solutions that are designed to evolve.
CONCLUSION
Today, business and technology are two very active dynamics that demand every
developers attention. Everything is changing so rapidly. Since developers work in
this same fast-paced environment, often building tools to facilitate it, they will either
design for evolution or deign for extinction. By employing three fundamental design
principles, extensibility, abstraction and componentization, an application may be
designed for compatibility with what is yet to come. The end result offers a competitive
advantage in the form of an adaptable tool for users and a flexible foundation for
developers, moving everyone ahead on the evolution curve.
|