University-level courses
Bryn Mawr College
CMSC B110: Introduction to Computing
This introduction to computer science is taught in the Processing language, essentially a dialect of Java. Fall 2016
CMSC B113: Computer Science I
This is an introductory course in computer science and computer programming, using the Java programming language. It is intended for students with higher degree of mathematical maturity than our regular introductory course. Fall 2017, Spring 2018
CMSC B206: Introduction to Data Structures
This is a fairly standard second-semester course in computer science, taught in Java. It covers implementations of arrays, linked lists, binary search trees, and hash tables, along with designs of lists, stacks, queues, sets, and maps. We conclude with a short unit on comparing sorting algorithms using Big-O notation. Spring 2018
CMSC B231: Discrete Mathematics
This is an introduction to the discipline and rigor of discrete mathmatics, using "Discrete Mathematics with Applications", by Susanna Epp. Fall 2017
CMSC B245: Principles of Programming Languages
An introduction to the study of programming languages, covering syntax, semantics, language classification, and a little type theory. This course uses Haskell and Java as the main languages of study, including work on a Java interpreter written in Haskell. JavaScript and assembly language round out the course. Fall 2018
CMSC B246: Programming Paradigms
A mid-level computer science course focusing on C and understanding memory layout and management. This course also teaches students the use of command-line interaction, git, and GitHub. Spring 2017
CMSC B350: Compiler Design
An upper-level course on compilers, with significant implementation work in Haskell. Spring 2019
CMSC B380: Modern Functional Programming
This course covers Haskell, with a strong focus on its type system. The course culminates in using Haskell with dependent types. Spring 2017
University of Pennsylvania
CIS194: Introduction to Haskell Programming (full instructor, Fall 2014)
This course, aimed at undergraduates with a small exposure to functional programming, covers Haskell.
CIS552: Advanced Programming (TA, Fall 2013)
This course is aimed at graduate students and advanced undergraduates. Students learn how to create well-crafted code in a functional programming language (Haskell).
CIS120: Programming Languages and Techniques I (TA, Spring 2013)
This is the second semester introductory course for computer science majors.
CIS190: C++ Programming (full instructor, Fall 2012)
This is a half-credit undergraduate course in the C++ language.
Harvard University
CS50: Introduction to Computer Science I (TA in 2000, 2001; head TA in 2002)
When I taught it, this course was a bread-and-butter introductory course in computer programming, taught in C (with some assembly language, too). It has since morphed into something more amazing. I shared the position of head TA in my last year at Harvard, overseeing a teaching staff of around 10 and helping professor Michael D. Smith plan the course.
High-school-level courses

Note: The links below starting with On... expand to short diatribes distilled from my strong opinions about various aspects of education. Read at your peril and feel free to debate with me over email. I readily welcome informed opposing viewpoints.

Introduction to Java Programming (taught 24 times, 2003–2011)
This course focused on writing small games; students wrote final projects at the end of the semester, often re-creating classics such as Breakout, Asteroids, or Tetris.

There were a number of variations on this theme over the years. Most notable was my attempt to include more girls in the class following guidelines to make computer science more practical. These versions (advertised to the student body in advance) included applications to a variety of non-computer-science fields. However, my experience is that the games-based courses were more successful for all genders.

Advanced Placement Computer Science AB (taught 6 times, 2003–2009)
Taught in Java, this course covered object orientation and data structures & algorithms up to linked lists, binary trees, and quick sort. It prepared students to take a national exam showing college-level proficiency in computer science
Advanced Placement Computer Science A (taught 3 times, 2008–2011)
Also taught in Java, this course covered object orientation and simple recursion.

In 2009, the College Board discontinued the AP Computer Science AB exam. According to the released statistics, it was easy to infer that the AB exam was not profitable due to low enrollment. I can guess why the AB enrollment was lower than that of A: AB was a lot harder, containing twice as much material. However, I found it aggravating—and still do—that the decision made was to jettison the harder course instead of to work on ways to train teachers better to cover the hard material. I did it for six years and it was hard to cover everything, but it was most certainly possible. In my opinion, the material that remained in the A course could hardly be called suitable for "advanced placement". In each of my three years teaching A, I finished covering the core material by around Christmas and spent the rest of the year attacking other topics. This may have been fun for teacher and student alike, but I see this change as another sign of the "dumbing down" of education.

Web Programming (taught 3 times, 2006–2009)
This course covered basic HTML, CSS, JavaScript, and Ruby on Rails. It did not cover any visual design aspects of building web pages.
Digital Electronics (taught once, Spring 2011)
This covered the basics of digital electronic design, including logic gates, flip-flops, adders, and timing circuits. I designed the course from scratch and outfitted a lab with all the necessary components.
FIRST Lego League (mentored 3 times, 2008–2010)
During the last two years, I was the director of the FLL program at my school.
FIRST Robotics Competition (mentored twice, 2009–2010)
Algebra II Honors (taught 3 times, 2009–2011)

This course taught essentially one skill, with the usual variations: how to solve for x. I enjoyed teaching my highly skilled and hard-working students to perform this skill, required by the school's curriculum and by the expectations of competitive college-bound high school students. However, I find the skill almost completely useless! Computers can perform this skill better than humans, so why do we spend so long teaching it?

I can think of a few arguments:

  1. We need to solve for x to perform basic calculations throughout life, such as remodeling a home or balancing a budget.
  2. We need to know how to solve for x so that we can program and maintain the computers to do so.
  3. Learning to solve for x builds skill in abstract symbol manipulation.

Here are my responses:

  1. Absolutely. Note that I did say "almost completely useless". To me, all students should know how to solve linear equations for x. For problems harder than that, students should know how to use a computer to perform the task.
  2. Absolutely. Learning to solve for x should remain as a college-level course (or perhaps high school elective) for those who wish to learn more. Note that we don't learn Newton's method for finding square roots anymore and are happy to let computers do that task for us.
  3. Absolutely. Students need to be exposed to abstract symbol manipulation. However, I'm sure we can find a more useful way to do this than solving for x. For example, we could teach programming in a referentially-transparent, pure functional programming language. I would even accept teaching using an untyped functional language that is otherwise well designed. As another example, we could teach students how to write inductive proofs. (The official curriculum for the two levels of the AP Calculus course is mysteriously devoid of the words "prove" and "proof".)

For more along these lines, see Conrad Wolfram tell the same story.

So, do I think any given school should just stop teaching how to solve for x? Unfortunately, no, I don't. In today's American educational system, students are best served by preparing them for the college entrance exams and to meet the college entrance expectations. These include a solid grounding in solving for x. It is regretfully up to national educational leaders to start the conversation of how to get from the current antiquated form of math education to a system that uses today's technologies to the fullest to prepare students for tomorrow's changing needs. When that starts, schools should jump right on board, but until then, the best a school can do is to squeeze in as much real math education around the required curriculum.

Multivariable Calculus (taught once, 2005–2006)
Functions, Statistics, & Trigonometry (taught once, 2009–2010)
This course was a bridge from Algebra II to Precalculus or AP Statistics for students who were not ready to go there directly. It covered elementary statistics, a solid unit on trigonometry, and basic operations on functions.

Both schools that I worked for had Algebra II as the final required math course. However, the college counselors often (rightly) insisted that students continue to take math to improve their chances at college admission. I agree that Algebra II does not finally answer all the questions a student should have to get a basic understanding of numbers. But I think that a standard Precalculus course (or a bridge course such as the one I taught) does an even worse job.

In my estimation, the vast majority of students who might wish to stop math after Algebra II will not have highly quantitative or numerically analytical careers. The abstract mathematics taught in Precalculus does not serve this population well. I have quite a solid understanding of Precalculus concepts, yet the only time I can recall using them outside of my work was to inform my brother (a mechanical engineer) that the optimal setting on the shower knob was at π on the unit circle.

Yet, I have used a higher math skill routinely during my adult life: the ability to reason about finances. This I learned from my father and from an AP Economics teacher who wisely strayed from the curriculum. Students who excel at math are likely able to figure most of the details out on their own—the math isn't really that hard. However, the students who need to be urged to continue past Algebra II might not be so lucky.

High schools should equip all students with the ability to make informed financial decisions as adults. This includes a basic understanding of how the stock market works as well as major other investment and debt vehicles. For example, a high school graduate should be able to figure out whether to lease a car or take out a loan to buy one, based on current and expected income, investments, and mortgage payments. By not teaching our students how to do this, we are handicapping those students whose parents can't teach them and perpetuating current inequity to the next generation.

In sum, I would love to see courses such as the one I taught (an equivalent of which exists at many schools whose offerings I've examined) become part of history and a course teaching basic financial know-how become a part of the future.