Design things to be simple, but no simpler.
Simple is easy to understand and then only expand when necessary. Sometimes that’s with a generalized abstraction that can easily be used; other times, it’s a simple rewrite or refactor because there’s so little code that needs to be changed.
- Simply a text file?
- +custom HTML?
- +custom CSS?
- A simple script?
- Embedded client-side script code?
- A server?
- +cloud computing?
- A framework?
- A public web API?
- Full, client-side single-page app?
- State management vs stateless
- Distributed vs centralized
- Memory management
- Static typing
- A language many people know vs one few do, or can understand and wield
Most things that have existed existed with old technology. Is this new creation that novel that it requires new technology?
Do you really need an API if there are no public clients?
Does a dynamic single-page app framework need to be used for everything or just a few parts?
Are you letting the sexiness of something new and shiny outweight the needs of the business domain? Something that pays the bills?
Be efficient and spend some time on the hammock to think about what the real requirements are, even with a bit of extensibility, before expending a bunch of money and effort. You’ll be leaner for it and maybe self-sustainable too.
There’s something to be said for Facebook’s philosophy on never forcing tools on developers, but instead to make it so easy for them to use, that they migrate. E.g., React, JSX, Flow, Reason, Hack, etc.
But that can become a Frankenstein monster to outsiders eventually. E.g., JVM interoperability, multi-paradigm languages. Perhaps these new things offer good abilities, but do not enforce one successful convention that everyone gravitates towards. The lowest common denominator of worst practices, if allowed, can and will happen.
Related to maybe only moving a little ahead of the herd of programming languages.
- Unshipping and minimizing dependencies