I wish I could communicate to people that humility is a good primary motivator for improving your skills.
The reason that people get into Design Patterns, and iterators, and dynamic functions, and languages with macros … the reason you do this is because you simply don’t trust yourself to be able to – or instance – MANAGE and MAINTAIN duplicate code, in the same projects or across projects.
And I hate when people misapply this Humble Programmer principle! It’s arguing that it’s arrogance to rely on your own brain, instead of a powerful abstraction that allows you to think about the problem in much simpler terms. Many people actually try to use the essay to argue against advanced coding techniques! That’s not “humble”, it’s some kind of prima-donna, look-down-on-other-coders thing, right?
How do you get THROUGH to these people?!?
Whereas many a “can-do”, “80’s guy” programmer will gleefully blast through reams of duplication-heavy code, copy-paste at the ready, producing hundreds of files and folders and tables, very productive, look at that tangible output … I feel, I KNOW, that I would be unable to keep my code from devolving into chaos. For one thing, I know I suck at keeping track of changes and making them in more than one place; it kicks my ass. In fact, I am less able to maintain non-orthogonal code than almost anyone else I know. I can’t manage several hundred different but similar stored procedures for a variety of domain objects, even using tools like code generation. It kicks my ass and I know it, and that’s why I went the extra mile, learned how to address the bigger problem, and now use a capable ORM library like Hibernate, and write only a small amount of specialized SQL – like Nested Sets insert triggers, etc, which is just to support specific data structures.
A program is going to change. Since I don’t trust myself to be able to redo all of this code later – or even to remember what it was about – I put a ton of effort into ensuring that my programs are very loosely coupled.
In so many industries, it would be difficult for me to succeed, because I have a terrible memory and a low ability to store much in my head at a time. Don’t get me wrong, the stuff I do can be pretty powerful, but I HAVE to keep the programs and interfaces simple and elegant. Otherwise, I’m doomed.
In so many industries, the fact that the quality of my output varies drastically would bar me from working. In programming, if I just think about a problem for slightly longer than the time it takes to copy googled code and paste/adapt it to my needs, I know that I can always work with my best thoughts. And so the quality of my output can be consistently high.