Topics & Readings
Week 1 - Intro
Key Ideas
- Challenges of writing good software.
- Understand where Software Engineering as a discipline comes in.
- Introduce this course's perspective.
- Establish how this course will work.
Required Context
APoSD: Chapters 1-3, and 19
These first few chapters introduce some key concepts about why writing software is hard.
Why Software Fails - A short essay on the reasons and ways software fails.
References & Additional Resources
- A Philosophy of Software Design Review - A reminder to view this book, and any book of this kind, with a grain of salt.
- Programmers: Stop Calling Yourselves Engineers - A case that the word engineering implies more than the field lives up to.
- Why Are Software Engineers (Not) Engineers? - A viewpoint on the word engineer as it applies to job titles.
- Programmer Archeologists
- Against Software Development
Week 2 - Designing for the Public
Key Ideas
- Understand user-centered and human-centered design.
- Discuss their importance to civic technology.
- Consider how these principles will apply to building your projects.
Required Context
- Code for America: What does it mean to build with, not for?
- usability.gov: User Centered Design
- UCD Introduction
- Community Based, Human Centered Design
References & Additional Resources
- usability.gov: Benefits of UCD
- Embedding Equity in Civic Design to Transform Customer Experience
- Scenario Mapping: Design Ideation Using Personas
- The Eight Golden Rules of Interface Design
Week 3: Building Together
Key Ideas
- Understand common software methodologies.
- Learn a pragmatic approach to working together in a small team.
- Learn to use version control effectively on a team.
- Learn about code quality tools in software collaboration.
Required Context
- APoSD Chapters 4-9 - These chapters discuss modular software design. This is useful as we think about working in a collaborative team, and will help greatly when we need to test our code.
- APoSD Chapters 11-15 - These chapters focus on making your code understandable. This is an increasingly important consideration as your team size grows.
References & Resources
- Agile Manifesto - A document created by a gathering of software developers that is responsible for the "agile revolution."
- Heuristics for Effective Software Development Organizations
- Managing the Development of Large Software Systems - the original "Waterfall" paper, which you will find, does not actually advocate for the waterfall method as it is often understood.
- Breaking Down Tasks - a recent blog post by Jacob Kaplan-Moss, which does an excellent job of talking through the process of scoping work with few assumptions.
- GitLab Engineering Handbook - A well-written set of engineering values from an open source team.
- Atlassian's Agile Guide - A comprehensive guide to agile methodologies from the company behind a very popular suite of agile tools.
- Conventional Commits - A popular git commit style guide.
- Bikeshedding - A term to recognize & avoid a common problem on teams.
Week 4: Building Reliable Software
Key Ideas
- Using Git and GitHub effectively on a team.
- Examine different types of software testing & best practices for writing testable software.
Required Context
- Python Testing Overview - Notes from 30122 on testing in Python, review if you haven't thought about testing in a while.
- APoSD Chapter 10 - This chapter discusses exceptions. Note that it is a somewhat unorthodox stance, and not necessarily in line with how most Python programmers think of exceptions.
- APoSD Chapter 19 - A short chapter on the author's stance on various trends in software development. (Part of the path to developing your own taste when it comes to software is getting opinions from experienced people and deciding which parts fit your personal style.)
- APoSD vs Clean Code - A discussion/debate between the author of APoSD and another popular book, Clean Code.
References & Resources
- You are never taught how to build quality software - On the importance, and neglect of, Quality Assurance
Week 5: Interfaces & APIs
Key Ideas
- Principles of interface design.
- Introduce some design patterns (our first) that relate to interface design.
- Examine common interfaces through a look at HTTP & related API paradigms.
Required Context
It will be helpful to come having prepared on two topics:
1. HTTP
We'll be using HTTP both as an example of interface/protocol design & it will assist in our discussion of APIs. It will be helpful to understand the differences between HTTP verbs, and the general structure of an HTTP message.
Unless you have covered this in another course, I would recommend reading the first four sections of this guide: https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Overview
You can skim/skip anything about HTTP/2 or QUIC. Those are encrypted versions of the HTTP/1.1 protocol, and do not change the message format.
You have what you need after the fourth section, everything starting with MIME types is too in-depth for our purposes.
2. REST
You may have heard the term REST or RESTful API. This is an hugely influential concept in modern API & web application architecture.
This is the paper that coined the term:
Fielding, Roy Thomas. Architectural Styles and the Design of Network-based Software Architectures (2000) - Chapters 5 and 6
This is admittedly not the easiest read, especially if you haven't read this particular kind of writing before.
You may find it useful to refer to the Wikipedia article on REST, which also provides helpful context and a thorough summary.
References & Additional Resources
- Notes on Good API Design - A concise essay that expresses some of the key principles of good APIs.
- A Retrospective on github3.py - A retrospective on a popular Python library and the interface choices it made.
Week 6: Functional Patterns
Required Context
We'll be discussing functional programming patterns this week.
I would recommend reading this helpful introduction to functional concepts in Python:
It will also be helpful for Wednesday's class to have read over this:
Also, now is a good time to be thinking about the topics in APoSD Chapters 17 & 18 which are applicable to our next few weeks.
References & Resources
- Functional Core, Imperative Shell
- Boundaries
- 30122 Notes: Data Pipelines
- Stanford Data Science Handbook
Week 7: OOP Design Patterns
Required Context
If you haven't read APoSD Chapters 17 & 18 now would be the time to do so.
I would also suggest looking at a few patterns either in Refactoring Guru or Python Patterns below. Choose 2-3, to get a sense of how the author(s) recommend you approach patterns.
References & Resources
- Refactoring Guru's Design Patterns - a nice guide to design patterns that's a bit more readable than the Gang of Four book (below)
- "Gang of Four" book: Design Patterns - the canonical text on Design Patterns. More geared towards OOP than most modern programmers would prefer, but still well-regarded.
- Python Design Patterns - A thoughtful reimagining of the "Gang of Four Book"
Week 8: Refactoring & Advanced Architecture
Our penultimate week together we will focus on what happens as applications grow and need to be refactored, as well as architectures beyond those introduced earlier in the quarter and when you would adopt them.
There are no required readings this week.
References & Resources
- The book Tidy First by Kent Beck, an excellent short primer on refactoring.
- Cosmic Python
- Clean Architecture
- Writing I/O-Free (Sans-I/O) Protocol Implementations