A common AntiPattern, wherein an unexpected request for a new capability, causes an assumption or requirement of an existing architecture (software or otherwise) to be violated. The usual retort from developers when such occurs, is:
Sorry, but the architecture can't do that!
Which is seldom true--unless the request is something truly impossible (like solving the halting problem), the system probably can be reconfigured to meet the new request.
But in many cases, it's expensive:
- Invalidation of an architectural assumption may cause significant rework
- The rework may provide a major maintenance nightmare, if compatibility with currently-deployed systems must be made
- Given constraints of schedule and budget, the claim "we can't do that" may become true.
- If memory or computational power is an issue; resolution may require a more powerful computing platform. Whether or not the development team provides the platform or the customer does; either way this is a major PITA.
Common causes of this:
- Some parameter, field, protocol, or other entity which doesn't provide ample room for expansion--the FixedQuantityOverflowBug
- Going from one to n (n > 1) instances of some thing--the SingletonAssumption?. (Going from n to n + k, where n > 1 and k isn't so large as to introduce scalability issues, is usually a minor deal, providing proper coding practices are followed--such as not hardcoding n in a million different places).
- Overtaxing CPU and/or memory. This is a major issue in EmbeddedSystems especially (though where I work; FPGA space is usually the resource that gets exhausted first, and we often buy the biggest FPGAs we can).
In the context of UI or
InteractionDesign:
- Use of a graphics framework or toolkit with a fixed set of widgets, and which makes it difficult to create new ones.
- Introduction of context-dependent UI elements where they are not expected. Many toolkits/frameworks (and the programmers that use them) consider context dependencies to be icky. Modular software design often explicitly discourages context dependencies. Users often love them, however.
- Change of UI paradigm, or introduction of UI elements which require such. A "back" button, for example--ubiquitous on web browsers, but often a royal beyotch to deal with in heavily stateful frameworks that don't anticipate such a feature.
Ways to mitigate:
- Anticipate future requirements--not just functional, but interface requirements to. Make sure current requirements are well-known.
- Parameterize dependencies.
- Document the limitations of the architecture. No systems design is limitless; so make sure the limitations are known to all stakeholders.