In an all too familiar trade-off, the result of striving for ultimate simplicity is intolerable complexity; to eliminate too-long proofs we find ourselves “hopelessly lost” among the too-long definitions.
So the tension around types comes from the fact that if you want to program in a style that turns effects into explicit things that get passed around, sophisticated higher-order functions are necessary to keep your code reasonably clean. And sophisticated higher-order functions tend to have fancy complicated types. To make programming with them palatable, you either need to have a correspondingly fancy type system or punt on types entirely.
If I sound elitist, it’s only because the time and difficulty required for wrapping a complex topic into a coherent narrative is often underestimated by those who have never done it. A book is not 150 successive blog entries, just like a novel isn’t 150 character sketches, descriptions, and scraps of dialog.
Processes componentize the heap.
Modules componentize the code.
When I worked with companies that have a holy mess of code, I felt like there wasn’t enough time in the day to refactor everything. When things broke when I refactored them I got yelled at. It felt like a miserable existence.
When I worked with a company that had clean code I didn’t have much work to do. It was all just boring things like adding more controllers and views and CRUD tasks. It felt like a miserable existence.