An ambitious goal
Prework: A strong foundation
Step 0: Admissions
Step 1: Our problem-solving process
Step 2: Analyzing performance
Step 3: L0 problems
Step 4: Web development
Step 5: Getting your first role
Step 6: L1+ problems
Our goal is to help hard-working, intellectually curious people calmly and methodically master programming, in a way that is unrestrained and has no bounds. In doing so, we aim to nurture and unlock every student's intellectual potential.
Hard things are hard. They take a lot of work and dedication. In this world of frantic rushing, it can feel like there are few places that support thoughtful, introspective, intellectually honest work. We hope to be such a place.
The first goal is to lay a foundation that will allow you to tackle the most difficult topics in computer science. To develop this, you’ll take our introductory course, Programming Foundations.
[Aside: It is essential that you have the right mindset to succeed in our program. In addition to reading our materials, we recommend reading this short essay by Dijkstra.]
This first course borrows heavily from epistemology and science. From epistemology, you’ll learn a process for discovering what is true, and calibrating your thoughts based on truth. From science, you’ll learn how to run experiments to test hypotheses about computational problems.
Along the way, you’ll learn about the essential mechanics behind all programming languages. To help you focus on the essential ideas, superfluous details are ruthlessly culled.
[Aside: Reliably, as if it were a law of nature, students on their own get completely lost in the details. A big reason is that superfluous ones sound important. Another is that the superfluous ones are easy to teach. These factors create a mouthwatering economic opportunity for suppliers of useless tutorials.]
If you bring all of these elements together successfully, you should be able to simulate the computer in your mind flawlessly, albeit with a lot of effort. When this becomes fluent and natural, you will finally be able to think in a computational way.
To help you identify weaknesses, we have quizzes throughout the lessons. They’re designed such that a thoughtful student should be able to get every quiz correct on the first try.
To help you reflect further, we include walkthroughs that describe our approach. You should compare your approach against ours. If there are any gaps, consider how you can close them. If you do this earnestly, gaps should eventually shrink over time.
In the case that you do fail a quiz, we offer no hints about what went wrong because that would stunt your growth. Each failure is a great opportunity that must be exploited fully, but that can only happen if you allow this “debugging of your own mind” to actually occur. Otherwise, how will you improve?
[Aside: Many teachers do not prioritize this “debugging of your mind”. Often the intent is good; be as helpful as possible, keep students on a rigid schedule, etc. Being overly helpful can quickly devolve into coddling. Adhering to too strict a schedule can quickly devolve into going through the motions. Beware of these teachers, as they unwittingly specialize in producing minds full of bugs.]
The admissions process consists of a written exam and live interview. We are trying to determine if you can handle the rigor of our main program. Decisions are based on your performance across these areas.
Regardless of the decision, we’ll give you detailed feedback to help you improve. If rejected, you may be able to reapply after a cooling off period. The length of your cooling off period will depend on your performance.
Since our paid program is very difficult, we offer more ways to get help. In addition to email support, you get chat support via Slack. For issues that cannot be resolved in writing, you can schedule individual meetings with an instructor.
You’ll also get access to our weekly Friday meetups, which are one part accountability meeting, one part problem-solving workshop. Before the meeting starts, you must post an update in Slack that describes what you accomplished this week.
Next, we have a ~10 minute discussion where you can ask questions, discuss topics of interest, and share personal projects.
The remaining ~50 minutes are reserved for live problem-solving. You’ll get a question that you must answer live. Our goal is to simulate the pressure you’ll face in interviews and the workplace.
You’ll be pushed to probe your own thinking, compare it to other approaches, discuss it with others, and modify it to counteract weaknesses.
What do you do when you don't know exactly what to do? That is what makes problem-solving so difficult. You must makes a series of decisions amidst uncertainty. The better your decisions, the better your results will be.
You can drastically improve your problem-solving ability through improving the quality of these decisions. Imagine that you have a problem-solving machine; you are the machine operator and owner. Each time you encounter a problem, you pay close attention to how you perform. Are there tweaks you can make so that you operate better the next time? Did you completely fail and need repairs?
In this section, you will learn about our approach to this repeatable process. In doing so, you will start to construct your own machine, with its own idiosyncratic strengths and weaknesses. Later on, we’ll feed problems into our machine. Each problem gives you a chance to make specific improvements so that you can produce better outcomes.
Next, you will learn our approach to analyzing time and space complexity with big O notation. This skill is a requirement if you want to effectively use data structures and algorithms.
The heart of this program is a set of increasingly difficult problems. The goal is for you to improve your problem-solving abilities in a rigorous way, where you must master each problem to move on. This means that reaching a certain point in the curriculum actually means something.
Problems are rated on a difficulty scale of L0, L1, L2, .... You will start at L0 and keep progressing until you can solve arbitrarily difficult problems. The most difficult problem you can reliably solve well is a proxy for your skill as a programmer. The higher it is the better. It gives you power; you can solve a larger set of problems, and companies understandably want to wield that power.
Problems are graded by hand. As a starting point, you must have a correct solution and big O analysis. Next, the solution must meet minimum standards for space and time complexity (i.e. it can’t be too slow or take too much memory). Finally, you’ll get a design grade that reflects the quality of your decision-making. If you fail on any of the criteria, you’ll have to try again.
Upon passing an assessment, you'll get detailed feedback about the strengths and weaknesses of your solution. From there, you can see where you need to improve by paying attention to the “gap” between your work and the reference solution.
A secondary but still important aspect of this program is a set of lessons, assessments, and quizzes related to web development. This has special importance because that is where most of the jobs are today. The goal is to give you applied skills and knowledge that will make you attractive to employers. We focus on helping you learn the skills that are required for front-end web development roles, since that is the most common entry level job.
Your first goal is to create a resume that will land you interviews. The crucial part of your resume will be a headline project that serves as proof of your programming ability. We'll guide you through this process and will help you incorporate the project into your resume.
Next, we’ll help you prepare for common behavioral interview questions. On the technical, side, most of the work is done by this point. The main challenge is to be comfortable working through problems under pressure. If you’ve practiced in the Friday workshops, you should be well prepared.
At this stage, the goal is to help you grow in your career. Often, students have a specific goal, like working in a more demanding role or moving from a startup to a larger company.
Concretely, our focus is helping you build increasingly more advanced problem-solving and software design skills that you can use in combination with classic data structures and algorithms. These skills are broadly useful in all types of programming and are worth doing on their own.
Practically though, most students will care about this because they are trying to break into the top tier of companies (e.g. Google, Facebook, Microsoft).
In theory, every aspect of the program can be replicated on your own, but as with most hard things, the subtle points are frustratingly difficult to get right. In learning with us, you benefit from all of our successes and most painful failures.