1. Debugging Real Systems

    12 Thoughts

    Start with the failure, follow the evidence across boundaries, and do not stop at a green build when the cause is still unknown.

  2. Data That Must Survive

    12 Thoughts

    Identifiers, clocks, migrations, constraints, and queries all have to respect one awkward fact: the data will probably outlive the code that wrote it.

  3. Integration Without Illusions

    12 Thoughts

    What happens after an HTTP 200, during a retry, or when half the work succeeded? The boundary is only useful once those failures have names.

  4. Changing Existing Software

    12 Thoughts

    Find what the old system actually does, preserve the behavior that matters, and create a seam small enough to change without betting everything on the rewrite.

  5. Design Before the Pattern Name

    13 Thoughts

    Start with the change that hurts. The useful role, invariant, or dependency usually becomes obvious before its pattern name does.

  6. Object Design

    12 Thoughts

    Objects should make the next change less surprising through usable construction, honest roles, small collaborations, and contracts callers can rely on.

  7. Domain Discovery and Integration

    6 Thoughts

    Language, work, ownership, and system relationships reveal boundaries that a directory tree cannot.

  8. Application Boundaries and Persistence

    6 Thoughts

    Clean diagrams eventually meet stored data, concurrent writes, and framework lifecycles. That is where mapping, reconstitution, and ownership stop being cosmetic decisions.

  9. Commands, Events, and Processes

    9 Thoughts

    Commands ask for work; events record accepted facts. Queues, outboxes, and long-running processes make the difference expensive to ignore.

  10. Testing for Confidence

    7 Thoughts

    Choose the test boundary from the defect you need to catch, not from the coverage number you want to report.

  11. Service Boundaries and Ownership

    5 Thoughts

    When is a module no longer enough to own a change? Follow the deployment, coordination, scaling, and ownership costs before paying for a network boundary.

  12. Laravel Performance and Operations

    6 Thoughts

    Measure the bottleneck first, because requests, queries, caches, workers, and long-lived processes do not fail in the same way.

  13. Release Engineering

    4 Thoughts

    The reason behind a change should survive the trip from commit and review to changelog, release decision, and shipped artifact.

  14. Observability and Deployment

    2 Thoughts

    A successful deploy command says almost nothing about compatibility, rollback, or what production is doing now.

  15. Software Supply Chain Security

    3 Thoughts

    A lockfile can repeat a choice. It cannot tell you who was allowed to change the artifact, which inputs executed, or where the credentials went.

  16. Engineering Decisions and Leadership

    3 Thoughts

    Technical decisions still have to fit commercial reality. Risk, capacity, ownership, pushback, and the conditions for changing course belong in the decision too.

  17. AI as an Engineering Instrument

    3 Thoughts

    Use AI to reach evidence faster without handing it comprehension, authority, or the decision.

  18. Recovery Engineering

    3 Thoughts

    Backups, replicas, and runbooks matter only when they help restore the first useful service under the failures you actually expect.

  19. Building a Rating Engine

    16 Thoughts

    A retrospective of a private logistics rating engine: the original PHP design, model changes, performance investigations and the Go port, with the code and measurements behind the decisions. Dates set the reading order, not when the work happened.