Our tech lead is a bit of a diva. He is smart but basically he just programs and doesn't bother with much else. He bangs out code quickly, but it can be buggy and its usually the rest of the team that fix the bugs, keep the infrastructure running, write the tests. He is good at tricky algorithmic stuff. His code is fairly well organised. I don't find his abstractions particularly good. The REST API he created is terrible (poor abstraction) and not RESTful a lot of it uses POST requests, 200 success contains errors. No tests. Terrible at explaining his work to other people. Poor at listening.
Give me a good team player with average ability over a good programmer that lacks the other skills any day.
Python's PEP 20/zen of python is one of the best guide for craft, imo. It works well for individual programmer as well as for teams.
Programming -with intent- is the best way to get better.
If I code up a 10k LOC main.cpp with stringly typed data structures, I'm not really better at programming, am I?
It's like that saying: practice doesn't make perfect, perfect practice makes perfect.
Programming is not literally just typing, as we all know, nor is it simply getting a Thing to compile. A lot of it is educating oneself on different types of data structures, algorithms, math, architectural practices, and so on. Expanding our workbench of tools, as it were.
And -then- putting that into practice when actually programming.
I'm not good at Rust merely because I've worked with Rust a lot; I've also read books on Rust, and I've read many web articles on Rust (found from Rust Weekly) and various libraries, etc.
I think you are, you are better having done that than before. It might not have been the best improvement you could have gotten out of it, but still.
The relevant XKCD is this one: https://xkcd.com/1414/
Basically it goes: If you just keep working, will you always keep making progress towards where you want to be?
I don't necessarily mean "if you just put in the effort then you'll succeed," which I do not believe in. People talk about "practice with purpose." You have to know the parts that you need to improve on and correct them if your actual intention is to get better at something. I believe that works better than taking any arbitrary action at all, with the same goal in mind.
So it's not knowing if writing that 10K LoC program actually does help or not. I forget things I've done. I lose interest.
Then I extrapolate from this and think, then there must be some spectrum of things in between that are not practically useful, and if I keep doing them then I will not improve in the ways that I want. I will believe that maybe writing a stringly typed C++ application is just reinforcing bad habits that I will have to expend extra effort to undo later. I then believe if that's the case then I ought to not do that thing at all if I believe it's just going to hinder my progress.
The problem is that this mindset costs me a lot of my action, because I figure if what I'm doing is not beneficial for my skills then I'd better get something else. A lot of the time that "something else" is something less challenging, all the way to nothing productive at all. So I end up believing I'm just coddling myself in an attempt to avoid "wasting time" not really improving.
I think this kind of fallacy stems from a fear of banging my head into a wall expecting to get better at some point without knowing if I'm actually on the right track. At least if someone knowledgeable teaches you they could suggest so. And that fear stems from placing too much value on intellectual success as opposed to enjoying the process. If you only enjoy something on the condition you improve, then it discourages you. I've been discouraged a lot.
It could also be due to divorcing enjoyment of something from improving at it. I simply always care about improving, and if I don't see improvement then I'll lose interest. But some say that people who enjoy things just improve on the basis of doing it at all. I just can't seem to get myself to believe it, though.