![](https://csdnimg.cn/release/download_crawler_static/10139040/bg12.jpg)
xxi
Preface
What’s this book all about? Well, it’s about how to develop software from a personal perspective. We’ll look at
what it means for you to take a problem and produce a program to solve it from beginning to end. That said,
this book focuses a lot on design. How do you design software? What things do you take into account? What
makes a good design? What methods and processes are there to help you design software? Is designing small
programs different from designing large ones? How can you tell a good design from a bad one? What general
patterns can you use to help make your design more readable and understandable?
It’s also about code construction. How do you write programs and make them work? “What?” you say.
“I’ve already written eight gazillion programs! Of course I know how to write code!” Well, in this book, we’ll
explore what you already do and investigate ways to improve on that. We’ll spend some time on coding
standards, debugging, unit testing, modularity, and characteristics of good programs. We’ll also talk about
reading code, what makes a program readable, and how to review code that others have written with an eye
to making it better. Can good, readable code replace documentation? How much documentation do you
really need?
And it’s about software engineering, which is usually defined as “the application of engineering
principles to the development of software.” What are engineering principles? Well, first, all engineering
efforts follow a defined process. So we’ll be spending a bit of time talking about how you run a software
development project and what phases there are to a project. We’ll talk a lot about agile methodologies, how
they apply to small development teams and how their project management techniques work for small- to
medium-sized projects. All engineering work has a basis in the application of science and mathematics to
real-world problems. So does software development. As I’ve said already, we’ll be spending a lot of time
examining how to design and implement programs that solve specific problems.
By the way, there’s at least one other person (besides me) who thinks software development is not an
engineering discipline. I’m referring to Alistair Cockburn, and you can read his paper, “The End of Software
Engineering and the Start of Economic-Cooperative Gaming,” at http://alistair.cockburn.us/The+end+o
f+software+engineering+and+the+start+of+economic-cooperative+gaming.
Finally, this book is about professional practice, the ethics and the responsibilities of being a software
developer, social issues, privacy, how to write secure and robust code, and the like. In short, those fuzzy
other things that one needs in order to be a professional software developer.
This book covers many of the topics described for the ACM/IEEE Computer Society Curriculum
Guidelines for Undergraduate Degree Programs in Computer Science (known as CS2013).
1
In particular,
it covers topics in a number of the Knowledge Areas of the Guidelines, including Software Development
Fundamentals, Software Engineering, Systems Fundamentals, Parallel and Distributed Computing,
Programming Languages, and Social Issues and Professional Practice. It’s designed to be both a textbook
1
The Joint Task Force on Computing Education. 2013. “Computer Science Curricula 2013: Curriculum Guidelines for
Undergraduate Degree Programs in Computer Science.” New York, NY: ACM/IEEE Computer Society. www.acm.org/
education/CS2013-final-report.pdf.