"Consequential Clojure Architectures" by Janet Carr

Discover the principles of Consequential Clojure Architecture, where business needs drive the design of modular, scalable, and maintainable codebases, and learn how to avoid common pitfalls in the pursuit of simplicity and reliability.

Key takeaways
  • Architecture is a business solution: Architecture is a business requirement, and solutions should be designed to address specific business needs.
  • Code organization is important: Well-organized code makes it easier to evolve and maintain over time.
  • Ports and adapters architecture: This pattern helps to decouple business logic from system outputs and drives the implementation of interfaces.
  • Driven adapters: These adapters decouple the system inputs from the business logic and drive the implementation of interfaces.
  • Domain-driven design: This approach focuses on modeling the business domain to meet specific business requirements.
  • Reactor, observable, and feedback: These components are crucial for building robust systems that respond to changes in the market.
  • Speculators, protocol-based design: Speculators can lead to overly complex code, while protocol-based design introduces rigidity.
  • Keep it simple: Over-architecting can lead to complex and unmaintainable codebases.
  • Codebases should be modular: Modular code makes it easier to evolve and maintain over time.
  • Refactoring is important: Regular refactoring helps to improve code quality and maintainability.
  • Avoid anti-patterns: Common anti-patterns include excessive use of interop, records, side effects, and over-architecting.
  • Consequential Clojure architecture: This approach focuses on building modular, maintainable, and scalable systems.