In this chapter, we learned the importance of the dependency rule. We learned that we can only import packages in one direction. We learned how to separate a complex application into layers.
We learned how to use dependency injection to interact between our application layers and implemented an application using a layered architecture.
The key to selecting the right architecture is a deep understanding our system's requirements, existing components and the capabilities of available technologies choices. At the end of the day it’s the system engineer’s job to ensure the entire system works properly.
In the next chapter, we'll learn about functors, monoids, type classes, and other functional programming concerns.