As a Software Engineer playing the role of developers, managers, tech leads, or architects (to cite some), one of the common and most important endeavors is to keep up with the latest technologies, methodologies, patterns, practices, frameworks/libraries among others. While for some specific purposes as learning how to use a technology or become proficient in a framework can be faster and interactive by taking an online course, the level of depth and detail is still not as profound as reading a good book.
Books are especially good when it comes to subjects related to design, architecture, or in-depth learning of a programming language or technology, and that's where I put my focus on this post. This is not by any means a closed and ultimate list, I’m sure several titles are missing, so please, don’t hesitate to add your suggestions in the comments below or the social channels. Without any more delays, let’s begin!.
Books about Software Design and Architecture
Design Patterns: Elements of Reusable Object-Oriented Software
I’ll start the list with one of the most iconic books in Software Engineering. It’s hard to find a book of Software — having now (2021), more than 20 years — that keeps so relevant today and that revolutionized the way we design software by the OOP paradigm.
I still feel surprised every time I come back to this book and see that the essence of how we design software hasn’t changed, despite the many programming languages and technologies that come and go, besides how much our computers have hundreds of thousands more processing power. In the end, building Software is a human action.
Design patterns are a building block in every good Software Architecture, and this book will teach you the most important in the categories: Creational, Behavioral and Structural.
Fundamentals of Software Architecture
This is a great book for those who are starting in a role of a Software Architect or pursuing one soon. It sets the theoretical foundations of what is Software Architecture, Architecture styles, patterns, and architecture characteristics (aka non-functional characteristics).
It begins by setting the expectations of the role of an architect in a company and explaining that Software Architecture is not a discipline well defined and standardized as in other engineering fields, but rather defined as common agreements between well-known authorities, institutions, and companies that invests in research and development in this subjects. Something I'd say can be extended to Software Engineering in general.
The book continues with an overview of the different architecture styles, including monolithic styles like microkernel, n-layer, or pipeline, and distributed styles as Service-oriented, Micro-services, Event-based, among others. Making a trade-off analysis on each one to help the reader choose the better fit for the design of a new project.
The last part is all about soft skills, which covers how to make architecture decisions and effectively communicate such decisions to management, stakeholders, and any interested in those. It also covers risk analysis, diagramming and presentation, negotiation, and leadership, all of them very important skills, especially for an architect role.
Patterns of Enterprise Application Architecture
A book by one of the most outstanding mentors in Software Development: Martin Fowler.
I consider this book as a reference manual of Enterprise Patterns, a useful source to go when you need to solve an architecture problem.
Although the focus is on enterprise applications, many of the principles and patterns apply to any kind of large-scale software application.
Designing Data-Intensive Applications
A very few books in Software Engineering are (in my personal opinion) as outstanding as this one. One of the things that makes this book apart from others is the fact that the author, Martin Kleppman is an engineer who works in research and development in addition to be a lecturer in a recognized university (University of Cambridge) and we can notice that in the detailed work he put in every chapter to bring the elements from computer science and applied engineering in the process of designing large scale data systems, in a perfect intersection of science and engineering.
The book is divided into three parts:
- Foundations of Data Systems: It studies the core concepts of scalability, reliability, and maintainability, following by the data models, query languages, and storage mechanisms present in relational and non-relational (NoSQL) database engines.
- Distributed Data: Deals with some techniques to build data systems that are built with distributed systems, such as replication, partitioning, transactions, and the problems that come with it, not present in contrast, with monolithic systems.
- Derived Data: The last part is about the techniques used to process data from primary sources. Those include batch processing and stream processing, present in large-scale distributed systems and technologies.
Through its 21 chapters, the author has compiled the interviews, publications in papers, other books, notorious blog posts from authorities in the field, and publications made from the leaders in large companies that have solved the most challenging problems in distributed systems. This one should be a must on your bookshelf!.
Agile Software Development, Principles, Patterns and Practices
This is another excellent Design Patterns book. It covers the Patterns but also another range of topics from the Agile methodology and Object-Oriented Design Principles, like those that the author, Robert C. Martin coined as SOLID.
Don’t Make Me Think: A Common Sense Approach to Web Usability
Another book that is not about programming, but about software design. Many front-end or full-stack developers focus on the logic and visual styles of a program but often miss one of the most critical components: the user. This book is about User Experience (UX) and user interfaces (UI).
Through a series of principles of intuitive navigations and information design, the author, Steve Krug teaches us the right way to make a user interface clear and easy to use. A real classic anyone who works on web design should read.
Books about Writing Code and Algorithms
This is the second book in the Robert C. Martin series and is considered by the author as a “prequel” to “Agile Software Development, Principles, Patterns and Practices,” following the work is done from Object Mentor.
This book is full of principles and best practices that are timeless and mostly language-independent. It’s a great aid to understand how to write or refactor code to favor quality and readability working in an Agile methodology, as we write programs that other people or even ourselves need to read in the future, the code should be self-explaining.
Clean Architecture: A Craftsman’s Guide to Software Structure and Design
This book is the third in the Robert C. Martin Craftsman’s Guide. It starts by reviewing the main Software Development paradigms that have been with us since the beginning of programming and as he explains, haven’t changed since:
- Functional programming imposes discipline upon assignment.
- Structured programming imposes discipline on direct transfer of control.
- Object Oriented programming imposes discipline on indirect transfer of control.
The book then continues to present the Design Principles to Software Architecture (as you read from this book, Design and Architecture in Software are nothing but the same thing). If you consider taking up Architecture seriously, you really should read this book!.
Introduction to Algorithms
A genuine classic in Computer Science, used by many colleges or universities around the world to learn about Algorithms and Data Structures. You can’t skip this area of Software Engineering, it’s just the building blocks of any computer program ever ran.
For a student is one of the best ways to start learning about algorithms, the growth order of a function, probabilistic analysis, and other formal topics. And for professionals, is an excellent reference to come back every time you need to refresh these concepts, including:
- Foundations: Growth of Function, probabilistic analysis- Sorting and Order Statistics: Heapsort, Quicksort.
- Data Structures: Elementary data structures, hash tables, binary search trees.
- Advanced Design and Analysis Techniques: Dynamic Programming, Greedy Algorithms.
- Advance Data Structures: B-Trees, Fibonacci heap.
- Graph Algorithms: Elementary graph algorithms, Minimum spanning trees.
Books about career building/Entrepreneurship
Cracking the Coding Interview: 150 Programming Questions and Solutions
As a software professional nowadays (or a just graduated) chances are you’ll leave your current company in pursuit of better challenges or benefits, at least once (I recommend you do, every company has its own culture, methodologies, and projects, the best is to expand your vision and find your way, don’t stay with the first impression). Being that the case, this book is essential.
Every time you go to a work interview in a Software company, you’ll have to make one or more programming tests to prove your knowledge, skills, and aptitude for the job. This book gives you all the tools you need to get a software developer job with practical advice on how to write a resume, answer behavioral questions, and of course 150 programming interview questions and answers.
The Lean Startup: How Today’s Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses
This is not a programming book; however, the Lean Startup methodology has a lot in common on how a Software project is done. His author, Eric Ries is a Software Engineer who created this method to start a new web game (IMVU) trying something different to face the extreme uncertainty of starting a new company.
Applying the knowledge from the LEAN methodology (created at Toyota), the scientific method, and agile methodologies like Scrum, Ries comes with a revolutionizing method for entrepreneurs to build new businesses.
Thank you so much for reading this post. Take care and talk to you again about more Software Engineering topics. Cheers!.