1. Intro to Software Engineering
This unit introduces the idea of software engineering, including how it is similar and different from programming, and a host of considerations for building software that is scalable and maintainable over time.
Intro to the Course
This unit introduces the idea of software engineering, including how it is similar and different from programming, and a host of considerations for building software that is scalable and maintainable over time.
- (Self-check covering tracing, OOP, lists, maps, and debugging)
Lab 1 + What is Software Engineering?
Last day to add / drop
2. Version Control & Branch Management
Version control is perhaps one of the most important topics in software engineering. Version control systems allow teams to collaborate on projects, review one another's code, experiment with new features and ideas, and revert to previous versions when needed. In this unit, we will explore different approaches that teams might take to organize their code repositories. We will also do various hands-on activities so that you can familiarize yourself with bash and git commands.
Intro to Version Control
Version control is perhaps one of the most important topics in software engineering. Version control systems allow teams to collaborate on projects, review one another's code, experiment with new features and ideas, and revert to previous versions when needed. In this unit, we will explore different approaches that teams might take to organize their code repositories. We will also do various hands-on activities so that you can familiarize yourself with bash and git commands.
- Chapter 16. Version Control and Branch Management Link
Lab 2: Version Control Part 1
Version Control and Collaborative Workflows
- Git Wikipedia article
Read the "History" and "Characteristics" sections.
- Pro Git book
The Pro Git book provides some useful context and conceptual models, particularly 2.1-2.5, 3.1-3.1, and 3.6.
- Git Collaboration Activity (Take after completing the in-class git collaboration activity)
3. Everything As Code (+ Docker)
In this unit, we will explore the idea of formalizing your entire software stack using code (e.g. operating system configurations, dependencies, documentation, and more). Even if your team is collaborating on the same codebase, if each team member is developing software with a different compiler, interpreter, language version, operating system, etc., you will likely run into conflicts and inconsistencies. Give this, you will learn about why "everything as code" is such an important idea, and some tools and strategies for managing your system stack over time.
Version Control Wrap
In this unit, we will explore the idea of formalizing your entire software stack using code (e.g. operating system configurations, dependencies, documentation, and more). Even if your team is collaborating on the same codebase, if each team member is developing software with a different compiler, interpreter, language version, operating system, etc., you will likely run into conflicts and inconsistencies. Give this, you will learn about why "everything as code" is such an important idea, and some tools and strategies for managing your system stack over time.
4. Package & Dependency Management
Package & Dependency Management
Lab 5. Package Managers
- Lab 5: Understanding Package Managers
- (Take after completing Lab 5)
5. Testing, Static Analysis, & Continuous Integration (CI)
Continuous integration (CI), static analysis, and testing are complementary software development techniques that ensure that teams can deploy software continuously with a high degree of confidence in the quality of their code. In this unit, we will learn about ways you and your team can automate code testing and validation procedures before merging code updates into the main branch. By setting up a few tools up front, you will save time and energy and increase the reliability of your code base.
Intro to Testing
Continuous integration (CI), static analysis, and testing are complementary software development techniques that ensure that teams can deploy software continuously with a high degree of confidence in the quality of their code. In this unit, we will learn about ways you and your team can automate code testing and validation procedures before merging code updates into the main branch. By setting up a few tools up front, you will save time and energy and increase the reliability of your code base.
Testing Lab: Rock, Paper, Scissors
- Lab 6: Testing & Static Analysis
Static Analysis & Continuous Integration
Testing, Static Analysis, & Continuous Integration (CI)
- Project 1 Set-Up
- Project 1: UNCA Course Lookup
6. Midterm Exam Review & Midterm
This unit is dedicated to consolidating what we have covered so far. The midterm will draw on the big ideas from the first half of the course, so it is important that you actively study the study questions for each topic, review the assigned readings, and revisit both the programming problems and the git collaborative workflow we practiced in class and labs. Use the mid-semester review session to identify gaps and ask questions before the exam.
Fall Break
Mid-Semester Review
- Mid Semester Review Cheat Sheet
- Mid-Semester Review
- Please review all of the readings and study questions assigned thus far, in preparation for the mid-term review.
Midterm Exam
- Midterm Exam
7. Back-End: the MVC Design Pattern + AsyncIO
As applications grow beyond simple scripts, structure and concurrency become essential. In this unit, we introduce the Model–View–Controller (MVC) design pattern as a way to organize server-side code so that data, presentation, and control logic stay separable and maintainable. We also explore AsyncIO in Python, which helps you write non-blocking back-end code that can handle many concurrent tasks efficiently -- an important foundation for responsive web services.
AsyncIO + MVC
- AsyncIO + MVC
- AsyncIO Activity
MVC Lab Slides
- MVC Lab Slides
- Lab 7: AsyncIO + MVC
8. Back-End: Databases & ORMs
Most real applications need durable, queryable storage. In this unit, we introduce relational databases and SQL as the foundation for persisting application data, then turn to object-relational mappers (ORMs) such as SQLAlchemy. Understanding how to model data, query it effectively, and bridge between database tables and application objects is critical for building reliable back-end systems.
Back-End: Databases & ORMs
Intro to Databases & Object-Relational Mappings
- Intro to Databases & Object-Relational Mappings
- SQL Readings: Please review the reference materials on SQL:
- Object-Relational Mapping Readings:
- Lab 7: AsyncIO + MVC
- Project 1: UNCA Course Lookup
Lab
- Lab 8: Database + ORM Lab
9. Challenges in Client-Side Engineering
Client-Side Engineering (Part I)
- Client-Side Engineering (Part I)
- Ask ChatGPT to answer the study questions (Be ready to have a conversation about the discussion questions, including what you learned from ChatGPT (and whether you think ChatGPT got it right).) Link
Communicating over HTTP
- Communicating over HTTP
Lab
- Lab 10: Design Systems & External Data
10. Back-End: Scaling Up
Once an application works for a small number of users, the next challenge is making it work under growth. In this unit, we examine what it means to scale a back-end system, including strategies for handling more traffic, coordinating services, and thinking about infrastructure that can evolve with demand. These ideas matter as you move from class projects toward production-minded software.
Symposium - No Class
Introduction to Project 2
- Introduction to Project 2
- Project 2: Full Stack Application
- Lab 10: Design Systems & External Data
Project 2 work: Ideally, you'll begin customizing your vertical feature today
- Project 2 work: Ideally, you'll begin customizing your vertical feature today
Thanksgiving Break
Scaling an App
- Scaling an App
- Kubernetes Basics (Tutorial) Link
13. Final Exam
Final Exam
- Final Exam (8:00AM)