Software Engineering: A Modern Approach
Preface 🔗
This book is an English translation of a work originally published in early 2020. Initially intended for Brazilian students, we chose to write it in Portuguese to maximize accessibility and make an impact on software engineering education throughout our country.
Fortunately, the book has been a considerable success, surpassing our expectations by a wide margin. It is now adopted by numerous Brazilian universities in different states across the country. Although estimating exact figures is difficult, we have evidence that over 400 instructors have used or are currently using the book. We frequently receive messages with positive feedback from students, instructors, and industry professionals who are using the book to improve their skills in the field.
Thus, with the book firmly established in Brazil by late 2023, we decided to embark on an English translation project to reach a global audience. This decision was also motivated by requests from Brazilian colleagues working abroad. Furthermore, the Portuguese edition remains relevant and doesn’t require significant updates.
For a deeper insight into the motivations behind writing the book, its organization, and features, we recommend that readers refer to the original preface, which we have reproduced in the following pages.
Website 🔗
The book has an open access version, available at https://softengbook.org. To report any errors, inconsistencies, or typos, please use the form at (link).
Marco Tulio Valente
Belo Horizonte, March 19, 2024
Preface to the Brazilian Edition 🔗
The uselessness of prefaces is a commonplace in the history of prefaces, so I will be brief. – Eduardo Giannetti
The idea of writing this book emerged in early 2019 when I was assigned to teach the software engineering course for the bachelor’s degree in computer science at UFMG, Brazil. To prepare for the course, I began by analyzing well-known software engineering books. To my surprise, I found they had changed little since I had taken the course during my undergraduate studies more than 25 years earlier.
My goal was to find a book that would allow me, at the beginning of a
class, to inform the students: Today, we will study this topic, which
corresponds to this chapter in the book.
At the end of the class, I
wanted to suggest to the students: To better comprehend the topics we
just covered, I suggest you do these exercises.
Unfortunately, I
couldn’t find such a book. Instead, I had to conduct extensive research
and read at least 15 books.
As a result, I created 600 slides covering the essential material for an undergraduate course in software engineering, particularly for programs that have only one course in the field. However, studying solely from slides does not provide the comprehensive learning experience obtained from reading a full and contextualized text.
Thus, I decided to transform the slides into my ideal textbook. It could also help other instructors who might face similar challenges when teaching an introductory software engineering course.
I would like to highlight the following points about the content, organization, and writing strategy of the book:
It was written to be a modern book, covering techniques and principles widely used in software engineering today.
Additionally, the book covers traditional techniques and principles. We believe it’s important to know the history of the field, highlighting what has and has not worked. This perspective is relevant to the students’ training, in our opinion.
The book includes numerous examples and discussions of real cases. For this purpose, we created the
Real World
sections, where topics are illustrated with recent and interesting examples, from large software companies and from the scientific literature.The book was written in Portuguese, primarily because we aimed to contribute to Brazilian courses and students. However, we chose not to translate certain terms, such as refactoring, branches, and sprints, as we believe Brazilian developers use them in their day-to-day work without translation.
Despite addressing modern topics, it is intended to be a timeless book. Therefore, techniques and technologies that have not yet stood the test of time are either not addressed or are addressed briefly. An example is the most recent frameworks and libraries for constructing web interfaces, which tend to change rapidly. We also avoided strongly coupling the book to any specific programming language. For instance, most code examples are presented in Java, but use a neutral syntax without using sophisticated or Java-specific resources.
It is not an excessively long book with numerous chapters that, in practice, discuss topics not pertinent to undergraduate courses.
Increasingly, software engineers have to write code. Today, there’s no room for saying
I don’t need to program because I’m an architect or analyst.
Therefore, in the software design, testing, and refactoring chapters, we attempted to follow the recommendation of Linus Torvalds (creator of Linux):Talk is cheap, but show me the code.
Thus, these chapters include several source code examples illustrating problems and solutions in real systems.In writing this book, we followed the principles we advocate. Thus, it was written following several agile principles and practices. Each chapter was treated as a sprint; once completed, it was made available for use, critique, and suggestions. Similar to software development, we believe it’s risky in today’s world to spend years writing a manuscript while locked in an office before making it public.
Audience 🔗
This book is intended for undergraduate students and was designed for curricula with a single 60-hour software engineering course. However, in conjunction with other books, it can be used in programs with two or more courses in the field.
It is also suitable for technical and technological degree programs. We have deliberately employed clear, accessible language to facilitate comprehension and widespread adoption. We also wrote the book with industry professionals in mind, especially those looking to improve their knowledge of modern software engineering topics.
Prerequisites 🔗
Readers are expected to have knowledge of basic programming concepts, algorithms, and data structures. Knowledge of object-oriented programming concepts is also recommended. Assuming a four-year undergraduate degree, the book is best suited for students in the latter half of their studies.
Marco Tulio Valente
Belo Horizonte, February 10, 2020
Author 🔗
Marco Tulio Valente holds a Ph.D. in Computer Science from the Federal University of Minas Gerais, Brazil, where he is an Associate Professor in the Department of Computer Science since 2009. Previously, he was an adjunct professor at PUC Minas for 11 years and a senior systems analyst at a telecommunication company for 4 years. He is the author of over 150 scientific papers and has supervised more than 30 master’s theses and 15 doctoral dissertations.
Acknowledgments 🔗
I would like to thank the 30 students who have been part of the ASERG research group over the last decade. A substantial part of the book’s content has its origin in the work of our group. Special thanks to Professors Eduardo Figueiredo and André Hora, my colleagues at DCC/UFMG, who reviewed some chapters of the book. Also, to Prof. José Luis Braga, who gave valuable suggestions to improve the text. I’d like to thank the students of the postgraduate course we offered in the second semester of 2019 who helped us to calibrate and refine the book’s content—especially Ulisses Fernandes and Fábio Ferreira, for their careful review. Thanks also to Aline Brito, who helped convert the text into the final format, and to João Eduardo Montandon and Hudson Borges, for reviewing the appendix on Git. Lastly, thanks to Osvaldo and Cynthia Valente, for proofreading parts of the manuscript.