Breaking your code into discrete modules will surface a problem if your code is tightly interconnected. Once you've defined your module boundaries you now are forced to not cause bidirectional dependencies. In this episode we will look at some strategies for breaking apart dependencies into abstractions first using protocols, then using protocol witnesses. We can then depend on those abstractions in our isolated module projects.