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.

Miscellaneous Documents Privacy Policy | Site Map | Services
Designed By SINDHU SYNERGY
Copy Right © 2006 Pioneer Soft, LLC. All Rights Reserved.