Potential Student Projects

Supervising graduate and undergraduate projects at the University of Toronto was one of the most rewarding and satisfying things I ever did. If you’re a student or a faculty member in need of a one- or two-semester project, and any of the ones listed below seem interesting, please reach out.

Development

Blocks-Based Data Science

TidyBlocks was a prototype of a Scratch-like tool for teaching introductory data ascience. It turned out to be an inappropriate visual paradigm, as there was no natural way to represent join operations as nested blocks. The aim of this project is to explore an alternative using a node-and-connector model like that of Node-RED or Yahoo! Pipes.

full proposal

Browsercast

Tools like PowerPoint aren’t web-friendly. When you export a slideshow to the web, what you get is a bunch of images, while screencasts are opaque to search engines and disability aids. In contrast, Browsercast plays snippets of audio in the browser as the viewer moves through the slides, so “View Source”, links, CSS, screen readers, and search work as they should. The prototype uses just 5kb of JavaScript; the aim of this project is to turn it into a functional tool.

Developer Discussion Tools

Most of the techniques catalogued in The Discussion Book are not supported by the communication and coordination tools that programmers routinely use. The aim of this project is to implement the most promising and study how useful they are.

Distributed Systems Simulators

Software Design by Example in Python deliberately ignored concurrency, partial failure, and everything else associated with modern distributed applications. The draft appendices are fixing that by building scale models of distributed protocols and systems from TCP to BitTorrent and load-balancing tools using asimpy. The tutorials will use simulators so that the accompanying lessons could illustrate edge cases in reproducible ways.

Lesson Syndication

RSS is one of the open web’s greatest successes. Podcasts and arXiv paper announcements leverage standard RSS/Atom feeds by packing custom data inside namespaced extensions. This keeps the feed syntactically valid so generic parsers still work, but allows domain-specific clients to extract more than “new post, here’s the title.” The aim of this project is to design and build a similar extension mechanism so that lessons can report their existence and content, including updates. This page has some ideas about how that might work.

A Little WYSIWYG Editor

Web Browser Engineering builds a small but fully-functional web browser step by step to show students how real ones work. The aim of this project is to build an equally simple desktop WYSIWYG editor in Python that supports both styled text and embedded sketching.

Markdown to DOM

Python-Markdown converts Markdown to HTML; if an program needs to check or manipulate a DOM tree, it must parse the HTML using a library like BeautifulSoup, perform whatever operations it needs to, and then convert the DOM back to HTML. In this project, students will refactor Python-Markdown so that it can generate a Beautiful Soup-compatible DOM tree directly.

Software Team Simulator

This project will use Asimpy, a Python discrete-event simulation library, to build an interactive GUI that lets users adjust parameters such as developer skill, schedule pressure, bug-fix strategy, and team composition, then watch simulated burndown curves, defect accumulation, and cycle times evolve in real time. The goal is an open-source tool covering scenarios from Brooks’ Law to specialist-versus-generalist staffing.

full proposal

WYSIWYG Computational Notebook

Jupyter uses JSON as its storage format, while Marimo and Quarto use Python with embedded strings and Markdown with embedded code respectively. This project will explore a third option by building an extension for LibreOffice using the the Jupyter messaging protocol so that people who prefer WYSIWYG editors can embed code and its output alongside diagrams, tables, and other media.

full proposal

XKCD Charts

Chart.xkcd is a JavaScript library that displays charts in the hand-drawn style of XKCD. Its creator is no longer maintaining it; this project will fork the original code, fix outstanding issues, and add new features such as axis limits and stable coloring schemes.

full proposal

Games

Bubbles!

The aim of the game is to get your bug from one end of the map to the other by riding on the surface of bubbles, which drift in the current. Bubbles bounce off each other, and off obstacles, deforming as they do so. Your bug can only move from one bubble to another during collision; to do so, it simply crawls along the surface. But you have to be careful: if your bug is caught between two bubbles, or between a bubble and an obstacle, it’s crushed. Extensions include:

Rewind

A first-person shooter with a science-fiction theme in which each player has a limited “temporal battery” that can be spent to reverse the flow of time by a few seconds. If you just got shot, rewind and take cover instead; if you missed a shot, rewind and aim lower. The twist is that your opponent knows you can do this, turning every rewind into a battle of wits.

full proposal

Save the Humans!

The zombies have attacked. The people at the zoo have panicked, and it’s up to the animals to save them in this tongue-in-cheek game. The tiger can chase people away from danger, but they might run straight into the arms of the ravenous horde. The bunny is so cute that people will chase it, but if they catch it they’ll just stand there petting it until they’re eaten, and so on.

full proposal

Tower Support Game

A tower defense game is one in which the player builds fixed defenses against incoming waves of attackers. The objective of this game is to prototype a simple tower support game, in which the player builds bridges, first aid stations, and so on to help travelers reach their destination.

full proposal

Research

Analysis of Undergrad Textbooks

Most undergraduate computer science programs have a first- or second-year course on data structures and algorithms. What do these courses actually teach, and which of these algorithms and data structures are used in upper-year courses? To answer these questions, this project will assemble and apply tools to analyze the text of several dozen textbooks; along the way, the students doing the project will have to decide how to identify topics, how to count them, and how to make their work reproducible.

Calibrated Code Review

Give a novice programmer a one-page program and have them score it using a checklist, then grade them on how closely their scoring matches the instructor’s. (They start with 100%, and lose one mark for each false positive or false negative.) After doing this a handful of times, they should learn to see code through the instructor’s eyes. Does this help them write better code? If so, how quickly and how well? This project will attempt to answer these questions.

GenAI for Architecture Descriptions

The first two volumes of The Architecture of Open Source Applications describes the architecture of several dozen large applications circa 2012. The aim of this project is to use those descriptions to determine how well LLMs can do the same job. The first step will be to obtain the source of those programs as they were at that time, along with archived email discussions, tickets, and other artifacts. That data will be fed into different LLMs, which will be asked to write a few thousand words to describe the systems; those mechanical descriptions will then be compared with the originals.

Identification of Variable Roles

Sajaniemi’s work on roles of variables identified and named ten small patterns in the way variables are used in novice programs. This project would build static and dynamic analysis tools to detect those patterns (and possibly others) in programs as an aid to teaching, debugging, and code review.

Project Closure

There are hundred of books in print about how to start a business. Only a handful discuss how to pass one on, and even talk about how to wind one down. This project will study when, why, and how software projects are wound down, either deliberately or on short notice.

Validity of Software Engineering Claims

Are some programmers really ten times more productive than others? Does test-driven development actually make programmers more productive? And do people actually believe these claims? This project will conduct a quantitative survey of best-selling books on software developmnt to measure how many of their claims are backed by citations, and of those, how many are considered valid, then survey programmers to see which (if any) they believe.

Tutorials

Software Design by Example in Gleam

Gleam is a modern functional language that runs on the Erlang/OTP platform and can also be compiled to JavaScript. This project will translate examples from Software Design by Example in Python into Gleam to help people coming from Python and other mainstream languages understand how to use FP in practice.

Software Security by Example

The first lesson in this tutorial will present a simple implementation of a wiki designed for shared note-taking. Each of the following lessons will fix one of its security shortcomings (or one of the shortcomings introduced by an earlier fix). Some will be vulnerabilities such as cross-site scripting or SQL injection; others will be missing features such as basic authentication or OAuth, role-based access control, the kind of logging that every sys admin wishes they had, static code analysis, and eventually the audit and emergency response procedures that such tools are meant to support.

Software Performance by Example

Each lesson in this tutorial will take a simple application, analyze its performance, and then make it faster. Along the way, the lessons will present general tips for improving performance similar to those in Jon Bentley’s classic book Writing Efficient Programs, update them, and show how to apply them in practice.

Unbreaking Software

Most programmers spend a large part of their time debugging, but most courses only show working code, and most textbooks don’t discuss how to prevent, diagnose, and fix errors. This tutorial fills that gap by presenting dozens of case studies showing how to find and fix real-world problems. Along the way, it will present examples of what programmers can do to handle errors gracefully, from data structure repair to automatically restarting servers.