Book cover
All rights reserved. Version for personal use only.
This web version is subjected to minor edits. To report errors or typos, use this form.

Home | Dark Mode | Cite

Software Engineering: A Modern Approach

Marco Tulio Valente


This book is an English translation of a work we initially published at the beginning of 2020. Originally 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 was a considerable success, far beyond our expectations. It is adopted in numerous Brazilian universities of various sizes, types, and from different states across the country. While it’s challenging to estimate such figures, we have indications that over 400 Brazilian 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 the end of 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 is still 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 consult the original preface, which we reproduce in the following pages.


The book has an open version, available at

To report any errors, inconsistencies, or typos please use this form (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 took the course during my undergraduate studies more than 25 years ago.

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 such a topic, which corresponds to such a 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 more than 600 slides with the core material for an undergraduate course in Software Engineering, specifically for degrees 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 manuscript.

Thus, I had the idea to transform the slides into a book that could fulfill the role of the textbook of my dreams. Of course, 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 largely used in software engineering today.

  • But the book also covers traditional techniques and principles. The reason is that we believe it’s important to know the history of the field, highlighting what did and what didn’t work. This perspective is relevant for the students’ training in our opinion.

  • The book includes numerous examples and discussions of real cases. For this, we created the Real World section, where topics are illustrated with recent and interesting examples, from large software companies and from the scientific literature.

  • The book was written in Portuguese, as our aim is primarily 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 programming language. For instance, most code examples are presented in Java, but using a neutral syntax and without making use of sophisticated or Java-specific resources.

  • It is not an endless 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 of real systems.

  • During the writing, we attempted to follow what we emphasize in the book. 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, I believe it’s risky in today’s times to spend years writing a manuscript locked in my office before making it public.


This book is intended for undergraduate students. It was created for use in curricula that have a single 60-hour Software Engineering course. However, in conjunction with other books, it can be used in degrees with two or more classes in the field.

It can also be used in technical and technological degrees. Indeed, we tried to use clear language, close to colloquial language, 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 on modern Software Engineering topics.


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, students should be in the second half to best benefit from our book.

Marco Tulio Valente

Belo Horizonte, February 10, 2020.


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 more than 150 scientific papers and has supervised over 30 master’s dissertations and 15 doctoral theses.


I would like to thank the more than 30 students who have been part of the ASERG research group in the last decade. A substantial part of the book’s content has its origin in the work of our group. I would like to thank professors Eduardo Figueiredo and André Hora, my colleagues at DCC/UFMG, who reviewed some chapters of the book. And 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. My thanks also go 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. Finally, to Osvaldo and Cynthia Valente, for proofreading parts of the manuscript.