Despite continuous improvements in processors and networks during the past four decades, however, developing quality concurrent and networked software remains hard; developing quality reusable concurrent and networked software is even harder. The principles, methods, and skills required to develop such software can be greatly enhanced by understanding how to create and apply patterns and frameworks. A pattern describes a reusable solution to a commonly occurring problem within a particular context. When related patterns are woven together they form a pattern language that provides a vocabulary and a process for the orderly resolution of software development problems. A framework is an integrated set of software components that collaborate to provide a reusable architecture for a family of related applications. Frameworks can also be viewed as concrete realizations of pattern languages that facilitate direct reuse of design and code.
This course describes how to apply patterns and frameworks to alleviate many accidental and inherent complexities associated with developing and deploying concurrent and networked software. These patterns and frameworks have been used successfully in many domains, including telecom/datacom, mobile devices, electronic medical imaging, network management, aerospace, avionics, automation, online gaming, and financial systems. Over the coming weeks and months I'll illustrate by example how patterns and frameworks simplify and enhance the development of concurrent and networked software via the use of:
- Object-oriented design concepts and notations -- such as encapsulation, abstraction, polymorphism, extensibility, and the Unified Modeling Language (UML).
- Object-oriented programming language features -- such as classes, inheritance, dynamic binding, and parameterized types available in languages like Java, C++, and C#.
- Middleware -- which is infrastructure software residing between applications and the underlying operating systems, networks, and hardware that encapsulates heterogeneity and enables control over key end-to-end quality-of-service properties, such as dependability and security.
- Operating system mechanisms -- such as event demultiplexing, multi-threading, multi-processing, and dynamic linking.