No time like the present...wait
Some form of zen-like patience is practiced every day in the mind of every programmer, and I would like to assert that is what seems to separate software engineers from society-at-large. I'm not certain I'm correct, but it is as accurate a description as I can come up with. Programming computers is an exercise in a peculiar type of patience. It isn't intelligence, necessarily, it isn't academics, it isn't only practice. I've heard it said that it is a "special kind of crazy" person who can write software, but that isn't accurate enough for me. I think it is a special kind of crazy patience.
I know we don't seem patient to Muggles, but underneath the laziness, impatience and hubris is a sea of fluid tranquility. Maybe that's the joke inwhat Larry Wall said? Note; Programmers aren't special, and the rest aren't Muggles. Anyone can do this stuff. Not a joke. You just have to have patience.
There is a vast amount of technical background and historical context involved in understanding the computer sciences, and getting even a tenuous hold on the canon of knowledge can seem overwhelming. At least it isn't organic chemistry, materials science, or becoming a surgeon. Be thankful you can do this, if you can program, it is probably easier. Nonetheless, one has to know a lot before one can do a little, in a sense.
One day, if you keep reading and digging, studying and learning, if you are really patient you'll become an advanced beginner! Advanced beginners find a hammer and everything becomes a nail for a while. Sometimes they find a spoon or a can opener and laugh at it, because you can't pound nails with that!The Advanced Beginner will not likely realize the others are not pounding nails, but polishing the finish on a Lamborghini. We all love and hate advanced beginners, even when it is ourselves.
Years later, relative competency sets in, and the bigger picture starts to emerge. Vistas of grok come into view, where only ego and fog once lay. This is the land where one can truly begin to have original thoughts and creative input to solve problems one hasn't faced before. Often because similar problems have arisen in the past, and now can be solved with more grace for the very recognition of that fact. Pattern recognition becomes a powerful ally to forge new paths into the frontiers of understanding. This is the time we blossom. And see the forest for the trees.
A good grasp of the big picture leads to proficient execution and an ability to identify challenges and benefits that aren't imaginable to an advanced beginner. This is where we start to be able to identify bad smells in the operational and conceptual paths of our work in a poignant way.
If a person is incredibly patient and makes it this far, that's great, they're pretty much a badass. If they want to be a total badass, no questions asked, they'll have to become an honest to goodness expert. This is where one begins to know what rules to break and when. Explaining why to less experienced folks may become a challenge, because intuition based on deep experience begins to be a somewhat faithful guide to taking action. Seeing the possible, and the risks along the road to execution of tasks happens for these seemingly prescient persons so rapidly and automatically they might appear as magic to the Muggles. And by Muggles, in this case, I mean the other programmers in the office. See what I did there? The perspective has changed.
The really cool thing about all this patience in learning and the long slog of skill acquisition is that a bunch of smart folks thought about it already and figured out that's basically how it works for any skill or discipline, not just programming. One example I like is the Dreyfuss Model, which is essentially what I just described in the paragraphs above. I find I can't be mindful of this process often enough, personally. When mindful of this process I find solace in knowing where I am within it, and it helps guide me to the next concrete action I can take to improve.