Recognizing Progress Requires a Certain Degree of Churn
How do we combat this? Well, you combat it by gradually shifting away from the features/syntax/paradigms you no longer feel best serve you as valuable programming tools. This is the same way people are writing JS code in a functional style. Is it a purely functional language like Haskell? No, it’s a multi-paradigm language that supports various forms of OOP, it doesn’t have strong or static typing, and it’s just now getting proper tail call optimization… but you can still code in a functional manner by exercising self-discipline & restraint. You can choose to use stateless functions and push side-effects to the edges of your app. You can use const to avoid reassignment and Object.freeze, deep-freeze, or Immutable.js to avoid object mutation. You can reap the benefits of strong typing by using TypeScript or Flow…
The important thing to realize is that you have that level of choice because these options are available to you. Can having a lot of choice be overwhelming at times? Of course! Can setting constraints for yourself help you establish more productive workflows & write more modular, maintainable code? Definitely! However, you’re the one that needs to make that call. Having that flexibility to evolve your programming style as you grow is invaluable. The same is true when it comes to choosing frameworks, libraries, and tools.