Agile Design Modeling

Unknown reference: implementing-domain-driven-desing
2021 10 01 head

The line between software development and software architecture is a tricky one.

Some people will tell you that it does not exist and that architecture is simply an extension of the design process undertaken by developers. Others will make out it is a massive gaping chasm that can only be crossed by lofty developers. They believe you must always abstract your abstractions and not get bogged down by those pesky implementation details.

As always, there is a pragmatic balance somewhere in the middle, but it does raise the interesting question of how you move from one to the other.

Key Takeaways

  • Understanding the basics of software architecture is more important than ever before, given the distributed nature of the software systems we are now building and the distributed nature of the teams building them.

  • The sweet spot of up front design, between too much and none at all, should focus on understanding the significant decisions and trade-offs that influence the shape of a software system.

  • Good architects are active members of the development team, from collaborating on code to coaching and providing technical leadership to the team.

  • Communicating about software architecture is challenging. The C4 model can help structure the communication, starting with a context diagram and working down to more technical aspects of the system.

  • Contrary to some popular assumptions, putting effort towards good architecture actually enables agility.

We could state the definition of software design and architecture is

  1. Management of non-functional requirements, see Fitness Functions

  2. Architecture definition, see C4 Models

  3. Technology selection, see ADR

  4. Architecture evaluation

  5. Architecture collaboration

Good Practices

Domain-Driven Design

I would postulate if your agile design follows domain-driven principles, you are safe for the next five years. Just do it.

Evolutive Architecture

Features and non-functional requirements will change over time. Define an architecture which will evolve with these changes. Domain-driven design approach is highly evolutive Refactoring and Clean Code Fitness Functions Continuous Integration and Delivery Software Craftsmanship

Refactoring

Evolutive architecture means you will regularly refactor your code base. Refactoring implies you have extensive integration and unit tests available.

Ideas

Explore approaches to improve the quality and adequacy of your architecture:

  1. Architect products, evolve from projects to products,

  2. Focus on quality attributes, not on functional requirements,

  3. Delay design decisions until they are absolutely necessary,

  4. Architect for change, leverage the power of small,

  5. Architect for build, test, deploy, and operate,

  6. Model the organization of your teams after the design of the system you are working on.

Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.

— Melvin E. Conway
2021 10 01 agile design

Agile digital product architects are aware of:

  1. Allow architecture to emerge,

  2. Software architecture is not about big design up front,

  3. A picture is worth a thousand words,

  4. You do not need to use UML See also C4 Model,

  5. Every software team needs to consider software architecture,

  6. Everyone is an architect and everyone owns the architecture,

  7. The software architecture role is about coding, coaching, and collaboration,

  8. A good software architecture enables agility.

References