Your domain might be complex and rich in variations that need to be supported. Trying to capture all the complexity is neither pragmatic nor feasible given the constraints you might be under. Instead, focus on the essential complexity. In addition, it is unlikely that your business supports all the variations in your problem domain. Fortunately most domain variations are expressed as user stories and you can look for patterns across iterations and releases to get a better understanding. Deciding the sub-set of complexity to manage is an art and you will need to continually collaborate with folks on your team on this.
- Data capture: the system might have multiple user roles and the kind of data, the validations/rules that execute on them all vary
- Geography: variations based on geographic regions/countries/states including differences in language, date/time formatting
- Combination of product features (also called as bundling): variations to support different product flavors (for instance basic supports features X, Y, and Z, professional supports features X, Y, K, and premium supports A, X, Y, and K).
- Entitlements: variations in access to different parts of a system and perform varying tasks. Related to user population and transaction behavior as well.
- Transaction behavior: variations in transaction behavior in terms of monetary limits, approvals/validation rules, how business exceptions are handled
- Channel (also called as distribution channel or sales channel): product availability, feature availability, security, customer support, frequency and kinds of marketing communications etc.
Next time you examine a user story place it in light of your domain categories. Is it a recurring pattern across iterations? If so, you should add it to your systematic reuse roadmap. Don’t panic if managing domain complexity doesn’t influence your design from day one. Nothing here is about embarking on a big upfront design effort to manage all this complexity. You should differentiate between awareness and action. Your increased awareness of your domain will help you align your systematic reuse efforts with business aspirations and iteration goals. Think of this as your refactoring guide that helps you make surgical changes to your codebase.