Managing Complexity of Large/Ultra Large Software System (SLIM)
Today there exist many important applications in business and commerce that consist of millions of lines of code that are becoming increasingly difficult to maintain. These applications have been written in one of early third generation languages, that has evolved over a long period of time and they are under continuous modification for business reasons. Such applications are classified as a legacy application. It is often very expensive to add new customer-demanded features to this code and to adapt it to ever-changing hardware specifications. This problem is exacerbated by the fact that the original authors of the code are often not available and the huge code base exists with little or no documentation.
Rewriting the entire system from the scratch is often not a feasible solution due to serious business and financial implications. Therefore, we need tools that can examine legacy code and make a best possible effort of discovering the architectural details. At the least, such discoveries can be in the form of a human-assisted modularization of the code where the system is logically divided into a set of modules that are relatively independent and that interact with one another to achieve the overall functionality of a system. Human assistance could be in the nature of providing a high level description of the services performed by the software and the keywords expected to be found in the software relevant to each of those services. Further human assistance could be in the form of use-case descriptions. A properly modularized system is easy to understand, maintain and enhance.
At the same time, it is also important to provide a methodology that assists the developers as the code evolves possibly from the scratch, to detect deviations of the code from the original architectural intent. Detection of deviations could then be followed up by requiring that the programmers either further modify the latest changes so as not to violate the original architectural intent, or that the architectural descriptions be updated.
This observation has led us to conceive of a toolset that helps the developers, managers and subject matter experts who are in the business of either managing existing legacy systems as well as developing large scale applications. The goal of this toolset will be to improve the following software quality traits (recommended by ISO-9126):
- Understandability: The attributes of software that bear on user's effort to understand the logical concept of the software and its applicability
- Learnability: Attributes of software that bear on the users' effort for learning the software
- Stability: Attributes of software that bear on the risk of unexpected effect of modifications.
- Analyzability: Attributes of software that bear on the effort needed for diagnosis of deficiencies or causes of failures, or for identification of parts to be modified.
- Changeability: Attributes of software that bear on the effort needed for modification, fault removal or for environmental change.
- Testability: Attributes of software that bear on the effort needed for validating the modified software.
The methodology has been applied to non-object oriented C/C++ based business systems. The methodology has not been applied to systems that are primarily event driven, real time, or plug-in. The tool in its current form can analyze large systems (nearly 5-6 million lines) and evaluate the system modularity using various metrics developed by the research team.