1) Fund complete programs or products. Keep your teams together and keep them improving.
2) Grow the program or product organically from a prototype. Analyze frequently. As it grows, shift strategies for team and task management, code management, test and release, and product management.
3) Divide the program or product into services, loosely defined as either software components or business services.
4) Find tech leads for each service, and for features with coherent stories. Build high performance teams around them with code review and strong quality control. They release changes as soon as changes are ready.
5) Unblock! contributors by reducing meetings, reducing batch processes, and providing a process for accepting code and changes from new contributors.
6) Provide all three paths to fixing the problem of dependencies - one person or team waiting for another. Do top-down planning for the things that you understand. Provide open peer to peer communication and escalation so that people identify and get the things they are waiting for. Encourage "fix it yourself" for important issues.
This will give you a development system that works at scale. Read the next chapter to find out how to use this powerful machine with effective planning and budgeting.