Surprised nobody have mentioned Making software, https://www.amazon.com/Making-Software-Really-Works-Believe/...
It takes a empirical view on the software process. Does writing tests first help you develop better code faster? Can code metrics predict the number of bugs in a piece of software? Do design patterns actually make better software?