I had a thought over the last bit of time about how programmers learn their trade. When I was cutting my teeth the expectation was that you already knew how to program by the time you got to school. It’s something that you did out of the love of it.
When I was growing up the idea of computer programmer wasn’t something that you really thought of as the “high paying job list.” There weren’t many of them, not enough to really move the needle on the jobs list. (Of course even back then they were well paid)
Keep in mind that I’m an old fart and I learned to program on a TI-99/4a back in ’81.
Things were simple back then too. You had limited memory. Limited speed. Limited storage. Limited everything. Most things you would need to use for a system were completely bespoke tools you built because off-the-shelf wasn’t fast or small enough. You didn’t build in configurability because that takes up space in the limited resources you had at hand.
Now if you want some feature you pull in a library. You’d be dumb not to, honestly; I’m not advocating building everything yourself, that’d be whack for sure.
The thing that you get though is the idea that everything should be configurable in n ways. You’re rewarded for that in school now.
This has a problem.
YAGNI — You Ain’t Gonna Need It.
The problem that you don’t run into in school is dealing with the long-term maintainability of the systems you build. Each configuration point is another thing to maintain on an ongoing basis. In school you build a project, it gets graded, then goes in the bit bucket; the long-term costs of the decisions made early on never need to get paid. An additional issue is that the ideas of how you’ll configure a system rarely line up with what will be needed in most systems as we’re not blessed with 20/20 foresight for the most part.
If you need a system with configurability, build it if you need it. Build your system so that you can extend it with the configurations you need later, but don’t preemptively bite off what you don’t need yet.