Sunday, September 5, 2010

Software Design Principles and the Building of the Internet

The article "The Design Philosophy of the DARPA Internet Protocols" impressed me as it described a very organic process for building a successful large software system. It struck me as a very healthy way to build a software product and one which many of the modern software development methods share much in common with. It also shows that good engineering principles have existed for many years, even though we still flounder in our attempts to codify an apply them consistently.

The first principle the article exemplfies is that of properly defining and prioritizing requirements. The builders of the Internet knew exactly what their client, the government, needed, and knew exactly the order of importance of the requested features. Prioritization of features is especially important when the cost of implementation of features is calculated during the initial design and implementation phases. For instance, if a feature is of relatively low importance to a customer but would require disproportionately significant engineering effort to implement, it can be safely discarded even if it is higher in priority than other features that are much easier to integrate into the system.

In relation to the first principle, I was also impressed that the designers of the Internet did not attempt to generate a cohesive design that would fulfill the majority of their customer requirements at once. Instead, they focused on the most important features first and then iteratively modified their design as they reconsidered the extending the existing system to fulfill new requirements. As an example, TCP was originally written as the common protocol by which the primary government requirements of robust, reliable communication between disparate networks would be met. However, when the system was analyzed in light of the need for multiple types of service, the Internet authors subsequently split TCP into TSoftware Design Principles and the Building of the InternetCP and IP and added UDP as an alternative transport layer protocol. This organic growth process is much easier for a development team to cope with, and also allows for the team to show progress and obtain feedback faster by delivering working software to their clients sooner.

Finally, the architecture of the Internet is a great example of effective distributed system design, and shows one way one of the most fundamental problems of software design, the problem of composing reusable software components, was handled. Evidence of this problem's inherent complexity abounds, from the existence of module frameworks like OSGi to dependency injection systems like Spring, to the fundamental methods of composition found in differing software paradigms like object-oriented and functional programming. The design of the Internet has been described as effectively applying the "end-to-end" principle in meeting its objectives in a layered architecture. Value lies in studying both this generic principle and its specific manifestation in the TCP/IP stack in order to learn more about how to compose software component in building a larger system.

No comments: