Building Evolutionary Architectures: Support Constant Change
Rate it:
Read between October 9, 2017 - March 6, 2018
4%
Flag icon
but balancing the pros and cons of each architectural decision leads to the tradeoffs so commonly lamented by architects.
5%
Flag icon
what if we build changeability into the architecture?
6%
Flag icon
Historically, a portion of architecture has often been viewed as a governance activity, and architects have only recently accepted the notion of enabling change through architecture.
7%
Flag icon
For example, if the project includes a relational database, the structure and relationship between database entities will evolve over time as well.
7%
Flag icon
which focuses on different perspectives from different roles and was incorporated into the IEEE definition of software architecture, splits the ecosystem into logical, development, process, and physical views.
8%
Flag icon
April 1968, Melvin Conway submitted a paper to Harvard Business Review called, “How Do Committees Invent?”
8%
Flag icon
it’s hard for someone to change something if the thing she wants to change is owned by someone else.
9%
Flag icon
Structure teams to look like your target architecture, and it will be easier to achieve it.
9%
Flag icon
Adapting implies finding some way to make something work regardless of the elegance or longevity of the solution.
10%
Flag icon
A system is never the sum of its parts. It is the product of the interactions of its parts.
11%
Flag icon
the fitness functions for evolutionary architecture may not be implementable in software (e.g., a required manual process for regulatory reasons), but architects must still define manual fitness functions to help guide the evolution of the system.
13%
Flag icon
Architects never know all important parts of the architecture at the beginning (the classic unknown unknowns problem
13%
Flag icon
Making the wrong design choices that ultimately lead to building software that fails in its environment Making design choices that cost time and/or money but are unnecessary Not being able to evolve the system easily in the future when the environment changes
16%
Flag icon
Old services aren’t forced to upgrade and can continue to call the original service as long as they need it.
16%
Flag icon
Architects often fall into the trap of seeing software architecture as an equation they must solve. Much of the commercial tooling sold to software architects reinforces the mathematical illusion of certainty with boxes, lines, and arrows.
16%
Flag icon
Testable
17%
Flag icon
One of the bedeviling problems in component-based systems is component
22%
Flag icon
Fast change to code implies fast changes to database schemas, but the database administrators are more concerned about stability because they are building a data warehouse.
24%
Flag icon
To learn from users, the developers released a new version of the legacy application with logging enabled to track which menu features users actually used.
25%
Flag icon
To successfully evolve software, developers must consider all the coupling points that could break.
25%
Flag icon
Yet, creating common shared artifacts causes a host of problems, such as coupling, more difficult coordination, and increased complexity. The bounded context concept recognizes that each entity works best within a localized context.
26%
Flag icon
project—make sure that all the terms on the team mean the same thing.
26%
Flag icon
Eventually, we unrefactored the Listing class back into a single large entity, because the software project revolved around it.
27%
Flag icon
Developers created highly coupled classes with poor modularity. Database schemas snaked into the UI and other parts of the system, effectively insulating them against change.
30%
Flag icon
Architects don’t traditionally include data dependencies within the technical architecture for microkernels, so developers and DBAs must consider data evolution independently.
30%
Flag icon
Once the core system is complete, most behavior should come from plug-ins, small units of deployment.
36%
Flag icon
No one perspective on architecture is “correct,” but rather a reflection on the goals developers build into their projects.
39%
Flag icon
Architects shouldn’t choose an architecture without evaluating it against the real problems they must solve.
39%
Flag icon
Coding standards don’t help for this type of problem because developers have a hard time remembering bureaucratic policies in the heat of coding.
42%
Flag icon
Architects quickly discover, however, that using the database as an integration point fossilizes the database schema across all sharing projects.
45%
Flag icon
Thus, database vendors have secreted armies within enterprises all over the world, where loyalties lie with the vendor rather than the company. DBAs in this situation ignore tools and other development artifacts that don’t come from the mothership.
48%
Flag icon
Software suffers from the unknown unknowns
49%
Flag icon
For many developers, refactoring has become synonymous with change, but there are key differences.
49%
Flag icon
It is exceedingly rare that a team refactors an architecture; rather, they restructure it,
50%
Flag icon
Adding fitness functions to package software is perhaps the biggest hurdle to enable evolvability. Generally, tools of this ilk don’t expose enough internals to allow unit or component testing, making behavioral integration testing the last resort.
50%
Flag icon
Most developers would rather write a framework than use a framework to create something useful: Meta-work is more interesting than work.
51%
Flag icon
A decade later, their best developers worked in full-time maintenance mode, fixing their application server, adding features to their web framework, and other mundane chores.
52%
Flag icon
All problems in computer science can be solved by another level of indirection, except of course for the problem of too many indirections.
53%
Flag icon
A common manifestation of this goal is the modern DevOps perspective on building immutable infrastructure.
53%
Flag icon
Modern DevOps has solved the dynamic equilibrium problem locally by replacing snowflakes with immutable infrastructure. Snowflake computers are ones that have been manually crafted by an operations person, and all future maintenance is done by hand.
53%
Flag icon
Building software systems that evolve means controlling as many unknown factors as possible.
55%
Flag icon
“We know we’ll need a message queue for lots of stuff eventually, so let’s get the fanciest one we can now and grow into it later.” The problem with this approach is technical debt: stuff that’s part of your project that isn’t supposed to be there and is in the way of stuff that is supposed to be there.
55%
Flag icon
Some development communities love preemptive layers of abstraction to a distracting degree but understanding suffers when you must call a Factory to get a proxy to a remote interface to a Thing.
56%
Flag icon
Developers understand the benefits of everything and the tradeoffs of nothing! Rich Hickey, creator of Clojure
58%
Flag icon
For example, set up an internal version-control repository to act as a third-party component store, and treat changes from the outside world as pull requests to that repository.
60%
Flag icon
First, an antipattern is a practice that initially looks like a good idea, but turns out to be a mistake. Second, better alternatives exist for most antipatterns.
61%
Flag icon
However, many organizations become overambitious with this category of software, leading to the vendor king antipattern, an architecture built entirely around a vendor product that pathologically couples the organization to a tool.
61%
Flag icon
However, a lot of the time ERP tools can’t be customized enough to fully implement what is needed,
61%
Flag icon
Developers are technically constrained by choices the vendor makes in terms of persistence, supported infrastructure, and a host of other constraints.
61%
Flag icon
But abstractions come at a cost because no abstraction is perfect—if
« Prev 1