Carter Zenke profile picture

Carter Zenke

I teach as a Senior Instructor in Computer Science at Harvard University. As academic head of CS50, I oversee educational productions and operations for CS50's 5M+ students, online and on-campus. With CS50's team of producers, I recently created our Introduction to Databases with SQL and am now teaching our new Introduction to Programming with R, both freely available online.

I have also recently made technical and pedagogical contributions to, the learnings from which we will present at SIGCSE 2024.

👋 Contact me at

📸 Photography by Andrew Markham

CS50's Introduction to Databases with SQL

Start learning! ✨ Learn about this course's design 🔍

Available, entirely for free, as OpenCourseWare. Also available via edX.

An introduction to databases using a language called SQL. Learn how to create, read, update, and delete data with relational databases, which store data in rows and columns. Learn how to model real-world entities and relationships among them using tables with appropriate types, triggers, and constraints. Learn how to normalize data to eliminate redundancies and reduce potential for errors. Learn how to join tables together using primary and foreign keys. Learn how to automate searches with views and expedite searches with indexes. Learn how to connect SQL with other languages like Python and Java. Course begins with SQLite for portability’s sake and ends with introductions to PostgreSQL and MySQL for scalability’s sake as well. Assignments inspired by real-world datasets.

Representative Learning Experiences

CS50's Introduction to Programming with R

Coming Soon! Learn about this course's design 🔍

Available, entirely for free, as OpenCourseWare. Also available via edX.

An introduction to programming using a language called R, a popular language for statistical computing and graphics in data science and other domains. Learn to use RStudio, a popular integrated development environment (IDE). Learn to represent real-world data with vectors, matrices, arrays, lists, and data frames. Filter data with conditions, via which you can analyze subsets of data. Apply functions and loops, via which you can manipulate and summarize data sets. Write functions to modularize code and raise exceptions when something goes wrong. Tidy data with R’s tidyverse and create colorful visualizations with R’s grammar of graphics. By course’s end, learn to package, test, and share R code for others to use. Assignments inspired by real-world data sets.

  • Representing Data
  • Filtering Data
  • Applying Functions
  • Tidying Data
  • Visualizing Data
  • Testing Programs
  • Packaging Programs
Representative Learning Experiences
  • Coming soon!