One key thing the author started to allude to: the value of functions - pure functions, vs a cyclic graph of mutable objects with temporal coupling of state changes and spaghetti inheritance out the wazoo.<p>OK, he didn't say <i>that</i> exactly, but he really did start heading that way.<p>The "static types will save us crowd" is drowning out a lot of the rest of the discussions that need to happen.<p>* Somebody mentioned Eiffel in other comments. Eiffel's design-by-contract assertions about invariants are vastly preferable to Java's magic beans that eventually (maybe) reach a valid useful state. I guess unit tests <i>sort of</i> compensate for this, but not really.<p>* Mutable state needs to be pushed to the peripheries of our apps, not plastered everywhere.<p>* Inheritance might not be such a good idea, due to reasoning about which code runs when you call a method / send a message. Do like Go-lang, and have interfaces for polymorphism, but skip inheritance - the use of an interface is a flag for later binding. Likewise, higher order functions and closures help you reuse code without resorting to spaghetti inheritance.<p>* We need languages that make programming with types easy, using type inference where it is clear to do so (e.g. - local identifier initialization, but perhaps not for multi-line function headers?). BUT, we still need to allow for dynamic runtime types, perhaps with a few minimal flags on identifiers/modules, rather than forcing people into monstrous reflection frameworks and XML situps.<p>FWIW, I agree (with the paper) that feature/integration tests are very good, but unit tests are often a waste.