Last Updated September 17, 1999 - Jack Harich - Go Back
"If I had eight hours to chop down a tree, I'd spend six sharpening my axe." - Abraham Lincoln
Quick Overview
Our goal is to be able to guarentee we have a really good architecture. This requires a rigorous repeatable process, in addition to experience and judgement. Basically we determine Requirements and then test several Candidate Architectures (or architecture portions) to see which are better. Since good designers generate alternate solutions paths, the process gives good feedback on which path is better, and how good a path is. This provides quick, deep understanding of the fundamental decisions the architects should focus on, which leads to better decisions, which allows the architects to iteratively zero in on an optimal result. We use the definition:
Architecture is a system's high level structure, which consists of components, their responsibilities and their relationships.
The Process
Architecture is a subset of an entire system, and so takes a different process from systems to do well. Hence we do not use the entire Mini Process, but just a similar set of steps. Briefly, the process is:
|
Please note that architecture is high level only, not a system's complete design. This is why we can use just key requirements, and zoom right along with a lightweight process. It's the 80/20 rule.
Much of this is based on the book "Software Architecture in Practice" by Bass, Clements and Kasman, 1998, from the SEI. This is the best book on software architecture I've seen. Chapters 1, 2, 4 and especially 9 are what I found most useful.
A weak point is "Generate candidate architectures". All this process does is use Requirements to test architectures. Creating an architecture still takes "a rather good eye". However, if the Requirements are correct, one can at least determine if an architecture is sufficient. There's also the high probability that a better architecture will evolve due to the evaluation feedback loop, and deeper understanding of the architectures and their common patterns. For a few suggestions see Modeling Checklist and the superb book mentioned above. The greatest single suggestion we can make is, "Good architecture is based on good principles".
An Example
Since a picture is worth a thousand words, we jump right into an example. Naturally we use a current project - The second generation of the UHR reference implementation core.
Determine Requirements
1. Nutshell Vision
Create a second generation UHR reference implementation, using the lessons learned from the BA. It should be so good it lasts at least 2 years before replacement, with Parts good for 3 years or more and DK good for 5 years or more.
2. Narrative
See the User's Mental Model for a fresh and concise description.
This architecture covers only the "core" technology, previously called the microkernel. The core should be a good lower layer for parts and visual tools, so core architecture must provide good collaboration abilities with higher layers.
3. Key Traits
Top goals here are:
- High expressiveness - Ability to handle any design or domain
- Low solution time - Time to market
- Low short term solution cost
- Low long term solution cost
- Sufficient performance
Subgoals that go under one or more of the above are:
- High reliability
- Good testability
- Ease of modification - Modifyability
- Ease of learning
- Ease of use
- Ease of independent module development
- High reuse of in house modules
- High reuse of market modules
Note how these are domain independent, and thus reusable. Perhaps that's because UHR is basically a framework for frameworks, ie a meta framework. In UHR a module is a part, which can be a container of parts or a leaf part.
4. Key Use Cases
These are domain dependent. Our key actors are Business, Core Tech, Part Shop, Assembler, End User and Part. This choice of actors reflects a "part flow" production process, a design decision in itself.
Our first pass lists important cases. We shall see which are architecture dependent and really are key cases.
Business
- Evaluate UHR core and other items for possible adoption.
- Start simple and ramp up for easy Technology Transfer
- Train engineers and others in use of new technology.
- Make investment decisions in strategic parts inventory.
- Make investment decisions in UHR based products.
Core Tech
- Manage the companywide process of using UHR.
- Design parts inventory strategy.
- Create domain frameworks.
- Create strategic or difficult parts.
- Produce in house tools using UHR.
Part Shop
- Evaluate part feasibility request.
- Create a part.
- Create a suite of parts that use a framework.
- Evaluate part enhancement request.
- Do part enhancement.
- Fix part defect.
Assembler
- Evaluate system feasibility request.
- Design system tree.
- Assemble system from parts.
- Evaluate enhancement request.
- Do enhancement.
- Fix defect.
- Document system for in house use.
- Document systemn for end user.
- Understand an old system someone else created.
End User
- Start a system.
- Close a system.
- Customize a system.
- Build a system from scratch.
- Update parts automatically while system is running.
Part
- Receive initial DK.
- Apply new DK while running.
- Receive Message.
- Send Message.
- Get a part instance for direct use.
- Use core for mutator special use.
5. Key possible future traits and use cases
In addition to these, we list possible future Use Cases, to test Modifyability. This is an extremely useful way to discover architectural weaknesses. A "Core Part" includes non-parts such as the Part interface in Candidate Architecture 2.
- Add more node types besides Container or Leaf Part.
- Support "web structure" rather than just tree.
- Change a core part substantially.
- Change the entire core substantially.
- Replace any core part while running.
- "Heal" any part while running if in trouble. (not clear)
- Do not use Messages at all for ultra high performance.
- Do not use DK for various reasons.
- Create a super tiny core for embedded use.
- Support transactions in the core.
- Port to C++ for performance reasons.
- Use code manglers for security reasons.
- Allow entire branches or systems to migrate to another location.
- Scale up to 100,000 nodes.
- Support virtual nodes, such as container fascade to another system.
- Handle multi-threaded work.
- Load classes, DK, images, etc from server database.
- Generate systems from systems.
- Support GUI drag and drop Visual Tool.
6. Key Architecture Dependent Risks
x
7. Organize key requirements into grid with rankings
x
(to be continued)