Thursday, April 16, 2015

The words matter

From Chapter 4: Aristocracy, Democracy, and System Design

Excerpt

By the architecture of a system, I mean the complete and detailed specification of the user interface... As Blaauw has said, "Where architecture tells what happens, implementation tells how it is made to happen." He gives as a simple example a clock, whose architecture consists of the face, the hands, and the winding knob. When a child has learned this architecture, he can tell time as easily from a wristwatch as from a church tower. The implementation, however, and its realization, describe what goes on inside the case—powering by any of many mechanisms and accuracy control by any of many.
(Ch 4. p. 45)

From Slaughterhouse Five

Excerpt

Now, when I myself hear that somebody is dead, I simply shrug and say what the Tralfamadorians say about dead people, which is "so it goes."' 
(Kurt Vonnegut)
In this chapter, Brooks asserts that the conceptual integrity of a design is of signal importance and insists on the need for an architect who has been imbued with the authority necessary to preserve that integrity.

While I've had many quibbles with this visionary book, I find more object to in this particular passage than any that I've previously discussed.

Brooks begins this chapter with a description of the Rheims cathedral. He holds Rheims up as a premier example of conceptual integrity and he contrasts it with other cathedrals whose design suffers because "later builders were tempted to 'improve' upon the designs of the earlier ones." There's an implied warning to programmers in this rather strained analogy: don't get too inventive or you'll screw things up.

Arc.boutant.cathedrale.Amiens.png
Sketch of flying buttress at Amiens Cathedral
(constructed 1220-1270 AD)
To my ear, this admonition is as archaic as the flying buttress. It probably made sense back when programmers coded with a mechanical pencils on graph paper. Back then algorithms were brained out, checked and rechecked and only then keypunched for a batch run. Using all that mental muscle was a lot more efficient that re-punching a card deck and queueing up for a batch run. With the arrival of workstations interactive compilers and linkers in the 70's, that changed. Programmers started working iteratively. Today developers think nothing of compiling and linking dozens or more of times a day. It's efficient. It's flexible. Change is easy.

That's a good thing. Despite Brooks admonition, programmers must be inventive. Why?

Unlike the good-old-days of the 13th century when tools and techniques changed on a geologic timescale, architects had no need to engineer change in their designs. Tomorrow would be like today. No worries about game changing innovations in the the next year or even the next century.

Tas.de.charge
Arch C has a tas-de-charge
Nowadays tools and techniques change with the seasons. Hardware changes. Operating systems change. Programming languages change. It's enough to make your present-day software architect wish she'd lived in another era. So, asking programmers to build a system "without design improvements" would be like asking the Reim's architects to design a structure that begins construction with tas-de-charge columns and finishes with steel-beam cantilevers. But, don't forget to maintain "conceptual integrity!" And, by the way, steel-beam construction was a mid-19th-century concept, so the architects would had to have been clairvoyant, and as Yogi reminds us, "it's tough to make predictions, especially about the future." More to the point, each construction method urges a very different aesthetic. A very tall order. So tall that it suggests a serious challenge to Brooks' warning against 'improving' a design.

And, as if that wasn't enough to raise doubts about Brooks' advise, there's a bigger problem: requirements for a software systems will always be in state of flux. It's inevitable. Users will need more. Broader applications will be imagined. Infrastructures will change. If the architect did not plan for improvement, the system will become brittle and break with the smallest change. Maintenance costs will soar. And then infrastructure and culture will grow to address the inadequacies of the system. Organizations will sprout with budgets and personnel to address the shortcomings. With the budgets come the bureaucracies who will guard their very existence by setting up political ramparts to 'protect' the very system shortcomings that justify their existence. Is it any wonder that large software systems, like the NASA ground systems, live for decades and are nearly impossible to replace?

In this regard, the example of the Reimian architects fails badly. Imagine the fix they would have been in if they had to specify a building that could host both an Easter Mass and a Superbowl! Yet this is pretty much the lot of your contemporary software architect who must embrace those who would 'improve their designs,' because they hold the key to a system's long term viability. An architect who resists the need for improvement invites a high cost of ownership and widespread user resistance and antipathy.2

Perhaps the observation with the greatest potential for an adverse consequence is Brooks' invocation of the Blaauw's claim, "...where architecture tells what happens, implementation tells how it is made to happen." Here's what worries me.

In contemporary aerospace parlance, the system engineering effort defines what the system should do. The implementation effort defines how the system is to be built. The "what" is described in a requirements document. The "how" is described in a design document. So, if we take Brooks and Blaauw literally, the architect's role is to merely produce requirements and not design.

That's a bit disingenuous. Brooks also says architecture is a "specification of the user interface." Note the contradiction—a specification is a design artifact, a realization of, a specific way to meet a requirement. In other words, a specification is a how, not a what. So in that respect, Brooks is calling on the architect to designate a design and be part of the implementation effort. Note the contradiction.

This in no mere mincing of words. Remember "what is is?"3 Sometimes words matter. Underneath this seemingly pointless contradiction lies one of the biggest challenges facing the development of a new system. Countless hours have been expended in NASA debating what is a 'what' and what is a 'how'. (The answer will always be relative to context and never absolute.) Why the concern? The determination of whether a statement describes a 'what' or 'how' determines budget and decisional authority.

In the traditional view, the architect is a system engineer, pure and simple. Any attempt to designate a novel role is considered a power grab.

In the reformist view, where reformist implies that software design and development is a first order concern for space system development, the role of an architect is considered a new role. One with authority to reach across both the system engineering and design efforts. The reformist architect connects the 'how' to the 'what' and the 'what' to the 'how'. This is especially important for non-functional requirements like exensibility, maintainability and testability. Aside from a specification, those words will always be empty.

The lack of implementation authority is a severe shortcoming of the the traditional view. If an architect does not need to be responsible for the 'how', the role may be awarded to an individual who lacks the software development talent and experience required to meet the challenge of designing a software system for change. Sadly, that is the rule and not the exception.

Piacenza Bronzeleber.jpg
"Liver of Piancenza" by LokilechTool
for divining from entrails
 
And then there's the matter of defining architecture as "the complete and detailed specification of the user interface." If only that were a sufficient description of architecture, the world of software development would be a better place. Sadly, this kind of guidance promises more than it can deliver. In much the same way sheep entrails offer only the slightest hint to the soothsayer who must offer sage advice, an architecture described only as an interface relies more on the interpreter than the description.

What could go wrong? How might a "complete and detailed specification" of a user interface be inadequate?

Assume that Brooks' concept of a "user interface" is the same as we think of it today, i.e. a description of how you put data into and get data out of a functional box without looking inside. In contemporary parlance, that's a black box description.

Black boxes are wonderful because they hide the internals from a user. No need to bother with those niggling internal details. Just plug in a value and the right answer magically appears.

At least that's the theory. In practice, if something goes wrong, there is no visibility into what might be going wrong. I've seen programmers spend nerve-wracking, costly weeks debugging a problem only to find it buried in some 3rd-party library. And black boxes can also be a nightmare for testers. Consider the poor soul who trips an infrequent, non-repeatable error as the launch date nears. Was there a defect? Was it tester error? One thing's for sure, if an error can't be repeated, it can't be fixed.

As a practical matter, black box use if fine for application users, and a recipe for trouble during development. What kind of trouble? Here's a few examples that come to mind (especially for a realtime, safety-critical space applications):
  • Consider an interface that specifies an integer input and an integer output. It says nothing about what happens behind the scenes. Internally that function might be optimized by using a type with fewer bits. The result could be a value that ends up rounding off to the wrong value. In many cases that's fine, but in other cases it may produce errors. Costly errors. A related issue was cause of the Ariane V disaster.
  • Consider the complete interface specification for a library of functions. It includes a list of all inputs and outputs. But what happens if there's a loop where one function call another? How will these functions interact? Is an output affected by the order of execution? An interface specification limited to inputs and outputs will be silent about interactions.
  • Consider a application that is reused as part of another larger system. Is the reused system being used in ways that are consistent with its design? Can new interfaces be safely added to the reused system? Will the new interfaces affect existing users? How will the deployment process affect existing users? An architecture that only defines the user interface will be silent on the many design consideration for reuse and modification.

What should an architecture do? It should provide design guidance in the form of constraints for programmers. The constraints that allow for change. The architecture should also describe the semantics of the system both in front of and behind the interface. The difficulty of the task cannot be overstated, but these are the necessary keys to conceptual integrity.

I suppose all this sounds like a mere tempest in a teapot. Perhaps this short anecdote will convince you otherwise.

On my last NASA assignment, I worked for a senior manager who was responsible for the ground systems used on nearly a dozen NASA missions. It was (and is) an out of date and extremely costly system to maintain.

A few years ago, headquarters allocated better than $10 million dollars for a multi-year upgrade. It was a rare opportunity to introduce a better ground system. Our team was especially smart and experienced. We analyzed the current requirement set and developed a simple, but powerful information architecture and structural architecture. We were optimistic. We prepared an architecture description document that described how we would build the system and presented it to the management team for review.

Remarkably we were stopped dead in our tracks. Our manager withdrew the funds for our design. His reason was simple: we had wasted our time defining more than the system interface. He was convinced that you can say all that's necessary with only an interface document. No example, no amount explaination could convince him otherwise. Despite his years of experience, he had no notion of what was required to successfully architect a new system. All progress on the new system immediately ground to a halt.

Today, those modernization funds have been exhausted without a single major improvement to the system. That's how it goes in NASA. That's how it is in a large bureaucracy.

"So it goes."


1. Trevelyn, G.O., The American Revolution, Part III, Saratoga and Brandywine, Valley Forge, England and France at War. Longmans, Green, and Co. 1907.
2. Brooks will acknowledge the problem of "changeability" in a later chapter (written for the 2nd edition), but he does not address the challenge it poses for conceptual integrity.
3. Nod to Bill Clinton's statement to the grand jury in 1998. 

"It depends on what the meaning of the word 'is' is. If the--if he--if 'is' means is and never has been, that is not--that is one thing. If it means there is none, that was a completely true statement....."

No comments:

Post a Comment