An open source curriculum for teaching datastructures and algorithms
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Teb's Computer Science Foundations Short Course

This repository contains curriculum materials designed to help schools, educators, companies, non-profits, or anyone at all teach an introductory computer science course. The materials here target concepts at the very core of computer science, and are focused primarily on introducing data structures and algorithms to students who have already been learning to program.

The materials here are intended for use in a classroom setting. Students who wish to self-study the same material may find the lesson plans, suggested exercises, and solutions useful -- but to get the most out of these materials they should be presented by instructor who already has a strong understanding of data structures and algorithms.

All of the materials in this repository have been released to the public domain. You may use them for any purpose you wish. If you want to support me, and enable me to create more public domain resources like these, consider subscribing to my Patreon profile. Additionally, if you want to contact me regarding these materials, please email me at

Using These Resources

The materials are designed to be used in a classroom setting, and are divided into two main types: lesson plans, and work for the students to complete. Each big picture topic in the syllabus has a lesson plan and at least one exercise. Pedagogically, these materials are written from a philosophy that students learn best by actively engaging with the topics at hand.

Lesson Plans

The lesson plans are written with the socratic method in mind, and with an understanding that no plan survives contact with a classroom. Each lesson plan has a set of stated objectives -- things that the students should know, or be able to do, after the end of each lesson. Following the objectives is a set of notes whose goals are:

  • To help remind the instructor about the topics and objectives
  • Provide a scaffold and order for each period of direct instruction
  • Provide a series of questions to pose to the students to challenge them to think and check their understanding
  • Give a few analogies and examples that I have found powerful in my own teaching
  • Provide sign posts to advanced concepts that are connected with these foundational topics

When I teach these classes myself, I rarely hit every bullet point in the lesson plans. Furthermore, the students will ask insightful questions that take the class down paths not covered in the lesson plans. These student-led tangents are invaluable to student learning, try not to think of these documents as a restrictive set of instructions for the lesson. Instead, I hope these materials empower you to create high quality classroom experiences that speak to your own strengths as an instructor.

I use the whiteboard, cold calling, pair-share, and socratic discussions extensively when teaching with these materials. Anything in bold is intended to be posed as a question to the students. Use your instincts and intuition about what strategies will get your students most engaged with the questions. Inventing object lessons, organizing mini debates, and encouraging open ended discussion are examples of ways to extend these lesson plans. Some of these lesson plans have suggested activities along these lines that I have found to be powerful in my own teaching.

Problems For Students

Direct instruction can be helpful for students, especially when students are being introduced to new and abstract topics such as Big O notation and complexity theory. However, even the best socratic discussion will be in vein unless students put what they learned into practice. Every lesson plan also has a set of suggested exercises -- mostly programming problems hosted on websites such as I have selected these problems to be relevant to the lesson objectives and to be appropriately difficult, with stretch/bonus problems for students who excel and want to dive deeper.

In my own teaching, I strive to get students working on problems early and often. Some of the most valuable direct instruction periods in my classroom have been spent revisiting homework problems, and addressing the most common mistakes/points of confusion as well as examining a particularly good solution.