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 Programming with R

This is CS50's introduction to programming using a language called R. Designed especially for learners interested in statistical computing and data science, this course takes learners from knowing nothing about programming to packaging R programs and sharing them with the world.


Many of CS50's learners have expressed an interest in data science and statistical computing. R is a popular programming language for working in those fields. This course is for learners hoping to work in data science and statistics—particularly learners who are new to programming in general.

Learning Outcomes

Per the course's syllabus, among the course's overarching goals are:

  • To equip learners with the tools to use and design R programs, via which they can efficiently analyze data, and
  • To support learners in using R to build something of meaning to them.

Ultimately, the course provides learners with a foundation in R programming that can support learners' further study, work, or play in computer science. The same foundation can also empower them to apply their knowledge to problems in other domains, far beyond computer science alone.

Design Process and Principles

Taking a page from the Understanding by Design (UbD) framework, this course's design process began by defining the learning outcomes above. Design then turned to defining the courses's learning strategies. The strategies the course employs are:

  • Direct instruction, in the form of lectures, to introduce content
  • Reflection, in the form of checks for understanding, to elicit understanding from lectures
  • Peer learning, through sections, to promote hands-on practice with the course's concepts
  • Problem- and scenario-based learning, through problem sets, in which students test their skills in assignments inspired by real-world scenarios

Below is a typical student's path through the course:

flowchart TD A[Watch Lecture] --> B[Complete Check for Understanding] B --> C[Attend Section] C --> D[Submit Problem Set] D --> A

This course is still under construction!