Data-oriented design or why you might shoot yourself in the foot with OOP (2009)
In all my experience with OOP, it's always been inheritance that is the root of all evil. Rust and Go got this correct by having class-like objects with no inheritance, to achieve encapsulation without fragility.Unfortunately, all the other languages that included inheritance in their design can't wish it away.  Devs are going to keep reaching for inheritance as the closest, most comfortable abstraction.