CPEN 321: Software Engineering (Fall 2017)



The course explores engineering principles for building non-trivial software-intensive systems: requirement specification, design, implementation, verification, and maintenance. The course uses a group project as the basic learning vehicle, providing students with an environment for applying the learned principles in practice while coping with constraints encountered when working on a real team: uncertain requirements, tight deadlines, etc. Students are evaluated based on their understanding of the software engineering principles and their ability to apply these principles in practice.

Learning Objectives

By the end of the course, students will learn several fundamental skills in modern software development:



Julia Rubin
Lectures: Tue. and Thu., 5:30-7pm, MCLD 228
Office hours: Thu. 4-5pm, KAIS 4053


Erik Dolinsky
Lab: Mon. 10am-12pm, MCLD 348 or by appointment

Duling Lai
Lab: Mon. 3-5pm, MCLD 348 or by appointment

Joey Li
Lab: Thu. 9-11am, MCLD 348 or by appointment


Course Prerequisites

One of EECE 210, CPEN 221, CPSC 210, EECE 309.

Course Format

The class meets two times a week for lectures and once a week for a lab section. Lab sections are reserved for group meetings. Each group should meet with a TA for 30 minutes a week, preferably during the lab time. In exceptional cases, an alternative time can be arranged in coordination with your TA.

Classroom material will be enhanced with assigned reading. The grading will be based on ~4 in-class quizzes and the group project. There is no final exam.


A major part of the course is the group project. The project simulates real development settings, where development teams communicate with customers to implement software that satisfies the customers’ requirements. The intent of this project is to give you the opportunity to apply the course concepts to a real system.

Scope: You are required to develop a client-server software system; the client side of the system must be a native mobile application that runs on a mobile device (i.e., not in a web browser). The server component can run on a physical machine or in a cloud data center. An example of a reasonably-scoped project is here.

Projects are performed by groups of 3-4 students, which are further paired to form communities. A community consists of two groups, A and B, with 3-4 students in each group. Groups A and B act as customer and development teams to each other. That is, group A acts as a customer of group B, while group B implements the system proposed by group A. At the same time, group B acts as the customer for group A, which implements the idea proposed by group B.

Technology: You have full freedom to choose both client and server technology (i.e., you can use Android, iOS, or a cross-platform mobile framework such as React Native or Xamarin). Your mobile app must run both on an emulator and on some mobile device, but it does not have to run on arbitrary mobile devices.

If you are interested in hosting the backend components on a cloud infrastructure, please let the course staff know and we can provide you with additional resources, such as Microsoft Azure credit.

All development artifacts must be stored in Git – a popular version control system. You will need a GitHub or Bitbucket account, but feel free to create a throw-away or anonymous account for this course, if that makes you more comfortable. Being familiar with Git is essential; please take a look at the 'getting started' part of the Atlassian Git Introduction if you are not familiar with Git. A shorter, less formal, guide is also available.

Logistics: All students in the same community must be in the same lab section; if you want to work with someone who is in another section, one of you will have to transfer lab sections.

Groups must be formed by the end of the second week (i.e., by September 15). Please choose your team members carefully, as no changes will be permitted. If you do not have a team organized after the first lecture, please go to Piazza and find your partners there; otherwise, we will assign you randomly to a team. Everyone should have partners by the end of the second week of the course.

Communities must be formed by the end of the third week (i.e., by September 22); no changes will be permitted. If you cannot find a peer group, we will randomly assign you one.

Communities are required to have regular weekly meetings to synchronize and to report on the work progress. Each meeting must be summarized in a 1-page report and submitted to the course staff. Weekly status reports help to keep the staff and yourselves informed about your progress. The team status must include (a) the deliverables for the week, (b) the plans for next week, (c) major decisions and changes in the scope of the project, and (d) the contributions of individual team members.

Weekly meetings will take around 30 minutes (15 minutes for each “customer” in the community), and will be facilitated and evaluated by the TAs. A staff member will contact your community to set up a meeting during your lab section.

In exceptional cases, meetings outside the lab hours can be arranged in coordination with the TAs. However, the meetings must be held during the same week. Late deliverables will be subject to the following penalties:

Project milestones

Submission guidelines

  1. Group members and project proposals are to be submitted here.
  2. Communities and project Git repositories are to be submitted here.
  3. Weekly progress reports are to be submitted here.


Grading for this course is based on two components:

There is no final exam.


Topics and Schedule

Note that this is a week-by-week guide only and is subject to change. Reading will assigned at a later point.

  Date Topic Project Milestones Reading Material / Other Comments
W1 Thu, Sept 7, 2017 Intro, what is SE
W2 Tue, Sept 12, 2017 Process, Software Lifecycle Tutorials on Mobile
Reading: Git Introduction and Guide
Thu, Sept 14, 2017 RE/User Stories Groups formed
Project descriptions due
W3 Tue, Sept 19, 2017 Project pitches Last day to withdraw
Thu, Sept 21, 2017 Project pitches Communities formed
W4 Tue, Sept 26, 2017 UML Requirements discussed Reading: Articles on Continous Integration by the Agile Alliance and Martin Fowler
Thu, Sept 28, 2017 Quiz 1
W5 Tue, Oct 3, 2017 Design, Design Patterns User stories presented Reading: composite structure diagram and package diagram.
Thu, Oct 5, 2017 Guest lecture
W6 Tue, Oct 10, 2017 More on design Design presented Reading: 1. Design Patterns: Factory Method, Abstract Factory, Decorator, Proxy, and Visitor.
2. The Coming Software Apocalypse
Thu, Oct 12, 2017 Code Reviews, Anti-patterns
W7 Tue, Oct 17, 2017 Teamwork, Version Control MVP Reading: Coding Horror "Code Smells",
A Taxonomy for Bad Code Smells
Thu, Oct 19, 2017 Quiz 2 (in SWNG 221)
W8 Tue, Oct 24, 2017 Guest lecture Code Review
Thu, Oct 26, 2017 Testing
W9 Tue, Oct 31, 2017 Static Analysis Test plan presented
Thu, Nov 2, 2017 Symbolic Execution, Model Checking
W10 Tue, Nov 7, 2017 - Test results presented
Thu, Nov 9, 2017 Quiz 3 (in PHRM 1101)
W11 Tue, Nov 14, 2017 Guest lecture Refined specifications presented
Thu, Nov 16, 2017 DevOps and Microservices
W12 Tue, Nov 21, 2017 More on Microservices + Recap + Quiz 4 preparation + Research in SE “Almost final” product presented
Thu, Nov 23, 2017 Quiz 4 (in PHRM 1101)
W13 Tue, Nov 28, 2017 Project presentations
Thu, Nov 30, 2017 Project presentations and awards


We gratefully acknowledge the inspiration we drew part of the material that we adapted from the previous editions of CPEN 321 and CPSC 310, as well as from CSE 403 (University of Washington), CSC C01 (University of Toronto), and CS 169 (UC Berkley).