Awesome write up.<p>While I agree that dynamically typed languages -- by their loosely defined API requirements -- are more difficult to scale, it&#x27;s not difficult to add type checking and&#x2F;or provide a well structured public API where necessary.<p>I think statically typed languages go too far in the other direction. Tyr type and API definitions are too strict leading in a ton of unnecessary effort (ie boilerplate), increased surface area for potential bugs, and overly restrictive limits that require &#x27;creative&#x27; workarounds to effectively write code.<p>I think there&#x27;s a &#x27;happy medium&#x27; to be found where type checks are required for certain inputs and a clearly defined API can be established without the need for private&#x2F;internal&#x2F;public syntax artifacts.<p>I&#x27;ve been playing with this a bit in JS lately. Using model definitions to specify the structure and enforce validation. As well as defining facades with the ES6 module import&#x2F;export syntax to define public APIs. Finer grained control (ie private vs internal) can be defined using closures that provide internal interactions while hiding the private implementation details.