- 97 Things Every Programmer Should Know (EN)
- Kathrin Passig, Johannes Jander - Weniger schlecht programmieren (DE)
- Vlad Mihalcea - High-Performance Java Persistence (EN)
- Peter Seibel - Coders At Work (EN)
- Bill Karwin - SQL Antipatterns (EN)
- Eric Evans - Domain-Driven Design, Tackling Complexity in the Heart of Software (EN)
- Joshua Bloch - Effective Java, 3rd Edition
- Rob Conery - The Imposter's Handbook: Essential CS Skills and Concepts for Self-Taught Programmers
- Michael Nygard - Release It! Second Edition
- Kevin Behr, George Spafford, Gene Kim - The Phoenix Project
I'd call those books "Problemsolver". You might not read them from front to back but as a reference for specific problems.
- Thorben Jansen - Hibernate Tips, More than 70 solutions to common Hibernate problems
- Simon Harrer, Jörg Lenhard, Linus Dietz - Java by Comparison
These are non IT specific books, but touch essential things in our business. Either the way we work together or address some common misconceptions, for example sleep being an optional aspect to live:
- Richard Sennett - Together.The Rituals, Pleasures and Politics of Cooperation
- Matthew Walker - Why We Sleep
- Robin DiAngelo - White Fragility (A recommended read for all white developers and a good starter to understand why we need to work actively against racism and not manifest structural racism in our software based solutions)
- Beate Ritterbach – Vererbung: für Objekte nützlich, für Werte gefährlich (DE)
- Oliver Gierke – Whoops! Where did my architecture go (EN)
- Mark Seemann - Domain modelling with REST(EN)
From "Effective Java, 2nd Edition"
The class must document its self-use of overridable methods. By convention, a method that invokes overridable methods contains a description of these invocations at the end of its documentation comment. The description begins with the phrase "This implementation."
The best solution to this problem is to prohibit subclassing in classes that are not designed and documented to be safely subclassed.
If a concrete class does not implement a standard interface, then you may inconvenience some programmers by prohibiting inheritance. If you feel that you must allow inheritance from such a class, one reasonable approach is to ensure that the class never invokes any of its overridable methods and to document this fact. In other words, eliminate the class's self-use of overridable methods entirely. In doing so, you'll create a class that is reasonably safe to subclass. Overriding a method will never affect the behavior of any other method.