
Based on Bloch and Gafter's standing room only Java Puzzlers talk at JavaOne, the heart of the book comprises over 100 Java programming language puzzlers: brainteasers that challenge the intellect while alerting programmers to the traps, pitfalls, and corner cases that lurk in the nether regions of the Java platform. All the puzzles from the authors' popular JavaOne presentations are included, as are many puzzles never before seen in public. There are two major types of puzzles in the book. Most of the puzzles take the form of short programs that appear to do something but actually do something else. Readers will be encouraged to predict the behavior of the program before running it. After running the program, readers will be encouraged to figure out why it behaved as it did before consulting the solution. In a second type of puzzle, the reader will be asked to write a short program that performs some specific task. Most of the solutions will contain a "moral," a rule that reader can follow to avoid the problematic behavior demonstrated in the puzzle. The puzzles are grouped into chapter based on the primary platform features they exercise and to maximize readability, fun, and pedagogical effectiveness.
There is also a lot of magic going on in JVM e.g. there is one optimization that causes stack trace to be omitted if the exception is thrown from a given place a lot of times. Beginners then see an exception without a stack trace and are stuck. SO rel: https://stackoverflow.com/a/3010106/1779504
Spring can be a source of confusing problems when defining beans (especially when you have to use Qualifier's). Most of the juniors that I had a change to work with had very hard time getting used to Spring bean model. And I am not mentioning here strange Spring Proxy behaviour that can defy even programmers with 10+ years of exp
For what it's worth, I think python's case is fairly simple and easy to remember.
Python objects can define two different methods for operator * : __mul__(self, b) and __rmul__(self, b). When you see A * B, try A.__mul__(B) if A has a __mul__. If the call throws NotImplemented (usually due to B's type) of if A did not hava a __mul__ call B.__rmul__().
I think that's actually much simpler that relying on types for dispatch since operators tend to be more "flexible" in their operand types than normal functions.
As a Unix systems engineer, I would choose
1. W.R. Stevens books on Unix and Tcp/ip.
2. Rochkind's Advanced UNIX Programming.
3. Most of the Unix/Linux manual pages.
4. Bash FAQ
As a Unix systems programmer I would choose 1. Mythical Man Month
2. Jon Bentley's Programming Pearls.
3. K&R C and Stroustrup C++
4. A recent Java reference and Bloch's Java Puzzlers
5. a reference and cookbook for the language of your choice -- Python, Ruby, Perl, etc.
6. Google's style guides[0]: https://www.amazon.com/Java-Puzzlers-Traps-Pitfalls-Corner/d...