Software development in fast-paced environment requires quick adaptation to changing conditions. Agile Architecture supports evolutionary design and architecture of a system in accordance with agile principles to meet the customer’s needs. Based on experience of Agile Architecture Working Group members, we present set of practices that are proven to work in our agile delivery model.
Software Solutions Center team members at Capgemini: Adam Witkowski, Krzysztof Korus, Jacek Panachida, Maksym Perevertov, Przemysław Szczuc, Szymon Stawiński
Agile way of working
Small teams of 3-5 people. Small teams reduce communication overhead and allow to effectively make common decisions. Within a small team, there is a higher chance to establish a common bond and create an ownership culture needed to act proactively, make decisions and solve the problems. Small teams can productively work on delivery of coherent services and contribute to common delivery process.
Architecture decisions are made in teams, customer is included in conversations, each developer understands and can influence the decisions. Business stakeholders work closely with development team to present the product vision and to shape the final solution. They clarify the business requirements and cooperate with developers to make sure that everyone is on the same page and can effectively build the right solution.
Before major design and development happen, there is a proof of concept (POC) or minimum viable product (MVP) and the results are confronted with the customer. Both POC and MVP shorten the customer feedback loops, accelerate learning and allow to verify solutions from business and/or technical perspective with minimal resources and limited risk.
Software is designed to be as simple as possible and modular. Software design is intended to accomplish business goals in the simplest possible way, while being open for extension. Modularity at different levels is vital to agile architecture and results in significant improvement of maintainability, testability and flexibility.
Design focuses on contracts and interfaces between components, once established work can be divided. Interfaces and contracts promote loose coupling and reusability of components and services. They allow for parallel development, increase autonomy and encourage efficient collaboration between all parties. They play vital role in integration and consumer-driven contract testing.
Continuous integration (CI) and continuous delivery (CD) are applied. CI and CD as part of shift left testing allow to catch issues earlier in the development process and to reduce cost of fixing bugs. Automated CI and CD can be easily scaled and kept run for large number or changes or often releases. They allow to reduce number of integration challenges and speed up the feedback loop.
Testing is an ongoing process and includes high unit and integration test coverage. Testing is performed early and often in accordance with shift-left approach and reduces time of feedback cycles. It is based on automated testing and is part of CI/CD pipeline. It combines different kind of testing methods (TDD, BDD, ATDD) to increase the quality of the resulting software. Quality standards are ensured by use of quality gates.
Minimal or no documentation: It emphasizes a need for a documentation that is adjusted to the project needs. Documentation should be created in a form most suitable for the project and the team. Documentation should be „just enough, just in time” to add value and reduce unnecessary cost.
A lot of communication within the small teams. Team members communicate frequently to deliver working software and stay connected with stakeholders to make sure that the solution meets the stakeholders’ needs. They use various tools and techniques to organize common information, plan work, and increase visibility.
Designing and developing only the required features (no overengineering, no development of nice to have in the future features etc.). Work of development team is focused on delivery of real value to customer. Thanks to common vision of the product, frequent communication and design simplicity, features are delivered just-in-time, thereby increasing efficiency and reducing unnecessary work.
All developers are involved in design, development, testing, releasing and support. Self-organizing and cross-functional development teams choose the best way to accomplish their work from end to end. They agree upon common practices and work jointly to deliver working software frequently.
Continuous technical improvement goes along with new business features. Emergent design allows development team to quickly respond to a change and evolve technical solution to fulfill the customer needs. Development team keep technical debt under control and work actively towards its reduction.
Benefits of an agile working methodology
- No employees working as architects only, so all architects act also as managers and/or as dev leads/senior developers etc.
- Almost no documentation to maintain
- This looks like the only way possible to deliver projects when requirements, priorities, deadlines and scope frequently changes (e.g. in investment banking)
- The team size can be much smaller
- Flexibility is very high
- Time to market is a plus
- Very high level of ownership and maturity on the team side
- Team can quickly handle replacements and new joiners
- Relatively low cost of patching
- Improved transparency and predictability of the development progress and shape of the system