CS 489-001: Software Delivery
Software development used to be a highly fragmented process. After developers have completed a set of enhancements and defect fixes, a candidate version of a release would be handed off to Software Quality Assurance (SQA) teams, who would check the candidate for defects. Next, the SQA team would hand the RC off to release engineering teams, who would prepare the software for release. After completing the official release process, software operators would install and configure the RC in production environments, where users can finally interact with it.
This fragmented approach to software engineering has largely been abandoned in industry for two reasons. First, since large quantities of enhancements and defect fixes would be grouped together into one release candidate, releases would encompass a large amount of change in the software system. These large releases were deemed risky both from a development organization perspective (i.e., field-reported defects can invalidate weeks or months of development effort) and a user adoption perspective (i.e., with so much change in the software system, it may be difficult to migrate existing installations to the new release). Second, the stakeholders on different teams would solely focus on tasks that fall within their purview, often leading to a lack of oversight of the whole development, release, and operations processes.
Instead, modern development teams have embraced the devops mindset, i.e., a holistic view of the development, release, and operations processes. Enabling this mindset is a vast array of development, release, and operations tools, techniques, and practices. XebiaLabs has provided an overview of the popular tools in the rapidly growing area of devops (see figure).
Learning Outcomes
The main objective of this course is to provide students with the skills that are needed to design, develop, and operate the integration, release, and deployment pipelines that are at the centre of modern devops-based software releasing practices. Modern software delivery teams are tasked with selecting appropriate software delivery tools and assembling them to produce integration, release, and deployment pipelines that connect development, release, and operations processes. Through the course material, students will gain experience in developing integration, release, and deployment pipelines. More specifically, students will:
- understand the challenges of modern software delivery
- learn to leverage several key software delivery tools (e.g., build automation, infrastructure-as-code)
- study and improve upon existing open-source integration, release, and deployment pipelines
Course Content
The course is comprised of four modules. In addition to laying out course expectations, the Logistics & Foundations module introduces students to (a) the key terms in software delivery and (b) the tools that laid the groundwork for the recent devops migration. These include version control systems that are used to manage software contributions and build systems that are used to manage internal and external dependencies. In the Integration Pipelines module, students will be introduced to concepts and tools that are used to automate the release pipeline. This includes concepts like quality gating and continuous integration. The Infrastructure & Deployment module covers approaches to preparing and orchestrating encapsulated deployment environments (virtual machines, containers), as well as approaches to orchestrate their deployment automatically (e.g., Infrastructure-As-Code). Finally, in the Deployment Strategies module, students will be introduced to risk mitigation strategies for deploying releases to a large (potentially global) user base. We will cover popular strategies for mitigating failures (e.g., blue-green deployment), continuous experimentation (e.g., A/B testing, canary releases), and resiliency (e.g., resiliency (a.k.a., chaos) engineering).
Evaluation
Students will be evaluated using the following breakdown (subject to change):
Technical Quizzes (10%)
Each student will individually complete a series of technical assignments during scheduled classes. These assignments will test their understanding of technical content that is covered during the prior and/or current week of class.
Term Tests (24%)
Over the course of the semester, we will have two scheduled tests that occur during class and/or a pre-scheduled time. Each test will be worth 12% of the final grade.
Final Exam (40%)
Formal, written, in-person final exam. Will be scheduled for 2 hours and 30 minutes. Students will be permitted to bring a two-page crib sheet, where they may write on all four surfaces. All other electronics and devices are not permitted.
Project (26%)
Students will work on a project in small teams (number of members TBD). The task of each group is to understand and improve upon the integration and release pipeline of an open-source software system. Groups will be graded on the following set of deliverables:
- Initial Report and Work Plan (4%): A report demonstrating an understanding of the existing release pipeline, its flaws/limitations, and how the group plans to improve upon the existing pipeline.
- Improvement Report and Deliverables (14%): Delivery of the technical improvements with a report measuring their impact.
- Final presentation (8%): Each project will be presented and discussed during the final two weeks of the semester. Video repordings are permissible, but all group members must still be present to answer questions.
Class Schedule
Classes will be held weekly on Mondays and Wednesdays at 14:30–15:50 in MC 4042.