Software complexity and time to market pressures are more challenging than ever for today’s development teams. New embedded products can have significant software components rivaling even desktop applications. Producing these systems without a powerful method of system partitioning designed for reuse can be daunting if not downright impossible.

This paper outlines effective methods for defining a stable partitioning of a system by subject matter. By effectively separating your software into manageable domain components you can substantially simplify internal component design, simplify interfaces between components, insulate your design from change, and provide reusable domain components for future products. The techniques described in this paper are applicable to systems developed using a functional or object-oriented approach.