MPCS 51205 Topics in Software Engineering (Autumn 2022)

Section 1
Instructor(s) Shacklette, Mark (jmshackl)
Location Online
Meeting Times Monday 4:10pm - 6pm
Fulfills Elective Specialization - Software Engineering (SE-2)


*Please note: This is the syllabus from the 2021/22 academic year and subject to change.*
This course is an intermediate approach to applied software design and development methods for use in creating efficient, reusable, and modular software.  This course is offered annually but content and focus change from year to year.  Methods we investigate include: distributed systems, architectures including microservices, event-driven architecture, Hybrid Transactional/Analytical Processing; software frameworks and container-based software development; and advanced techniques including multi-threading and data design.  A heavy focus is on design and creativity and what constitutes creative design.

This course provides hands-on experience in the architecture and design of systems and a review of best practices for the communication of that design.  Issues in the landscape of software design, including complexity, constraints, progressive discovery, and limitations in communication will be explored.  In this course, students will be organized into teams and each team will be provided with a set of (partial) requirements and will be responsible for the analysis, design, design documentation, and implementation in source code of a project that constitutes a complex software system. Each team of students will work through requirements analysis, expression of design using a modeling language, and implementation, and techniques and tools will be provided in order to facilitate the delivery.  
The progression of design will be peer-reviewed by the student teams.  We will work within an "Agile" design and implementation framework and adopt agile approaches to lean design.  One of our efforts will be to dispel the myth that design is not performed within an agile environment.
During the course and lectures, we will cover the following topics:
Why is design important, even in an agile environment?
Attributes of good design: coupling, cohesion, law of Demeter, generic solutions vs. specific solutions
What is the role of modeling in software development?
Documenting and communicating software design using the Unified Modeling Language notation
Lean thinking and lean modeling
Design guidelines for quality, interoperability, modifiability, performance, security, testability, and maintainability
The role of patterns in designing software and design refactoring
Decomposing systems into recognizable patterns

Course Prerequisites

Core Programming and satisfactory completion of the Unix Bootcamp.

Other Prerequisites

Knowledge of Java and/or C++ and/or Python

This course requires competency in Unix and Linux. Please plan to attend the MPCS Unix Bootcamp ( or review the UChicago CS Student Resource Guide here:

Overlapping Classes

This class is scheduled at a time that conflicts with these other classes:

  • MPCS 50101-1 -- Concepts of Programming
  • MPCS 51036-1 -- Java Programming
  • MPCS 51040-1 -- C Programming
  • MPCS 51042-1 -- Python Programming

Eligible Programs

Masters Program in Computer Science MS in Computational Analysis in Public Policy (Year 2) MA in Computational Social Science (Year 2) Bx/MS in Computer Science (Option 2: Professionally-oriented - CS Majors) Bx/MS in Computer Science (Option 3: Profesionally-oriented - Non-CS Majors)