Software Development Life Cycle
Software Development Life Cycle
Software Development Life Cycle
For small problems these activities may not be done explicitly. The start end boundaries of these activities
may not be clearly defined, and not written record of the activities may be kept. However, for large
systems where the problem solving activity may last over a few years. And where many people are
involved in development, performing these activities implicitly without proper documentation and
representation will clearly not work. For any software system of a non-trival nature, each of the four
activities for problem solving listed above has to be done formally. For large systems, each activity can be
extremely complex and methodologies and procedures are needed to perform it efficiently and correctly.
Each of these activities is a major task for large software projects.
Furthermore, each of the basic activities itself may be so large that it cannot be handled in single step and
must be broken into smaller steps. For example, design of a large software system is always broken into
multiple, distinct design phases, starting from a very high level design specifying only the components in
the system to a detailed design where the logic of the components is specified. The basic activities or
phases to be performed for developing a software system are:
In addition to the activities performed during software development, some activities are performed after
the main development is complete. There is often an installation (also called implementation) phase,
which is concerned with actually installing the system on the client's computer systems and then testing it.
Then, there is software maintenance. Maintenance is an activity that commences after the software is
developed. Software needs to be maintained not because some of its components "wear out" and need to
be replaced, but because there are often some residual errors remaining in the system which must be
removed later as they are discovered. Furthermore, the software often must be upgraded and enhanced
to include more "features" and provide more services. This also requires modification of the software,
Therefore, maintenance in unavoidable for software systems.
In most commercial software developments there are also some activities performed before the
requirement analysis takes place. These can be combined into a feasibility analysis phase. In this phase
the feasibility of the project is analyzed, and a business proposal is put forth with a very general plan for
the project and some cost estimates. For feasibility analysis, some understanding of the major
requirements of the system is essential. Once the business proposal is accepted or the contract is
awarded, the development activities begin starting with the requirements analysis phase.
1. Preliminary Investigation
2. Requirement Analysis / Determination of System's Requirements
3. Design of system
4. Development (coding) of software
5. System Testing
6. Software Maintenance
7. Error distribution with phases
Preliminary Investigation
Fig 2.1 shows different stages in the system's life cycle. It initiates with a project request. First stage is the
preliminary analysis. The main aim of preliminary analysis is to identify the problem. First, need for the
new or the enhanced system is established. Only after the recognition of need, for the proposed system is
done then further analysis is possible.
Suppose in an office all leave-applications are processed manually. Now this company is recruiting many
new people every year. So the number of employee in the company has increased. So manual
processing of leave application is becoming very difficult. So the management is considering the option of
automating the leave processing system. If this is the case, then the system analyst would need to
investigate the existing system, find the limitations present, and finally evaluate whether automating the
system would help the organization.
Once the initial investigation is done and the need for new or improved system is established, all possible
alternate solutions are chalked out. All these systems are known as "candidate systems". All the
candidate systems are then weighed and the best alternative of all these is selected as the solution
system, which is termed as the "proposed system". The proposed system is evaluated for its feasibility.
Feasibility for a system means whether it is practical and beneficial to build that system.
Feasibility is evaluated from developer and customer's point of view. Developer sees whether they have
the required technology or manpower to build the new system. Is building the new system really going to
benefit the customer. Does the customer have the required money to build that type of a system? All
these issues are covered in the feasibility study of the system. The feasibility of the system is evaluated
on the three main issues: technical, economical, and operational. Another issue in this regard is the legal
feasibility of the project.
1. Technical feasibility: Can the development of the proposed system be done with current
equipment, existing software technology, and available personnel? Does it require new technology?
2. Economic feasibility: Are there sufficient benefits in creating the system to make the costs
acceptable? An important outcome of the economic feasibility study is the cost benefit analysis.
3. Legal feasibility: It checks if there are any legal hassle in developing the system.
4. Operational feasibility: Will the system be used if it is developed and implemented? Will there
be resistance from users that will undermine the possible application benefits?
The result of the feasibility study is a formal document, a report detailing the nature and scope of the
proposed solution. It consists of the following:
Once the feasibility study is done then the project is approved or disapproved according to the results of
the study. If the project seems feasible and desirable then the project is finally approved otherwise no
further work is done on it.
In most software projects, the requirement phase ends with a document describing all the requirements.
In other words, the goal of the requirement specification phase is to produce the software requirement
specification document. The person responsible for the requirement analysis is often called the analyst.
There are two major activities in this phase - problem understanding or analysis and requirement
specification in problem analysis; the analyst has to understand the problem and its context. Such
analysis typically requires a thorough understanding of the existing system, the parts of which must be
automated.
Once the problem is analyzed and the essentials understood, the requirements must be specified in the
requirement specification document. For requirement specification in the form of document, some
specification language has to be selected (example: English, regular expressions, tables, or a
combination of these). The requirements documents must specify all functional and performance
requirements, the formats of inputs, outputs and any required standards, and all design constraints that
exits due to political, economic environmental, and security reasons. The phase ends with validation of
requirements specified in the document. The basic purpose of validation is to make sure that the
requirements specified in the document, actually reflect the actual requirements or needs, and that all
requirements are specified. Validation is often done through requirement review, in which a group of
people including representatives of the client, critically review the requirements specification.
Note that in software requirements we are dealing with the requirements of the proposed system, that is,
the capabilities that system, which is yet to be developed, should have. It is because we are dealing with
specifying a system that does not exist in any form that the problem of requirements becomes
complicated. Regardless of how the requirements phase proceeds, the Software Requirement
Specification (SRS) is a document that completely describes what the proposed software should do
without describing how the system will do it?. The basic goal of the requirement phase is to produce the
Software Requirement Specification (SRS), which describes the complete external behavior of the
proposed software.
The design activity is often divided into two separate phase-system design and detailed design. System
design, which is sometimes also called top-level design, aims to identify the modules that should be in the
system, the specifications of these modules, and how they interact with each other to produce the desired
results. At the end of system design all the major data structures, file formats, output formats, as well as
the major modules in the system and their specifications are decided.
During detailed design the internal logic of each of the modules specified in system design is decided.
During this phase further details of the data structures and algorithmic design of each of the modules is
specified. The logic of a module is usually specified in a high-level design description language, which is
independent of the target language in which the software will eventually be implemented. In system
design the focus is on identifying the modules, whereas during detailed design the focus is on designing
the logic for each of the modules. In other words, in system design the attention is on what components
are needed, while in detailed design how the components can be implemented in software is the issue.
During the design phase, often two separate documents are produced. One for the system design and
one for the detailed design. Together, these documents completely specify the design of the system. That
is they specify the different modules in the system and internal logic of each of the modules.
While working with the part of a system, a designer needs to understand only the abstractions of the other
parts with which the part being designed interacts. The use of abstraction allows the designer to practice
the "divide and conquer" technique effectively by focusing one part at a time, without worrying about the
details of other parts.
Like every other phase, the design phase ends with verification of the design. If the design is not specified
in some executable language, the verification has to be done by evaluating the design documents. One
way of doing this is thorough reviews. Typically, at least two design reviews are held-one for the system
design and one for the detailed and one for the detailed design.
An important concept that helps the understandability of programs is structured programming. The goal of
structured programming is to arrange the control flow in the program. That is, program text should be
organized as a sequence of statements, and during execution, the statements are executed in the
sequence in the program.
For structured programming, a few single-entry-single-exit constructs should be used. These constructs
includes selection (if-then-else), and iteration (while - do, repeat - until etc). With these constructs it is
possible to construct a program as sequence of single - entry - single - exit constructs. There are many
methods available for verifying the code. Some methods are static in nature that is, that is they do not
involve execution of the code. Examples of such methods are data flow analysis, code reading, code
reviews, testing (a method that involves executing the code, which is used very heavily). In the coding
phase, the entire system is not tested together. Rather, the different modules are tested separately. This
testing of modules is called "unit testing". Consequently, this phase is often referred to as "coding and unit
testing". The output of this phase is the verified and unit tested code of the different modules.
System Testing
Testing is the major quality control measure employed during software development. Its basic function is
to detect errors in the software. During requirement analysis and design, the output is a document that is
usually textual and non-executable. After the coding phase, computer programs are available that can be
executed for testing phases. This implies that testing not only has to uncover errors introduced during
coding, but also errors introduced during the previous phases. Thus, the goal of testing is to uncover
requirement, design or coding errors in the programs.
Consequently, different levels of testing are employed. The starting point of testing is unit testing. In this a
module is tested separately and is often performed by the coder himself simultaneously with the coding of
the module. The purpose is to execute the different parts of the module code to detect coding errors. After
this the modules are gradually integrated into subsystem, which are then integrated themselves
eventually form the entire system. During integration of modules, integration testing is performed. The
goal of this testing is to detect design errors, while focusing on testing the interconnection between
modules. After the system is put together, system testing is performed. Here the system is tested against
tech system requirements to see if all the requirements are met and the system performs as specified by
the requirements. Finally, acceptance testing is performed to demonstrate to the client, on the real life
data of the client, the separation of the system.
For testing to be successful, proper selection of test cases is essential. There are two different
approaches to selecting test cases-functional testing and structural testing. In functional testing the
software for the module to be tested is treated as black box, and then test cases are decided based on
the specifications of the system or module. For this reason, this form of testing is also called "black box
testing". The focus is on testing the external behavior of the system. In structural testing the test cases
are decided based on the logic of the module to be tested. Structural testing is sometimes called "glass
box testing". Structural testing is used for lower levels of testing and functional testing is used for higher
levels.
Testing is an extremely critical and time-consuming activity. It requires proper planning of the overall
testing process. Frequently the testing process starts with the test plan. This plan identifies all the testing
related activities that must be performed and specifies the schedule, allocates the resources, and specify
guidelines for testing. The test plan specifies manner in which the modules will integrate together. Then
for different test units, a test case specification document is produced, which lists all the different test
cases, together with the expected outputs, that will be used for testing. During the testing of the unit, the
specified test cases are executed and actual result is compared with the expected output. The final output
of the testing phases is to the text report and the error report, or set of such reports (one of each unit is
tested). Each test report contains the set of such test cases and the result of executing the code with
these test cases The error report describes the errors encountered and action taken to remove those
errors.
It is generally agreed that for large systems, removing all the faults before delivery is extremely difficult
and faults will be discovered long after the system is installed. As these faults are detected, they have to
be removed. Maintenance activities related to fixing of errors fall under corrective maintenance.
Removing errors is one of the activities of maintenance. Maintenance also needed due to a change in the
environment or the requirements of the system. The introduction of a software system affects the work
environment. This change in environment often changes what is desired from the system. Furthermore,
often after the system is installed and the users have had a chance to work with it for sometime,
requirements that are not identified during requirement analysis phase will be uncovered. This occurs,
since the experience with the software helps the user to define the needs more precisely. There might
also be changes in the input data, the system environment and output formats. All these require
modification of the software. The maintenance activities related to such modification fall under adaptive
maintenance.
Maintenance work is based on existing software, as compared to development work, which creates new
software. Consequently maintenance resolves around understanding the existing software and spares
most of their time trying to understand the software that they have to modify. Understanding the software
involves not only understanding the code, but also the related documents. During the modification of the
software, the effects of the change have to be clearly understood by the maintainer since introducing
undesired side effects in the system during modification is easier.
To test whether those aspects in the system that are not supposed to be modified are operating as they
were before modification, regression testing is done. Regression testing involves executing old test cases
to test that no new errors have been introduced. Thus, maintenance involves understanding the existing
software (code and related documents), understanding the effects of change, making the changes - both
to the code and documents, testing the new parts (changes), and resetting of the old parts that were not
changed.
Since often during development, needs of the maintainers are not kept in mind, little support documents
are produced during development to aid the maintainer. The complexity of the maintenance task is
coupled with the neglect of maintenance concerns during development which makes maintenance the
most cost effective activity in the life of a software product.
Since maintenance depends critically on the software characteristics that are decided during
development, maintenance cost can be reduced if maintenance concerns are kept in forefront during
development. One of the reasons why this is often not done is that the development cost is done by the
developers while maintenance is often done by the users. Hence, the developers do not have much
incentive for increasing the development effort in order to reduce the maintenance cost. However, for
reduction in overall cost of software, it is imperative that the software be developed so the maintenance is
easy.
The development cost, a typical distribution of effort with the different phases is
Requirement - 10%
Design - 20%
Coding - 20%
Testing - 50%
The exact number will differ with organization and the type of the project. There are some observation we
can make from the data given above. The first is that the goal of design and coding should reduce the
cost of design and coding, but should be to reduce the cost of testing and maintenance, at the expense of
increasing design and coding cost. Both testing and maintenance depend heavily in the design and
coding of the software. And these costs can be considerably reduced if the software is designed and
coded to make testing and maintenance easier. Therefore, during design and implementation, the issues
in our minds should be "can the design be easily tested", and "can it be easily modified". These require
alternate designs and may increase the cost of the design and coding. But this additional costs pay
dividends in the later phases.
Error Distribution
The notion that programming is the central of activity during software development is largely because
normally programming has been considered to be difficult task and sometimes an "art". Another
consequence of this kind of thinking is the belief that errors largely occur during programming, as it is the
oldest activity in software development and offers many opportunities for commiting errors. It is now
realized that errors can occur at any stage during development. A typical distribution of error occurrences
by is
As we can see, errors occur throughout the development process. However the cost of correcting
different phases is not the same and depends on when the error is detected and correceted. As one old
expect, the greater the delay in detecting an error after it occurs, the more expensive it is to correct it.
Error that occur during the requirements phase, if corrected after coding is completed, can cost many
times more than correcting the error during the requirements phase itself. The reason for this is fairly
obvious. If there is an error in the requirements, then the design and the code will get affected.
To correct the error, the coding that is done would require both the design and the code to be changed
there by increasing the correction. So we should attempt to detect errors in the previous phase and
should not wait until testing to detect errors. This is not often practiced. In reality, sometimes testing is the
sole point where errors are detected. Besides the cost factor, reliance on testing as the primary source for
error detection, due to the limitations of testing, will also result in unreliable software. Error detection and
correction should be a continous proces that is done throughout software development. In terms of the
development phases what this means is that we should try to validate each phase before starting with the
next.