Absolutely, test test and more tests, we have a mechanism where we use random data with random lengths etc. so you will see many tests run on multiple threads checking random info. This has proven invaluable in some complex testing situations (like can we encrypt / decrypt all data types etc.).
reveal intent => plus only a single intent, single responsibility rules
This goes with my other big point, the rule of “least astonishment” i.e. do not implement an equals without also implementing it’s partner not equals etc.
I would also rate single ownership as more important than deduplication, in many cases. So when calculating, do not let anyone near the thing, when it’s calculated make it immutable and share as much as you want, BUT only if you can ensure lifetimes are managed and agreed by all. Otherwise do not share at all
The rest then follows nicely. Really good summation I think, nice find Mark.