Luck is not a type system.
An idea I've been playing with.
For those desiring rapid prototyping and the simplicity of editing code by hand in a vanilla text editor, dynamic languages such as Ruby, Python, and Javascript are unrivaled. But as projects mature and increase in complexity, these requirements often give way to maintainability and performance.
These two boxes are more readily ticked by statically-typed languages such as Java, Scala, and Go. Compile-time type checking allows these languages to make strong assertions about the type of input each function receives, and along with them, significant optimizations. If the program contains invalid type signatures, it is rejected. This eliminates an entire class of bugs which may only arise when the program is run – for example, in production.
Many dynamic languages implement method dispatch via a hash map populated at runtime. Each time a method is invoked, the virtual machine looks for a definition of that method in the map, then either calls it or returns a "no method error." If the method exists, the programmer is lucky and the program continues. If it does not exist, she is not.
I don't care for method dispatch powered by luck.