|
|
  |
Manufacturing
Process for the Software Applications
|
|
Software’s greatest irony is that after taming the complexity of
every other discipline of the engineering (e.g. CAD or chip design), goods and services, software researchers still not been able create rational model to control or manage the complexity of the software projects.
|
|
OK! Software is unique and it faces a unique set of problems... So What? It should not be an excuse. The software, on the other hand, can be made highly intelligent and
flexible, unlike the physical objects, like light bulb or automobile engine. How can we compare a software
component (i.e. an intelligent code module) with piece of dumb metal (e. g. engine)? We must be ashamed of
it?
|
|
The NIST/ATP’s web page (http://www.atp.nist.gov/focus/cbs.htm)
says in the Technology Challenge section:
|
Examples from the physical world often are invoked to explain
software systems - - in some systems: for example, standard software interfaces for network communications
are called "sockets". The analogies are insidious, however, because the realm of software is nothing like
the realm of physical objects. The idea of manufacturing only one kind of light bulb, which would be reconfigured
automatically at the point of use to fit into any desired socket at any voltage, is absurd. But for software components,
the idea is not only feasible - - it could be the necessary enabling technology for the complex systems
software needed for new, advanced information technology applications.
|
|
In other words, ATP is saying that, you need to build a configurable component that can be used in any car one can make at that time. That is, you should have a universal
engine that fits, Camry, Civic, BMW, Porch, Cadillac and Taurus. Of course, it is physically impossible and
absurd.
|
|
OK! Lets see, how to overcome this problem? How to setup
an automobile assembly line, in software? We need to build a Software module, a factory that takes the parts
and assembles them to build the automobile. For Example:
|
|
Assembling pre-fabricated interchangeable-parts
|
Autofactory.addAutoBody (Component AutoBody);
Autofactory.addEngine(Component Engine);
// Assemble selected Transmission - A
pre-fabricated interchangeable-part
If (Request.TransmissionOption == Auto)
Autofactory.addTransmission (Component
AutoTransmission);
Else
Autofactory.addTransmission
(Component ManualTransmission);
// Assemble selected entertainment system
If (Request.EntertainmentOption == CD_Player_Option)
Autofactory.addEntertainmentSystem (Component CD_Player);
Else If (Request.EntertainmentOption == Stereo_ CassetPlayer)
Autofactory.addEntertainmentSystem(Component CassetPlayer);
|
|
|
Do
you get the picture? You supply the appropriate parts and
the factory assembles them to build the Automobile for the customer. If you are manufacturer of the components,
such as, the Stereo Player or CD-Player, You may use the same process to set up the assembly line that assembles
its subcomponents. This process to setup a factory works well for any product.
|
|
We know this process works very well for manufacturing.
Toyota setup a factory to make Camry and Honda setup a factory to make Accord. But, most experts argue that
it doesn’t work for software, because it is so unique. Why is it so unique? The problem is not the
software’s uniqueness, but we are unable to leverage the intelligence, we can program into the software modules,
which can easily be far more intelligent and flexible compare to a piece of metal (e.g. engine) possible can
offer. Therefore, the intelligence, which we can include in the software-modules, must overcome the complexity
and uniqueness.
|
|
We all know standardized or predefined plug-in interfaces
for the parts revolutionized the product manufacturing. It is not substantiated here, but has discussed in other
places and of course experts many software researchers agree that: If we can invent loosely coupled systems
(i.e. systems assembled using plug-in parts), we can eliminate 80% of integration complexity and also reduces
the cost of the parts by allowing specialists (having skills in the relevant domain) to independently design
and refine manufacturing of each interchangeable or plug-in part.
|
|
We must
overcome two main obstacles: (1) the applications doesn't have such
interchangeable parts today, so we must invent
software interchangeable parts. (Also review, process
for assembling interchangeable parts) (2). Two
Camry could have exactly same engines. All the engines are identical twins and it is very hard to make out
any difference. But, in the software, every component is unique, for example, a
user's portfolio chart for e-trade
account. The chart changes from user to user and minute to minute (e.g. company stocks are sold/bought or
stock values fluctuate).
|
|
The software is unique. It needs to create highly
custom application for each user. This is akin to building a universal automobile manufacturing plant, which builds any car
you want (e.g. Camry, BMW or Accord). That means, you should have a universal engine that fits, Camry, Civic,
BMW, Porch, Cadillac and Taurus. Of course, it is physically impossible. However, it is possible for the software
overcome these problems, by employing a simple indirection.
|
|
We could do this by employing two intelligent software modules and partitioning the responsibilities between
them. We could have a “Component Factory” (or “CF”) that can dynamically build custom
“Application Component” (or “AC”) on the fly (i.e. in real-time) using up to the minute
information based on user account number. The same CF creates a different AC after few minutes even for the same user, if stock values fluctuate. (Please review Examples
for Component Factory or This-CF
example)
|
|
|
|
Assembling dynamically custom-built interchangeable-parts
|
//
CF custom builds
the plug-n-play
AC using data in Request (at real-time)
Autofactory.addAutoBody (ComponentFactory
AutoBody (Request) );
Autofactory.addEngine(ComponentFactory Engine(Request));
If (Request.TransmissionOption == Auto)
Autofactory.addTransmission(ComponentFactory
AutoTransmission (Request));
Else
Autofactory.addTransmission(ComponentFactory
Manual Transmission (Request));
If (Request.EntertainmentSystemOption == CD_Player_Option)
Autofactory.addEntertainmentSystem(ComponentFactory
CD_Player(Request));
Else
If (Request.EntertainmentSystemOption == Stereo_ CassetPlayer)
Autofactory.addEntertainmentSystem(ComponentFactory
CassetPlayer(Request));
// The parameter "Request" contains user
preferences/privileges and other context Objects
|
|
|
Now, you setup the software-manufacturing factory, which uses the CF (the indirection) instead of using the parts
directly. We make the CF intelligent enough to custom
manufacture appropriate component for the Product/System.
Likewise, the CF for the component may use one or more
other CFs to build subcomponents. The figure#1
shows the manufacturing supply chain.
|
|
Both
(car and application) are assembled using 'replaceable-parts'. To build a custom online-application, we are setting up
a supply chain for the parts in the web page (or an application screen). In this supply chain, each CF builds appropriate
component (or plug-in AC) for the custom application, based on each user's profile and preferences.
The real innovations are: Ready-to-assemble
and easily-replaceable 'code-block' for the loosely coupled parts (which doesn’t exist today, in Object
Oriented Paradigm) and the “CF-indirection” to custom build the
plug-n-play AC at real-time.
|
|
|
"All problems in computer science can be solved by another level of indirection"
--- Butler Lampson (Found the quote & Included on 27-8-2006)
|
|
| |
|
| |
Useful
Proof:
With out the
ability to build "Hierarchies
of Swappable Modules", even the product-makers (e.g.
Computers or Cars) would face
crisis, similar to the software-crisis faced by the software-makers
today. Pioneer-soft's 'patent-pending' Component-oriented process comprises of innovative
process to build
'ready-to-assemble' components and simple
mechanism to build Component-hierarchies and Arrays.
|
|
The
Only Real Difference Between Automobiles and Software
|
The main goal of the
auto-makers is mass production. But, the mass-production is not an issue for the software. We could make a million CD copies of an application in
minutes. Web-servers could serve million applications (e.g. SVG pages) in a minute.
Web-server builds a custom product for each user. For example, the assembly-line
(e.g. web-server) builds a BMW for a user, a Porch for the next user, and a Mercedes Benz with
Ferrari-engine
(why not, if that is what the next user likes ), and so on.
If you sell a Toyota Corolla to a customer, after six-months, he won't ask you to redesign
or replace parts to make it a Camry. Software-maker's problem is
different. For auto-makers, it has taken nearly 100 years, to evolve from Ford Model-T to
Camry-2007-model. It is necessary to
make comparable
evolution in just a year or two (e.g. by frequent
redesign and iterative improvement releases) for EACH software application.
It is desirable to
design any product (either software or hardware) by assembling easily replaceable parts, so that, the product provides outstanding service access to each and every part.
Please
click here and see figure#3. The replicable parts substantially cut the maintenance cost, for example: To replace broken parts in
a computer; or To easily replace few set of parts to evolve the features of the software application.
If we built the large applications by assembling
easily replaceable parts
(i.e. coupled by Zero Spaghetti-code), it could increase the productivity for
rapid
evolution by many folds (e.g. each part can be easily replaced, or separated to
refine independently).
To
secure high productivity gains (or to be highly agile), I usually prefer: using more layers of hierarchy of simpler
component-factories (or 'CF'), rather than complex CFs and fewer layers of
hierarchy. Please see figure#1 for the layers of CF supply chain.
We could employ lot of automation and innovative models or processes. For example, use
simple CASE-tools to automatically detect incompatible new part or broken service interfaces (if a service provider part is
updated and inadvertently one of the consumers is not updated).
I am not going to discuss other processes until file patents. But like to point
out, there is lot of scope for
improvements and innovations.
The productivity gains
of 10 to 50 folds is possible, if the application is build by assembling loosely coupled
and easily replaceable parts. Since each component-factory is simpler and the
part is loosely-coupled, the CF can be refined nearly autonomously.
Today,
redesign of a large software sub-module (See its scattered
objects in Fig#5) not only cost 10 to 50 folds, but also most experts agree that it is an uncertain
or risky endeavor (especially if he is not the original developer of the
module).
|
|
The pivotal event in the history of modern industrial evolution is the
invention of interchangeable-parts in early 19th century. It is not
possible to build interchangeable parts using the current programming languages. So the software-makers stuck in 18th century.
Fortunately, we invented processes
for building 'customizable-interchangeable' parts using the emerging
languages and also mechanisms for assembling the parts.
|
|
We
can't build Loosely-coupled Replaceable parts in Java
Although it
may be possible to create small custom
modules in the traditional
programming languages (e.g. Java, C++ or C#), it is too complex to build
programs that can automatically synthesize the modules to build larger and larger
modules, which is fundamental limitation of the traditional programming
languages. Can we design small Java modules so that, later create very simple instructions in minutes to synthesize the small Java modules for building larger and large Java modules and finally the application?
NO! Java is not very good language for doing that.
With out this ability to programmatically synthesize any
set of smaller custom parts to build larger and larger parts, how can we setup a
supply chain to create unique custom applications?
To
setup the supply chain as shown in the figure#1, we must use new kind of
processes and languages for the building 'ready-to-assemble' code-blocks (i.e. resultant code in the right side
of the Fig#1). The language must allow (1) programmatically manipulate pre-built modules to customize them and (2) synthesize the customized modules to build larger and larger modules.
The XML languages (e.g. XAML/Vista, SVG or MXML/Flex) have such amazing characteristics. For example, the
'code-blocks' can be easily mashed-up (or synthesized) to build larger and larger
Lego-blocks.
This website has many examples to prove that the XML languages overcome
all such limitations of traditional programming languages. One may use Java or
C# in the left side (in the FIg#1) for the "Component Factories" to
build custom 'code-blocks' and to synthesize the 'code-blocks'. To avoid the
hand coding in XML, one may use Pioneer-soft's reusable GUI Classes to generate the code-block
for the Components.
|
|
|
|