CSCI 338: Fall 2025

Software Engineering

CSCI 338: Fall 2025

Schedule

Topic 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.

Readings & Activities

Week Slides / Activities Readings
Week 1 Tue, 8/19 Lecture 1: Intro to the Course
Activity 1: Warm Up
Thu, 8/21 Lecture 2: What is Software Engineering?
Lab 1: Code Editors

Study Questions

  1. How is software engineering different from programming?
  2. Is software engineering actually engineering? Why or why not?
  3. Why not just aim for "nothing changes"?
  4. What is Hyrum's Law?
  5. How should decisions be made on software engineering teams? Name some better and worse ways of making decisions.
  6. What do we mean by trade-offs?
  7. What is "shifting left"?
  8. Sample command line quiz questions

Topic 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.

Readings & Activities

Week Slides / Activities Readings
Week 2 Tue, 8/26 Lecture 3: Intro to Version Control
Thu, 8/28 Lecture : Introduction to Lab 2
Lab 2: Configuring git and GitHub
Week 3 Tue, 9/2 Lecture 4: Version Control and Collaborative Workflows
Activity 2: Git Collaboration Activity
  • : Git Wikipedia article
    Read the "History" and "Characteristics" sections.
  • optional: 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.
Thu, 9/4 Lecture : Intro to Lab 3
Lab 3: A Tour of git Commands

Study Questions

  1. Why is version control important?
  2. Why is code history important?
  3. What is the difference between centralized and distributed version control?
  4. What is the problem with having long-running dev branches? What is the solution?
  5. What is the one version rule?
  6. What are the tradeoffs of having a "monorepo" versus multiple repos?
  7. What is the difference between git and GitHub?
  8. What is the difference between a merge commit and rebasing? What would you want to do one over the other (i.e., what are the the tradeoffs of each)?
  9. What does the "origin" typically refer to?
  10. What is a public / private key pair?
  11. What do the following git commands do? clone, status, add, log, commit, push, pull, merge, rebase
  12. What do the following bash commands do? ls, cat, mv, pwd, cd, rm

Topic 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.

Readings & Activities

Week Slides / Activities Readings
Week 4 Tue, 9/9 Lecture 5: Version Control Wrap
Activity 3: Coding Practice
Thu, 9/11 Lecture 6: Everything as Code
Lab 4: Intro to Docker

Study Questions

  1. What were servers "back in the day"? What are servers now?
  2. What kinds of server challenges do administrators need to be able to handle?
  3. What is virtualization? What is containerization? How are they different?
  4. What is the difference between declarative and imperative code? What are some examples of each?
  5. Besides your application's source code, what other kinds of things should you also represent as code?
  6. What are some of the advantages of putting all aspects of your system in terms of code?
  7. What is Docker and why is it useful?
  8. Be able to explain the following Docker concepts: image, container, volume, bind mount

Topic 4. Package & Dependency Management:

When developing software, it is common to rely on dependencies -- code that has been developed by other people. However, your code isn't the only code that changes. Dependencies (and their dependencies, and their dependencies' dependencies) also evolve over time as new features are added and bugs are patched. Given this, in this unit we will examine some tools, approaches, and considerations for managing code dependencies. We will also experiment with a few different dependency management tools, such as npm, poetry, and apt.

Readings & Activities

Week Slides / Activities Readings
Week 5 Tue, 9/16 Lecture 6: Package & Dependency Management
Thu, 9/18 Lab 5: Understanding Package Managers

Study Questions

  1. What do we mean by "dependency management"?
  2. What happened in the "leftpad" debacle? What happened in the "everything" debacle? Why should we care?
  3. What are the trade-offs associated with relying on dependencies?
  4. What should you consider before adding a new dependency to your software project?
  5. What are some challenges with upgrading dependencies?
  6. What are some dependencies that we have used in this class?
  7. What are some common features of a good dependency management system?
  8. What is the purpose of the Poetry lock file and the package.json lock file?
  9. Different dependency management systems are used for different parts of the software stack. What are some examples of dependency managers that are used for: operating systems, software languages (e.g., python, node.js, ruby, etc., server configuration?

Topic 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.

Readings & Activities

Week Slides / Activities Readings
Week 6 Tue, 9/23 Lecture 7: Intro to Testing
Activity 4: Python Practice
Thu, 9/25 Lab 6: Testing & Static Analysis
Week 7 Tue, 9/30 Lecture 8: Static Analysis & Continuous Integration
Activity 5: Team Preferences
Thu, 10/2 Activity 6: Project 1 Setup
Project 1: UNCA Course Lookup

Study Questions

  1. general What does "shifting left" mean?
  2. testing What are some of the benefits of automated testing?
  3. testing What are some of the limits of automated testing?
  4. testing What are the different test "sizes"? Why are these distinctions important?
  5. testing What is meant by "nondeterminism" in testing?
  6. testing What are some important qualities of a testing suite?
  7. testing What are some considerations that go into writing testable code?
  8. testing What is the difference between an interpreted and a compiled language?
  9. static analysis What languages are interpreted? What languages are compiled?
  10. static analysis What do we mean by "static"?
  11. static analysis What are some examples of static analysis tools?
  12. static analysis What are some of the benefits of doing static analysis?
  13. static analysis What are some of the challenges / limitations of static analysis?
  14. CI What is continuous integration?
  15. CI What are some of the key benefits and headaches (i.e. tradeoffs) of continuous integration?
  16. CI Can you still use CI if you're working on a really big feature that’s not ready for prime time?
  17. CI What happens in the "presubmit" phase?
  18. CI What is release candidate testing? How is it similar / different from the "presubmit" phase?

Topic 6. Midterm Exam Review & Midterm:

Readings & Activities

Week Slides / Activities Readings
Week 8 Thu, 10/9 Lecture 9: Mid-Semester Review
Activity 7: Mid Semester Review Cheat Sheet
  • : Please review all of the readings and study questions assigned thus far, in preparation for the mid-term review.
Week 9 Tue, 10/14 Exam 1: Midterm Exam

Topic 7. Back-End: the MVC Design Pattern + AsyncIO:

Readings & Activities

Week Slides / Activities Readings
Week 9 Thu, 10/16 Lecture 10: AsyncIO + MVC
Activity 8: AsyncIO
Week 10 Tue, 10/21 Lecture : MVC Lab Slides
Lab 7: AsyncIO + MVC

Topic 8. Back-End: Databases & ORMs:

Readings & Activities

Week Slides / Activities Readings
Week 11 Tue, 10/28 Lecture 11: Intro to Databases & Object-Relational Mappings
Thu, 10/30 Lab 8: Database + ORM Lab

Topic 9. Challenges in Client-Side Engineering:

In this unit, we will explore some software engineering ideas that are specific to client-side engineering. To do this, we're going to learn some HTML, CSS, JavaScript, and React concepts as a means of learning various client-side software engineering principles

Readings & Activities

Week Slides / Activities Readings
Week 12 Tue, 11/4 Lecture 13: Client-Side Engineering (Part I)
Thu, 11/6 Lecture 14: React
Lab 9: Intro to client-side programming with React
Week 13 Tue, 11/11 Lecture 15: Communicating over HTTP
Thu, 11/13 Lab 10: Design Systems & External Data

Study Questions

  1. What is front-end engineering? What is UI engineering?
  2. When did it become a distinct subdiscipline of computer programming?
  3. What are some of the specific challenges that front-end engineers must navigate?
  4. What are some common technologies used in front-end engineering?
  5. What's the best way to get a job in UI engineering?
  6. Is UI engineering easier than other forms of engineering?
  7. What is functional programming?
  8. What is a bundler?
  9. What are the tradeoffs of using a client-side framework?
  10. What is the purpose of the package.json and package-lock.json files?

Topic 10. Back-End: Scaling Up:

Readings & Activities

Week Slides / Activities Readings
Week 14 Thu, 11/20 Lecture 16a: Introduction to Project 2
Project 2: Full Stack Application
Week 15 Tue, 11/25 Lecture 16b: Project 2 work: Ideally, you'll begin customizing your vertical feature today

Topic 11. Back-End: Scaling Up & Course Wrap:

Readings & Activities

Week Slides / Activities Readings
Week 16 Tue, 12/2 Lecture 17: Scaling an App
Week 17 Tue, 12/9 Exam 2: Final Exam (8:00AM)