Das von vielen hochgelobte Buch "Clean Code "von Uncle Bob fand ich nicht so prickelnd - das mag aber daran liegen, dass mir das meiste davon eh schon bekannt ist. Wie BlackJack es sagte, muss man es ja irgend wann einmal "lernen" bzw. gehört haben. Wer da also noch relativ unbedarft ist, dem mag das ex catedra präsentierte Wissen darin recht nützlich (und neu!) sein.
Speziell bei den ausgedehnten Refactoring Exzessen im späteren Teil bin ich zwiegespalten: Prinzipiell ist es sicherlich eine gute Idee, ein halbwegs komplexes Beispiel zu wählen, um Methoden zu zeigen, aber ohne sich intensiv selber mit dem Code auseinander zu setzen bringt es einem nicht viel. Und ehrlich gesagt fehlte mir die Motovation, mich mit diesem Java-Code zu befassen
Ich würde alleine für das erste Kapitel das Buch
Dependency Injection in .NET von Mark Seemann empfehlen. Ich habe noch nie eine bessere Motivation und zugleich Einführung in ein Thema gesehen

(Wer es in einem Laden sieht, sollte sich die 15 Seiten einfach mal so durchlesen, auch wenn er nicht aus der C# oder Java-Ecke kommt!) Der Mann hat einen sehr angenehmen Schreibstil und dazu ein Talent, komplexe Sachverhalte plastisch darzustellen, so dass man sowohl das Problem klar begreift als auch den Lösungsansatz dazu.
Weniger Konzepte der Programmierung an sich, dafür imho durchaus lesenswert finde ich auch den "Klassiker" von Eric Evans "Domain Driven Design". Allerdings empfand ich das Englisch als ziemlich prosaisch für ein technisches Buch; ich bin sicherlich nicht der beste Englischkenner, aber da waren auch ettliche Vokabeln drin, die meine Mutter noch nie gehört hatte (und die ist wirklich fit in Englisch und ich rede hier nicht von technischen Begriffen). Sicherlich kein KO-Kriterium, aber wenn der Lesefluss durch das Nachschlagen für verständnisrelevante Begriffe getrübt wird, mag ich das nicht so. Auch wenn vieles in dem Buch imho arg theoretisch daherkommt und auch vieles wirklich speziell für Großprojekte relevant ist, finde ich den Grundtenor gut: Konzentriere Dich auf die Problemdomäne und nicht auf andere Dinge wie die Persistenzschicht oder die Präsentationsschicht. Ich gestehe, dass auch ich früher oftmals schon das relationale Modell zu erst im Kopf hatte, und da herum meinen Code geschrieben habe.