Code that changes based on it's data. Heady stuff. Generics are a thing in many languages. Used properly they can be amazingly powerful and abstract complexity away from the developer. Used improperly they add unnecessary abstraction and make it harder to understand and debug code. There are also different "levels" of generics, from function overloading to Rust's implementation. Our challenge is to make the right choice so that we can make progress today and be prepared for the future. To do that we need to understand what generics are and the trade-offs around their use.