> Instead of worrying about how changes in one module might ripple through dozens of dependencies, you can focus on the explicit contracts between components
That's a great idea! I'd like to suggest that we make programming languages have this as a first class concept: as part of writing a module, you write down a static description of the explicit contract. You might even encode effects and error states into that description!
Then, you know that if you stick to that contract, nothing ripples through the dependencies, but if you change it, there's things you need to go update elsewhere.
You can even readily swap in different components that have that same external contract! And since it's static, we can check it before the program even runs.
"external contract" is kind of clunky. What if we called it a "type"?