Software Frameworks for Developing Complex Systems
This white paper proposes an enabling technology, called Software Frameworks, which allows developers to create much more complex, more advanced, and more error free software systems than they would be otherwise able to create if they had to handcraft each line of code.
Over time, the costs (and risks) of developing and maintaining large computer programs keeps escalating as the complexity of these programs increases. Complexity increases as the number of platforms that must be supported increases. Platforms include Main Frames, PCs, Smart Phones, Tablet Computers, Cluster Computers, Multi-Core computers, and a host of computers on a network or in the Cloud.
The risks of cost over-runs increases as the complexity increases. The old development model of hand-crafting every bit of software is becoming economically non-viable. In fact, there is a threshold of complexity where the legacy manual software development model breaks down.
For example, former Secretary of the USAF Michael W. Wynne blamed the use of the DOD's Ada programming language for 300+ billion dollars in cost overruns and schedule slippages on many major DOD projects, including the F-22 Raptor (20 Million Lines of Code), and F-35 Joint Strike Fighter (5.7 Million Lines of Code). The Ada programming language is an excellent language. Embedded systems written in Ada often run on the first try.
Something else must be going on to cause such large cost overruns. It is well known that most developers can handle programs with 1000 variables and 500 functions The ability to keep track of variables and functions in larger programs degrades rapidly as the number of variables and functions increase.
To alleviate the types of problems to which former Secretary Wynne was referring, a change in software development methodology should be considered. One option is Software Frameworks. A Software Framework is a software tool that assists the developer with variables and functions, has automatic statement completion capabilities, and provides standard libraries that are problem domain specific. Thus Frameworks make it easier to develop code faster and more accurately. Frameworks can also automatically generate the support software that achieves connectivity between different components of a large system running in a multi-core, multi-platform, multi-network/cloud environment. A developer just has to specify:
A list of software components that are to be included in a build.
The sources and destinations of data that is to be sent over the network. It is possible to build a GUI tool that greatly expedites this task.
The hardware architecture (using a special format) of each hardware component in the larger system.
A 'Properties File' that contains the information not given in the above three bullets
The task of adding capability to a major computer program now turns into the task of developing new code that adheres to the requirements of the Software Framework's published Application Programmers Interface (API). Following the API enables the developer to deal mostly with new program requirements.
The Framework then generates, like Ruby on Rails, the software that "glues" the new code to the old code. This is done transparently, freeing developers to focus on to the problem at hand.
Software Frameworks and Legacy Systems
Large DOD packages like ACSIS (Aegis Combat Systems Interface Simulator) and ASCOT (Advanced Simulation Combat Operations Trainer) have been around for decades, and have absorbed tens of millions of dollars in Life cycle maintenance costs. This does not include the tens of millions of dollars invested in the original development.
This situation is only getting worse as legacy computer hardware, which is needed to run these legacy simulators, is becoming so antiquated that replacement parts are no longer available at any cost. These large computer programs present an ideal opportunity for a Software Framework that will
Support less expensive lifecycle maintenance.
Support porting simulators to more modern and less expensive hardware.
Make it easier and much less expensive to add new features as new needs arise.
Make it possible to reuse much of the tactical software in building the associated simulators.
Expedite the development of the tactical software.
Example No 1
A special scripting language was developed to expedite the output of the state vector from a computer model of a rotary kiln. A FORTRAN subprogram OUTP4(), with the embedded script can be found here (44 lines of FORTRAN).
The resulting expansion of subroutine outp4() script can be found here (337 lines of FORTRAN, expansion factor of 7.6). The framework uses the embedded script and information that was extracted from elsewhere in the program to perform the expansion. The resulting table can be found here.
Example No 2
A special Units C++ class was developed to dynamically track the propagation of the properties of numbers and variables during program execution. Each arithmetic type, including int, short, char, float, double, long double, etc. needs to be replaced by an Int, Short, Float, Double, LongDouble class that are derived from the Units class, so all arithmetic operations can also track the properties of any resulting calculation. For example, 2 ft / 1 sec = 2 ft/sec. To cover all possibilities one must generate overloaded operator functions which includes all binary combinations of the C++ base types and their corresponding classes derived from the Units class. This enables tracking of properties of the constants and variables as the calculation progresses. The awk script which generates these functions can be found here (299 lines of code), and the generated functions can be found here (38154 lines of code). Clearly trying to create these function manually is a daunting task
Relative Difficulties and Costs of Different Approaches to Solving a Problem
a) Telling a computer what you want Machine Language: Difficulty=1000
b) Telling a computer what you want in Assembly laguage. Difficulty=100
c) Telling a computer what you want in C or C++ or Java or Ada or ... Difficulty=10
d) Telling a computer what you want in a special scripting language (and Framework) designed for your problem domain. Difficulty=1
Since the costs are proportional to the Difficulty of the problem, looks like option d) is the best approach.
There are many problem domains in the commercial world that already use Frameworks for their computer program development. These include brokerage, banking, and management information systems. Some examples of frameworks are OpenOffice.org, an office tools suite framework, Ruby On Rails for interactive web pages with a Database Back end, .NET for Windows programs written in multiple programming languages, and SAP for management information systems.
In an environment in which requirements are changing almost weekly, and multi-million line programs must be developed and maintained at an affordable cost, the approach of developing a Software Framework for building computer programs of 100,000 lines or more is very cost effective. Under a Framework, development and maintenance costs can be less than ½ of the cost that would be incurred using a completely manual approach. Any organization that is working with increasingly complex problems and dealing with impending budget cuts and cost overruns should be able to solidify its future by using Software Frameworks to develop its products.