Discussion about this post

User's avatar
Jim Grey's avatar

This really clarifies something I've experienced more than once joining companies with a lot of legacy code. More new functionality is always wanted, but building on the existing codebase had already consumed too many of their futures. We had to invest in refactoring and testing first, which felt risky because it delayed features. Your features/futures framing names exactly what I was protecting -- the capacity to keep building after that first feature shipped.

At one company after we did this there was push to build a vast feature, something like 1.5 team-years worth of work. A clever product manager on the team led the fast delivery of the smallest unit of that feature that could provide value, and then found customers used it and liked it. She asked them what else it needed to do, and one enhancement was requested far more than any other. We built that. Total time: three weeks. Customers all but stopped asking for more. They never needed the rest of what we initially envisioned this feature to be! We preserved futures by building only what was actually needed. Reading this makes me realize we were alternating between features and futures without having the language for it. Thank you for giving me that language.

Anthony Mowers's avatar

This is good and helpful.

At the same time I’ve found that so much of what happens next depends on the makeup of my team. What values do we share?

I sometimes wonder if I could convince people that gravity exists if they aren’t already interested in the topic.

I could think futures vs features are important. Meanwhile my team mates might be more oriented towards new threading models in Java 25. If that’s the case we’ll have hard time navigating the features vs futures space.

I struggle with this aspect of work more than anything. I guess I’m asking how to apply this in a team setting when it’s not even something on people’s radar.

6 more comments...

No posts

Ready for more?