The Programming Languages Mentoring Workshop, or PLMW, is a one-day event that’s held on the day before the main conference program starts at the four major SIGPLAN conferences (POPL, PLDI, SPLASH, and ICFP). It has a scholarship program that funds students to travel to and attend the entire conference, and it is specifically designed to welcome new and aspiring researchers to the conference and help inspire them to pursue (or continue to pursue) careers in programming languages research.
This fall, I’m teaching a graduate seminar on a topic I’m very excited about: the design and implementation of SMT solvers, solver-aided languages, and solver-aided systems!
This spring, I taught our undergrad distributed systems course here at UC Santa Cruz for the first time! It was a blast, and one of the most fun things about it was reading the zines about distributed systems that my students made.
I’d been thinking about incorporating a zine-making assignment into a course like this for years, ever since getting a glimpse of the zines that Cynthia Taylor’s students made for her operating systems courses back in 2015. When I saw the beautiful sketchnotes that Romeo Jung made for my colleague Peter Alvaro’s version of this course last fall, I was even more excited to give students an outlet for creative expression through zines. So I jumped at the chance to do it once I was teaching the course myself.
The zine assignment went well enough that I’m writing this post about it in the hope that it might be useful for other folks teaching CS who want to try something similar in their own courses, and maybe inspire more people to try making their own zines on CS topics.
In my distributed systems course a couple weeks ago, we were discussing how the anti-entropy mechanism in the Dynamo key-value store uses Merkle trees to efficiently compare the data stored on different replicas. The idea is this: suppose that two replicas (on different physical machines, perhaps on opposite sides of the planet) are each storing some large number of key-value pairs. Suppose you want to make sure that the values of the keys on replica A are the same as those of the corresponding keys on replica B. (They might not agree if, say, replica A got updated at a time when replica B was unreachable.)
In the undergrad distributed systems course I’m teaching this spring, I decided I wanted to discuss the Chandy-Lamport algorithm for snapshotting the global state of a distributed system in some detail. When I looked around to see how other people were teaching this algorithm, I kept noticing the exact same example being used in multiple people’s lecture notes, for different courses taught at different institutions.
From what I can tell, the original source of this example is Indranil Gupta’s lecture notes for his CS425 distributed systems course at Illinois. (If I’m wrong about the source, someone please let me know.) Since then, it seems like other people have been borrowing it (with attribution), and for good reason — it’s a nice example! But I found it to be a bit hard to follow, even when I watched Gupta’s own video lecture from his Coursera “Cloud Computing” course that shows him walking through the example.
Also, there’s a typo in the original example that seems to have propagated to all the other copies — they all have two events labeled “E”! So, this post is my own take on this ubiquitous example, cleaned up a bit and explained in detail. Credit goes to Indy Gupta for coming up with the example in the first place.