- Simplicity versus Flexibility versus Optimality
- Knowing the Problem You're Trying to Solve
- Overhead and Scaling
- Operation Above Capacity
- Compact IDs versus Object Identifiers
- Optimizing for the Most Common or Important Case
- Forward Compatibility
- Migration: Routing Algorithms and Addressing
- Making Multiprotocol Operation Possible
- Running over Layer 3 versus Layer 2
- Determinism versus Stability
- Performance for Correctness
- In Closing
Before we design a solution, it's often useful to define the problem to be solved. The counterargument is that if we do that, we might design something only for the problems we think of, whereas if we design without preconception of the problems, there might be applications we would otherwise never dream of. Although I appreciate the advantages of flexibility and generality, I think it's a good idea to have at least one well-defined problem in mind, perhaps designing the system so that other variants can be supported without making the solution too complicated.
Sneeze protocol: First you sneeze. Then someone says, "Gesundheit." Then I suppose you must say, "Thank you." Then I suppose you must say "You're welcome." I think, at that point, the protocol terminates. The only problem is, what has it accomplished? I'd say all the messages in the sneeze protocol are wasted messages. In fact, if I involuntarily make an embarrassing noise, the protocol I wish everyone around me would follow is the "pretend they didn't notice" protocol.
An example is policy-based routing. The general problem is easy to state. Some paths are willing to carry only certain types of traffic. Some traffic finds only certain paths acceptable. But nobody ever describes all the known actual customer needs. BGP provides some set of policies but not the general case. For example, a BGP router chooses a single path to the destination without taking into account the source. It's quite likely that packets from different sources would need to be routed differently. So BGP doesn't even solve all the known cases; it solves only what it happens to solve.
Does BGP solve the important cases, or has the world adapted to what BGP happens to solve? If it's the latter, would the world have been satisfied with a more conveniently accommodated subset, or perhaps even without policy-based routing at all?
Real-life example of "know the problem": When my son was three I saw him in the hallway crying, holding up his hand, saying, "My hand! My hand!" I took his hand lovingly and kissed it a few times and said, "What's the matter, honey? Did you hurt it?" He sobbed, "No, I got pee on it."