With some regularity, I get asked by other students for class recommendations. I’ve taken a lot of interesting courses at Yale. Many of them have taught me skills or facts that I would never have learned otherwise; some of these have caused me to make major updates in my worldview. There are a select few that have gone even further and changed how I approach problems at the most basic level. These paradigm-shifting classes are the ones I inevitably recommend.
The key lessons I’ve taken from these classes are summarized below.
Intro Microeconomics
Utility: The idea that every outcome can be assigned some numerical utility value is an incredibly powerful decision-making tool. Putting rough utility estimates on things is easy once once you get the hang of it. Suddenly, seemingly intractable problems are transformed into elementary expected value calculations. This tool also makes it a lot easier to identify previously invisible gaps in your intuitive reasoning, like the sunk cost fallacy.
Coordination Problems: After learning about utility and preferences, I had about a week of believing libertarianism was the only logical way to organize a society before being hit over the head with coordination problems. It’s my belief that most of the difficult public policy problems we face today are some variety of coordination problem. Having a model and a name for this phenomenon makes it a lot easier to think about how to align incentives.
Discrete Math
Isomorphic Problem-Solving: The first time I heard someone describe how to solve a counting problem with stars and bars, my mind was blown. This type of technique crops up a lot in counting problems. Probably not coincidentally, there are also a lot of real-world problems which are isomorphic to discrete math problems. Since that first lecture with stars and bars, I never solve a problem without first trying to map it onto something I already know how to solve.
Graphs: Closely related to isomorphic problem-solving is the idea that many problems are actually some variant of graph manipulation. It’s amazing how knowing two or three graph techniques allows you to solve something like half of real-world problems.
Systems Programming
Information Theory: the idea of entropy and information content is a powerful way to conceptualize the world. Once you start thinking about quantifying the information content of some input, you can see that many events give us a lot more information about the world than we might first assume.
Algorithms
Dynamic Programming and Non-linear Thinking: The idea that simple algorithms can get much better performance the instinctive “human” method for solving a problem was a paradigm shift for me. The knapsack problem convinced me that thinking like an algorithm rather than a person can solve seemingly intractable problems.
Random Algorithms: If dynamic programming doesn’t solve your problem, maybe a randomized algorithm will. Seeing how randomness can cut through the Gordian knot of algorithm design gave me a powerful tool for solving tricky problems.
In reflection, most of these pieces of insight are actually just ways to convert messy non-mathematical problems into math problems. Until such a time as I am uploaded to the perfect mathematical world of the matrix, I will continue to look for classes that teach me to bring some algebraic order to the chaos.