Your Privacy

This site uses cookies to enhance your browsing experience and deliver personalized content. By continuing to use this site, you consent to our use of cookies.
COOKIE POLICY

Skip to main content

Architectural Simplicity

Architectural Simplicity
Back to insights

With all of the cool modern frameworks, database options and other technologies available to us it’s easier than ever for software solutions to become overly complex. Sometimes this is a reflection of the complicated problems we are solving. However, in many cases it is the result of poor planning or adding functionality without enough consideration for how it will affect the system as a whole. Striving for architectural simplicity from the beginning and throughout the life of a software system can be the difference between a scalable platform that can adapt as requirements change and a mess of legacy code that no one really understands.

Why do things get complicated?

Simplicity takes planning

When it comes to software architecture simple does not mean easy. It takes a generous amount of hard work, time and collaboration to achieve architectural simplicity. A deep understanding of the problem at hand, comprehensive knowledge of the tools and patterns available and a reasonable idea of where the software might go in the future are all necessary requirements to come up with an effective but not overly complex solution. Achieving all these things often necessitates a planning phase that can range from a few days to a few sprints. Some teams do not feel that this level of effort for planning is in keeping with Agile principles. Sometimes the reality of the situation simply does not afford the appropriate amount of time for planning or there isn’t enough buy in from decision makers to allocate that time. In these cases, it is the architecture (and the project itself sooner or later) that suffers.

“I love technology…”

It is very tempting to try to weave in that new framework or library everyone is talking about when architecting a new solution. It looks great on a resume or a slide deck and can often sell more work! We have to evaluate these choices objectively to ensure we do not make a software solution more complex without adding any (or enough) benefit. On the other hand, unnecessary complexity can also be introduced by using the tech stack we are most comfortable with instead of the one that best fits the problem.

Merge now, refactor “later”

We’ve all seen it (and are probably guilty of it). The TODO comment (committed 4 years ago) that acknowledges that although this code is terrible rest assured that it will be cleaned up in a later iteration. There will always be times when that fix or patch or feature just has to go out right now. It is up to architects and developers to stress the importance of a minimum standard of code quality and its positive effect on system performance, supportability, and the bottom line in the long run.

What are the benefits of architectural simplicity?

In most cases a simpler architecture produces software that:

  • Is easier to understand, document, deploy, test and debug
  • Is more likely to remain well organized and consistent as more and more developers contribute to it
  • Has fewer boundaries between different moving parts and fewer opportunities for failure
  • Is easier to learn and implement
  • Can easily be modified and updated as requirements change and our understanding of the problem space deepens

How can architectural simplicity be achieved?

Avoid over engineering

While it is important to create an architecture that is flexible it is equally important not to try to account for every possible edge case (think YAGNI!) Another good rule of thumb is to seek the most general solution for the specific problem at hand.

Reduce ambiguity

Whenever possible avoid making design decisions based on assumptions or partial knowledge. Spikes, proofs concept, user studies and other tools can all help fill in the gaps of understanding before plowing ahead in the wrong direction.

Communicate, adjust, repeat

In order to end up with the ideal solution we need all the facts and buy in from the appropriate parties. The later it is revealed that a solution is not quite right for a particular use case or stakeholder the more expensive it is to change and the more likely it is to introduce unnecessary complexity. These pitfalls can be avoided by keeping lines of communication open, discussing the implications of design decisions often and generating at least enough documentation to facilitate discussion and record the motivations behind architectural decisions. There will inevitably be trade-offs between this pattern/technology/design choice and the other. Everyone involved in the decision-making process should have a clear understanding of the reasons and the risks.

How can architectural simplicity be maintained?

Refer back to the original goal

Architecture is never done. It is a living entity that needs attention in order to survive. With each new iteration in design or change in requirements we must ask:

  • How does this fit with the original design?
  • Does this architecture still meet our needs?
  • Even if this is something we can do, should we?

Revisit trade-offs and choices

We can only make decisions with the data available at the time. As we move forward it is important to look back at previous design decisions with a fresh eye. Perhaps the reasons for or against a particular choice are no longer valid.

Empower the team

Although some companies have a title called Architect, good architecture is not the responsibility of one person or team. It takes a community to create and maintain an architecture. Everyone involved should feel free (better yet obligated) to ask questions about design decisions, propose changes, and offer his or her unique perspective on how the architecture does or does not address the problem at hand.

Sources: InfoQChris DzombakMartin Fowler 

Digging In

  • Development & Modernization

    Keeping Infrastructure out of the Way of Application Goals

    Every new application starts with an idea. Whether creating a new site, the next big social media platform or just trying to make a process workflow easier, the idea is the driving force where teams want to spend most of their time perfecting the user experience. However, once a project moves out of the proof of […]

  • Development & Modernization

    Docker Brings Scale at Cost

    Our UDig Software Engineering team has always been a cloud–first engineering group, but while inventorying our internal application and cloud usage we were disappointed at our spend and over-usage of EC2 instances with AWS. Through research and experience we knew if we could containerize our applications with Docker, we’d then be able to consolidate and maximize our servers‘ output. Before we […]

  • Development & Modernization

    Is Lift-and-Shift a Valid Option for Cloud Migration?

    There are a few valid cases for doing a “lift and shift” cloud migration, but it should always be challenged, especially when it is used as a stepping stone in your long-term strategy. Legitimate time, technology, or capacity constraints within existing data centers are valid reasons to begin with a “lift and shift” migration. If there is true necessity for an organization to meet a certain deadline […]

  • Development & Modernization

    Minimize your Cloud Debt

    Technical debt is a real liability. If you have spent any time working at a company that relies on technology, you have most likely felt the impacts of technical debt. It comes in many forms and is difficult to identify in many cases, but one thing is for certain – it has compounding costs. As […]

  • Development & Modernization

    Understanding Serverless Computing

    Most consumers think of cloud computing simply as off-site storage space. But there’s been a rising trend in the last few years to host and run code in the cloud. As the features have matured, it’s become simple to use serverless computing services for applications. Advantages The primary advantage to serverless computing is simplicity. The […]