Learning goals

Discrete math is the foundation of the analytic part of computer science.

This course has two major learning goals:

  • Acquire and enhance your ability in abstract thinking and formal mathematic communication.
  • Familiarize yourself with important math concepts and tools essential for advanced topics in computer science.

These two learning goals, while deeply intertwined, are not the same thing, and we emphasize both. Therefore, for the first learning goal, you will find yourself practicing math proofs that seem irrelevant to computer science. They eventually set you up for success in reasoning about more complicated things relevant to computer science.


Content at a glance

Every computer scientist has their own journey.

One class is not enough for us to cover all important math concepts and tools essential for all advanced topics in computer science. Instead, this class will contain two different kinds of content:

  • Core modules (CM) are the topics that we think most computer scientists (i.e., you) need, and/or most advanced topics in computer science will require. Specifically, they are:
    • Logic
    • Proof Methods
    • Math Tools (such as sequences, recurrence relations, and asymptotic notations)
    • Sets, Functions and Relations
    • Inductions
    • Graph Theory
    • Combinatorics
    • Probability
  • Elective modules (EM) are other topics that we think some computer scientists need, and/or some advanced topics in computer science will require; we intend these modules to serve as the interfaces between CompSci230 and upper-level electives. The list of EMs is not finalized yet at this point.

There is no mandatory programming in this course. However, for those of you who are brilliant programmers and love to learn by programming, there exist opportunities to use programming to aid your learning in this course. Some assignments have a programming track that can replace part of the default work. These alternative programming assignments do not require a specific programming language. We will not offer any official programming guide or help resources beyond the instructions.

Please see the Module at a Glance page for the typical process of a module.


This is a partially flipped class, and it is partially flipped for equity.

People come to this class with very diverse math background, in terms of both depth and breadth.

Teaching all the content from scratch in the synchronous class meetings is less work for us, but that assumes one speed (of introducing contents) fits all. 

Instead of relying on that unsafe assumption, this class has required readings for all core modulesBefore the start of the first class meeting for each CM, you will have read the required readings and attempted a corresponding prepare quiz in Canvas.

You are not expected to master the content on your own through this process; instead, you are merely expected to get yourself comfortable with the basic math concepts that we cover in that CM. This way, you are given as much time and space as necessary to learn about the basic math concepts, and we start the class meetings on a more leveled playing field in which everyone has some exposure with the material. This then allows us to diagnostically strengthen the more difficult concepts and dive deeper into the subject in the class meetings. Unfortunately, this also means it is more difficult to succeed if you refuse to put in effort before the class meetings.

The elective modules, on the other hand, are not flipped. We cannot reasonably require work from you upfront for modules that you may eventually decide not to complete. Fortunately, EMs build on CMs, so it will be your success in the CMs that prepare you for EMs. Class meetings for EMs are where we interest/motivate you to continue your learning on those topics.


This is a class designed for flexibility.

We trust you to own your learning as an adult and a future computer scientist.

You get to choose what elective modules to complete. Even for the core modules, there are usually multiple ways to successfully complete a module. One example is the aforementioned alternative programming assignments. To support this core value, the grading mechanism in this class is designed such that your overall letter grade can never decrease from putting in more work or attempting new modules. Please see the Discrete Grading page for more details on grading.


This is a class designed for community.

Your success is not defined by others’ success.

Our goal in this class is to make everyone succeed, where success means achieving the learning goals.

There will be no curving (in the conventional sense) in this class. We will NEVER do anything that makes your success depend on others’ success. (You may feel free to read “success” as “grade” in the previous sentence.) Your classmates in this class are your teammates, not competitors. Please see the Community Policies page for more details on collaboration.


This is a class designed around feedback.

Communication is bidirectional.

You will get at least two opportunities for every bit of your work in this class, including all assignments and exams. This is such that you can learn and improve your work via the feedback we (the course staff) give you on your first attempt. We would love to give you an unlimited number of opportunities to improve, but that is usually not logistically feasible with our limited resources. Two is what we can promise you in advance. Please see the relevant pages for what it means for you to get a second chance for each course component.