I'm assuming John Ousterhout's book A Philosophy of Software Design [1], which I would recommend reading before reading about design patterns, because it's more fundamental.
[1] https://news.ycombinator.com/item?id=37975558