Teaching at UBC
My courses in UBC Statistics and the Master of Data Science program, the open textbooks they run on, and how I’m bringing AI into them.
I’m a Lecturer in the Department of Statistics at the University of British Columbia, where I’ve taught since 2022 (I started as a Postdoctoral Research and Teaching Fellow). I teach introductory data science to undergraduates, and the computing, workflow, and visualization courses in the Master of Data Science (MDS) program. This term (fall 2026) I’m teaching my MDS course, DSCI 521, and I’m the first instructor for SPPH 381H: Health Data Science: AI and Knowledge Translation.
My teaching outside UBC, and how I think about teaching in general, is on my main Teaching page.
Open textbooks
I co-author and maintain the open textbooks my MDS courses run on. They’re public, so anyone can learn from them or teach with them.
🔁 Reproducible & Trustworthy Workflows
Version control, environments, containers, testing, CI/CD, and packaging. Used in DSCI 310, 522, and 524.
💻 Computing Platforms for Data Science
Bash, Git, Quarto, and virtual environments, the computing skills students use for the rest of the program. Used in DSCI 521.
📊 Data Visualization II
Dashboards with Shiny in R and Python, interactive maps, and AI-powered apps. Used in DSCI 532.
Courses
| Course | Title | Terms taught |
|---|---|---|
| DSCI 100 | Introduction to Data Science (R and Python sections) | 2022S, 2022W1, 2023S, 2023W1, 2023W2, 2024S, 2025S, 2025W1, 2025W2 |
| DSCI 310 | Reproducible and Trustworthy Workflows for Data Science | 2022W2, 2024W2 |
| DSCI 521 | Computing Platforms for Data Science | 2023W1, 2024W1, 2025W1, 2026W1 |
| DSCI 522 | Data Science Workflows | 2024W1, 2025W1 |
| DSCI 524 | Collaborative Software Development | 2022W2 (lectures), 2024W2, 2025W2 |
| DSCI 532 | Data Visualization II | 2024W2, 2025W2 |
| DSCI 554 | Experimentation and Causal Inference | 2021W2 (labs) |
| DSCI 561 | Regression I | 2022W1 (labs) |
| DSCI 591 | MDS Capstone Project | capstone mentor every year since 2022 |
| SPPH 381H | Health Data Science: AI and Knowledge Translation | 2026W1 |
SPPH 381H isn’t my course. It was developed by Dr. M. Ehsan Karim of UBC’s School of Population and Public Health with the AI-KT team (Manya Jain, Rainie Fu, and Md. Belal Hossain), and I happen to be a good fit to teach it.
I also run office hours for the Health Data Analytics micro-certificate through UBC Extended Learning: Health Data and Visualization (2024–2026) and Health Data Analysis and Machine Learning (2024).
Teaching with AI
This term I’m using AI on purpose in both of my courses, and there are 2 things I want students to get out of it. There’s using AI to learn something, and then there’s just doing stuff to learn the AI.
In DSCI 521, an agent now does the typing in my review sessions. Instead of watching me retype the commands, the class reads what the agent ran and judges it (a bit of recognition, but mostly evaluation, in Bloom’s Taxonomy terms), and the running token cost sits on the screen the whole time. I wrote about how those sessions went in Reviewing with an Agent Harness.
In SPPH 381H, which has no coding prerequisites, students use GitHub Copilot to write the code for their research questions, and we spend class time reading that code and the results it gives back. Since we aren’t stuck on the details of the code, we get to spend more time on the data and the next question to ask of it. It was never really about the code, it’s about the thinking behind it. That post is Using AI to Learn, and Learning the AI.
Assessment is the hard part, and education in general is in an assessment crisis right now with AI. DSCI 521 no longer has exams; instead, every student builds a personal website that starts their professional portfolio, on the bet that when your name is on the work, you don’t want it to be AI slop. In DSCI 100 we’ve been moving exam questions toward reading and reasoning about code, since whether a student can write code from scratch tells me less than it used to. I also keep a collection of learning moments, examples of correcting AI output where knowing the tool made the difference.
This is all still changing, so the newest version of this section is my Incorporating AI in the Classroom series on the blog.
Recent course work
I change my courses a little every year, and some of those changes end up moving the whole MDS program along with them.
2026–27 (in progress)
Most of this year’s changes are about Python tooling, and they started in DSCI 521 since that’s where students first set everything up.
- All of MDS: Python environments are moving from
condatouvanduv.lockfiles, a core tooling change for the whole program, and we’re migrating to the Positron IDE this year. - DSCI 522: reproducible environments with
uvanduv.lockfiles, replacingconda-lock. - DSCI 524:
uvfor all Python packaging, following where the Python Packages book is likely headed and moving closer to the pyOpenSci materials. Last year the documentation moved from ReadTheDocs and Sphinx toquartodoc, and this year it’s moving again, to Great Docs.
2025–26
- DSCI 532 (2025W2): rewrote the course around Shiny for R and Python, replacing Dash, and added AI-powered dashboards with
chatlasandquerychat. The textbook and the student project showcase are now public. - DSCI 100: moved the course project to GitHub Classroom with checkpoint due dates, spreading feedback (and grading) across the term.
- DSCI 522: reproducible Python environments with
conda-lockand multi-architecture Docker images, with a reference repository showing the whole workflow end to end. - DSCI 524: switched Python packaging to
hatch, following the pyOpenSci packaging guide, and documentation to Quarto andquartodocwith live previews on every pull request.
Student evaluations
At the end of every course, UBC asks students to fill out a Student Experience of Instruction (SEI) survey. If you found me through Rate My Professors, you’ve seen my 3.1 out of 5. As a data scientist, I’d like to point out that’s 14 ratings, and the plots below come from 727 SEI responses across 24 course sections since 2022 (I’ll let you decide which sample you trust).
The plots use UBC’s interpolated median, a median on the 1 to 5 scale that accounts for how the ratings are spread out, and they only include sections that met UBC’s minimum response rate.
Figures updated 2026-05-21, with SEI results through 2025W2 (spring 2026). I update them a few times a year, once all of a term’s SEI reports are in.

Students rate each statement from 1 (strongly disagree) to 5 (strongly agree). These are UBC’s 6 University Module questions, which every instructor gets asked:
- Explain Requirements: Throughout the term, the instructor explained course requirements so it was clear to me what I was expected to learn.
- Motivated: The instructor conducted this course in such a way that I was motivated to learn.
- Understand: The instructor presented the course material in a way that I could understand.
- Learning Progression: Considering the type of class (e.g., large lecture, seminar, studio), the instructor provided useful feedback that helped me understand how my learning progressed during this course.
- Support: The instructor showed genuine interest in supporting my learning throughout this course.
- Learned: Overall, I learned a great deal from this instructor.
How to read it:
- Points: one course section each, colored by course and nudged sideways so they don’t overlap.
- Boxes: the median and middle half of all the sections for that question.
- Point size: UBC’s dispersion index, flipped, so bigger points mean students agreed with each other more. The index runs from 0 (everyone gave the same rating) to 1 (students split evenly between strongly disagree and strongly agree).
- Panels: MDS courses on top, undergraduate courses on the bottom.
- Legend counts: sections plotted out of sections with SEI results, since sections below UBC’s minimum response rate are left out (for example, 6/9 means 6 of 9 DSCI 100 sections are shown).
In my MDS courses, every section scores between 4 and 4.8 out of 5 on every question. DSCI 100, the big intro course with about 100 to 175 students a term, is where my scores are lowest, mostly on feeling motivated and on getting feedback about how their learning is going. That’s also where most of my course changes have gone, like the code review sessions, worked examples, and checkpoint projects. DSCI 310 sits at the top of the undergraduate panel, and its 2022W2 offering got Dean of Science recognition for some of the highest student evaluation scores in the UBC Faculty of Science.

Each panel averages the interpolated medians of one set of questions, for each course in each term.
- University Module: the 6 UBC questions from the figure above.
- Course: 2 questions about the course itself.
- My academic background provided sufficient preparation for this course.
- In this class, I applied facts, theories, or methods to new problems or situations.
- Instructor: 3 questions about the instructor.
- The instructor treated students with respect.
- The ways the instructor implemented the course activities (e.g., in-class activities, labs, tutorials, field trips, online components, assignments) helped me achieve the learning objectives.
- The instructor was intentional about cultivating a welcoming and inclusive environment that supports all students and encourages all students to participate.
Each line is one course, and a course only shows up once it has at least 2 terms that met UBC’s minimum response rate (so DSCI 532 and DSCI 561 aren’t here yet). Lines only connect the terms where a course was taught and met the response rate, which is why some of them jump across a few terms.
Over time, the questions about me as an instructor have stayed between about 4.3 and 4.8 in every course. DSCI 521 went up on all 3 sets of questions between 2023W1 and 2025W1, and DSCI 100 dipped in 2023W1 and has hovered just under 4 on the University Module questions since 2025.
In the written comments, students bring up how approachable I am more than anything else, along with how much they get out of watching me live code (the most common request is for me to slow down during those demos, which is fair). Student comments are confidential, so I don’t quote any of them here.