Pattern-Oriented Software Architectures for Concurrent and Networked Software
This ten week Coursera massive
open online course (MOOC) entitled Pattern-Oriented
Software Architectures for Concurrent and Networked Software
taught students how to apply patterns and frameworks to alleviate the
complexity of developing concurrent and networked software. Students
wrote concurrent and networked software programs in popular
open-source pattern-oriented software architecture frameworks, such as
Android (Java) and ACE (C++). The course
began on March 4th, 2013 and ran through the middle of May, 2013.
About this Course
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:
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
- 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
- Operating system mechanisms -- such as event demultiplexing,
multi-threading, multi-processing, and dynamic linking.
Upon completing this course, students will be able to:
- Recognize the inherent and accidental complexities involved with
developing concurrent and networked software.
- Understand how pattern-oriented software architecture techniques
can and cannot help to alleviate this complexity.
- Apply key pattern-oriented software architecture techniques to
develop reusable concurrent and networked software infrastructure
- Utilize object-oriented programming language and middleware to
develop concurrent and networked software.
- Understand advanced operating system mechanisms and use them
effectively to develop concurrent and networked software.
- Know where to find additional sources of information on how to
successfully apply pattern-oriented software architecture techniques
to concurrent and networked software.
The class will consist of lecture videos with integrated quiz
questions designed to ensure that you're understanding material
covered in the videos. There will also be weekly auto-graded
standalone quizzes, as well as peer-graded short essays and
programming assignments that are not part of the videos and optional
reading material. The programming assignments will involve writing
concurrent and networked software in popular pattern-oriented software
architecture frameworks written in Java (such as Android) and C++ (such as ACE and Boost). There will also be an
optional final exam.
The course is intended for students who are familiar with
- General object-oriented design and programming techniques, such
as patterns, modularity, and information hiding
- Fundamental OO programming language features, such as classes,
inheritance, dynamic binding, and parameterized types
- Basic systems programming concepts, such as process/thread
management, synchronization, and interprocess communication
- Networking terminology, such as client/server architectures and
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
The PDF and PowerPoint versions of all the slides used in the
course will be available online as the videos become available on the
course website. You can download this material from here.