Many developers begin developing by unknowingly using the concept of Separation of Concerns (SoC). They dedicate their time to develop software by designing and developing features (concepts) with as little overlap of functionality as possible. This approach is how I once programmed when I was a developer. It provides instant gratification. Unfortunately, this methodology succeeds for only very trivial applications. The approach is completely inappropriate for large-scale or enterprise-level solutions.
The Purpose of Software
The purpose of a software application is driven enviably by the developing organization. The goals are generally driven with commercial requirements and the ultimate solution must deliver an acceptable ROI. In most cases, the system’s future return must be promoted to gain buy-in before any investment is allocated. And in many situations, the architectural design must be leveraged to demonstrate the value and viability of the future system.
The Value of Architecture
I parallel the need for software architecture with the construction of a physical structure –specifically… I like to relate every system I design as a Tree House, a Home, or a Skyscraper.
Listening Is Key
The architect must begin by considering a diverse pool of concerns from all stakeholders (users, developers, management, investors, customers, etc). It is during this initial gathering of information that often forms fundamental flaws in a system. By neglecting the insights from a key individual, the architect may fail to incorporate a core attribute for the end solution. Although many circumstances may contribute to design flaws, I believe that the primary issue that surrounds the inability to actively listen to others. People naturally want to explain their thoughts to support their intentions. But, this is not the activity for the architect at this phase. A related problem is the inability for the architect to communicate his or her intentions. –But, we’ll save that issue for a later discussion.
What is Software Architecture
At its core, software architecture is a compiled distillation of needs and expectations from all stakeholders. From its definition, we can recognize that the architecture of a software application will never be flawless. This is because software always evolves. While software continues to be used, it is never complete. Why is software never complete??? Because stakeholders (anyone who is affected by the software) will change their minds, some stakeholders will depart while others will join (Yikes… even after the system is released). So how do we shoot a moving target?
Shooting a Moving Target
There are 3 tools that I use to enable sound system architecture: Pillars, Design Patterns, and Modeling Criteria. At the most abstract level, an architect should incorporate a set of Pillars throughout the entire system’s design. A pillar (by my definition) is a central, foundational, abstracted concept that supports the operation and reinforces the mission of the system. Because each pillar sustains crucial functional support, a pillar can never be removed. For example, during the discovery of stakeholder’s needs, the system architect may uncover that the solution must allow for a customizable, role-based security model and all actions must be logged and comply with FDA regulations. The concepts would be 2 pillars of the new system. Pillars should be documented in concise, understandable terms and leveraged as a litmus test against every designed task.
Atomic Components (tasks must completely succeed or completely fail)
Loose Coupling (changing one component does not affect the other component)
Open/Closed Principle (components may be opened for extension, but closed for modification)
Dependency Inversion (high-level components should not depend on low-level components)
Conclusion
Software will constantly evolve throughout its entire life. Do not attempt to stop the evolution. Rather record key principles surrounding the project to architect the best solution. As a final remark, I relate software architecture with the design of an airplane. The wings of a plane maintain sufficient structure to lift the craft into the air. At the same time, the wings are designed to flex 22 degrees up and 18 degrees down to prevent a total failure during turbulent conditions, protecting not only the craft, but also all stakeholders. Architects must understand and address all discoverable needs while incorporating a fine balance between structure (for functionality) and flexibility (for customization & user acceptance). By applying Pillars, Design Patterns, and Modeling Criteria, an architect can achieve a proper design to deliver a scalable, maintainable, and reliable system.
No comments:
Post a Comment