A Philosophy of Software Design by John Ousterhout is often recommended, and is very good.
There was an interesting debate between John and Uncle Bob on their differences in style recently[1], with a related HN discussion[2].
[1] https://github.com/johnousterhout/aposd-vs-clean-code/blob/m...