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 Continuous Integration/Continuous Delivery (CI/CD), the tendency to waste resources, and opportunities to accelerate processes by cutting down on waste. 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 Exercises (12%)
Each student will individually complete a series of four technical exercises during scheduled lab periods. These assignments will test their understanding of technical content that is covered during the prior and/or current week of class.
Exams (60%)
Formal, written, in-person 110-minute exams. Two exams are scheduled for the semester:
- Midterm Exam (20%): Scheduled for February 15th at 4:30 PM–6:20 PM. Students may bring a one-page (8.5" x 11") crib sheet, where they may write on all two surfaces. A calculator is also permitted. All other electronics and devices are not permitted.
- Final Exam (40%): Schedule TBD. Students may bring a two-page (8.5" x 11") crib sheet, where they may write on all four surfaces. A calculator is also permitted. All other electronics and devices are not permitted.
Project (28%)
Students will work on a project in teams of up to six members. 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 (5%): 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 (15%): 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 classes of the semester. Video/screen recordings 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 13:00–14:20 in MC 4060.