I wrote earlier about using agile software reuse and the key ingredients that are beneficial when pursuing such a strategy. In this post, I want to summarize how agile practices can be used to build reusable service capabilities.
|Practice||How is this practice supported?||Why is this practice supported?|
|User stories||Examine user stories within the context of the overall reuse strategy. Differentiate functionality for the overall domain vs. for a single application. Match story with known service and identify development and refactoring tasks.||User stories are the primary means for getting requirements for services. User stories can be used to recognize common functionality across services. It bridges business needs with reusable services.|
|Don’t Repeat Yourself||Code reviews done to remove duplication across existing and new services. Review code at multiple levels of granularity – source code snippets, classes, services, and across the domain services inventory. Prefer building only domain services.||Ensure services are reusable and do not have channel/technology/transport coupling.Keeps codebase light by removing unwanted code. Helps leverage internal and/or external solutions for functionality that is outside of your core domain.|
|Refactoring||Heavily used for two primary purposes: iterative service development and legacy asset leverage. Refactoring used to identify and fix service limitations (functional and technical). Align user stories to known set of service refactorings. Refactoring also used to wrap legacy functionality and loosen coupling among legacy systems.||Refactoring is the foundational technique to achieve agility and helps deliver functional services iteratively. Refactoring is also necessary since domain knowledge and business strategy gets refined over time. Legacy assets can quickly be put to use as part of the service inventory by refactoring them saving time and money.|
|Done, Done||Unit and integration test the service, perform necessary refactorings, add suite of tests to the continuous integration process, and document service in the service catalog.||Ensure reuse-friendly techniques are performed and quality isn’t comprised when adding/updating services to the domain inventory.|
|Release planning||Only build services when there is a known consumer. Support backward compatibility using service wrappers and co-existence using versioning. Bundle enhancements across multiple services.||Deliver business value early with service orientation. Maximize service reuse across initiatives by releasing early and often. Reduces burden on development team and allows graceful migration path for consumers.|
|Iteration planning||Plan iteration scope using prioritized list of user stories. This list will in turn drive new service development and updates to existing ones. Allocate time for service development, decomposing legacy code, perform reviews, refactoring, integrate with continuous builds, as well as documentation.||Capture assumptions and known refactorings to continuously deliver working software and address limitations over multiple releases. Iterations help build reusable services over time greatly minimizing schedule risk.|
This isn’t an exhaustive list of agile practices that facilitate reuse – consider these as a starting point.