 |
Aug
2000 |
By
Dr.Thomas J Mowbray |
Many of us
have serious misconceptions about the capabilities
of current software approaches. Based upon surveys
of corporate software projects in the United States,
the realities of software development are as follows.
[1] About one third of all software projects are
canceled. Average projects expend twice as much
budget and schedule as initially planned. After
delivery, the majority of systems are considered
unsuccessful because they have far fewer capabilities
than expected. Modifying and extending systems
are the most expensive cost drivers and very likely
to create new defects. Overall, the outcome of
filely all application software projects are stovepipe
systems, brittle software architectures that under-perform
on requirements. The Software Crisis The software
crisis in corporate development became apparent
decades ago, when procedural software technologies
were popular. Subsequent, object-oriented approaches
(such as the Object Modeling Technique) have been
equally unsuccessful for corporate developers.
These outcomes have been repeatedly confirmed
by research. [1] Three key factors are exacerbating
the software crisis:
- requirements change,
- commercial innovation, and
- distributed computing.
A significant part of the problem
is rising user expectations. User requirements
for systems have increased much faster than corporate
developers' capability to deliver. Requirements
changes are more frequent as businesses maneuver
for competitive advantage with strategic corporate
software.
Another confounding factor is
the destabilizing force of accelerating technology
innovation, both in commercial software and hardware
platforms. Corporate developers have difficulty
finding compatible configurations of software
products, and are forced to upgrade configurations
frequently as new products are released. Software
maintenance due to technology upgrades is a significant
corporate cost driver.
Distributed computing is an
essential feature of many new applications due
to predominance of the Internet and geographically
diverse enterprises. Traditionally, software designers
assumed homogeneous configurations, centralized
systems, local communications, and infrequent
failures. Today's highly distributed enterprises
require heterogeneous hardware/software, decentralized
legacy configurations, and complex communications
infrastructure. The result is an environment with
frequent partial system failures. Distributed
computing reverses many key assumptions that are
the basis for procedural and object-oriented software
development.
The software industry has established
object-orientation (OO) as the mainstream technology.
OO is the technology adopted by new corporate
development projects because OO is universally
supported by software tool vendors. Masses of
legacy programmers are training for object-oriented
development (e.g. C++ and Java) as corporations
create new strategic systems. Unfortunately, these
developers and corporations are likely to become
the next generation of disillusioned participants
in the software crisis. However, the organizations
that survive and thrive with this technology,
must use it in sophisticated new ways, represented
by componentware.
Componentware Resolving the
software crisis requires fundamental changes in
systems thinking, software processes, and technology
utilization. The next major era of technology,
The Componentware Revolution, contains key elements
of the crisis solution.
The componentware approach introduces
a set of closely interrelated techniques and technologies.
Componentware introduces a sophisticated mindset
for generating business results. These componentware
elements include:
- Component Infrastructures
- Software Patterns
- Software Architecture
- Component-Based Development
Componentware technologies provide
sophisticated approaches to software development
that challenges outdated assumptions. Together
these elements create a major new technology trend.
Componentware represents as fundamental a change
in technology as object-orientation and previous
generations.
We will discuss these componentware
technologies after a brief introduction to componentware's
unique principles.
Components
versus Objects
Componentware can be understood
as a reincarnation of object-orientation and other
software technologies. What distinguishes componentware
from previous generations of technology are four
principles: encapsulation, polymorphism, late
binding, and safety. This list overlaps with object-orientation,
except that it eliminates the emphasis on inheritance.
In component thinking, inheritance is as a tightly-coupled,
white box relationship that is unsuitable for
most forms of packaging and reuse. Instead, components
reuse functionality by invoking other objects
and components instead of inheriting from them.
In component terminology, these invocations are
called delegations.
By convention, all components
have specifications corresponding to their implementations.
The specification defines the component encapsulation
(i.e. its public interfaces to other components).
Reuse of component specifications is a form of
polymorphism which is strongly encouraged. Ideally,
component specifications are local or global standards
that are widely reused throughout a system, an
enterprise, or an industry.
Componentware utilizes composition
for building systems. In composition, we integrate
two or more components to create a larger entity,
which could be a new component, a component framework,
or an entire system. Composition is the integration
of components. The combined component acquires
joint specifications from the constituent component.
If the components have matching
specifications for client calls and services,
then they can interoperate with no extra coding.
This is often called plug and play integration.
At run time, when executed at runtime, this is
a form of a late binding. For example, a client
component can discover a component server through
an on-line directory, such as the CORBA Trader
Service. With matching client and service interface
specifications, the components can establish a
run-time binding to each other, and interact seamlessly
through the component infrastructure.
In a perfect world, all components
would be fully conformant with their specifications
and free from all defects. Successful operation
and interoperation of components depends on many
internal and external factors. Safety properties
can help because they can minimize entire classes
of defects in a component environment. As society
becomes increasingly dependent upon software technology,
safety has become a serious legal concern and
one of the most important areas of computer science
research.
For example, Java's garbage
collection feature guarantees memory safety, or
freedom from memory deallocation defects (which
are problematic in C++ programs). Other kinds
of safety include type safety (guaranteed data
type compatibility), and module safety which controls
the effects of software extension and component
composition.
Component
Infrastructures
The componentware revolution
has already arrived in the form of component infrastructures.
Major platform vendors have bet their futures
on componentware product lines. In particular,
Microsoft, Sun Microsystems, IBM, and the CORBA
consortia have established significant componentware
infrastructures through massive technology and
marketing investments.
These component infrastructures
(Microsoft COM, Sun Enterprise Java Beans, and
CORBA request brokers) are dominant infrastructures
for overlapping industry segments. Microsoft COM
on the desktop; Java for cross platform applications;
and CORBA for corporate networks and the Internet.
Interestingly, these technologies are also mutually
interoperable, with Microsoft, Sun, IBM, and others
supporting the CORBA Internet Inter-ORB Interoperability
Protocol (IIOP) for Microsoft COM and Java Remote
Method Invocation (although Java works equally
well with CORBA). In the following paragraphs,
we'll compare these infrastructures briefly.
Microsoft has been promoting
the Component Object Model (COM) and follow-on
products for several years. COM is a single-computer
component infrastructure. OLE and ActiveX define
componentware interfaces based upon COM. In theory,
the Distributed Component Object Model (DCOM)
extends the capabilities of COM over networks
and the Internet. With these technologies, Microsoft
has funded a major corporate strategy promoting
a worldwide migration to componentware over the
past five years. Future Microsoft plans indicate
that it will continue its componentware initiative
for the forseeable future.
The DCOM
Disaster
Benefits
CORBA
Unfortunately, DCOM is a technological
disaster of such proportions that only Microsoft
could fund its continued existence with favorable
public relations. A key problem with DCOM is its
security model, which was not architected into
the technology prior to massive commercial deployment
on Microsoft operating systems. For security and
other reasons (e.g. system management support),
DCOM is not recommended for use on the Internet,
nor is it suitable for distributed enterprise
systems. These and other DCOM limitations are
supposed to be addressed by Windows 2000 and COM+
(DCOM's successor), which are likely to stabilize
by early next century. The DCOM disaster has not
influenced Microsoft's strong support for componentware
technology.
DCOM's misfortunes have yielded
significant benefits for CORBA vendors. At one
time, Microsoft's DCOM was considered an insurmountable
competing technology to CORBA. Vendor groups were
terrified about the future prospects for CORBA.
With increasing industry skepticism
about DCOM and other proprietary middleware, CORBA
has become the uncontested market leader for distributed
computing. CORBA's is the only adopted technology
for distributed computing that supports multiple
programming languages and multiple platforms.
SIDEBAR END
Sun Microsystems invention of
Java is a continuing evolution of programming
language features, infrastructures, and related
class libraries. Java technology has created tremendous
industry excitement and support from independent
developers. The extensions for Java Beans and
Enterprise Java Beans establish an evolving component
model that rivals COM and ActiveX in the cross-platform
application space. Enterprise Java Beans and the
IBM San Francisco project are using Java Remote
Method Invocation (RMI) for distributed computing,
one of several proprietary infrastructures available
to Java programmers. While proprietary Java infrastuctures
do provide convenience for programmers, they lack
one key capability: interoperability with other
programming languages. This may be a serious limitation
for corporate projects because it hampers legacy
integration and cross-language development which
is commonplace for server applications. Another,
more subtle issue, is that Java application programming
interfaces (APIs) are not standards. For popular
technologies like JDBC, vendors often customize
the APIs as they create their value-added versions
of the Sun reference technologies.
The Common Object Request Broker
Architecture (CORBA) is an open-systems standard
for distributed infrastructure supported by multiple
vendors, industry consortia, and formal standards
bodies. [2] Recently, there has been a surge in
CORBA licensing in corporate development organizations
with a surprising array of Fortune 500 companies
adopting CORBA for enterprise projects, including
banks and manufacturers. From its inception CORBA
has supported both object and componentware models.
With today's CORBA products supporting multiple
component interfaces in a single encapsulated
servlet, CORBA is an ideal infrastructure for
componentware development involving heterogeneous
hardware/software, multiple programming languages,
or distributed computing. Recently, CORBA has
been extended to support the capabilities of message
oriented middleware and domain-specific API standards
(healthcare, manufacturing, financial services,
and so forth). Just like any other technology,
CORBA products do have limitations (e.g. memory
leaks, conformance, performance). However, for
a standard established in 1991, it is amazing
how well the CORBA architecture has weathered
cataclysmic innovations in other technologies
and emerged ever stronger (e.g. Java and the Internet).
Componentware infrastructures
are having a significant impact on software development.
In many respects, these infrastructures are well
on their way to becoming mainstream development
platforms. Because all of these infrastructures
are becoming interoperable (through CORBA IIOP),
there is a well understood relationship between
infrastructure models. Their similarities are
much greater than their proprietary differences
might imply.
Infrastructure selection is one
of the most discussed, but least important, aspects
of implementing componentware. For corporate developers,
the most critical issues are confronted well after
infrastructure selection. These issues include:
how to master designing with the technology, how
to architect systems, and how you coordinate your
development efforts. These areas are covered by
the next three sections on Software Patterns,
Software Architecture, and Component-Based Development.
Software
Patterns
Software patterns comprise a
common body of software knowledge which can be
applied across all component infrastructures.
The most famous category of software patterns,
called design patterns, comprises proven software
design ideas which are reused by developers. [3]
Other important categories of patterns include
analysis patterns and antipatterns. [1] Analysis
patterns define proven ways of modeling business
information; that can be directly applied to the
modeling of new software systems and databases.
Software patterns are a necessary
element of componentware. The development of new,
reusable components requires expert-level quality
of design, specification, and implementation.
Proven design solutions are necessary to establish
successful component architectures and frameworks
for families of applications. Often, there are
too many variables to take chances on unproven
design concepts.
The popularity of software patterns
can be explained as a response to the practical
shortcomings of object-orientation. Antipatterns
explain the common mistakes that people make when
developing object-oriented software systems (as
well as other types of systems). Much more is
needed than basic object-oriented principles to
build successful systems. Design patterns explain
the additional, sophisticated ideas that are required
for effective software designs. Analysis patterns
present the sophisticated ideas necessary for
the effective modeling of concepts and data.
It is still commonplace in software
development, to reinvent design ideas, incurring
the risks and delays of trial and error experimentation.
If fact, most software methods encourage reinvention
as the normal mode of development. Considering
the challenging forces of requirements change,
technology innovation, and distributed computing,
we consider reinvention to be an unnecessary risk
in many circumstances. This comment is especially
applicable to the development of components, where
the costs of defects and redesigns can affect
multiple systems.
Altogether, software patterns
can be described as knowledge reuse. It is interesting
to note that most patterns are considered as simple
as commonsense by expert-level developers. However,
for the majority of developers, patterns are a
necessary part of technical training that can
help them to achieve world-class results.
Software
Architecture
Software architecture concerns
the planning and maintenance of system structure
from earliest system concept, through development,
and operations. Good architectures are stable
system structures which can accommodate changes
in requirements and technologies. Good architectures
ensure the continuous satisfaction of human needs
(i.e. quality) throughout system lifecycles.
Reusable components are examples
of good architecture. They support stable interface
specifications, which can accommodate changes
due to reuse in many system contexts.
Software architecture plays
an important role in component design, specification,
and use. Software architecture provides the design
context, within which, components are designed
and reused. Components have a role in predetermining
aspects of software architecture. For example,
a component framework may predefine the architecture
of a significant portion of a system.
One of the most exciting aspects
of software architecture for componentware is
supporting distributed project teams. A software
architecture comprises a system specification
that enables parallel, independent development
of the system or its parts. A proper software
architecture defines computational boundaries
(i.e. API) that divide the system into separate
testable subsystems. These subsystems can be outsourced
to one or more distributed project teams.
Component-Based
Development
Component-based development
is software development with a difference. Many
process aspects are reused, such as iterative,
incremental development. The primary componentware
difference is the specialization of technical
roles. [2] Three key componentware roles are software
architect, component developer, and application
developer. These differ from object-oriented approaches
which promoted notions of all-purpose programmers,
committee-based design, and architecture after-the-fact.
A typical leadership team for
a project comprises a software architect and a
project manager. The architect works in conjunction
with management to make key technical decisions,
those with system-wide impact. The architect is
responsible for technical planning of the system,
and communicating these plans with developers.
Since the architect coordinates system-wide design
decisions, many other technical decisions are
the responsibility of developers. To be effective,
the architect must have the highest levels of
experience and technical training; with outstanding
skills in design, specification-writing, and spoken
communication.
The best component developers
are also the most talented programmers. They design
and program the building blocks from which the
application will be constructed. The architect
defines the major boundaries behind which component-based
services will be provided. Reuse of pre-existing
components is evaluated with respect to an organizational
software repository. For new component requirements,
the component-developers design and construct
new software, updating the organizational repository.
Typically, components will implement the horizontal
functions and lower-level aspects of the system,
reducing the need for application developers to
reinvent these capabilities. Component developers
make intensive use of software patterns, applying
several overlapping patterns to each component
design and implementation.
Application developers are responsible
for integrating components and implementing the
vertical requirements of the system, including
user interfaces. They apply preexisting components
to the solution of application-specific problems.
Application developers must communicate with end-users
have some domain expertise.
Generally, component developers
use systems programming languages, such as C++
and Java, while application developers use scripting
languages, such as Javascript, TCL, Python, and
Visual Basic. Systems programming languages allow
more control of low level issues, but are more
difficult to use for application-building. Scripting
languages provide a higher level of abstraction,
with a corresponding reduction of up to 8:1 in
lines of code needed to implement a given requirement,
compared to systems programming languages.
Summary
The Componentware Revolution
is the next major software technology trend. In
many ways, it has already arrived, and is readily
available for commercial exploitation. This revolution
is actively supported by major vendors, including
Microsoft, Sun, IBM, and the CORBA vendor consortia
. The most important aspects
of componentware are not the choice of technologies,
but how these are applied. Successful adoption
of componentware must include the reuse of software
patterns, the planning of software architecture,
and the establishment of component-based development
teams.
The Componentware Revolution
is an exciting opportunity to avoid the inadequacies
of outdated software approaches. Componentware
enables you to survive and thrive when facing
the challenges of requirements change and rapid
commercial innovation. Componentware delivers
the benefits of software reuse and enables outsourcing
to distributed project teams.
References
[1] Brown,
W.J., R.C. Malveau, H.W. McCormick, and T.J. Mowbray,
ANTIPATTERNS: REFACTORING SOFTWARE, ARCHITECTURES,
AND PROJECTS IN CRISIS, John Wiley & Sons, 1998.
(ISBN 0-471-19713-0)
[2] Mowbray,
T.J. and W.A. Ruh, INSIDE CORBA, Addison-Wesley,
1997. {ISBN 0-201-89540-4)
[3] Mowbray,
T.J. And R.C. Malveau, CORBA DESIGN PATTERNS,
John Wiley & Sons, New York, 1997. (ISBN 0-471-10611-9)
[4] Mowbray,
T.J. And R. Zahavi, THE ESSENTIAL CORBA: SYSTEMS
INTEGRATION USING DISTRIBUTED OBJECTS, John Wiley
& Sons, New York, 1995. (ISBN 0-471-10611-9)
|