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, 1/14
|
Lecture 1: Intro to the Course
Activity 1: Warm Up
|
|
|
|
Thu, 1/16
|
Lecture 2: What is Software Engineering?
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?
- What is "shifting left"?
-
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.
| Week |
|
Slides / Activities |
Readings |
|
Week 2
|
Tue, 1/21
|
Lecture 3: Intro to Version Control
|
|
|
|
Thu, 1/23
|
Lecture : Introduction to Lab 2
Lab 2: Configuring git and GitHub
|
|
|
Week 3
|
Tue, 1/28
|
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, 1/30
|
Lecture : Intro to Lab 3
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
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.
| Week |
|
Slides / Activities |
Readings |
|
Week 4
|
Tue, 2/4
|
Lecture 5: Everything as Code
Activity 3: Coding Practice
|
|
|
|
Thu, 2/6
|
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, 2/11
|
Lecture 6: Package & Dependency Management
|
|
|
|
Thu, 2/13
|
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, 2/18
|
Lecture 7: Intro to Testing
Activity 4: Testing Activity
|
|
|
|
Thu, 2/20
|
Lab 6: Testing & Static Analysis
|
|
|
Week 7
|
Tue, 2/25
|
Lecture 8: Static Analysis & Continuous Integration
Activity 5: Team Preferences
|
|
|
|
Thu, 2/27
|
Activity 6: Project 1 Setup
Project 1: UNCA Course Lookup
|
|
-
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 8
|
Tue, 3/4
|
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.
|
|
|
Thu, 3/6
|
Exam 1: Midterm Exam
|
|
| Week |
|
Slides / Activities |
Readings |
|
Week 10
|
Tue, 3/18
|
Lecture 10: AsyncIO + MVC
Activity 8: AsyncIO
|
|
|
|
Thu, 3/20
|
Lab 7: AsyncIO + MVC
|
|
| Week |
|
Slides / Activities |
Readings |
|
Week 12
|
Tue, 4/1
|
Lecture 11: Intro to Databases & Object-Relational Mappings
|
-
: SQL Readings: Please review the reference materials on SQL:
-
: Object-Relational Mapping Readings:
|
|
|
Thu, 4/3
|
Activity 9: Team Formation Questionnaire
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
| Week |
|
Slides / Activities |
Readings |
|
Week 13
|
Tue, 4/8
|
Project 2: Full Stack Application: Student Academic Management Tool
|
|
|
|
Thu, 4/10
|
Lecture 13: Client-Side Engineering (Part I)
|
|
|
Week 14
|
Tue, 4/15
|
Lecture 14: React
Lab 9: Intro to client-side programming with React
|
|
|
|
Thu, 4/17
|
Lecture 15: Communicating over HTTP
Lab 10: Design Systems & External Data
|
|
- 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?
Topic 10. Back-End: Scaling Up:
| Week |
|
Slides / Activities |
Readings |
|
Week 15
|
Thu, 4/24
|
Lecture 16: Scaling an App
|
|
Topic 11. Project 2 Presentations:
| Week |
|
Slides / Activities |
Readings |
|
Week 16
|
Tue, 4/29
|
Activity : Each group will present their final project
|
|
|
Week 17
|
Tue, 5/6
|
Exam 2: Final Exam
|
|