1
1
Chenglie Hu
An Introduction to
Software Design
Concepts, Principles, Methodologies,
and Techniques
Chenglie Hu
Computer Science
Carroll University
Waukesha, WI
USA
# The Editor(s) (if applicable) and The Author(s), under exclusive license to Springer Nature Switzerland AG
2023
This work is subject to copyright. All rights are solely and exclusively licensed by the Publisher, whether the
whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations,
recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
The use of general descriptive names, registered names, trademarks, service marks, etc. in this publication does not
imply, even in the absence of a specific statement, that such names are exempt from the relevant protective laws
and regulations and therefore free for general use.
The publisher, the authors, and the editors are safe to assume that the advice and information in this book are
believed to be true and accurate at the date of publication. Neither the publisher nor the authors or the editors give a
warranty, expressed or implied, with respect to the material contained herein or for any errors or omissions that
may have been made. The publisher remains neutral with regard to jurisdictional claims in published maps and
institutional affiliations.
This Springer imprint is published by the registered company Springer Nature Switzerland AG
The registered company address is: Gewerbestrasse 11, 6330 Cham, Switzerland
Preface
According to the Accreditation Board for Engineering and Technology (or ABET as
commonly known), software design is one of the core subjects of computer science
alongside data structures, computer architecture, algorithms, and programming languages.
Yet, unlike the other core areas, there is no widely accepted “table of contents” for software
design that can be used for curriculum development. As a result, what software design may
be or entail largely depends on the interpretation of an instructor. There are a variety of
ways how design is taught in a computer science program, including a learning of the
Unified Modeling Language, a learning about design patterns, or simply a chapter-worth
coverage in a software engineering course. Though students may have learned pieces of
software design in various courses even in elementary programming courses, such
fragmented coverages may not always be coherent and consistent. Computer science
education research has shown that graduating computer science students may lack neces-
sary software design knowledge and skills due to inadequate design education students
have received.
After all, software design is not a well-defined discipline in terms of its foundation
(concepts and theories), a defined body of knowledge that allows foundational research to
be carried out, its terminologies, its research methods, and, perhaps most importantly, some
institutional manifestation in the form of subjects taught at colleges and universities. In
fact, we might not even agree on what appears to be a basic question: What is software
design? In the extreme, a software design may be fully documented like one we may see in
a structural engineering discipline, or it may only exist in code artifacts. But most likely in
practice, we often create critical yet often incomprehensive design artifacts for a variety of
reasons to communicate about our design thoughts and facilitate the code construction. On
the one hand, a design must work logically; thus, doing design might sound like doing
some sort of mathematics (though whether both share similar ways of thinking remains
debatable). On the other hand, there are many ways we can design a program, and we
eventually must choose one. Thus, doing design might be considered a form of art with an
“aesthetic” value in the viewpoint of a designer. But at all events, design is unlikely an
engineering act or thing because we may start constructing the software when we do not
v
vi Preface
even have an architecture of the software ready. Regardless of what software design may
be, its importance in software’s long-term success is undeniable. Despite these conceptual
and philosophical challenges, it appears clear that we need a consistent design curriculum
in computer science programs to better prepare students for real-world challenges in
software development.
Most design books are professionally oriented, focusing on a design process such as
continuous design, emergent design, domain-oriented design, agile modeling, etc. They
were not intended to be used as college textbooks. Meanwhile, there have been some
design textbooks but most with also significant coverage on programming. They vary in
style, depth, and topical focus. This diversity seen in existing textbooks may have created
difficulties for instructors to choose an appropriate textbook as the author experienced
when he started teaching the subject more than a decade ago. The author’s exploration in
teaching of design started with this fundamental question: What is an appropriate body of
knowledge about software design that every computer science student must possess? The
Guide to the Software Engineering Body of Knowledge (published by IEEE Computer
Society in 2004) specifies what constitutes body of knowledge for software design. The
backbone of this knowledge seems to be the design-enabling techniques, which, according
to the Guide, include design principles, guidelines, and key notions and concepts in regard
to design abstraction, decomposition, modularization, and module cohesion and coupling.
Also based on the Guide, some essential knowledge about software architecture should also
be included. Therefore, the design-enabling techniques, software architecture, and design
of larger software elements (necessary for understanding software architecture) may
constitute, in the author’s viewpoint, the core of the essential knowledge about software
design. This understanding has guided the author to design and improve his teaching every
year, leading to the formation of the book.
Chapter 1 is dedicated to an exploration of what software design may be and entail.
Design is a way of thinking; therefore, “design thinking”—a widely publicized mode of
critical thinking in the recent years—is prompted in the book. Readers are expected to have
appropriate knowledge in data structures. However, it is not assumed that readers have also
gained good understanding about the paradigm of object orientation. Thus, Chaps. 2 and 3
are designed to help readers better understand object orientation and the essentials of
object-oriented design. Methods, standalone or being part of larger units, are essential
program units, and design of methods may significantly impact the design attributes of
enclosing modules, subsystems, or even the entire system. Chapter 4 is dedicated to design
of methods. Object-oriented design is still the primary design paradigm in the real world;
therefore, a good portion of the book also includes topics about design of objects, modeling
with the Unified Modeling Language, and use of design patterns (Chaps. 5, 6, and 8,
respectively), though the coverage of these topics has a focus on intrigued ideas behind the
use of the concepts, techniques, tools, and patterns. Despite object orientation being still the
center of attention, there is a strong promotion throughout the book that software design
should consider all appropriate design paradigms and methodologies. Larger software
elements are often directly responsible for the formation of software architecture.
Preface vii
ix
x Contents