Humans deal with complex systems by using abstraction and modularity to break problems down into smaller, more manageable pieces. Modularity allows components to be reused, while abstraction ignores implementation details and focuses on simpler interfaces between modules. This recursive process of building up systems from basic modules allows for complexity far beyond what could be understood all at once. Different models or abstractions expose different aspects of a system and allow exploration of design tradeoffs.