It's easy for programmers to forget how hard some of the earlier concepts were, even if we are good teachers and communicators. My wife has gotten motivated to learn Ruby on Rails (having never been a programmer before), and it's been a really valuable experience witnessing someone trying to understand almost all of the concepts from scratch. Just trying to describe what git does is almost impossible without somehow comparing it to saving a word document. The other day I had to clarify that typing something "into Sublime" doesn't mean it's
only in Sublime - that Sublime is actually a view ("but I thought you said a view was a template!") into the same files and folders that are in her terminal. And the thing about how you can push to both heroku and github, but not check out or clone from heroku, that's still confusing. But she was deliriously happy when she figured out how to add a scaffold and add a link to the "create" functionality from the header, all by herself.
When I look at the examples that the author pasted, it seems like the commonality is that they all go more than a couple layers deep. Sometimes asking "why" twice is enough, but sometimes you have to go a few layers deep (like understanding PDO's connection flags when all you want to do is get a user's first name out of a database). I don't think that's so much about ability or smartness, as it is patience, and what layer of thinking you'd rather hang out in. Although, like other commenters have said, some good refactoring can help a programmer from having to need to understand those lower levels if they're not relevant to what you're presently working on.