About this course
The computer science program is designed for secondary students of any grade, as long as they have a basic grounding
in Python programming (or a similar language). We will not be covering the absolute basics from scratch in this
section. We will assume that students have a basic understanding of the following concepts:
- Variables and data types
- Control flow
- Functions
- Lists and dictionaries
Format
Each week will consist of an in-person 2 hour session, which will divided into a lecture and a lab. The lecture will
cover a specific topic in depth, and the lab will be used to collaboratively code review student solutions to the
weekly problem set.
The weekly problem set will consist of approximately 3 problems, which exercise the weekly topic in depth. Students are
encouraged to work on the problems during the week, and commit their solutions to their GitHub repository. Instructors
can provide mid-week support in the community Discord server.
No special supplies are required for the course. The classroom is fully equipped with development computers,
perhipherals, etc. We will require a GitHub account, but this can be created for free
during the first class.
Topics covered
We will cover in depth the fundamental data structures used in competitive programming, including linked lists, stacks, queues, graphs, heaps, and trees.
The analysis and implementation of algorithms is the core focus of this course, and serves as a foundation for all other specializations in computer science. In-depth topics like recursion, state machines, dynamic programming, and graph algorithms will serve as a foundation for virtually all advanced topics in other courses.
All development will be done with industry-standard workflows for version control and continuous integration. The collaboration model we will use can be carried forward to other projects, university work, and industry.
Well-specified problems such as those in competitive programming are a perfect environment for test-driven development. We will equip students with a testing framework that allows them to write specifications and verify correctness with a high degree of confidence.
Many of the topics and problems we cover will be among the most intricate pieces of code high school students will have written up to this point. Debugging techniques including breakpoints, tracing, and profiling will be essential to taming this new level of complexity.