Module 1 — Course Logistics
1.1 Course Introduction [ Slides pdf ] [ Slides pptx ]
1.2 Course Mechanics [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain in general terms what software engineering is
- List your weekly obligations as a student
- List the requirements for completing the course
Module 2 — Connecting Requirements and Code
2.1 User Stories [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the structure of a user story
- Identify and fix user stories that don't have the correct structure
- Define the relationship between conditions of satisfaction and user stories, and the difference between essential, desired, and extension conditions
- Identify whether a given condition of satisfaction actually relates to a given user story
- Propose new conditions of satisfaction for new user stories
2.2 Requirements and Risk [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the overall purposes of requirements analysis
- Recall the three major dimensions of risk in requirements analysis
- Explain the connection between requirements analysis and user stories
- Identify functional and non-functional requirements, and give examples of each
2.3 Testing Conditions of Satisfaction [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the basics of Test-Driven Development
- Derive testable behaviors and tests from conditions of satisfaction
- Begin developing simple applications using TypeScript and Vitest
- Learn more about TypeScript and Jest from tutorials, blog posts, and documentation
2.4 When Have I Written Enough Tests? [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain how TypeScript types and documented preconditions influence what tests you need to write
- Explain what code coverage is, and how different measures differ, including statements, branches, functions, and lines
- Explain the benefits of mutation testing
2.5 Testing Integrated Software Systems [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the difference between unit and integration tests.
- Describe the role of test doubles in reducing the size of the "SUT" (System Under Test).
- Identify basic uses of mocking in Vitest and the goals that mocking serves.
- Identify (anti)patterns in software that can lead to tests being flaky.
Module 3 — The Web's Software Stack
3.1 Web Applications [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the role of “client” and “server” in the context of web application programming
- Explain the primary options for client-server communication in modern web applications
- Identify places where TypeScript does — and doesn’t! — help with writing correctly-behaving web applications, and identify some of the solutions to functionality TypeScript doesn’t provide
3.2 Architecting Simple Web Services [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain what "business logic" is
- Describe the fundamental differences between the three layers of the controller, service, and repository layers in a C-S-R architecture
- Explain the difference between “horizontal" and "vertical" scaling
- Know what someone is talking about when they say "microservices"
3.3 The Context of Asynchronous Programming [ Code txt ]
The goal of this lesson is to prepare you to:
- Explain the technical reasons that helped NodeJS became a popular basis for programming web servers
- Explain what what "synchronous" and "asynchronous" mean in the context of asynchronous programming
- Differentiate cooperative and preemptive multitasking
- Differentiate concurrency and parallelism as concepts
- Identify the uses of callbacks, "classic" promises, and awaited promises in concurrent programming
3.4 Concurrency Patterns in Typescript [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Given a simple program using async/await, work out the order in which the statements in the program will run
- Write simple programs that create and manage promises using async/await
- Write simple programs to mask latency with concurrency by using non-blocking IO and Promise.all in TypeScript
3.5 JavaScript in the Browser [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Describe the relationship between JavaScript, TypeScript, HTML, and the Document Object Model (DOM)
- Explain the historical and present value of "frontend tooling"
3.6 React [ Code txt ] [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Understand how the React framework binds data (and changes to it) to a UI
- Explain the relationship between JSX and JavaScript
- Create simple React components that use state and properties
3.7 React Hooks [ Code txt ] [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the basic use cases for useEffect
- Explain when a useEffect is executed, and when its return value is executed
- Construct simple custom hooks and explain why they are useful.
Module 4 — Working in (Agile) Teams
4.1 Software Process [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Know the basic characteristics of the waterfall software process model
- Be able to explain when the waterfall model is appropriate and when it is not
- Understand how the waterfall and agile models manage risk
- Be able to explain how agile process instill quality, including through test driven development
4.2 Agile Planning and Estimation [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Describe how agile planning manages uncertainty by creating detailed plans only for the most immediate tasks
- Explain how agile planning decomposes large projects into individual tasks that can be estimated
- Understand the key artifacts and process steps in Scrum
4.3 Teams [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain key advantages of working in a team and sharing information with your team
- Describe the HRT pillars of social interaction
- Understand why small teams are effective for agile processes
- Apply root-cause analysis to construct a blameless post- mortem of a team project
4.4 Pair Programming [ Slides pdf ] [ Slides pptx ]
Module 5 — Agile in the Cloud
5.1 Cloud Infrastructure [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain what “cloud” computing is and why it is important
- Explain why shared infrastructure is important in cloud computing
- Discuss trade-offs that you might consider for self or vendor-managed platforms
5.2 Continuous Deployment [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain the general elements of continuous deployment systems (dependencies, configuration, and secrets).
- Explain how containers differ from VMs, and the tradeoffs between them
- Deploy a basic website using a public or private container-as-a-service provider
5.3 Continuous Integration [ Slides pdf ] [ Slides pptx ]
5.4 Continuous Delivery [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Describe how continuous integration helps to catch errors sooner in the software lifecycle
- Describe strategies for performing quality-assurance on software as and after it is delivered
- Compare and contrast continuous delivery with test driven development as a quality assurance strategy
5.5 Testing Web Applications [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Describe some points in the landscape of testing front-end web applications (snapshot testing, visual tests, interaction tests)
- Identify major tools in the frontend testing space (Storybook, Playwright, Cypress, Puppeteer, Selenium), and how they compare to tools like Jest and Vitest.
- Explain the role that quality assurance has within Agile development and continuous delivery.
Module 6 — Perspectives on Software Design
6.1 Security [ Slides pdf ] [ Slides pptx ]
The goal of this lesson is to prepare you to:
- Explain why you should always hash and salt your passwords
- Have basic literacy in some key cryptographic primitives (hashes, message authentication codes, and encryption)
- Define key terms (attack surface, threat model) relating to software/system security
- Explain why all aspects of software engineering are necessary to think about in order to think about security