“I’d leave out classes,” (James Gosling, Creator of Java)
Rob Muhlestein

Adhoc mutation has been a core issue in most of the applications I’ve worked on. This is why developers coming into a large code base take a long time to ramp up. If they mutate something in one random place of the app it can (and does) cause bugs in other places. This adhoc mutation “feature” is a primary driver on developers spending so much time unit testing.

As for strict typing, it is helpful in warning developers at compile time but has drawbacks with making polymorphism code harder and can sometimes give a false sense of safety. Rust’s contracts and Clojure/ClojureScript’s spec are a great alternative. They offer compile time and run time checking. The also have validation baked in (either at compile or runtime). This allows them to do generative testing and have a increased confidence when handling datasets a developer might not have thought of.