> We generally don't have 6-month old branches. We don't shy away from assigning big projects to devs, though. They iteratively collaborate with our Product team to carve out a v1, and then get to work. We throw out reliability on delivery dates of any one feature, believing that we achieve higher throughput with less coordination (we avoid dependencies between features as much as possible).
If your product priorities are stable for 6 months at a time, you're in a rare position. And I'd worry about knowledge sharing and maintainability if whole functional areas were being implemented by one person on their own. I agree with avoiding having two people working on the same area in parallel if at all possible, and there's certainly an overhead to not having the same person do a series of related tasks, but if we're planning to share maintenance responsibility for that area of the code (which is what being on the same team means) then I think spreading out the development work is worth the overhead. And fundamentally if no-one else on the team can understand Bob's architecture then better to find that out sooner rather than later.
> The critical difference, I think, is that none of that breaking up is super planned out, and it's certainly not formalized prior to development. The changes often trickle out over several releases. Collaborators may help advise on where to break things up, but ultimately it's up to the dev to use good judgement.
Scrum doesn't favour large amounts of up-front planning - ideally you don't plan beyond the end of the sprint - but you define the user-facing change you're trying to make, at least in enough detail to a) tell whether it's actually done or not b) estimate enough to let you prioritize. Even if your priorities are stable enough that you don't need to do the latter, I think I'd always want to define what I'm aiming for in each release ahead of time - otherwise it's just too easy to scope creep and end up with those 6 months of unmerged changes. And if that goal isn't something user-facing then you're kidding yourself, IME - it's just too easy to overengineer or overarchitect and produce a bunch of churn that doesn't actually achieve anything, unless you're constantly keeping in mind what this change is actually supposed to achieve.