ACRONYMS

OMG: Object Management Group
UML: Unified Modeling Language
INTRODUCTION

The term software construction refers to the
detailed creation of working, meaningful software through a
combination of coding, verification, unit testing, integration
testing, and debugging.
The Software Construction Knowledge Area is
linked to all the other KAs, most strongly to Software Design and
Software Testing. This is because the software construction process
itself involves significant software design and test activity. It
also uses the output of design and provides one of the inputs to
testing, both design and testing being the activities, not the KAs
in this case. Detailed boundaries between design, construction, and
testing (if any) will vary depending upon the software life cycle
processes that are used in a project.
Although some detailed design may be performed
prior to construction, much design work is performed within the
construction activity itself. Thus the Software Construction KA is
closely linked to the Software Design KA.
Throughout construction, software engineers both
unit-test and integration-test their work. Thus, the Software
Construction KA is closely linked to the Software Testing KA as
well.
Software construction typically produces the
highest volume of configuration items that need to be managed in a
software project (source files, content, test cases, and so on).
Thus, the Software Construction KA is also closely linked to the
Software Configuration Management KA.
Since software construction relies heavily on
tools and methods and is probably the most tool-intensive of the KAs,
it is linked to the Software Engineering Tools and Methods KA.
While software quality is important in all the
KAs, code is the ultimate deliverable of a software project, and
thus Software Quality is also closely linked to Software
Construction.
Among the Related Disciplines of Software
Engineering, the Software Construction KA is most akin to computer
science in its use of knowledge of algorithms and of detailed coding
practices, both of which are often considered to belong to the
computer science domain. It is also related to project management,
insofar as the management of construction can present considerable
challenges.
BREAKDOWN OF TOPICS FOR SOFTWARE CONSTRUCTION

The breakdown of the Software Construction KA is
presented below, together with brief descriptions of the major
topics associated with it. Appropriate references are also given for
each of the topics. Figure 1 gives a graphical representation of the
top-level decomposition of the breakdown for this KA.

1. Software Construction Fundamentals

The fundamentals of software construction include
The first three concepts apply to design as well
as to construction. The following sections define these concepts and
describe how they apply to construction.
1.1. Minimizing Complexity [Bec99; Ben00;
Hun00; Ker99; Mag93; McC04]

A major factor in how people convey intent to
computers is the severely limited ability of people to hold complex
structures and information in their working memories, especially
over long periods of time. This leads to one of the strongest
drivers in software construction: minimizing complexity. The need to
reduce complexity applies to essentially every aspect of software
construction, and is particularly critical to the process of
verification and testing of software constructions.
In software construction, reduced complexity is
achieved through emphasizing the creation of code that is simple and
readable rather than clever.
Minimizing complexity is accomplished through
making use of standards, which is discussed in topic 1.4
Standards in
Construction, and
through numerous specific techniques which are summarized in topic
3.3 Coding.
It is also supported by the construction-focused quality techniques
summarized in topic 3.5
Construction Quality.
1.2. Anticipating Change [Ben00; Ker99;
McC04]

Most software will change over time, and the
anticipation of change drives many aspects of software construction.
Software is unavoidably part of changing external environments, and
changes in those outside environments affect software in diverse
ways.
Anticipating change is supported by many specific
techniques summarized in topic 3.3
Coding.
-
Communication methods (for example, standards for document
formats and contents)
-
Programming
languages (for example, language standards for languages like
Java and C++)
-
Platforms
(for example, programmer interface standards for operating
system calls)
-
Tools (for
example, diagrammatic standards for notations like UML (Unified
Modeling Language))
1.3. Constructing for Verification [Ben00;
Hun00; Ker99; Mag93; McC04]

Constructing for verification means building
software in such a way that faults can be ferreted out readily by
the software engineers writing the software, as well as during
independent testing and operational activities. Specific techniques
that support constructing for verification include following coding
standards to support code reviews, unit testing, organizing code to
support automated testing, and restricted use of complex or
hard-to-understand language structures, among others.
1.4. Standards in Construction
[IEEE12207-95; McC04]

Standards that directly affect construction
issues include Use of external standards.
Construction depends on the use of external standards for
construction languages, construction tools, technical interfaces,
and interactions between Software Construction and other KAs.
Standards come from numerous sources, including hardware and
software interface specifications such as the Object Management
Group (OMG) and international organizations such as the IEEE or ISO.
Use of internal standards
.
Standards may also be created on an organizational basis at the
corporate level or for use on specific projects. These standards
support coordination of group activities, minimizing complexity,
anticipating change, and constructing for verification.
2. Managing Construction

2.1. Construction Models [Bec99; McC04]

Numerous models have been created to develop
software, some of which emphasize construction more than others.
Some models are more linear from the construction
point of view, such as the waterfall and staged-delivery life cycle
models. These models treat construction as an activity which occurs
only after significant prerequisite work has been
completed—including detailed requirements work, extensive design
work, and detailed planning. The more linear approaches tend to
emphasize the activities that precede construction (requirements and
design), and tend to create more distinct separations between the
activities. In these models, the main emphasis of construction may
be coding.
Other models are more iterative, such as
evolutionary prototyping, Extreme Programming, and Scrum. These
approaches tend to treat construction as an activity that occurs
concurrently with other software development activities, including
requirements, design, and planning, or overlaps them. These
approaches tend to mix design, coding, and testing activities, and
they often treat the combination of activities as construction.
Consequently, what is considered to be
“construction” depends to some degree on the life cycle model used.
2.2. Construction Planning [Bec99; McC04]

The choice of construction method is a key aspect
of the construction planning activity. The choice of construction
method affects the extent to which construction prerequisites are
performed, the order in which they are performed, and the degree to
which they are expected to be completed before construction work
begins.
The approach to construction affects the
project’s ability to reduce complexity, anticipate change, and
construct for verification. Each of these objectives may also be
addressed at the process, requirements, and design levels—but they
will also be influenced by the choice of construction method.
Construction planning also defines the order in
which components are created and integrated, the software quality
management processes, the allocation of task assignments to specific
software engineers, and the other tasks, according to the chosen
method.
2.3. Construction Measurement [McC04]

Numerous
construction activities and artifacts can be measured, including
code developed, code modified, code reused, code destroyed, code
complexity, code inspection statistics, fault-fix and fault-find
rates, effort, and scheduling. These measurements can be useful for
purposes of managing construction, ensuring quality during
construction, improving the construction process, as well as for
other reasons. See the Software Engineering Process KA for more on
measurements.
3. Practical considerations

Construction is an activity in which the software
has to come to terms with arbitrary and chaotic real-world
constraints, and to do so exactly. Due to its proximity to
real-world constraints, construction is more driven by practical
considerations than some other KAs, and software engineering is
perhaps most craft-like in the construction area.
3.1. Construction Design [Bec99; Ben00;
Hun00; IEEE12207-95; Mag93; McC04]

Some projects allocate more design activity to
construction; others to a phase explicitly focused on design.
Regardless of the exact allocation, some detailed design work will
occur at the construction level, and that design work tends to be
dictated by immovable constraints imposed by the real-world problem
that is being addressed by the software. Just as construction
workers building a physical structure must make small-scale
modifications to account for unanticipated gaps in the builder’s
plans, software construction workers must make modifications on a
smaller or larger scale to flesh out details of the software design
during construction.
The details of the design activity at the
construction level are essentially the same as described in the
Software Design KA, but they are applied on a smaller scale.
3.2 Construction Languages [Hun00; McC04]

Construction languages
include all forms of
communication by which a human can specify an executable problem
solution to a computer.
The simplest type of construction language is a
configuration
language, in which
software engineers choose from a limited set of predefined options
to create new or custom software installations. The text-based
configuration files used in both the Windows and Unix operating
systems are examples of this, and the menu style selection lists of
some program generators constitute another.
Toolkit languages
are used to build applications
out of toolkits (integrated sets of application-specific reusable
parts), and are more complex than configuration languages. Toolkit
languages may be explicitly defined as application programming
languages (for example, scripts), or may simply be implied by the
set of interfaces of a toolkit.
Programming languages
are the most flexible type of
construction languages. They also contain the least amount of
information about specific application areas and development
processes, and so require the most training and skill to use
effectively.
There are three general kinds of notation used
for programming languages, namely:
Linguistic notations
are distinguished in particular
by the use of word-like strings of text to represent complex
software constructions, and the combination of such word-like
strings into patterns that have a sentence-like syntax. Properly
used, each such string should have a strong semantic connotation
providing an immediate intuitive understanding of what will happen
when the underlying software construction is executed.
Formal notations
rely less on intuitive, everyday
meanings of words and text strings and more on definitions backed up
by precise, unambiguous, and formal (or mathematical) definitions.
Formal construction notations and formal methods are at the heart of
most forms of system programming, where accuracy, time behavior, and
testability are more important than ease of mapping into natural
language. Formal constructions also use precisely defined ways of
combining symbols that avoid the ambiguity of many natural language
constructions.
Visual notations
rely much less on the
text-oriented notations of both linguistic and formal construction,
and instead rely on direct visual interpretation and placement of
visual entities that represent the underlying software. Visual
construction tends to be somewhat limited by the difficulty of
making “complex“ statements using only movement of visual entities
on a display. However, it can also be a powerful tool in cases where
the primary programming task is simply to build and “adjust“ a
visual interface to a program, the detailed behavior of which has
been defined earlier.
3.3. Coding [Ben00; IEEE12207-95; McC04]

The following considerations apply to the
software construction coding activity:
-
Techniques for creating understandable source code, including
naming and source code layout
-
Use of
classes, enumerated types, variables, named constants, and other
similar entities
-
Use of
control structures
-
Handling
of error conditions—both planned errors and exceptions (input of
bad data, for example)
-
Prevention of code-level security breaches (buffer overruns or
array index overflows, for example)
-
Resource
usage via use of exclusion mechanisms and discipline in
accessing serially reusable resources (including threads or
database locks)
-
Source
code organization (into statements, routines, classes, packages,
or other structures)
-
Code
documentation
-
Code
tuning
3.4. Construction Testing [Bec99; Hun00;
Mag93; McC04]

Construction involves two forms of testing, which
are often performed by the software engineer who wrote the code:
-
Unit
testing
-
Integration testing
The purpose of construction testing is to reduce
the gap between the time at which faults are inserted into the code
and the time those faults are detected. In some cases, construction
testing is performed after code has been written. In other cases,
test cases may be created before code is written.
Construction testing typically involves a subset
of types of testing, which are described in the Software Testing KA.
For instance, construction testing does not typically include system
testing, alpha testing, beta testing, stress testing, configuration
testing, usability testing, or other, more specialized kinds of
testing.
Two standards have been published on the topic:
IEEE Std 829-1998,
IEEE Standard for Software Test Documentation
and IEEE Std 1008-1987,
IEEE Standard for
Software Unit Testing.
See also the corresponding sub-topics in the
Software Testing KA: 2.1.1
Unit Testing
and 2.1.2
Integration Testing
for more specialized
reference material.
3.5. Reuse [IEEE1517-99; Som05]

As stated in
the introduction of (IEEE1517-99):
“Implementing
software reuse entails more than creating and using libraries of
assets. It requires formalizing the practice of reuse by integrating
reuse processes and activities into the software life cycle.“
However, reuse is important enough in software construction that it
is included here as a topic.
The tasks
related to reuse in software construction during coding and testing
are:
-
The
selection of the reusable units, databases, test procedures, or
test data
-
The
evaluation of code or test reusability
-
The
reporting of reuse information on new code, test procedures, or
test data
3.6. Construction Quality [Bec99; Hun00;
IEEE12207-95; Mag93; McC04]

Numerous techniques exist to ensure the quality
of code as it is constructed. The primary techniques used for
construction include
-
Unit
testing and integration testing (as mentioned in topic 3.4
Construction Testing)
-
Test-first development (see also the Software Testing KA, topic
2.2 Objectives of Testing)
-
Code
stepping
-
Use of
assertions
-
Debugging
-
Technical
reviews (see also the Software Quality KA, sub-topic 2.3.2
Technical
Reviews)
-
Static
analysis (IEEE1028) (see also the Software Quality KA, topic 2.3
Reviews and
Audits)
The specific technique or techniques selected
depend on the nature of the software being constructed, as well as
on the skills set of the software engineers performing the
construction.
Construction quality activities are
differentiated from other quality activities by their focus.
Construction quality activities focus on code and on artifacts that
are closely related to code: small-scale designs—as opposed to other
artifacts that are less directly connected to the code, such as
requirements, high-level designs, and plans.
3.7 Integration [Bec99; IEEE12207-95;
McC04]

A key activity during construction is the
integration of separately constructed routines, classes, components,
and subsystems. In addition, a particular software system may need
to be integrated with other software or hardware systems.
Concerns related to construction integration
include planning the sequence in which components will be
integrated, creating scaffolding to support interim versions of the
software, determining the degree of testing and quality work
performed on components before they are integrated, and determining
points in the project at which interim versions of the software are
tested.
Matrix of Topics vs. Reference Material


RECOMMENDED REFERENCES FOR SOFTWARE CONSTRUCTION

-
[Bec99] K. Beck, Extreme Programming
Explained: Embrace Change, Addison-Wesley, 1999, Chap. 10,
12, 15, 16-18, 21.
-
[Ben00a] J. Bentley, Programming Pearls,
second ed., Addison-Wesley, 2000, Chap. 2-4, 6-11, 13, 14, pp.
175-176.
-
[Hun00] A. Hunt and D. Thomas, The
Pragmatic Programmer, Addison-Wesley, 2000, Chap. 7, 8 12,
14-21, 23, 33, 34, 36-40, 42, 43.
-
[IEEE1517-99] IEEE Std 1517-1999, IEEE
Standard for Information Technology-Software Life Cycle
Processes- Reuse Processes, IEEE, 1999.
-
[IEEE12207.0-96] IEEE/EIA
12207.0-1996//ISO/IEC12207:1995, Industry Implementation of
Int. Std. ISO/IEC 12207:95, Standard for Information Technology-
Software Life Cycle Processes, IEEE, 1996.
-
[Ker99a] B.W. Kernighan and R. Pike, The
Practice of Programming, Addison-Wesley, 1999, Chap. 2, 3,
5, 6, 9.
-
[Mag93] S. Maguire, Writing Solid Code:
Microsoft’s Techniques for Developing Bug-Free C Software,
Microsoft Press, 1993, Chap. 2-7.
-
[McC04] S. McConnell, Code Complete: A
Practical Handbook of Software Construction, Microsoft
Press, second ed., 2004.
-
[Som05] I. Sommerville, Software
Engineering, seventh ed., Addison-Wesley, 2005.
APPENDIX A. LIST OF FURTHER READINGS

-
(Bar98) T.T. Barker,
Writing Software
Documentation: A Task-Oriented Approach,
Allyn & Bacon, 1998.
-
(Bec02) K. Beck,
Test-Driven
Development: By Example,
Addison-Wesley, 2002.
-
(Fow99) M. Fowler and al.,
Refactoring:
Improving the Design of Existing Code,
Addison-Wesley, 1999.
-
(How02) M. Howard and D.C. Leblanc,
Writing Secure
Code, Microsoft
Press, 2002.
-
(Hum97b) W.S. Humphrey,
Introduction to
the Personal Software Process,
Addison-Wesley, 1997.
-
(Mey97) B. Meyer,
Object-Oriented
Software Construction,
second ed., Prentice Hall, 1997, Chap. 6, 10, 11.
-
(Set96) R. Sethi,
Programming
Languages: Concepts & Constructs,
second ed., Addison-Wesley, 1996, Parts II-V.
APPENDIX B. LIST OF STANDARDS

-
(IEEE829-98) IEEE Std 829-1998,
IEEE Standard for
Software Test Documentation,
IEEE, 1998.
-
(IEEE1008-87) IEEE Std 1008-1987 (R2003),
IEEE
Standard for Software Unit Testing,
IEEE, 1987.
-
(IEEE1028-97) IEEE Std 1028-1997 (R2002),
IEEE
Standard for Software Reviews,
IEEE, 1997.
-
(IEEE1517-99) IEEE Std 1517-1999,
IEEE Standard for
Information Technology-Software Life Cycle Processes- Reuse
Processes, IEEE,
1999.
-
(IEEE12207.0-96) IEEE/EIA
12207.0-1996//ISO/IEC12207:1995,
Industry
Implementation of Int. Std. ISO/IEC 12207:95, Standard for
Information Technology-Software Life Cycle Processes,
IEEE, 1996.