Teams in my company face the same types of problems. We are building projects with a large number of moving parts and architectural layers that make it difficult to create a working product early on. Additionally, there are often specialty resources that need to be scheduled or slightly out of synch with the team. Some approaches we've taken are below It has been challenging, but these approaches seem to be helping.
Build as vertically as possible
- In other words, strive to have something working, end to end as quickly as possible. We typically get there a few sprints in on a 9-16 month project.
- You'll often find a significant number of layers can be mocked or held back.
- Often, the initial customer facing components are place holders. We create a limited bit of functionality that is something like what the customer wants, but is likely to be very different in the final project. This allows us to prove the rest of the product at a system level and provide visibility from a system perspective.
Separate base architecture from the product
Our early sprints are often centered around infrastructure/architecture. For example, threading subsystems, performance monitoring, communications and test frameworks.
- Treat the subsystems as separate deliverables
- Fully define each subsystem
- Complete (truly complete, not just a partial implementation) each subsystem
- Load test each subsystem within the context of how it will be used in the final product