A Philosophy of Software Design John Ousterhout

This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first introduces the fundamental problem in software design, which is managing complexity. It then discusses philosophical issues about how to approach the software design process, and it presents a collection of design principles to apply during software design. The book also introduces a set of red flags that identify design problems.

You can apply the ideas in this book to minimize the complexity of large software systems, so that you can write software more quickly and cheaply.

**Agile Application Security: Enabling Security in a Continuous Delivery Pipeline** Laura Bell, Michael Brunton-Spall, Rich Smith, Jim Bird

Agile continues to be the most adopted software development methodology among organizations worldwide, but it generally hasn't integrated well with traditional security management techniques. And most security professionals aren’t up to speed in their understanding and experience of agile development. To help bridge the divide between these two worlds, this practical guide introduces several security tools and techniques adapted specifically to integrate with agile development.

Written by security experts and agile veterans, this book begins by introducing security principles to agile practitioners, and agile principles to security practitioners. The authors also reveal problems they encountered in their own experiences with agile security, and how they worked to solve them.

**Building Evolutionary Architectures: Support Constant Change ***Neal Ford, Rebecca Parsons. Patrick Kua*

The software development ecosystem is constantly changing, providing a constant stream of new tools, frameworks, techniques, and paradigms. Over the past few years, incremental developments in core engineering practices for software development have created the foundations for rethinking how architecture changes over time, along with ways to protect important architectural characteristics as it evolves. This practical guide ties those parts together with a new way to think about architecture and time.

Building Microservices: Designing Fine-Grained Systems (2nd Edition) Sam Newman

Distributed systems have become more fine-grained in the past 10 years, shifting from code-heavy monolithic applications to smaller, self-contained microservices. But developing these systems brings its own set of headaches. With lots of examples and practical advice, the second edition of this practical book takes a holistic view of the topics that system architects and administrators must consider when building, managing, and evolving microservice architectures.

Microservice technologies are moving quickly, and this revised edition gets you up to date with a new chapter on serverless and cloud-native applications, expanded coverage of user interfaces, more hands-on code examples, and other additions throughout the book.

Author Sam Newman provides you with a firm grounding in the concepts while diving into current solutions for modeling, integrating, testing, deploying, and monitoring your own autonomous services. You’ll follow a fictional company throughout the book to learn how building a microservice architecture affects a single domain

**Building Secure & Reliable Systems [FREE!]** Google SRE Team

Can a system be considered truly reliable if it isn't fundamentally secure? Or can it be considered secure if it's unreliable? Security is crucial to the design and operation of scalable systems in production, as it plays an important part in product quality, performance, and availability. In this book, experts from Google share best practices to help your organization design scalable and reliable systems that are fundamentally secure.

Two previous O'Reilly books from Google--Site Reliability Engineering and The Site Reliability Workbook--demonstrated how and why a commitment to the entire service lifecycle enables organizations to successfully build, deploy, monitor, and maintain software systems. In this latest guide, the authors offer insights into system design, implementation, and maintenance from practitioners who specialize in security and reliability. They also discuss how building and adopting their recommended best practices requires a culture that's supportive of such change.

**Continuous Delivery: Reliable Software Releases Through Build, Test, and Deployment Automation** *Jez Humble, David Farley*

A groundbreaking book that sets out the principles and technical practices that enable rapid, incremental delivery of high quality, valuable new functionality to users. Through automation of the build, deployment, and testing process, and improved collaboration between developers, testers, and operations, delivery teams can get changes released in a matter of hours—sometimes even minutes—no matter what the size of a project or the complexity of its codebase.

This book presents the foundations of a rapid, reliable, low-risk delivery process. It covers deployment pipelines in detail and also discusses the ecosystem needed to support continuous delivery, from infrastructure, data and configuration management to governance.

<aside> 💡 The seminal book on Continuous Delivery. Highly worth a read.


**Design Patterns - Elements of Reusable Object-Oriented Software** *Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides*

The legendary "Gang of Four" presents a catalog of simple and succinct solutions to commonly occurring software design problems, regardless of language. Previously undocumented, these 23 patterns have allowed software engineers around the globe to create more flexible, elegant, and ultimately reusable software systems without having to rediscover these solutions themselves for many years.

<aside> 🥇 Probably one of the most successful software engineering books of all time. And for good reasons.


**Design It! From Programmer to Software Architect** Michael Keeling

Grounded by fundamentals and filled with practical design methods, this is the perfect introduction to software architecture for programmers who are ready to grow their design skills. Ask the right stakeholders the right questions, explore design options, share your design decisions, and facilitate collaborative workshops that are fast, effective, and fun. Become a better programmer, leader, and designer. Use your new skills to lead your team in implementing software with the right capabilities—and develop awesome software!

**DevOps Handbook: How to Create World-Class Agility, Reliability, and Security in Technology Organizations** *Gene Kim, Patrick Debois, John Willis, Jez Humble*

For decades, technology leaders have struggled to balance agility, reliability, and security. The consequences of failure have never been greater―whether it's the debacle, cardholder data breaches, or missing the boat with Big Data in the cloud.

And yet, high performers using DevOps principles, such as Google, Amazon, Facebook, Etsy, and Netflix, are routinely and reliably deploying code into production hundreds, or even thousands, of times per day. The DevOps Handbook shows leaders how to replicate these incredible outcomes, by showing how to integrate Product Management, Development, QA, IT Operations, and Information Security to elevate your company and win in the marketplace.

<aside> 💡 The perfect follow-on after reading *The Phoenix Project,* filled with practical **advice for how to build a DevOps culture.


**Domain-driven Design: Tackling Complexity in the Heart of Software** Eric Evans

This book provides a broad framework for making design decisions and a technical vocabulary for discussing domain design that brings software engineers and business owners closer together . It is a synthesis of widely accepted best practices along with the author’s own insights and experiences. Projects facing complex domains can use this framework to approach domain-driven design systematically. Many people have employed domain-driven design in some form, but it is so much more effective with a systematic approach and a shared vocabulary.

<aside> 💬 „This book belongs on the shelf of every thoughtful software developer.” Kent Beck