• Analyze

    Find issues, risks and technical debt in the system and its organization, and understand their root causes.

    32 patterns

  • Evaluate

    Make issues and remedies comparable by estimating their value, cost and risk, then prioritize.

    4 patterns

  • Improve

    Apply approaches and practices that eliminate issues, reduce technical debt and optimize quality.

    48 patterns

  • Cross-cutting

    Practices that span all phases and keep issues and improvements visible, understood and aligned.

    20 patterns

104 patterns and practices, of which 37 are stubs waiting for contributors. New here? Read the introduction first.

All patterns, A–Z

  • Anticorruption Layer Improve

    An anticorruption layer is a logical layer that provides a stable interface to (potentially) volatile software components. As long as this interface remains untouched developers can implement changes or even replace their own or third-party software without affecting the clients of this interface.

  • Architectural Understanding Cross-cutting

    Document relevant structures, concepts, decisions, interfaces etc. of the system to locate issues, risks and opportunities for improvement.

  • Architecture Backlog stub Improve

    Keep a prioritized list of improvement tasks (remedies) with their as a backlog, parallel to the (regular) feature backlog.

  • Assertions stub Improve

    Use assertions to verify preconditions and to make a program fail early when something goes fundamentally wrong.

  • ATAM Analyze

    Apply the ATAM method to evaluate the software architecture regarding its compliance with quality goals.

  • Automated Tests stub Improve

    Introduce automated tests to verify correctness or runtime behavior. Unit-, integration-, acceptance-, load- or database-tests are well-known specialisations of this.

  • Big Bang Approach Improve

    Approach to replace an old system with a new system with one big bang deployment.

  • Branch for Improvement stub Improve

    Introduce distinct branches in your version control system to reflect improvements.

  • Bulkhead stub Improve

    Can be placed between two systems to avoid the propagation of faults from one system to the other system ([Nygard07], p. 119ff.).

  • Bus Factor Analyze

    Improve the structure of a system or its documentation so that the organisation is not at risk if certain key people leave.

  • Butterfly Methodology Improve

    Data migration method without the need of gateways. Enables zero-downtime migrations by working with temporary data stores.

  • Capture Quality Requirements Analyze

    Make the specific quality requirements of a system explicit.

  • Change by Copy stub Improve

    Isolate competing change necessity by copying and allowing the copies to evolve independently. Also known as Change via Split.

  • Change by Extension stub Improve

    Enable efficient change by creating new components instead of modifying existing ones.

  • Change-by-Abstraction Refactoring Improve

    Incrementally replace part of the system with a new implementation.

  • Change-by-Split Approach Improve

    Maintain and evolve a few smaller systems, instead of one big monolith. Reduce time-to-market, work in smaller teams that individually become more focussed.

  • Chicken-Little Approach Improve

    Software-Migration with incremental steps to avoid or reduce the risks coming along with the Big Bang approach.

  • Collect Issues Cross-cutting

    Keep a list of problems, issues and risks. Regularly match those to your collection of possible remedies.

  • Collect Opportunities for Improvement Cross-cutting

    Keep a list of possible and potential measures, remedies, tactics, strategies for improvements. Regularly match those to your collection of issues.

  • Composite Database Approach Improve

    Combination of Database-First and Database-Last. Beside a forward- and reverse-gateway, there is a need for a transaction-coordinator.

  • Context Analysis Analyze

    Analyse external interfaces for risk, technology, business value and other factors.

  • Data Analysis Analyze

    Analyze and inspect the data created and manipulated by the system for its content, structure, quantity and size.

  • Database First Approach Improve

    Do a Big-Bang migration of the database, incrementally implement new applications and interfaces and connect the legacy system to the new database by forward gateways.

  • Database Last Approach Improve

    Keep the existing database for a limited time, incrementally implement new applications and interfaces and connect them to the legacy database by reverse gateways.

  • Debugging Analyze

    Identify the source of an error (bug) or misbehavior by observing the flow of execution of a program in detail.

  • Deprecate Obsolete Parts stub Improve

    Actively mark parts in software that aren’t needed anymore and communicate to your consumers or customers, that you will remove specific functionality in the future.

  • Development Process Analysis Analyze

    Analyse and inspect the development process (as documented or described by stakeholders) for appropriateness, problems or problem-areas.

  • Docs-as-Code Improve

    Docs-As-Code is a documentation approach that raises developer-related documentation to the same importance as source code.

  • Document Problems stub Cross-cutting

    See Improvement Backlog.

  • Documentation Analysis Analyze

    Analyse existing documentation for availability, correctness, actuality, problems or problem-areas.

  • Estimate Feature Value Evaluate

    Estimate the (monetary) value of a given feature, so you can compare features of the system with each other.

  • Estimate Improvement Cost Evaluate

    Determine how much a specific improvement (a set of actions taken to eliminate or reduce a specific issue or problem) is likely to cost (in money and/or effort).

  • Estimate in Interval Evaluate

    Estimate in intervals, giving lower and upper bounds.

  • Estimate Issue Cost Evaluate

    Find out how much a given issue costs in units of money or effort in a period or for every occurrence.

  • Expect Denial Cross-cutting

    Some people will oppose your findings, will whitewash or sugarcoat issues, problems or root causes. Regardless on how careful you prepared your analysis, they will try to diminish or attack your findings.

  • Explicit Assumption Cross-cutting

    Compensate missing facts (especially requirements, goals, estimates, opinions) by explicit (usually written) assumptions about those facts.

  • Extract Reusable Component stub Improve

    Extract code from an existing system to create a reusable component. See [SERIOUS-Refactoring], page 95.

  • Fail Fast Cross-cutting

    Identify quality issues as early as possible and aim to fix them.

  • Fast Feedback Cross-cutting

    Evaluate the quality of work artifacts and processes as early as possible. Enables teams to apply corrective actions or take countermeasures as early as possible.

  • Front-End Switch stub Improve

    Route front-end requests to either new or old backend systems, depending on their nature, content-negotiation or other request criteria. This is especially helpful to support Never Change Running System.

  • Goals and Constraints Cross-cutting

    Make the overall goals and constraints of the improvement efforts understandable to every stakeholder.

  • Group Improvement Actions stub Improve

    Collect several improvement actions, which can or shall be applied or implemented together.

  • Handle If-Else Chains stub Improve

    Refactor nested if-then-else structures for improved understandability. Can be seen as a specialisation of Remove Nested Control Structures.

  • Hierarchical Quality Model Analyze

    Decompose the overall goal of “high quality” into more detailed and precise requirements, finally resulting in a tree-like structure. See ATAM and [Quality-Requirements].

  • Impact Analysis Cross-cutting

    Determine what impact (in code, concepts, data and the organization) a specific action or issue (e.g. refactoring, recurring problem) will or might have. Identify the resultant effects on system development and operations.

  • Improve Code Layout stub Improve

    Making code easier to read results in better understandability.

  • Improve Feedback from and for Stakeholders Improve

    Effectively collect feedback from various stakeholders.

  • Improve Logging Improve

    Employ sophisticated logging mechanisms such as modern logging frameworks, distributed log collection and visualization tools in order to gain more detailed information about the system during runtime with a minimal or predictable performance impact.

  • Improvement Backlog Cross-cutting

    Collect all known issues and problems within a system or its associated processes, and make them comparable by evaluating each one.

  • Infrastructure Analysis Analyze

    Analyze the technical infrastructure of the system, e.g. with respect to time and resource consumption or creation. Part of Runtime Analysis.

  • Instrument System Analyze

    Find out how the system is really used and what the runtime relationships are, as well as other facts that can not be easily determined by Static Code Analysis even in situation where the system under design is largely undocumented and the architecture work thus mostly relies on assumptions, interviews and lore.

  • Interface Segregation Principle Improve

    Reduce coupling between clients and service providers.

  • Introduce Boy Scout Rule Improve

    Enable cross-cutting architectural improvement even if it is not feasible to change the whole codebase.

  • Introduce Layering stub Improve

    Introduce layers within the source code to improve separation of concern. It’s common to have at least a business layer and an interface layer - the latter for both user- and programmatic interfaces. See Uncle Bob’s Clean Architecture for a short summary.

  • Isolate Changes stub Improve

    Introduce interfaces and intra-system borders, so that changes cannot propagate to other areas.

  • Issue List Cross-cutting

    Collect all known issues and problems within a system or its associated processes. Make the issues comparable by evaluating each one, usually using economical units like money or time.

  • Issue Tracker Analysis Analyze

    Analyse entries from issue tracker to identify critical areas, components or stakeholders.

  • Keep Data, Toss Code stub Improve

    A strategy to improve systems, keeping the data created with the (old) systems as foundation for a new one. Also described as Bridge-to-the-New-Town (by Wolfgang Keller). This is the opposite of Never Change Running System.

  • Manage Complex Client Dependencies with Facade Improve

    Simplify the interaction of a client with a set of service components.

  • Measure Improve

    Gather various metrics and visualize them on dashboards in order to make your system behavior more predictable and assumed coincidences explainable.

  • Migrate Data stub Improve

    Transform existing data from one structure or representation into another by keeping its original intent or semantic intact.

  • Mikado Method stub Improve

    Coordinated refactoring effort, described in the Mikado-book.

  • Natural Death stub Improve

    Keep old system running and only retire it once all objects contained reach end of life according to their life cycle.

  • Never Change Running System stub Improve

    To minimize risks, you should try to refrain from changes to existing (working) code - as every change inevitably introduces new risks or even bugs.

  • Never Rewrite Running System stub Improve

    Joel Spolsky arguments, never to rewrite a system from scratch, as you will likely make many new mistake and won’t generate much added value.

  • Organizational Analysis Analyze

    Analyse and inspect organization(s) responsible for the system.

  • Outside-in Interfaces stub Improve

    Modularize system aligned to (existing) external interfaces.

  • Plan Improvements Cross-cutting

    Conduct long- and short-term planning of improvement activities. Balance or align issues and improvements, considering existing goals and constraints.

  • Pre-Interview Questionnaire Analyze

    Prior to interviewing stakeholders, present them with a written questionnaire, so they can reflect in advance.

  • Pre-Mortem Analyze

    Identify issues that could let become the current project a huge disaster.

  • Qualitative Analysis Analyze

    Analyze which quality goals of the system are at risk and which are met by the current implementation.

  • Quality-Driven Software Architecture stub Improve

    Derive (technical, structural or process-related) decisions based upon detailed quality requirements. QDSA requires explicit quality requirements.

  • Quantitative Analysis Analyze

    Measure artifacts or processes within the system, e.g. source code.

  • Questionnaire Analyze

    Support interviews with guidance and hints for appropriate questions.

  • Refactoring stub Improve

    Source code transformation that does not change functionality of system. See [Fowler-Refactoring].

  • Refactoring Plan stub Improve

    The route of refactoring, as discussed within the development team. This plan should always be visible to every team member.

  • Remove Nested Control Structures stub Improve

    Re-structure code so that deeply nested or complicated control structures are replaced by semantically identical versions. Special case of Refactoring, similar to Untangle Code. Often performed by reducing complexity and especially cyclomatic complexity. When reducing code complexity one needs to make sure we’re not exchanging inner/ method/ cyclomatic complexity by outer/ design or runtime complexity.

  • Report Structure Cross-cutting

    A generic structure for written audit or review reports, usually following an Analyze phase.

  • Requirements Analysis Analyze

    Analyze and document (current) requirements: required features and required constraints

  • Root Cause Analysis Analyze

    Explicitly differentiate between symptom and cause: identify root causes of symptoms, problems or issues.

  • Runtime Analysis Analyze

    Analyze the runtime behavior of the system, e.g. with respect to time and resource consumption or creation.

  • Runtime Artifact Analysis stub Analyze

    Artifacts that were created by a running system are a gold mine. They allow you to get a deeper understanding of the inner workings of a software system. Use log management, aggregators and monitoring tools to gather log files. Then analyze usage patterns, stack traces or errors to see what the system is really doing.

  • Sample for Improvement stub Improve

    Provide concrete code example for typical improvement situations, so that developers can improve existing code easily.

  • Schedule Work stub Improve

    Schedule refactoring or improvement work, so that all (business and technical) stakeholders know about them.

  • Separate Cause from Effect Cross-cutting

    Explicitly differentiate between symptom (effect) and cause: identify root causes of symptoms, problems or issues.

  • Slide or Write Cross-cutting

    Consider format and structure of the review report early.

  • Social Debt Analyze

    Evaluate and track the welfare and health of a software development and operation organization or community such that additional project cost can be avoided or somehow managed.

  • Software Archeology Analyze

    Understand software by examining existing source code.

  • Stakeholder Analysis Analyze

    Ensure that all concerned parties are addressed.

  • Stakeholder Interview Analyze

    Learn from the people who know or care about the system and everything around it.

  • Stakeholder-Specific Communication stub Cross-cutting

    Communicate with stakeholders by actively applying their specific or favored terminology and/or communication channels.

  • Static Code Analysis Analyze

    Analyse source code to identify building blocks and their dependencies, determine complexity, coupling, cohesion and other structural properties.

  • Strangler Approach Improve

    Divide a legacy system into different functional domains and replace those step by step.

  • Structural Analysis stub Analyze

    Analyze the static structures (e.g. building block structure) of the system, e.g. package or module dependencies, runtime- and/or deployment dependencies. See the more specific Static Code Analysis, Context Analysis and Data Analysis.

  • Systematic Decisions stub Cross-cutting

    Systematically prepare and take decisions by finding appropriate options, check assumptions, overcome emotion and prepare to be wrong. See Decisive (by C+D Heath).

  • Take What They Mean, Not What They Say Analyze

    Find out the real meaning/intention of stakeholders

  • Toggle Feature stub Improve

    Simultaneously support evolved, competing or conflicting features at runtime by toggling feature flags.

  • Traceability Cross-cutting

    When discussing problems, some stakeholders will question or doubt your findings (see pattern Expect Denial). Keeping thorough references to the origins or original sources of major findings keep eventual critics in check.

  • Untangle Code stub Improve

    Remove unnecessary complications in code, e.g. nested structures, dependencies, dead-code, duplicate-code etc. See Remove Nested Control Structures. Special case of Refactoring.

  • Use Case Cluster stub Analyze

    Understand system functionality by grouping functionality into clusters to reduce complexity.

  • Use Invariants to Kill Zombies Improve

    Provide a safe approach in situations where it seems to dangerous to delete code or whole modules from a huge system because Static Code Analysis can’t recognize whether the code is still in use or not.

  • User Analysis Analyze

    Get an overview of user categories or groups, their goals, requirements and expectations. Find out about issues users have with the system.

  • View-Based Understanding Analyze

    Understand the inner workings and internal (code) structure of of the systems. Document (and communicate) this via architectural views, especially the building-block view.

  • Widen Your Options stub Cross-cutting

    Before taking decisions it’s often a good idea to widen your decision space, look for additional options. Sometimes it’s not only “yes-or-no” decisions, but a spectrum of additional options are available - at least if you allow your brain to deviate from conventional path or your own preliminary conclusions.