A typical software development practice is to do a high level design to get the basic components or subsystems, then divide the team up to implement the required functions, then integrate everything in the last few weeks of the project.
This back-end-loads all the integration risk at the end of the DevelopmentInterval. It practically ensures that on the slight chance some piece doesn't happen according to plan you are stuck at your project delivery date with a jumble of components that do absolutely nothing a user can use.
An alternative approach is to build your software in HorizontalStripes across the whole system. These stripes are chunks of user recognizable functions, UserStories, groups of UseCase's, or ImpliedRequirements?.
Integrate continuously as you go. That way if you get into trouble on the last stripe of a development interval, you at least have the first N stripes already running.
This practice is heavily supported by using a WorkQueue to plan your project and report status; each row on the WorkQueue is a stripe across the system.
The stripes correspond to the "micro-v's" discussed in ValidationVee.
-- BillBarnett
Also known as VerticalSlices