Curated Tech Reading Map

Find your next tech book to read

Domain

Software Design

A systematic learning path for software design — from clean code to architecture, testing, and quality culture. Covers code quality, TDD, DDD, distributed system design, and DevOps/quality organization.

The Terrain of This Field

The terrain of software design can be read as a single ascending path: it begins at "readable code" under your feet, rises through the habits that preserve quality (refactoring and test-driven development), and continues up to the highlands of "architecture" that overlook the whole system.

The first continent is the realm of "code quality" — variable names, functions, and responsibilities at the micro scale. Beyond it spread the hills of "testing and refactoring" for growing code without breaking it, and further on rise the mountain ranges of "clean architecture" and "domain-driven design," where you design the direction of dependencies and the boundaries between modules.

Deeper still lie the plateaus of "scale and operations" — distributed systems, data-intensive design, and DevOps/quality organizations. The key to surveying this field is recognizing that the scale of concerns connects continuously, from the micro (code) to the macro (organization and operations).

Follow the arrows to read in order / solid = required, dashed = recommended

Share this map

Difficulty

Beginner
Intermediate
Advanced

Dependencies

Prerequisite
Recommended
Related

Computing layout...

Books in this domain

Difficulty
Reading status
Tags

33 books

Dependencies

  1. 01The DevOps ハンドブックGoogleのソフトウェアエンジニアリングRecommended / DevOps文化から大規模組織文化へ

    Reason: After learning DevOps culture and practices in 'The DevOps Handbook', move to a concrete example of how a hyperscale organization operates them over the long term. 'Software Engineering at Google' frames engineering as 'programming integrated over time', offering insight into large-scale, long-lived engineering culture as a cross-domain bridge.

  2. 02Testing JavaScript ApplicationsフルスタックテスティングRelated / JS テスト戦略からフルスタック品質戦略へ

    Reason: Once you've established a JavaScript testing strategy, you broaden your view beyond the frontend to whole-system quality optimization including CI/CD. Full Stack Testing provides a quality strategy spanning contract, performance, security, and E2E, positioning testing as part of development culture.

  3. 03マイクロフロントエンドマイクロサービスアーキテクチャRelated / FE分散からBE分散の対応概念へ

    Reason: Grasp the idea of splitting the frontend into independent parts, and you notice it shares the same roots as backend microservices. Building Microservices provides the server-side framework of boundaries, autonomous deployment, and alignment with organization, letting you understand the principles of decomposition from both sides.

  4. 04Clean CodeリファクタリングRecommended / コード品質からリファクタリングへ

    Reason: Once you know what good code looks like, you need techniques to safely move existing code toward that standard. Refactoring offers a systematic way to improve structure without changing behavior, guided by code smells.

  5. 05Clean Codeテスト駆動開発Recommended / コード品質からTDDへ

    Reason: To keep writing clean code, you need a foundation that lets you change it without fear. Test-driven development instills the discipline of growing clean, working code in small cycles, turning quality into a habit.

  6. 06Clean CodeClean ArchitectureRecommended / コード品質からアーキテクチャへ

    Reason: Once quality at the function and class level is second nature, the next step is to design the direction of dependencies and boundaries across the whole system. Clean Architecture provides the principle of pushing details outward and keeping business rules at the core.

  7. Reason: After grasping patterns intuitively through illustrations and examples, you solidify the vocabulary with the original text, where intent, applicability, and consequences are rigorously defined. The Gang of Four codifies patterns into a shared design language that grounds discussion.

  8. 08テスト駆動開発単体テストの考え方/使い方Recommended / TDD基礎からテスト設計原則へ

    Reason: Once the small TDD cycle makes writing working tests second nature, you advance to principles of what and at what granularity to test. Good tests are resistant to refactoring, do not get in its way, and reliably catch regressions.

  9. 09テスト駆動開発実践テスト駆動開発Recommended / TDD基礎から高度なTDDへ

    Reason: After getting comfortable with unit-level TDD, you move to outside-in TDD—driving from acceptance tests down to units—to design the collaboration between objects itself. Mocks become a tool for expressing collaboration, not just a stand-in for implementations.

  10. 10リファクタリングレガシーコード改善ガイドRecommended / リファクタリングからレガシーコード改善へ

    Reason: Once safe refactoring moves are in hand, you take on the hardest case: legacy code without tests. You first find seams to break dependencies, cover them with tests as a safety net, and only then improve the structure.

  11. 11Clean Architectureソフトウェアアーキテクチャの基礎(第2版)Recommended / アーキテクチャ原則から体系的学習へ

    Reason: After gaining an intuition for the ideal shape from Clean Architecture, you formalize architectural characteristics and trade-offs into a shared vocabulary. This book elevates design judgment from personal instinct to a discipline you can reason about.

  12. 12Clean Architectureドメイン駆動設計をはじめようRecommended / アーキテクチャからDDD入門へ

    Reason: Once you can control the direction of dependencies, the next question becomes where to draw the boundaries. Domain-Driven Design derives bounded contexts from the language of the business, giving architectural decomposition real meaning.

  13. Reason: Once you have a vocabulary of architectural characteristics and trade-offs, you apply that judgment to the concrete case of distributed systems. Microservices demand a design that deliberately breaks coupling in exchange for independent deployment and autonomy.

  14. Reason: After grasping the fundamental characteristics, you advance to trade-off analysis in the hard parts that have no single right answer—service granularity, data ownership, distributed transactions. The same authors show not the answer but how to decide.

  15. 15ソフトウェアアーキテクチャの基礎(第2版)進化的アーキテクチャRecommended / 基礎から進化的アーキテクチャへ

    Reason: After learning static architectural decisions, you widen your view to designs that keep adapting to change. You gain the idea of using fitness functions to continuously verify architectural characteristics, making evolution measurable.

  16. Reason: After mapping the strategic and tactical landscape with an introductory text, you verify the origin and precise definitions of the concepts in the source. Evans' DDD grounds the ubiquitous language and model-driven design, forming the foundation for applied judgment.

  17. 17マイクロサービスアーキテクチャモノリスからマイクロサービスへRecommended / マイクロサービス基礎から移行戦略へ

    Reason: Once you understand microservice principles, you advance to realistic strategies for migrating from an existing monolith. Most successes peel services off a monolith incrementally, so you also learn when not to distribute from the start.

  18. Reason: Once you split services, the next hard problem becomes the distribution, consistency, and reliability of data. DDIA systematically provides the foundational theory and trade-offs of distributed data systems—replication, partitioning, and transactions.

  19. 19単体テストの考え方/使い方レガシーコード改善ガイドRelated / テスト設計からレガシー改善へ

    Reason: After grasping the principles of good tests, you apply them to legacy code that resists testing. You introduce seams to break dependencies and pin current behavior with characterization tests before changing it safely.

  20. 20単体テストの考え方/使い方実践テスト駆動開発Related / テスト原則から高度なTDDへ

    Reason: Once you can judge the quality of an individual test, you extend to a design approach that grows object responsibilities and collaboration through tests. Choosing the right test double becomes feedback on the design itself.

  21. 21Clean ArchitectureA Philosophy of Software Design, 2nd EditionRecommended / アーキテクチャから複雑性管理の哲学へ

    Reason: Once you have the principles of dependencies and boundaries, you descend to the universal question beneath them: how to contain complexity. Ousterhout systematizes complexity management through the lens of deep modules and information hiding.

  22. 22リファクタリングA Philosophy of Software Design, 2nd EditionRelated / リファクタリングから設計哲学へ

    Reason: Once you have tactical means of improvement, you raise your view to the strategic question of why—the nature of complexity itself. A new criterion enters your refactoring decisions: does this actually reduce complexity?

  23. 23単体テストの考え方/使い方Effective Software TestingRecommended / テスト原則から設計技法へ

    Reason: After grasping the qualities of good tests—protection against regressions, resistance to refactoring, fast feedback—you raise the question of what to test with systematic techniques like boundary analysis, equivalence partitioning, and structural testing. Case selection moves from intuition to engineering.

  24. 24Effective Software Testing実践プロパティベーステストRecommended / テスト設計技法から不変条件検証へ

    Reason: Once example-based testing techniques are in hand, you advance to property-based testing, which generates inputs broadly and verifies invariants. You let the machine find counterexamples a human would miss and expose gaps in the spec.

  25. 25単体テストの考え方/使い方フルスタックテスティングRecommended / 単体テストからフルスタック品質戦略へ

    Reason: Once unit tests form a solid base, you stack integration, contract, and end-to-end tests in the right proportions along the test pyramid, scaling up to a system-wide quality strategy. The rule is many at the bottom, few at the top.

  26. 26フルスタックテスティングLeanとDevOpsの科学[Accelerate]Recommended / CI/CD戦略からDORAメトリクスへ

    Reason: Once testing and CI/CD give you a foundation for building in quality, you frame how it affects organizational delivery performance through measurement. DORA's four key metrics show empirically that speed and stability are not a trade-off.

  27. 27LeanとDevOpsの科学[Accelerate]GoogleのソフトウェアエンジニアリングRecommended / DevOps科学から大規模組織文化へ

    Reason: Once you can improve delivery performance through measurement, you widen your view to the engineering culture and practices that sustain it at scale and over time. Google frames this as 'programming integrated over time.'

  28. 28GoogleのソフトウェアエンジニアリングLEADING QUALITYRecommended / 組織文化から品質リーダーへ

    Reason: After understanding the engineering practices of large organizations, you advance to a leadership view that raises quality from individual effort to a culture the organization cultivates. Quality becomes a strategic concern of management.

  29. 29フルスタックテスティングLEADING QUALITYRelated / フルスタック品質から組織文化へ

    Reason: Once you have a technical quality strategy in hand, you widen your view to how to embed it at the team and organizational level. The subject shifts from the quantity and kinds of tests to decision-making and culture around quality.

  30. 30Clean ArchitectureチームトポロジーRecommended / アーキテクチャからチーム設計へ

    Reason: Once you can design technical boundaries, you widen your view to the fact that those boundaries and team structure shape each other—Conway's Law. Architecture is not only a code problem but an organizational one.

  31. 31チームトポロジーエリック・エヴァンスのドメイン駆動設計Recommended / チーム編成からドメインモデルへ

    Reason: After designing team boundaries for fast flow, you back those boundaries with the language of the business domain. A bounded context defines the outline of both the team and the model at once.

  32. 32モノリスからマイクロサービスへチームトポロジーRecommended / モノリス分割からチーム境界へ

    Reason: As you carve out services, the question becomes whether the unit of decomposition matches the cognitive load of a team. The inverse Conway maneuver reorganizes teams to fit the architecture you want.

  33. Reason: Once you have the idea of guiding evolution with fitness functions, you advance to concrete analysis of the hard parts of distributed architecture—granularity, data ownership, and communication trade-offs—from the same authors.

  34. 34実践テスト駆動開発Effective Software TestingRecommended / 高度なTDD実践からテスト設計技法へ

    Reason: After practicing how to grow design through tests, you raise the sufficiency of the test cases themselves with systematic techniques. You turn both wheels—good design and thorough cases—to reduce gaps in testing.

  35. Reason: Once you have universal principles for containing complexity, you apply them specifically to the complexity of the domain. DDD tames the essential complexity inherent in the business through a model and a ubiquitous language.

  36. 36Clean Codeエリック・エヴァンスのドメイン駆動設計Recommended / コード品質からドメインモデリングへ

    Reason: Once you have quality standards at the code level, you point that expressiveness toward the language of the domain. Meaningful names become a ubiquitous language that bridges business and code, making the model speakable in code.

  37. 37Clean ArchitectureマイクロサービスアーキテクチャRecommended / アーキテクチャ原則から分散実装へ

    Reason: The principles of dependency direction and boundaries apply directly to designing service boundaries. You connect them to concrete decisions that map bounded responsibilities onto independently deployable units.

  38. Reason: The principles of test design carry over to the frontend. Building on the test pyramid, you cover the essentials of the UI with a few end-to-end tests and protect logic densely with unit tests—the criteria stay the same across layers.

  39. 39リーダブルコードClean CodeRecommended / 可読性入門からコード品質体系へ

    Reason: After grasping the basics of readability such as naming and function decomposition, you move on to binding them into principles of why. Clean Code connects individual techniques into a coherent system of craftsmanship and design principles.

  40. 40リーダブルコード達人プログラマーRecommended / 可読性入門から達人哲学へ

    Reason: Once you have the concrete techniques of readability such as naming and formatting, you widen your view to the professional philosophy that runs through daily decisions—DRY, orthogonality, and a stance toward change. The Pragmatic Programmer binds individual techniques into an attitude of why.

  41. 41リーダブルコードリファクタリングRelated / 可読性入門からリファクタリングへ

    Reason: Once you know what readable code looks like, you need techniques to move existing code toward that shape without breaking it. Refactoring offers a step-by-step way to improve structure in small moves without changing behavior, guided by code smells.

  42. 42達人プログラマーClean CodeRecommended / 達人哲学からコード品質原則へ

    Reason: After adopting the pragmatic mindset of keeping code healthy, you ground those attitudes in concrete quality standards at the function and class level. Clean Code systematizes what good code is through principles and worked examples.

  43. 43達人プログラマーリファクタリングRelated / 達人哲学からリファクタリングへ

    Reason: Refactoring is how the pragmatic discipline of not living with broken windows is applied to real code. It turns 'spot the decay, fix it now' into a habit of small, behavior-preserving improvements.

  44. 44Clean Architectureエンタープライズ アプリケーションアーキテクチャパターンRecommended / クリーンアーキテクチャから PoEAA 原典へ

    Reason: Once you have the principles of layering and dependency direction, you advance to the source of the canonical patterns that implement them—Repository, Service Layer, Domain Model. Mapping principles to patterns deepens your design vocabulary.

  45. Reason: After mastering enterprise patterns that assume a single database, you widen your view to consistency, replication, and partitioning of data spread across many nodes. The assumptions of scale change.

  46. Reason: After learning general-purpose object patterns, you advance to patterns that address enterprise-specific contexts—layering, persistence, and distribution. Fowler's PoEAA supplies that vocabulary, such as Repository and Domain Model.

  47. 47Head FirstデザインパターンリファクタリングRelated / パターン認識からリファクタリング技法へ

    Reason: Once you can recognize patterns, techniques for safely moving existing code toward the pattern it wants to be become valuable. Refactoring lets you introduce patterns not in one leap but as a sequence of incremental, safe transformations.

  48. 48実践プロパティベーステストフルスタックテスティングRelated / 性質ベーステストからフルスタック品質戦略へ

    Reason: Once you can verify invariants, you place that skill within a quality strategy spanning unit, integration, and end-to-end. You design what property each layer guarantees, giving the whole pyramid coherence.

  49. 49エリック・エヴァンスのドメイン駆動設計データ指向プログラミングRelated / DDD の永続化を不変データ駆動で再考する

    Reason: After learning to express a domain model with objects, you encounter the contrasting data-oriented idea of separating code from data and taming complexity with immutable data, relativizing the assumptions of your design.

  50. 50A Philosophy of Software Design, 2nd Editionデータ指向プログラミングRelated / 複雑性管理の異なるアプローチとしてデータ指向へ

    Reason: Once you have general principles for managing complexity, you examine data-oriented programming as one concrete prescription—separating data from behavior and embracing immutability. The same goal admits different paths.

  51. 51Head Firstデザインパターンレガシーコード改善ガイドRelated / パターン認識からレガシーコード改善へ

    Reason: When you can read the structure of existing code through the lens of patterns, you can move on to building a safe foothold in untested legacy code—finding seams, covering them with tests, and improving the design from there.

  52. 52オブジェクト指向における再利用のためのデザインパターンClean ArchitectureRelated / GoFパターン原典からアーキテクチャ原則へ

    Reason: After acquiring a vocabulary of class- and object-level patterns, you widen your view to governing the direction of dependencies and boundaries across the whole system. Clean Architecture pushes details outward and keeps business rules at the center.

  53. 53ドメイン駆動設計をはじめようチームトポロジーRecommended / DDD境界からチーム編成設計へ

    Reason: Once you can draw bounded contexts, you map those boundaries onto team structure. Aligning contexts with teams lowers cognitive load and speeds the flow of value.

  54. 54ソフトウェアアーキテクチャ・ハードパーツデータ指向アプリケーションデザインRecommended / 難しい設計判断から分散データシステムへ

    Reason: When the hard parts of distributed architecture force decisions about decomposing data, you descend to the underlying theory of distributed data. The principles of consistency, replication, and storage engines become the grounds for your design decisions.

  55. 55Googleのソフトウェアエンジニアリング生成AI時代のソフトウェア開発Recommended / Googleの開発実践からAI駆動開発へ

    Reason: After understanding the engineering practices of large organizations, you view how generative AI changes the flow of development with the same discipline. AI is a tool that pays off only on a foundation of review, testing, and design judgment.

  56. 56達人プログラマー生成AI時代のソフトウェア開発Recommended / プラクティカル開発からAIツール活用へ

    Reason: Once you have the pragmatic mindset—sharpen your tools, own your judgment—you take in generative AI as a new tool. The ability to verify AI output rather than trust it blindly is the very craftsmanship of the AI era.

  57. Reason: Once you can bring AI into development, you advance to the question of responsibility—the impact that power has on society. You take a view that weaves correctness, bias, and accountability of outputs into design from the start.

  58. 58Building Secure and Reliable Systems責任あるソフトウェアエンジニアリングRecommended / 安全・信頼性から社会的責任へ

    Reason: Once you can build security and reliability into a system's design, you extend that reach to responsibility toward users and society. Technical robustness becomes the foundation for fulfilling ethical and social responsibility.

Explore next

Connected fields