Bottom-up design
Bottom-up design is an approach to system design that emphasizes building systems from small, primitive components, gradually integrating lots of small parts to compose the complete solution. It is sometimes used as a synonym for [evolutionary design], which is a similar concept.
Bottom-up design contrasts with top-down design, which instead emphasizes up-front planning and design through [decomposition] of the problem space into lots of subsystems which can each be developed relatively independently.
Bottom-up design is often desirable in situations where there are limited resources (such as time or people) or where the requirements are unclear or unstable. If developers are unfamiliar with the domain or problem space, they can at least start to build components that they know they definitely will need, before they know how the components will fit into the overall design.
The emphasis of bottom-up design is on reusing generic components to compose custom solutions with minimal bespoke code. The base components are incrementally linked together to form larger subsystems, which are in turn connected to form the complete system.
In the bottom-up approach, [architectural patterns] – and potentially even the [architectural style] – are emergent properties of the system. They take shape organically as the system is built.
The main benefit of bottom-up design is [reusability] of existing code. The main downside of bottom-up design is that it can be overly organic, leading to a tangle of elements and subsystems with no overall structure and limited consistency. Development of large-scale systems especially requires some degree of top-down design to maintain [conceptual integrity]. In practice, most modern software design practices combine elements of both top-down and bottom-up design.