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.
Week |
|
Slides / Activities |
Readings |
Week 1
|
Tue, 8/20
|
Lecture 1: Intro to the Course
Activity 1: Warm Up
|
|
|
Thu, 8/22
|
Lecture 2: What is Software Engineering?
Video : Lecture recording
Lab 1: Code Editors
|
|
- How is software engineering different from programming?
- Is software engineering actually engineering? Why or why not?
- Why not just aim for "nothing changes"?
- What is Hyrum's Law?
- How should decisions be made on software engineering teams? Name some better and worse ways of making decisions.
- What do we mean by trade-offs?
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.
Week |
|
Slides / Activities |
Readings |
Week 2
|
Tue, 8/27
|
Lecture 3: Intro to Version Control
Video : Lecture recording
|
|
|
Thu, 8/29
|
Lecture : Introduction to Lab 2
Lab 2: Configuring git and GitHub
|
|
Week 3
|
Tue, 9/3
|
Lecture 4: Version Control and Collaborative Workflows
Video : Lecture recording
Activity 1: Git Collaboration Activity
|
-
Read the history section (including all subsections: Naming, Characteristics, Data Structures, and References).
-
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/5
|
Lab 3: A Tour of git Commands
|
|
- Why is version control important?
- Why is code history important?
- What is the difference between centralized and distributed version control?
- What is the problem with having long-running dev branches? What is the solution?
- What is the one version rule?
- What are the tradeoffs of having a "monorepo" versus multiple repos?
- What is the difference between git and GitHub?
- 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)?
- What does the "origin" typically refer to?
- What is a public / private key pair?
- What do the following git commands do?
clone
, status
, add
, log
, commit
, push
, pull
, merge
, rebase
- What do the following bash commands do?
ls
, cat
, mv
, pwd
, cd
, rm
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.
Week |
|
Slides / Activities |
Readings |
Week 4
|
Tue, 9/10
|
Lecture 5: Everything as Code
Video : Lecture recording
Activity 1: Git Collaboration Activity
|
|
|
Thu, 9/12
|
Lab 4: Intro to Docker
|
|
- What were servers "back in the day"? What are servers now?
- What kinds of server challenges do administrators need to be able to handle?
- What is virtualization? What is containerization? How are they different?
- What is the difference between declarative and imperative code? What are some examples of each?
- Besides your application's source code, what other kinds of things should you also represent as code?
- What are some of the advantages of putting all aspects of your system in terms of code?
- What is Docker and why is it useful?
- Be able to explain the following Docker concepts:
image, container, volume, bind mount
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.
Week |
|
Slides / Activities |
Readings |
Week 5
|
Tue, 9/17
|
Lecture 6: Package & Dependency Management
Video : Lecture recording
|
|
|
Thu, 9/19
|
Lab 5: Understanding Package Managers
|
|
- What do we mean by "dependency management"?
- What happened in the "leftpad" debacle? What happened in the "everything" debacle? Why should we care?
- What are the trade-offs associated with relying on dependencies?
- What should you consider before adding a new dependency to your software project?
- What are some challenges with upgrading dependencies?
- What are some dependencies that we have used in this class?
- What are some common features of a good dependency management system?
- What is the purpose of the Poetry lock file and the package.json lock file?
- 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?
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.
Week |
|
Slides / Activities |
Readings |
Week 6
|
Tue, 9/24
|
Lecture 7: Intro to Testing & Static Analysis
Video : Lecture recording
Activity 2: Practice writing tests and using some static analysis tools This activity didn't quite work out, but you will have another chance to practice with testing and static analysis in Lab 6.
|
-
Forgot to post the readings :(
|
Week 11
|
Tue, 10/29
|
Lecture 8: Shifting Left with Testing, Static Analysis, & Continuous Integration
Video : Lecture recording
Lab 6: Testing & Static Analysis
|
|
-
general What does "shifting left" mean?
-
testing What are some of the benefits of automated testing?
-
testing What are some of the limits of automated testing?
-
testing What are the different test "sizes"? Why are these distinctions important?
-
testing What is meant by "nondeterminism" in testing?
-
testing What are some important qualities of a testing suite?
-
testing What are some considerations that go into writing testable code?
-
testing What is the difference between an interpreted and a compiled language?
-
static analysis What languages are interpreted? What languages are compiled?
-
static analysis What do we mean by "static"?
-
static analysis What are some examples of static analysis tools?
-
static analysis What are some of the benefits of doing static analysis?
-
static analysis What are some of the challenges / limitations of static analysis?
-
CI What is continuous integration?
-
CI What are some of the key benefits and headaches (i.e. tradeoffs) of continuous integration?
-
CI Can you still use CI if you're working on a really big feature that’s not ready for prime time?
-
CI What happens in the "presubmit" phase?
-
CI What is release candidate testing? How is it similar / different from the "presubmit" phase?
Week |
|
Slides / Activities |
Readings |
Week 11
|
Thu, 10/31
|
Lecture 9: Mid-Semester Review
Video : Lecture recording
Activity 3: Mid Semester Review Cheat Sheet
Project 1: UNCA Course Lookup
|
|
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
Week |
|
Slides / Activities |
Readings |
Week 12
|
Tue, 11/5
|
Lecture 10: Client-Side Engineering (Part I)
Video : Lecture recording
|
|
|
Thu, 11/7
|
Lecture 11: React
Video : Lecture recording
Lab 7: Intro to client-side programming with React
|
|
Week 13
|
Tue, 11/12
|
Lecture 12: Client-Server Communication over HTTP
Video : Lecture recording
|
|
- What is front-end engineering? What is UI engineering?
- When did it become a distinct subdiscipline of computer programming?
- What are some of the specific challenges that front-end engineers must navigate?
- What are some common technologies used in front-end engineering?
- What's the best way to get a job in UI engineering?
- Is UI engineering easier than other forms of engineering?
- What is functional programming?
- What is a bundler?
- What are the tradeoffs of using a client-side framework?
- What is the purpose of the
package.json
and package-lock.json
files?
Week |
|
Slides / Activities |
Readings |
Week 13
|
Thu, 11/14
|
Video : Lecture recording
Lab 8: Design Systems & External Data
|
|
Week 14
|
Tue, 11/19
|
Lecture 13: Communication over HTTP (relevant for both client & server)
Video : Lecture recording
|
|
Week |
|
Slides / Activities |
Readings |
Week 14
|
Thu, 11/21
|
Lecture 14: Intro to Databases & ORMs
Video : Lecture recording
Lab 9: Database Lab
|
|
Week |
|
Slides / Activities |
Readings |
Week 16
|
Tue, 12/3
|
Lecture 16: Scaling an App
Video : Lecture recording
|
|
Week |
|
Slides / Activities |
Readings |
Week 16
|
Thu, 12/5
|
Lecture 16: Course Synthesis
Video : Lecture recording
Project 2: Full Stack Application
|
|