With the growth of the software size and complexity, the traditional approach of building software from scratch, becomes more and more inefficient in terms of productivity and cost. The quality assurance of the produced software becomes almost infeasible, discouraging introduction of the new technologies.
In order to meet the requirements of quality, modern large-scale software, new development paradigms have been introduced that facilitate the creation of evolvable, flexible, reliable and reusable systems.
One of such paradigms is called a Component Based Software Development (CBSD) and it relies on the concept of building an application components that are meant to be the independent, reusable pieces of code.
In this post I will present the component based approach for large-scale software development, discuss its advantages and argue its superiority over traditional approaches in modern large-scale software.
What is Component-Based Software Engineering?
Component Based Software Engineering aims at reducing the cost of software production and improving the quality of a system by building it using selected components and integrating it together into one piece employing well-defined software architecture.
The components can be heterogeneous in terms of programming language and can be developed by different programmers that significantly improves the communication within a team and thus facilitates productivity. They should be easy to assemble by simply checking it out of repository and integrating into the final software system.
Each of the component should have some clearly defined functionality and be independent of the whole system.
Moreover, they should be assembled in context of well-defined architecture and communicate with each other using interfaces.
The development of Component Based Systems can be divided into the following phases:
1. Component Requirement Analysis
In this phase, it is crucial to gather, understand and manage requirements relating to to the particular component. At this point the decision has to be made regarding the choice of platform, programming language and design of interfaces that will allow inter-component communication.
2. Component Development
At this stage, the implementation of specified requirements plays crucial role. The resulting component should be of high quality and well-functional, providing a clear way of communication in terms of interfaces.
3. Component Certification
At this point the components are outsourced and selected candidate components are tested and verified if they satisfy the system requirements with high reliability.
4. Component Customization
In order for the component to work correctly with the whole system, it has to be adjusted in terms of specific system requirements, platform, performance and interfaces. This process is called customization of a component and the resulting product should be ready for integration.
5. System Design Architecture
This phase requires gathering the requirements of the whole system, defining suitable architecture and appropriate implementation details. The result of this phase should consist of suitable documentation for integration and system requirement for the testing and maintenance phase.
6. System Integration
The purpose of this phase is integration of the components into one system. It involves component integration and system testing. Sometimes a component has to be adjusted to the whole system and thus requiring the reintegration of all of the components. The resulting system is the final version of the integrated software.
7. System Maintenance
After the system is delivered, it has to be maintained and support for the end-user needs to be provided. This involves for instance, the continuous process of improving system’s performance and correcting faults.
The advantages of component-based software development approach
For the component-base systems to be advantageous over traditional building from scratch paradigm, all of the components should be designed and implemented with the following principles in mind:
The components should be designed in a way that enables them to be used in different applications and different scenarios. This saves a lot of cost and is much more productive since time has to be spent only on customizing an already existing component.
Each component should be able to be replaced by a similar one, thus if slightly different functionality is required or the current component is obsolete or no longer suitable, it can be quickly substituted.
Lack of context specification
The components need to be designed to be integrated into different environments and contexts.
Each of the components can be further adjusted to provide additional functionality.
The components can interact using only their interfaces, therefore hiding the local details such as state, processes or variables.
The components should be appropriate for deployment into any suitable environments, thus they should possess minimal dependencies related to other components. This ensures that the deployment of a particular component do not affect the whole system in any way.
By following above principles, we gain many practical advantages over the traditional approach of building the system from the scratch.
One of the most important ones is the increased productivity and decreased cost of development. This is because the components can be reused by adjusting them to a particular scenario what saves a substantial amount of time and financial resources.
It is also worth noticing that the development of components can be spread over multiple projects that have separate funds, what spreads the development costs as well.
Moreover, the deployment of components is much more efficient, because if the small change is needed, only the affected component will have to be changed and deployed back. In the case of very large systems this can save a lot of time and effort.
Furthermore, the component based paradigm makes the development process much easier. Since the components are isolated, the programmers can work on it independently or in small teams, keeping the level of efficient communication.
The components are much smaller than the size of the whole system, therefore the building process takes much less time increasing the productivity.
Additional advantage is that the components can be written using different languages, hence developers can choose most suitable language for the component’s functionality, again increasing the productivity.
It might be the case that some of the components might require developers with specific business or technical knowledge, and thus they can be assigned specific roles more efficiently, isolating them from unrelated tasks and allowing them to focus on tasks that they are experts with.
Finally, because the system is split up into independent smaller parts, the complexity is significantly decreased and the testing is made much more easy what positively influences the system’s quality.
In this post, I described the component-based software development paradigm and discussed its advantages in relation to the large scale software development.
The presented paradigm, in contrast with building from scratch approach, allows to reduce both complexity of the software and cost of development while increasing the developers’ productivity and software’s quality.
1. Cai Xia, Michael R. Lyu, Kam-fai Wong, Ada Fu, ”Component-Based Software Engineering: Technologies, Quality Assurance Schemes”
2. Microsoft Developer Network, “Chapter 3: Architectural Patterns and Styles”