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 indications 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 with the aim of reaching 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 choose 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 with the core material for an undergraduate course in software engineering, specifically for programs that have only one course in the field. However, studying just from slides does not provide the learning experience obtained from reading a full and contextualized text.
Thus, I had the idea of transforming the slides into a book that could fulfill the role of the textbook of my dreams. 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 overly long book with multiple chapters that, in practice, discuss topics not relevant 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. It was created for use in 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 classes in the field.
It can also be used in technical and technological degree programs. Indeed, we tried to use clear language, close to colloquial speech, to reduce the barriers to the book’s adoption. Finally, we also wrote the book with industry professionals in mind, especially those who are seeking to improve their knowledge of modern software engineering topics.
Prerequisites
Readers should have knowledge of basic programming concepts, algorithms, and data structures. Additionally, we highly recommend knowledge of object-oriented concepts. Assuming a 4-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.