Advanced Software Engineering

Advanced Software Engineering

CPSC 410, Winter Term 2 2024, Instructor: Caroline Lemieux (clemieux@cs.ubc.ca)

Mo/We 2:00PM-3:30PM, IRC-Floor 1-Room 4

Canvas Page, Piazza


This is Not the Official Course Website ^

This webpage serves to provide some information about the course description which may help students who are deciding whether to take/drop the course.

The official course webpage is the canvas webpage. This canvas page contains all the details of the schedule, the course slides, etc. There is also an official piazza, on which course updates will be posted.

You can find the full syllabus here; the most up-to-date verison will be on canvas.

Course description ^

Course-level learning goals

This course builds on your existing software engineering knowledge and experience with a hands-on approach to collaborative software engineering. The course is project-heavy and requires you to plan, coordinate and work with a team of your colleagues. You will design, build and evaluate two moderate-sized team projects throughout the course of the term, and we will use these as vehicles for exploring what it takes to work with a team break down a software project, and coordinate with other team members in a productive manner

The topics of the projects will also provide a grounding in programming language design and implementation, and tools and techniques to aid programmers in understanding and analysing their code. In particular, we will explore two main focus areas (one for each project):

  1. Domain Specific Languages (what they are for, how to design and build them to be useful to your users)
  2. Program Analysis (extracting, analysing and presenting rich information to programmers about their code's potential behaviours)

Interwoven with these focus areas, we will discuss empirical evaluation methods appropriate to software engineering projects in general, as well as relevant object-oriented programming techniques for implementing languages and program analyses. You will exercise good practices in development and teamwork via the team projects throughout the term, while regular exercises will cover both specific techniques and encourage you to problem-solve, exploring and evaluating alternative designs and implementation choices.

Course-Level Learning Objectives

Upon successful completion of this course, students will be able to:

  1. Manage and evaluate a development strategy and timeline for a project built in parallel by a team of programmers.
  2. Decompose a software design into modular components and development tasks, enabling separate testing, smooth adaptation to changes and easier final integration.
  3. Collaborate as a responsible and effective team and course member, taking shared responsibility for their team successfully delivering on their project goals, and personal responsibility for keeping to deadlines in a timely fashion.
  4. Design and implement Domain Specific Languages tailored to a given task and group of users, incorporating early feedback and design revisions into your process.
  5. Differentiate static and dynamic techniques for program analysis, contrasting their strengths and weaknesses.
  6. Create simple program analyses to help programmers understand their own programming challenges and software engineering processes.
  7. Evaluate software engineering research questions and projects via rigorous empirical studies.

How it will go

This will be a practical course: during the term you will complete two group projects (one on each of the focus areas above), as well as roughly-bi-weekly individual quizzes which will form a continuous assessment of your progress throughout the term.

Plan to spend at least 6 hours a week on average on this course in addition to the contact time, and be sure to plan your individual and team activities carefully from the beginning to avoid falling behind. Note that this is an average: some weeks may be more or less intensive and your mileage may vary; you will definitely benefit from spreading the work for each deadline out, especially for the projects.

Make sure to agree clearly with your project groups what your expectations are of each other, communicate regularly and revise your plans as needed; a key purpose of the projects is learning to work together as an effective development team, and you and your team members are collectively responsible for ensuring your team’s success and the wellbeing of your other team members.