I've been working with some companies who do hardware/software systems. Most often, they have some embedded code too, just to make life interesting. To be honest, I don't know how to do implementation by feature for a whole brand new system. Here's what I've been suggesting:
- Prototype the software architecture as early as possible, even if it's just one path through the architecture, even if everything isn't set up into neat little components. Chances are good the hardware doesn't exist yet, but if it does (even a prototype), proto the software onto the hardware and see what happens.
- Make as few components as possible. This is a variation on the KISS principle. Sometimes, it's easy to break things down into a picture with a gazillion components, but that makes it harder to write and integrate the code.
- If you must implement by component, integrate by feature.
- Develop automated unit tests, preferably using test-driven techniques, so you really don't write more code than you need.
- Be ready to integrate a few things at a time, so you move towards continuous integration. Whatever you do, arrange things so you're not doing big-bang integration of the hardware, software, firmware, whatever at the end.
Do you have any suggestions/ideas? In my experience, once a system is built, it's relatively easy to add pieces implementing by feature. But it's much harder when defining and building a new system from scratch to implement by feature.