Grow software, not build
In the realm of software development, the process of creating remarkable software differs from traditional construction practices. Rather than being built outright, great software thrives through a process of growth and evolution. As an architect responsible for designing software systems, your role involves establishing the initial structure and organization that will accommodate future changes and unforeseen interactions with other systems.
Despite the architectural terminology borrowed from building and engineering, the essence of exceptional software lies in its organic development rather than construction. Size has proven to be the most significant predictor of software failure. Hence, starting with a large-scale system design offers little benefit upon reflection. Although the temptation to pursue such an approach may arise, designing extensive systems upfront tends to result in larger, more prone-to-fail projects. These projects often exhibit incidental complexity, inertia, untestability, fragility, unnecessary components, increased expenses, and a negative political dimension.
To counteract these pitfalls, it is crucial to resist the inclination to design a complete, expansive system that aims to fulfill all known requirements and desired properties. Instead, maintain a grand vision while avoiding a grand design. Embrace the idea of allowing you and your system to adapt as the situation and requirements inevitably evolve.
领英推荐
The most effective way to ensure the adaptability and evolution of a software system is to foster its growth from the very beginning. Encouraging a system to evolve involves starting with a small, functional subset of the intended architecture—the simplest working solution possible. This early-stage system possesses numerous desirable qualities and imparts valuable insights about the architecture that larger systems or mere collections of architectural documents cannot provide. Your involvement in its implementation is more likely, making it easier to test and reducing coupling. Additionally, a smaller team can handle its development, minimizing coordination costs. The system's properties are more observable, deployment is smoother, and it allows you and your team to learn quickly what works and what doesn't. It also highlights areas where the system may encounter difficulties in evolving, areas prone to crystallization and fragility, and potential points of failure. Perhaps most importantly, it is comprehensible and tangible to stakeholders from the outset, enabling their understanding and growth within the overall design.
Therefore, focus on designing the smallest system possible, assist in its delivery, and let it evolve gradually toward the grand vision. Although this approach may initially feel like relinquishing control or shirking responsibilities, it ultimately leads to appreciation from your stakeholders. It is essential not to confuse an evolutionary approach with discarding requirements, phased development, or constructing a disposable system. #SoftwareGrowth #EvolutionaryArchitecture #AdaptToChange #SmallFirstApproach #AvoidLargeSystems #OrganicSoftwareDevelopment #FlexibilityOverRigidity #ContinuousEvolution #TestableSystems #StakeholderComprehension #DeliverAndIterate #SoftwareSuccess