This course focuses on pattern-oriented software architecture for concurrent and networked software. Concurrent software can simultaneously run multiple computations that potentially interact with each other. Networked defines protocols that enables computing devices to exchange messages and perform services remotely. The topics in this course are timely since the advent of multi-core and distributed-core processors--coupled with ubiquitous wireless and wireline connectivity--is increasing the demand for researchers and practitioners who understand how to successfully develop and deploy concurrent and networked software.
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.
We'll explore several case studies from the domains of mobile apps, web servers, object request brokers, avionic control systems, and expression tree processing to showcase a time-tested pattern-oriented software design and programming method for concurrent and networked software.
The course is organized as follows:
Section 0: Overview of all the topics covered in the course. This material is designed to help you visualize the motivations for--and challenges of--of concurrent and networked software. We also summarize how patterns and frameworks help address key challenges of concurrent and networked software.
Section 1: Introduction to concurrency and networking, which provides background info pertaining largely to the OS and middleware layers. We discuss key design dimensions of concurrent and networked software, as well as review common operating system programming mechanisms and Android programming mechanisms. This part focuses on concepts and is generally independent of programming language.
Section 2: Overview of patterns and frameworks, which focuses on pattern-oriented software architecture, with an emphasis on concurrent and networked software. We explore key pattern and framework concepts, relationships, and examples, as well as evaluate the pros and cons of patterns and frameworks. Small code examples are shown throughout using C++ and Java, though this section concentrates more on design rather than programming.
Section 3: Applying patterns and frameworks to develop concurrent and networked software, which examines lots of code. An open-source web server is used as a running example to illustrate patterns and frameworks pertaining to service access, communication, synchronous event handling, connection establishment, service initialization, service configuration and activation, concurrency and synchronization, and asynchronous event handling. These examples are in C++ using ACE.
Appendix: Presents a case study that applies many "Gang of Four" patterns that aren't directly related to concurrent and networked software. Evaluates the limitations with algorithm design and shows how pattern-oriented design alleviates these limtations. The examples are largely in C++, again with some Java examples to show how pattern-oriented design simplifies portability across programming languages.
It's only day 2 of this class but already we've had more than a week's exposure to the study material. The lectures are university-quality and the material is relatively easy to understand if you're a programmer or systems analyst.