In this post, I summarize the 3 CPSC courses I took in the online term W2020: CPSC 310, CPSC 320 and CPSC 317.

CPSC 310 Introduction to Software Engineering

Introduction

This class is distinctly divided into a “theory” and “project” part. The theory portion formalizes software engineering principles and methodologies which is covered in lectures and tested in midterms and the final exam. On the other hand, for the project, you and your partner create a UBC courses and rooms data query engine and write tests, mostly in TypeScript. The project is split into 4 checkpoints with respective deadlines.

Lecture Topics

  • Testing
  • Development Methodology (Agile/scrum)
  • User requirements/stories
  • Refactoring
  • REST
  • Object Oriented Design Principles & Patterns (Factory, Singleton, Visitor)
  • Ethics

Project

Overview

The project provides a list of either UBC courses or rooms given a query with a matching criteria. Specifically, it allows user to add datasets of either UBC courses or rooms, and then proceed to make some query like “show me all courses with an average > 60” or “show me all rooms with < 30 seats”. The program then returns a list of all courses/rooms matching the criteria. The project is done in partners, and split into 4 checkpoints: (1) writing tests, (2) backend for adding dataset and parsing query, (3) adding more advanced backend – support for rooms and transformations, (4) adding the web server and UI. Scores are evaluated by a set of tests that are automatically run on your project for each merge onto the master branch.

Tech stack

Mostly TypeScript for the backend (TypeScript is JavaScript plus object oriented features), and requests and results are in JSON. Tests are written with Mocha and Chai. The web server is written with the REST server library restify, and the frontend is in vanilla JavaScript.

Recommendations

  • Start each checkpoint early if you think you need help. Piazza/office hours get really busy close to the deadline.
  • A reliable partner is pretty important for this class. The project workload is actually really heavy; I was barely able to finish my portion of the work on time.
  • Not all TA’s are created equal. If you visit office hours and find a good TA, remember them.
  • Read up on some TypeScript/JavaScript if you’ve never used a functional language before. It’s quite different from Java, Python or C/C++.

Experience

My Rating: Workload: 4.5/5, Difficulty: 2/5, Usefulness: 3/5

Lectures are pretty optional, since most of the information is on the slides. Midterms are true/false questions, which makes it easy if you’ve looked at the slides.

My portion of the project (add dataset) consisted of mostly asynchronous code, using promises. Considering I have no experience in neither JavaScript nor async code, this was a very difficult and daunting task in the beginning. I actually had to go to office hours a few times—as someone who never goes to office hours—because I had no clue what I was doing with promises and TypeScript. But after writing lots of code, I still had no clue I was doing, but the code works.

Overall, the project was lots of work (and will be difficult if you don’t know JavaScript or promises), but the lecture material is super easy and straightforward.

Resources

CPSC310 W2020 Course Website

CPSC 320 Intermediate Algorithm Design and Analysis

Systematic study of basic concepts and techniques in the design and analysis of algorithms, illustrated from various problem areas. Topics include: models of computation; choice of data structures; graph-theoretic, algebraic, and text processing algorithms. Source: UBC SSC

I too, have no idea what this course description is saying, so putting it into words that are more understandable:

Introduction

A math and theory heavy course that focuses on algorithm design (i.e., for a problem, give a brute force solution, then create a good algorithm), and analysis (i.e., prove that your algorithm is correct, and determine the run time). We also see many common problems and solutions, such as greedy algorithms, graph problems, divide and conquer, and memoization/dynamic programming. No real programming involved, only pseudo code in coming up with algorithms, and a lot of proofs. Overall, the course provides the fundamentals for more advanced leet code or interview problems.

Lecture Topics

  • Designing and analyzing algorithms general steps
  • Solving problems via Reduction
  • Graph problems (BFS, DFS)
  • Greedy Algorithms
  • Divide and Conquer Algorithms, Master’s Theorem, recurrence trees
  • Memoization and Dynamic Programming
  • NP-completeness (reduction and proofs)

Coursework

  • 5 written assignments in Latex
  • 2 take home tests
  • Weekly tutorials

Experience

My Rating: Workload: 2/5, Difficulty: 3/5, Usefulness: 3/5

I took this course in the online term (2020W), and it seems like it was made a lot harder than previous in person sessions. They made the midterm so difficult that the average was 18/35 or ~52% (the final was not much better). Other than the absurd difficulty of the tests, this class has a pretty light workload.

Classes contain no teaching, rather its alternating periods of you working on a worksheet in a breakout room, and the professor going over the answers. The worksheets are mostly straightforward, and I could speed run through a 50 minute class in 30 minutes, skipping the breakout room parts. The assignments take a bit more effort, though it seems like I either understand it, or not, in the latter case I proceed to write some random stuff, and hope for a lenient TA and part marks. There are also textbook readings and quizzes, but those can be done with a very quick skim.

Overall, good professor (Patrice), very difficult exams, mostly easy workload except assignments are slightly more work.

Resources

For my year, everything was on the course website.

CPSC 317 Internet Computing

Introduction

Mostly theoretical course on how the internet works, the 5 layer protocol stack, and its respective protocols, including ethernet, IP, TCP/UDP, DNS, SSH, etc. Also analyzes performance in regards to network metrics like bandwidth and latency, and covers internet security via encryption and possible cyber attacks. Includes three coding assignments related to server, client and socket programming.

Lecture Topics

  • Internet Design
  • IP layer (networking addressing, routing packets)
  • Link layer (ethernet frames/addressing, local area networks, DHCP, ARP)
  • Transport layer (TCP/UDP) and Domain Name System (DNS)
  • Calculating network performance (bandwidth, latency, delay)
  • Reliable data transfer (acknowledgements, sliding window and pipelines)
  • Security

Coursework

  • 3 programming assignments
  • Weekly canvas quizzes
  • 4 bigger quizzes
  • Weekly tutorials

Experience

My Rating: Workload: 1/5, Difficulty: 1/5, Usefulness: 2/5

Very interesting course since I had no prior knowledge of the internet, and mostly theoretical like CPSC 313. I think the material the course covers is essential knowledge, but for me it was missing the bigger picture, and too much nitty gritty details.

The programming assignments are on par with CPSC 313 assignments (but there’s only 3). The coding itself is pretty straightforward, but most of the time there’s quite some ambiguity and underspecification, so I usually like to wait until others have clarified the task on Piazza to start the assignment.

Overall easy assignments, light workload and mostly theoretical material. Good course for anyone that would like to know more about the internet and server/client programming.