Course Description

Design plays a crucial role in the success of a software product, as decisions made during the design stage have a long-lasting impact on qualities such as reliability, robustness, maintainability, scalability, and security. With the increasing use of AI-based programming tools (such as ChatGPT and Copilot), being able to effectively design large, complex software and reason about systems at scale will become highly sought-out skills in the software industry.

This course teaches students how to design complex, large-scale software systems that are reliable, robust, and built to last. It introduces fundamental concepts and techniques for designing software to achieve qualities of a successful product (such as maintainability, scalability, and robustness) and to avoid catastrophic failures. After taking this course, students will be able to (1) systematically generate and explore design alternatives, (2) specify and evaluate design options using appropriate abstractions, and (3) communicate and critique design decisions with other members of large, multi-team organizations. The discussions of these concepts will be driven by case studies of past failures and successes in real-world software systems. The course will be hands-on and involve a semester-long project where the students will work in teams to design, test, and deploy a complex software system. This course is aimed at both undergraduate and graduate students who are interested in the role of a software architect or designer in an organization.

Logistics

Prerequisites

  • Intermediate programming skills and/or experience with building medium-size programs
  • Experience with unit tests and version control systems (e.g., Git)
  • An interest in learning from failures and a growth mindset

Time & Location

  • Lectures: Mon & Wed, 9:30-10:50 AM (GHC 4303)
  • Recitation: Friday, 10:00-10:50 AM (GHC 4303)
  • Office Hours: TBD

Course Staff

Readings

There is no single official textbook for this course. Instead, readings will be assigned from academic and industry articles, book chapters, blog posts, and videos. Please see Canvas for more information about the readings.

Class Schedule

Date Topic Reading Assignment
Jan 12 Mon Introduction and motivation Just Enough Architecture Ch. 3  
Jan 14 Wed Problem vs. solution space The World and the Machine  
Jan 16 Fri Activity: Problem space    
Jan 19 Mon MLK Jr Day - No classes    
Jan 21 Wed Design abstractions Just Enough Architecture Ch. 6 & 9 HW1 out
Jan 23 Fri Activity: Modeling systems    
Jan 26 Mon Quality attributes & trade-offs Software Architecture in Practice Ch. 3; Fowler article on quality  
Jan 28 Wed Interface design Program Development in Java Ch. 9 HW1 due
Jan 30 Fri Activity: Making trade-offs    
Feb 2 Mon Design for change IEEE Software article; Parnas 1972  
Feb 4 Wed Design for change (continued) Clean Architecture Ch. 7, 10, 11, 22  
Feb 6 Fri Activity: Changeability    
Feb 9 Mon Design for testability Effective Software Testing Ch. 6, 7  
Feb 11 Wed Design for testability (continued) Effective Software Testing Ch. 4, 8  
Feb 13 Fri Activity: Testability    
Feb 16 Mon Midterm    
Feb 18 Wed Design for interoperability    
Feb 20 Fri Midterm review    
Feb 23 Mon TBD    
Feb 25 Wed TBD    
Feb 27 Fri TBD    
Mar 2 Mon Spring break - No classes    
Mar 4 Wed Spring break - No classes    
Mar 6 Fri Spring break - No classes    
Mar 9 Mon Design reviews Improving Design Reviews at Google  
Mar 11 Wed Cross-team interface design session Design It! From Programmer to Software Architect Ch. 9  
Mar 13 Fri Activity: Service integration    
Mar 16 Mon Design for scalability Designing Data-intensive Applications Ch. 1, 5, 6  
Mar 18 Wed Design for scalability (continued) Monolith first  
Mar 20 Fri Activity: Scalability    
Mar 23 Mon Design for robustness Why software quality matters  
Mar 25 Wed Design for robustness (continued)    
Mar 27 Fri Activity: Robustness    
Mar 30 Mon Chaos engineering; Design for security Chaos testing at Netflix; STRIDE approach  
Apr 1 Wed Design for security (continued) Security design principles  
Apr 3 Fri Activity: Security    
Apr 6 Mon Design for usability Mental models; Usability design heuristics  
Apr 8 Wed Design for usability (continued)    
Apr 10 Fri Spring Carnival - No classes    
Apr 13 Mon Designing AI systems    
Apr 15 Wed Designing AI systems (continued)    
Apr 17 Fri Project work time (no recitation)    
Apr 20 Mon Course review    
Apr 22 Wed Project presentations    
Apr 24 Fri Exam review    

Learning Objectives

After taking this course, students will be able to:

  • Describe, recognise, and apply design principles for (but not limited to): Reusability, testability, changeability, robustness, scalability, security, and safety.
  • Explain how to adapt a software design process to fit different domains, such as robotics, web apps, mobile apps, and medical systems
  • Identify, describe, and prioritize relevant requirements for a given design problem
  • Generate viable design solutions that appropriately satisfy the trade-offs between given requirements
  • Apply appropriate abstractions & modeling techniques to communicate and document design solutions
  • Evaluate design solutions based on their satisfaction of common design principles and trade-offs between different quality attributes

Course Philosophy

Hands-on Experience in a Collaborative Project

Interesting design challenges usually arise in complex systems and can only be fully understood via first-hand experience. Therefore, teams in this course will work together on a single project to collaboratively build a complex system that involves design decisions and discussions of interfaces between different teams. We will provide support structures to help you navigate potential cross-team issues.

Growth Mindset & Learning from Failures

When working on a complex software project, design issues and challenges will inevitably arise. In this course, we embrace a growth mindset and encourage students to see challenges in the project as an opportunity to learn based on the motto: “If you fail and you know why, you’ve succeeded. If you succeed and you don’t know why, you’ve failed”. We will focus on continuous, semester-long improvements, rather than achieving perfection in the first attempt.

Active Student Participation

Educational research shows that active student participation in lectures is crucial for ensuring a deep understanding of the material [MIS]. So rather than just presenting design principles in a traditional lecture style, our lectures are based on real-world case studies from which we will derive design principles together.

[MIS]: Brown, Peter C., Henry L. Roediger III, and Mark A. McDaniel. Make it stick: The science of successful learning. Harvard University Press, 2014.

Assessments

  • 20% Homework: 3-4 individual homeworks mostly focusing on software design problems from case studies discussed in class.
  • 50% Project: Multiple milestones involving development of a fully functional system, along with design documents and reflections, critiques, and a final project presentation.
  • 20% Exams : In person, open-book midterm & final.
  • 10% Participation: Active participation in class discussions and recitations, and completion of end-of-lecture exit tickets.

Course and Grading Policies

Participation Policy

Class participation will be graded by lecture and recitation engagement, including asking relevant questions, contributing to class discussions, and participating in in-class exercises. Completion of exit tickets will also count towards the participation grade.

Time Management

This is a 12-unit course, and it is our intention to manage it so that you spend close to 12 hours a week on the course on average. In general, 4 hours/week will be spent in class, 1-2 hours on readings, and 6-7 hours on assignments and the project. Please give the course staff feedback if the amount of time you spend on the course differs significantly from the expectations. We are happy to provide tips on time management and will adjust the course load if we notice that many students are raising issues.

Late Submission Policy

We understand that it is sometimes difficult to avoid conflicting deadlines or other obligations such as job interviews. If you need additional accommodations, please contact us.

Academic Integrity

Honesty and transparency are important to good scholarship. Plagiarism and cheating, however, are serious academic offenses with serious consequences. If you are discovered engaging in either behavior in this course, you will earn a failing grade on the assignment in question, and further disciplinary action may be taken. For a clear description of what counts as plagiarism, cheating, and/or the use of unauthorized sources, please see the University’s Policy on Academic Integrity.

In this course you are allowed to discuss potential solution ideas to individual homework with other students in order to practice brainstorming and communication between software engineers. However, your solution still has to be your own and should not be identical to the solution of your discussion partners. You may not show your final solution to other students before you both have submitted your solution. This applies to source code as well as write-ups.

The use of generative AI has to be explicitly documented as such. While we encourage you to critically engage with generative AI and experiment with it for different types of design tasks, it is your responsibility to check the quality of the output from an LLM. Generative AI is not allowed on exams or exit tickets.

If you have any questions regarding plagiarism or cheating, please ask us as soon as possible to avoid any misunderstandings. For more information about Carnegie Mellon’s standards with respect to academic integrity, you can also check out the Office of Community Standards & Integrity website.

Student Wellness

As a student, you may experience a range of challenges that can interfere with learning, such as strained relationships, increased anxiety, substance use, feeling down, difficulty concentrating and/or lack of motivation. These mental health concerns or stressful events may diminish your academic performance and/or reduce your ability to participate in daily activities. CMU services are available, and treatment does work. You can learn more about confidential mental health services available on campus at the Counseling and Psychological Services website. Support is always available (24/7) from Counseling and Psychological Services: 412-268-2922.