Document
Document
Document
Program Maintenance
Program maintenance is the process of modifying a software or program after delivery to achieve any of
these outcomes –
Correct errors
Improve performance
Add functionalities
Despite the common perception that maintenance is required to fix errors that come up after the
software goes live, in reality most of the maintenance work involves adding minor or major capabilities
to existing modules. For example, some new data is added to a report, a new field added to entry forms,
code to be modified to incorporate changed government laws, etc.
Types of Maintenance
Corrective maintenance – Here errors that come up after on-site implementation are fixed. The errors
may be pointed out by the users themselves.
Preventive maintenance – Modifications done to avoid errors in future are called preventive
maintenance.
Adaptive maintenance – Changes in the working environment sometimes require modifications in the
software. This is called adaptive maintenance. For example, if government education policy changes,
corresponding changes have to be made in student result processing module of school management
software.
Perfective maintenance – Changes done in the existing software to incorporate new requirements from
the client is called perfective maintenance. Aim here is to be always be up-to-date with the latest
technology.
Maintenance Tools
Software developers and programmers use many tools to assist them in software maintenance. Here are
some of the most widely used –
Program slicer – selects a part of the program that would be affected by the change
Data flow analyzer – tracks all possible flows of data in the software
Dependency analyzer – assists in understanding and analyzing interdependence of different parts of the
program
Programming Methodologies
When programs are developed to solve real-life problems like inventory management, payroll
processing, student admissions, examination result processing, etc. they tend to be huge and complex.
The approach to analyzing such complex problems, planning for software development and controlling
the development process is called programming methodology.
There are many types of programming methodologies prevalent among software developers –
Procedural Programming
Problem is broken down into procedures, or blocks of code that perform one task each. All procedures
taken together form the whole program. It is suitable only for small programs that have low level of
complexity.
Example – For a calculator program that does addition, subtraction, multiplication, division, square root
and comparison, each of these operations can be developed as separate procedures. In the main
program each procedure would be invoked on the basis of user’s choice.
Object-oriented Programming
Here the solution revolves around entities or objects that are part of problem. The solution deals with
how to store data related to the entities, how the entities behave and how they interact with each other
to give a cohesive solution.
Example – If we have to develop a payroll management system, we will have entities like employees,
salary structure, leave rules, etc. around which the solution must be built.
Functional Programming
Here the problem, or the desired solution, is broken down into functional units. Each unit performs its
own task and is self-sufficient. These units are then stitched together to form the complete solution.
Example – A payroll processing can have functional units like employee data maintenance, basic salary
calculation, gross salary calculation, leave processing, loan repayment processing, etc.
Logical Programming
Here the problem is broken down into logical units rather than functional units. Example: In a school
management system, users have very defined roles like class teacher, subject teacher, lab assistant,
coordinator, academic in-charge, etc. So the software can be divided into units depending on user roles.
Each user can have different interface, permissions, etc.
Software developers may choose one or a combination of more than one of these methodologies to
develop a software. Note that in each of the methodologies discussed, problem has to be broken down
into smaller units. To do this, developers use any of the following two approaches –
Top-down approach
Bottom-up approach
The following illustration shows an example of how you can follow modular approach to create different
modules while developing a payroll processing program.
Payroll Processing
Bottom-up Approach
In bottom-up approach, system design starts with the lowest level of components, which are then
interconnected to get higher level components. This process continues till a hierarchy of all system
components is generated. However, in real-life scenario it is very difficult to know all lowest level
components at the outset. So bottoms up approach is used only for very simple problems.
Bottom-up Approach
Requirement gathering
Problem definition
System design
Implementation
Testing
Documentation
Maintenance
The first two steps assist the team in understanding the problem, the most crucial first step towards
getting a solution. Person responsible for gathering requirement, defining the problem and designing
the system is called system analyst.
Requirement Gathering
Usually, clients or users are not able to clearly define their problems or requirements. They have a vague
idea of what they want. So system developers need to gather client requirements to understand the
problem that needs to be resolved, or what needs to be delivered. Detailed understanding of the
problem is possible only by first understanding the business area for which the solution is being
developed. Some key questions that help in understanding a business include –
Interviews
Questionnaires
System analysts needs to create clear and concise but thorough requirements document in order to
identify SMART – specific, measurable, agreed upon, realistic and time-based – requirements. A failure
to do so results in –
Increased costs
Delayed delivery
Due to the depth of information required, requirement gathering is also known as detailed investigation.
Problem Definition
After gathering requirements and analyzing them, problem statement must be stated clearly. Problem
definition should unambiguously state what problem or problems need to be solved. Having a clear
problem statement is necessary to –
Often, coding is supposed to be the most essential part of any software development process. However,
coding is just a part of the process and may actually take the minimum amount of time if the system is
designed correctly. Before the system can be designed, a solution must be identified for the problem at
hand.
The first thing to be noted about designing a system is that initially the system analyst may come up
with more than one solutions. But the final solution or the product can be only one. In-depth analysis of
data gathered during the requirement gathering phase can help in coming to a unique solution.
Correctly defining the problem is also crucial for getting to the solution.
When faced with the problem of multiple solutions, analysts go for visual aids like flowcharts, data flow
diagrams, entity relationship diagrams, etc. to understand each solution in depth.
Flowcharting
Flowcharting is the process of illustrating workflows and data flows in a system through symbols and
diagrams. It is an important tool to assist the system analyst in identifying a solution to the problem. It
depicts the components of the system visually.
Flowcharting
In case of any change in logic or data/work flow, flowchart has to be redrawn completely
Data flow diagram or DFD is a graphical representation of data flow through a system or sub-system.
Each process has its own data flow and there are levels of data flow diagrams. Level 0 shows the input
and output data for the whole system. Then the system is broken down into modules and level 1 DFD
shows data flow for each module separately. Modules may further be broken down into sub-modules if
required and level 2 DFD drawn.
Pseudocode
After the system is designed, it is handed over to the project manager for implementation, i.e. coding.
The actual coding of a program is done in a programming language, which can be understood only by
programmers who are trained in that language. However, before the actual coding occurs, the basic
operating principles, work flows and data flows of the program are written using a notation similar to
the programming language to be used. Such a notation is called pseudocode.
Here is an example of a pseudocode in C++. The programmer just needs to translate each statement into
C++ syntax to get the program code.
Pseudocode
System analysts try to identify all major mathematical operations while identifying the unique solution
to problem at hand.
A real-life problem is complex and big. If a monolithic solution is developed it poses these problems –
To overcome these problems, the solution should be divided into smaller parts called modules. The
technique of breaking down one big solution into smaller modules for ease of development,
implementation, modification and maintenance is called modular technique of programming or
software development.
Modules are smaller and have lower level of complexity so they are easy to understand
Identifying modules in a software is a mind boggling task because there cannot be one correct way of
doing so. Here are some pointers to identifying modules –
If data is the most important element of the system, create modules that handle related data.
If service provided by the system is diverse, break down the system into functional modules.
If all else fails, break down the system into logical modules as per your understanding of the system
during requirement gathering phase.
For coding, each module has to be again broken down into smaller modules for ease of programming.
This can again be done using the three tips shared above, combined with specific programming rules.
For example, for an object oriented programming language like C++ and Java, each class with its data
and methods could form a single module.
Step-by-Step Solution
To implement the modules, process flow of each module must be described in step by step fashion. The
step by step solution can be developed using algorithms or pseudocodes. Providing step by step solution
offers these advantages –
Anyone reading the solution can understand both problem and solution.
It is equally understandable by programmers and non-programmers.
Micro-level details like identifier names, operations required, etc. get worked out automatically
Control Structures
As you can see in the above example, it is not necessary that a program logic runs sequentially. In
programming language, control structures take decisions about program flow based on given
parameters. They are very important elements of any software and must be identified before any coding
begins.
Algorithms and pseudocodes help analysts and programmers in identifying where control structures are
required.
Decision control structures are used when the next step to be executed depends upon a criteria. This
criteria is usually one or more Boolean expressions that must be evaluated. A Boolean expression always
evaluates to “true” or “false”. One set of statements is executed if the criteria is “true” and another set
executed if the criteria evaluates to “false”. For example, if statement
Repetition control structure is used when a set of statements in to be repeated many times. The number
of repetitions might be known before it starts or may depend on the value of an expression. For
example, for statement, while statement, do while statement, etc.
As you can see in the image above, both selection and decision structures are implemented similarly in a
flowchart. Selection control is nothing but a series of decision statements taken sequentially.
Here are some examples from programs to show how these statements work –
Decision Structures
Decision Structures
A finite set of steps that must be followed to solve any problem is called an algorithm. Algorithm is
generally developed before the actual coding is done. It is written using English like language so that it is
easily understandable even by non-programmers.
Sometimes algorithms are written using pseudocodes, i.e. a language similar to the programming
language to be used. Writing algorithm for solving a problem offers these advantages –
Assists in debugging
Becomes part of software documentation for future reference during maintenance phase
Example Algorithms
Let us first take an example of a real-life situation for creating algorithm. Here is the algorithm for going
to the market to purchase a pen.
Example Algorithms
Step 4 in this algorithm is in itself a complete task and separate algorithm can be written for it. Let us
now create an algorithm to check whether a number is positive or negative.
Example Algorithms
Flowchart Elements
Flowchart Symbols
Here is a chart for some of the common symbols used in drawing flowcharts.
Input/ Output Input/ Output Used for denoting program inputs and outputs.
Decision Decision Stands for decision statements in a program, where answer is usually
Yes or No.
On-page Connector On-page Connector Connects two or more parts of a flowchart, which are
on the same page.
Off-page Connector Off-page Connector Connects two parts of a flowchart which are spread
over different pages.
Flowchart can have only one start and one stop symbol
Example Flowcharts
Example Flowcharts
As you know, computer does not have intelligence of its own; it simply follows the instructions given by
the user. Instructions are the building blocks of a computer program, and hence a software. Giving clear
instructions is crucial to building a successful program. As a programmer or software developer, you
should get into the habit of writing clear instructions. Here are two ways to do that.
Clarity of Expressions
Writing unambiguous expressions is a skill that must be developed by every programmer. Here are some
points to be kept in mind while writing such expressions –
Unambiguous Result
Evaluation of the expression must give one clear cut result. For example, unary operators should be
used with caution.
Unambiguous
Do not try to achieve many things in a single expression. Break into two or more expressions the
moment things start getting complicated.
Simplicity of Instructions
It’s not just for computers that you need to write clear instructions. Any one reading the program later
(even you yourself!!) should be able to understand what the instruction is trying to achieve. It is very
common for programmers not to get a hang of their own programs when they revisit it after some time
has passed. This indicates that maintenance and modification of such programs would be quite difficult.
Writing simple instructions helps in avoiding this problem. Here are some tips to write simple
instructions –
Avoid clever instructions – Clever instructions might not look that clever later if no one is able to
understand it properly.
One instruction per task – Trying to do more than one thing at a time complicates instructions.
Use standards – Every language has its standards, follow them. Remember you are not working alone on
the project; follow project standards and guidelines for coding.
In this chapter, we will cover how to write a good program. But before we do that, let us see what the
characteristics of a good program are –
Portable – The program or software should run on all computers of same type. By same type we mean a
software developed for personal computers should run on all PCs. Or a software for written for tablets
should run on all tablets having the right specifications.
Efficient – A software that does the assigned tasks quickly is said to be efficient. Code optimization and
memory optimization are some of the ways of raising program efficiency.
Effective – The software should assist in solving the problem at hand. A software that does that is said to
be effective.
Reliable – The program should give the same output every time the same set of inputs is given.
User friendly – Program interface, clickable links and icons, etc. should be user friendly.
Self-documenting – Any program or software whose identifier names, module names, etc. can describe
itself due to use of explicit names.
A name that identifies any variable, object, function, class or method is called an identifier. Giving
proper identifier names makes a program self-documenting. This means that name of the object will tell
what it does or what information it stores. Let’s take an example of this SQL instruction:
Look at line 10. It tells anyone reading the program that a student’s ID, name and roll number are to be
selected. The names of the variables make this self-explanatory. These are some tips to create proper
identifier names –
Don’t give same name to two identifiers even if the language allows it
Don’t give same names to more than one identifier even if they have mutually exclusive scope
Comments
In the image above, look at line 8. It tells the reader that the next few lines of code will retrieve list of
students whose report card is to be generated. This line is not part of the code but given only to make
the program more user friendly.
Such an expression that is not compiled but written as a note or explanation for the programmer is
called a comment. Look at the comments in the following program segment. Comments start with //.
Comments
You should avoid adding superfluous comments as that may prove counterproductive by breaking the
flow of code while reading. Compiler may ignore comments and indentations but the reader tends to
read each one of them.
Indentation
Distance of text from left or right margin is called indent. In programs, indentation is used to separate
logically separated blocks of code. Here’s an example of indented program segment:
Indentation
As you can see, indented program is more understandable. Flow of control from for loop to if and back
to for is very clear. Indentation is especially useful in case of control structures.
Inserting blank spaces or lines is also part of indentation. Here are some situations where you can and
should use indentation –
Blank lines between logical or functional blocks of code within the program
Identifying and removing errors from a program or software is called debugging. Debugging is ideally
part of testing process but in reality it is done at every step of programming. Coders should debug the
smallest of their modules before moving on. This decreases the number of errors thrown up during the
testing phase and reduces testing time and effort significantly. Let us look at the types of errors that can
crop up in a program.
Syntax Errors
Syntax errors are the grammatical errors in a program. Every language has its own set of rules, like
creating identifiers, writing expressions, etc. for writing programs. When these rules are violated, the
errors are called syntax errors. Many modern integrated development environments can identify the
syntax errors as you type your program. Else, it will be shown when you compile the program. Let us
take an example –
Syntax Errors
In this program, the variable prod has not been declared, which is thrown up by the compiler.
Semantic Errors
Semantic errors are also called logical errors. The statement has no syntax errors, so it will compile and
run correctly. However, it will not give the desired output as the logic is not correct. Let us take an
example.
Semantic Errors
Look at line 13. Here programmer wants to check if the divisor is 0, to avoid division by 0. However,
instead of using the comparing operator ==, assignment operator = has been used. Now every time the
“if expression” will evaluate to true and program will give output as “You cannot divide by 0”. Definitely
not what was intended!!
Logical errors cannot be detected by any program; they have to be identified by the programmer herself
when the desired output is not achieved.
Runtime Errors
Runtime errors are errors that occur while executing the program. This implies that the program has no
syntax errors. Some of the most common run time errors your program may encounter are –
Infinite loop
Division by ‘0’
Code Optimization
Any method by which code is modified to improve its quality and efficiency is called code optimization.
Code quality determines life span of code. If the code can be used and maintained for a long period of
time, carried over from product to product, its quality is deemed to be high and it has a longer life. On
the contrary, if a piece of code can be used and maintained only for short durations, say till a version is
valid, it is deemed to be of low quality and has a short life.
Reliability and speed of a code determines code efficiency. Code efficiency is an important factor in
ensuring high performance of a software.
Intuition based optimization (IBO) – Here the programmer tries to optimize the program based on her
own skill and experience. This might work for small programs but fails miserably as complexity of the
program grows.
Evidence based optimization (EBO) – Here automated tools are used to find out performance
bottlenecks and then relevant portions optimize accordingly. Every programming language has its own
set of code optimization tools. For example, PMD, FindBug and Clover are used to optimize Java code.
Code is optimized for execution time and memory consumption because time is scarce and memory
expensive. There has to be a balance between the two. If time optimization increases load on memory
or memory optimization makes the code slower, purpose of optimization will be lost.
Memory Optimization
As you know, data and instructions consume memory. When we say data, it also refers to interim data
that is the result of expressions. We also need to keep a track of how many instructions are making up
the program or the module we are trying to optimize. Here are some tips for memory optimization –
Avoid declaring global variables inside loops that are executed many times
Program Documentation
Any written text, illustrations or video that describe a software or program to its users is called program
or software document. User can be anyone from a programmer, system analyst and administrator to
end user. At various stages of development multiple documents may be created for different users. In
fact, software documentation is a critical process in the overall software development process.
In modular programming documentation becomes even more important because different modules of
the software are developed by different teams. If anyone other than the development team wants to or
needs to understand a module, good and detailed documentation will make the task easier.
Any outdated document should be phased out after due recording of the phase out
Advantages of Documentation
Maintenance is easier
Programmers other than the developer can understand all aspects of software
Ensures knowledge de-centralization, cutting costs and effort if people leave the system abruptly
Example Documents
A software can have many types of documents associated with it. Some of the important ones include –
User manual – It describes instructions and procedures for end users to use the different features of the
software.
Operational manual – It lists and describes all the operations being carried out and their inter-
dependencies.
Design Document – It gives an overview of the software and describes design elements in detail. It
documents details like data flow diagrams, entity relationship diagrams, etc.
Requirements Document – It has a list of all the requirements of the system as well as an analysis of
viability of the requirements. It can have user cases, reallife scenarios, etc.
Testing Document – It records test plan, test cases, validation plan, verification plan, test results, etc.
Testing is one phase of software development that needs intensive documentation.
List of Known Bugs – Every software has bugs or errors that cannot be removed because either they
were discovered very late or are harmless or will take more effort and time than necessary to rectify.
These bugs are listed with program documentation so that they may be removed at a later date. Also
they help the users, implementers and maintenance people if the bug is activated.
Program Maintenance
Program maintenance is the process of modifying a software or program after delivery to achieve any of
these outcomes –
Correct errors
Improve performance
Add functionalities
Despite the common perception that maintenance is required to fix errors that come up after the
software goes live, in reality most of the maintenance work involves adding minor or major capabilities
to existing modules. For example, some new data is added to a report, a new field added to entry forms,
code to be modified to incorporate changed government laws, etc.
Types of Maintenance
Corrective maintenance – Here errors that come up after on-site implementation are fixed. The errors
may be pointed out by the users themselves.
Preventive maintenance – Modifications done to avoid errors in future are called preventive
maintenance.
Adaptive maintenance – Changes in the working environment sometimes require modifications in the
software. This is called adaptive maintenance. For example, if government education policy changes,
corresponding changes have to be made in student result processing module of school management
software.
Perfective maintenance – Changes done in the existing software to incorporate new requirements from
the client is called perfective maintenance. Aim here is to be always be up-to-date with the latest
technology.
Maintenance Tools
Software developers and programmers use many tools to assist them in software maintenance. Here are
some of the most widely used –
Program slicer – selects a part of the program that would be affected by the change
Data flow analyzer – tracks all possible flows of data in the software
Dependency analyzer – assists in understanding and analyzing interdependence of different parts of the
program