Introduction

Course Background and Goals

This may be the only course in the world dedicated entirely to software design:

  • How should large systems be structured?
  • What does good code look like?
  • What is the role of design in the software development process?

Goal for the class: enhance design awareness

  • Change the way you think about programming
  • Provide vocabulary for talking about design
  • Present a set of principles of software design
  • Develop critical skills: recognize good and bad designs (red flags)

Complexity

Why does design matter? Too hard to build and evolve large software systems:

  • Can't understand how they work
  • Can't figure out how to fix bugs or implement new features
  • Hard to produce code without bugs (can't predict implications of a change)

Complexity: anything related to the structure of a system that makes it hard to understand and modify the system.

No-one can fully understand a large software system: can't keep it all in your mind at once

What makes systems complicated?

  • Lots of little things: complexity is incremental
  • Examples: dependencies, inconsistencies, special cases

Complexity increases as a system ages

Most important overall goal for design: reduce apparent complexity

  • Eliminate complexity
  • Hide complexity: modular design
    • Decompose large system into pieces that are mostly independent
    • Each module is relatively small
    • Most coding tasks involve only a few modules
    • Allows more functionality before system becomes unmaintainable

Result: make it easier to work with large systems that have lots of functionality.

Role of Design in the Software Development Process

Software design is a continuous process: different from other kinds of engineering

  • Most engineering areas: design is only done at the beginning of a project
  • Early days of software: waterfall model: divide development into distinct phases: requirements definition, design, coding, testing, maintenance.
  • Problem: can't visualize a large software system well enough to design it all in advance
  • Approaches today tend to be more incremental (e.g. agile development).
  • Eliminate all up-front design?
  • Compromise approach works best:
    • Design a bit
    • Implement and evaluate
    • Refactor to fix problems
    • Design a bit more, and repeat
  • What you learn in earlier phases reduces mistakes in later phases
  • Will still make mistakes: must constantly be looking for and fixing design problems.

Course Structure

Iteration

  • Create a nontrivial application from scratch
  • Receive criticism
  • Rewrite to fix problems

Criticism:

  • I will read all projects
  • You will read each other's projects
  • In-class code reviews

Goal for course: minimize apparent complexity

  • Clean, simple, obvious
  • Correctness less important (within reason)

Class organized around 3 projects:

  • Projects 1 and 2: Raft protocol for distributed consensus
    • Project 1: leader election mechanism, communication
    • Project 2:
      • Revise, based on code reviews
      • Add log mechanism, implement replicated shell
  • Project 3: simplified version of make utility
  • Work in teams of 2
  • Code in C++

Class format: studio (discussion, interaction):

  • Lectures (only a few): around 50 minutes
  • Studios (code reviews, exercises, etc.): 80 minutes
  • Some classes cancelled to make time for programming
  • Class attendance is mandatory
  • Grading policy:
    • No exams
    • Grades based on project work and class participation
  • 3 late days
  • Office hours
  • Ed for communication

Class participation is essential

Giving and receiving criticism is very important

  • Expect to receive lots of feedback, may be intense:
    • Unlikely that any of you is already a good programmer
    • Small details matter
  • Keep criticism constructive:
    • It's about the code, not the person
    • Remember that everyone is learning
  • Growth mindset

Book: read all but Chapters 19-20 by Friday.

I'm interested in feedback on the class

Get started right away!

  • Pick partners immediately
    • Meet after class
    • Send me info: Google ids, GitHub ids
  • Read Raft paper, Project 1 writeup, start designing/coding
  • Read APOSD

This week: discuss Raft (read the paper by Wednesday)

Next week: review material from APOSD