Don't use the repository structure as your primary abstraction!
AEM comes with a number of useful concepts and abstractions, but much code in AEM projects is still based on Sling resources and JCR nodes, properties and ValueMaps, not to mention the String operations to create paths to access these. The overall repository structure is still the abstraction used most often.
Creating functionality while working on that level is cumbersome, error-prone and leads to an explosion of (often duplicated) helper functionality. High level concepts, which are more expressive and easier to use, are rarely designed and implemented.
This talk shows to create proper abstractions to cleanup your application design and your code, so you can build your applications in away, which is easier to understand, maintain and evolve.