Chapter I Mca
Chapter I Mca
Chapter I Mca
The term software engineering is composed of two words, software and engineering.
Software is more than just a program code. A program is an executable code, which serves some
computational purpose. Software is considered to be a collection of executable programming code,
associated libraries and documentations. Software, when made for a specific requirement is called
software product.
Engineering on the other hand, is all about developing products, using well-defined, scientific principles
and methods.
So, we can define software engineering as an engineering branch associated with the
development of software product using well-defined scientific principles, methods and
procedures. The outcome of software engineering is an efficient and reliable software product.
We can alternatively view it as a systematic collection of past experience. The experience is arranged in
the form of methodologies and guidelines. A small program can be written without using software
engineering principles. But if one wants to develop a large software product, then software engineering
principles are absolutely necessary to achieve a good quality software cost effectively.
Without using software engineering principles it would be difficult to develop large programs. In industry
it is usually needed to develop large programs to accommodate multiple functions. A problem with
developing such large commercial programs is that the complexity and difficulty levels of the programs
increase exponentially with their sizes. Software engineering helps to reduce this programming
complexity. Software engineering principles use two important techniques to reduce problem complexity:
abstraction and decomposition. The principle of abstraction implies that a problem can be simplified by
omitting irrelevant details. In other words, the main purpose of abstraction is to consider only those
aspects of the problem that are relevant for certain purpose and suppress other aspects that are not
relevant for the given purpose. Once the simpler problem is solved, then the omitted details can be taken
into consideration to solve the next lower level abstraction, and so on. Abstraction is a powerful way of
reducing the complexity of the problem. The other approach to tackle problem complexity is
decomposition. In this technique, a complex problem is divided into several smaller problems and then
the smaller problems are solved one by one. However, in this technique, any random decomposition of a
problem into smaller parts will not help. The problem has to be decomposed such that each component of
the decomposed problem can be solved independently and then the solution of the different components
can be combined to get the full solution. A good decomposition of a problem should minimize
interactions among various components. If the different subcomponents are interrelated, then the different
components cannot be solved separately and the desired reduction in complexity will not be realized.
● Large software - It is easier to build a wall than to a house or building, likewise, as the size of
software becomes large engineering has to step to give it a scientific process.
● Scalability- If the software process were not based on scientific and engineering concepts, it
would be easier to re-create new software than to scale an existing one.
● Cost- As hardware industry has shown its skills and huge manufacturing has lowered the price of
computer and electronic hardware. But the cost of the software remains high if the proper process
is not adopted.
● Dynamic Nature- The always-growing and adapting nature of software hugely depends upon the
environment in which the user works. If the nature of software is always changing, new
enhancements need to be done in the existing one. This is where software engineering plays a
good role.
● Quality Management- The better process of software development provides better and quality
software products.
● Operational
● Transitional
● Maintenance
Well-engineered and crafted software is expected to have the following characteristics:
1.3.1 Operational
This tells us how well software works in operations. It can be measured on:
● Budget
● Usability
● Efficiency
● Correctness
● Functionality
● Dependability
● Security
● Safety
1.3.2 Transitional
This aspect is important when the software is moved from one platform to another:
● Portability
● Interoperability
● Reusability
● Adaptability
1.3.3 Maintenance
This aspect briefs about how well software has the capabilities to maintain itself in the ever- changing
environment:
● Modularity
● Maintainability
● Flexibility
● Scalability
In short, Software engineering is a branch of computer science, which uses well-defined engineering
concepts required to produce efficient, durable, scalable, in-budget and on-time software products
1.4 SOFTWARE DEVELOPMENT LIFE CYCLE
A software life cycle model (also called process model) is a descriptive and diagrammatic representation
of the software life cycle. A life cycle model represents all the activities required to make a software
product transit through its life cycle phases. It also captures the order in which these activities are to be
undertaken. In other words, a life cycle model maps the different activities performed on a software
product from its inception to retirement. Different life cycle models may map the basic development
activities to phases in different ways. Thus, no matter which life cycle model is followed, the basic
activities are included in all life cycle models though the activities may be carried out in different orders
in different life cycle models. During any life cycle phase, more than one activity may also be carried
out.
The development team must identify a suitable life cycle model for the particular project and then adhere
to it. Without using of a particular life cycle model the development of a software product would not be in
a systematic and disciplined manner. When a software product is being developed by a team there must
be a clear understanding among team members about when and what to do. Otherwise it would lead to
chaos and project failure. This problem can be illustrated by using an example. Suppose a software
development problem is divided into several parts and the parts are assigned to the team members. From
then on, suppose the team members are allowed the freedom to develop the parts assigned to them in
whatever way they like. It is possible that one member might start writing the code for his part, another
might decide to prepare the test documents first, and some other engineer might begin with the design
phase of the parts assigned to him. This would be one of the perfect recipes for project failure. A software
life cycle model defines entry and exit criteria for every phase. A phase can start only if its phase-entry
criteria have been satisfied. So without software life cycle model the entry and exit criteria for a phase
cannot be recognized. Without software life cycle models it becomes difficult for software project
managers to monitor the progress of the project.
Many life cycle models have been proposed so far. Each of them has some advantages as well as some
disadvantages. A few important and commonly used life cycle models are as follows:
The classical waterfall model is intuitively the most obvious way to develop software. Though the
classical waterfall model is elegant and intuitively obvious, it is not a practical model in the sense that it
cannot be used in actual software development projects. Thus, this model can be considered to be a
theoretical way of developing software. But all other life cycle models are essentially derived from the
classical waterfall model. So, in order to be able to appreciate other life cycle models it is necessary to
learn the classical waterfall model. Classical waterfall model divides the life cycle into the following
phases as shown in fig.2.1:
1.5.1 Feasibility study - The main aim of feasibility study is to determine whether it would be financially
and technically feasible to develop the product.
● At first project managers or team leaders try to have a rough understanding of what is required to
be done by visiting the client side. They study different input data to the system and output data
to be produced by the system. They study what kind of processing is needed to be done on these
data and they look at the various constraints on the behavior of the system.
● After they have an overall understanding of the problem they investigate the different solutions
that are possible. Then they examine each of the solutions in terms of what kind of resources
required, what would be the cost of development and what would be the development time for
each solution.
● Based on this analysis they pick the best solution and determine whether the solution is feasible
financially and technically. They check whether the customer budget would meet the cost of the
product and whether they have sufficient technical expertise in the area of development.
1.5.2 Requirements analysis and specification: - The aim of the requirements analysis and specification
phase is to understand the exact requirements of the customer and to document them properly. This phase
consists of two distinct activities, namely
● Requirements gathering and analysis
● Requirements specification
The goal of the requirements gathering activity is to collect all relevant information from the customer
regarding the product to be developed. This is done to clearly understand the customer requirements so
that incompleteness and inconsistencies are removed.
The requirements analysis activity is begun by collecting all relevant data regarding the product to be
developed from the users of the product and from the customer through interviews and discussions. For
example, to perform the requirements analysis of a business accounting software required by an
organization, the analyst might interview all the accountants of the organization to ascertain their
requirements. The data collected from such a group of users usually contain several contradictions and
ambiguities, since each user typically has only a partial and incomplete view of the system. Therefore it is
necessary to identify all ambiguities and contradictions in the requirements and resolve them through
further discussions with the customer. After all ambiguities, inconsistencies, and incompleteness have
been resolved and all the requirements properly understood, the requirements specification activity can
start. During this activity, the user requirements are systematically organized into a Software
Requirements Specification (SRS) document. The customer requirements identified during the
requirements gathering and analysis activity are organized into a SRS document. The important
components of this document are functional requirements, the nonfunctional requirements, and the goals
of implementation.
1.5.3 Design: - The goal of the design phase is to transform the requirements specified in the SRS
document into a structure that is suitable for implementation in some programming language. In technical
terms, during the design phase the software architecture is derived from the SRS document. Two
distinctly different approaches are available: the traditional design approach and the object-oriented
design approach.
● Traditional design approach -Traditional design consists of two different activities; first a
structured analysis of the requirements specification is carried out where the detailed structure of
the problem is examined. This is followed by a structured design activity. During structured
design, the results of structured analysis are transformed into the software design.
● Object-oriented design approach -In this technique, various objects that occur in the problem
domain and the solution domain are first identified, and the different relationships that exist
among these objects are identified. The object structure is further refined to obtain the detailed
design.
1.5.4 Coding and unit testing:-The purpose of the coding phase (sometimes called the implementation
phase) of software development is to translate the software design into source code. Each component of
the design is implemented as a program module. The end-product of this phase is a set of program
modules that have been individually tested. During this phase, each module is unit tested to determine the
correct working of all the individual modules. It involves testing each module in isolation as this is the
most efficient way to debug the errors identified at this stage.
1.5.5 Integration and system testing: -Integration of different modules is undertaken once they have been
coded and unit tested. During the integration and system testing phase, the modules are integrated in a
planned manner. The different modules making up a software product are almost never integrated in one
shot. Integration is normally carried out incrementally over a number of steps. During each integration
step, the partially integrated system is tested and a set of previously planned modules are added to it.
Finally, when all the modules have been successfully integrated and tested, system testing is carried out.
The goal of system testing is to ensure that the developed system conforms to its requirements laid out in
the SRS document. System testing usually consists of three different kinds of testing activities:
System testing is normally carried out in a planned manner according to the system test plan document.
The system test plan identifies all testing-related activities that must be performed,
specifies the schedule of testing, and allocates resources. It also lists all the test cases and the expected
outputs for each test case.
1.5.6 Maintenance: -Maintenance of a typical software product requires much more than the effort
necessary to develop the product itself. Many studies carried out in the past confirm this and indicate that
the relative effort of development of a typical software product to its maintenance effort is roughly in the
40:60 ratios. Maintenance involves performing any one or more of the following three kinds of activities:
● Correcting errors that were not discovered during the product development phase. This is called
corrective maintenance.
● Improving the implementation of the system, and enhancing the functionalities of the system
according to the customer’s requirements. This is called perfective maintenance.
● Porting the software to work in a new environment. For example, porting may be required to get
the software to work on a new computer platform or with a new operating system. This is called
adaptive maintenance.
The classical waterfall model is an idealistic one since it assumes that no development error is ever
committed by the engineers during any of the life cycle phases. However, in practical development
environments, the engineers do commit a large number of errors in almost every phase of the life cycle.
The source of the defects can be many: oversight, wrong assumptions, use of inappropriate technology,
communication gap among the project engineers, etc. These defects usually get detected much later in the
life cycle. For example, a design defect might go unnoticed till we reach the coding or testing phase. Once
a defect is detected, the engineers need to go back to the phase where the defect had occurred and redo
some of the work done during that phase and the subsequent phases to correct the defect and its effect on
the later phases. Therefore, in any practical software development work, it is not possible to strictly
follow the classical waterfall model.
1.6 ITERATIVE WATERFALL MODEL
To overcome the major shortcomings of the classical waterfall model, we come up with the iterative
waterfall model.
Here, we provide feedback paths for error correction as & when detected later in a phase. Though
errors are inevitable, but it is desirable to detect them in the same phase in which they occur. If so,
this can reduce the effort to correct the bug.
The advantage of this model is that there is a working model of the system at a very early stage of
development which makes it easier to find functional or design flaws. Finding issues at an early stage
of development enables to take corrective measures in a limited budget.
The disadvantage with this SDLC model is that it is applicable only to large and bulky software
development projects. This is because it is hard to break a small software system into further small
serviceable increments/modules.
1.6 PROTOTYPING
MODEL
A prototype is a toy implementation of the system. A prototype usually exhibits limited functional
capabilities, low reliability, and inefficient performance compared to the actual software. A prototype
is usually built using several shortcuts. The shortcuts might involve using inefficient, inaccurate, or
dummy functions. The shortcut implementation of a function, for example, may produce the desired
results by using a table look-up instead of performing the actual computations. A prototype usually
turns out to be a very crude version of the actual system.
There are several uses of a prototype. An important purpose is to illustrate the input data formats,
messages, reports, and the interactive dialogues to the customer. This is a valuable mechanism for
gaining better understanding of the customer’s needs:
● how the screens might look like
● how the user interface would behave
● how the system would produce outputs
Another reason for developing a prototype is that it is impossible to get the perfect product in the
first attempt. Many researchers and engineers advocate that if you want to develop a good product
you must plan to throw away the first version. The experience gained in developing the prototype
can be used to develop the final product.
A prototyping model can be used when technical solutions are unclear to the development team. A
developed prototype can help engineers to critically examine the technical issues associated with the
product development. Often, major design decisions depend on issues like the response time of a
hardware controller, or the efficiency of a sorting algorithm, etc. In such circumstances, a prototype
may be the best or the only way to resolve the technical issues.
It is also called successive versions model or incremental model. At first, a simple working model is built.
Subsequently it undergoes functional improvements & we keep on adding new functions till the desired
system is built.
Applications:
● Large projects where you can easily find modules for incremental implementation. Often used
when the customer wants to start using the core features rather than waiting for the full software.
● Also used in object oriented software development because the system can be easily portioned
into units in terms of objects.
Advantages:
● User gets a chance to experiment partially developed system
● Reduce the error because the core modules get tested thoroughly.
Disadvantages:
● It is difficult to divide the problem into several versions that would be acceptable to the customer
which can be incrementally implemented & delivered.
Fig 3.3: Evolutionary Model