Writing tests is as much of good practice as it is a scientific endeavour.

In this talk, I explain how types and tests complement each other, how to use them, and what epistemology and the scientific method can teach us about correctness.

Tests, like experiments, follow an inductive approach to getting to know our programs: they execute parts of our code and observe its behavior. We then do an extrapolation: we choose to believe our software will always behave the same in the future.

Types, like mathematical proofs, can use a strict system of logical rules prove absolute properties about programs before they even run.

In this talk, I use this analogy to demonstrate how tests and types complement each other, and how we can use both to write better programs.