Greetings,
Understanding does not require rewriting. It requires the ABILITY to rewrite.
One of the most valuable traits I have found in myself, as a software developer is the ability to look at a product, a service, an API, and think, ‘How would I have built this?’, and then apply a few small tests to see if my ‘design intuition’ is basically right. If everything looks right, I can then design my interactions with that software under the presumption that it’ll do ‘the right thing’, and generally be right.
The worst job experience I ever had was with a company where NOTHING they built was designed the way I would have built it, and the design decisions (or even the forces that created the design decisions) weren’t documented at all. Every time I tried to make a change, or build on top of their existing framework, something broke, often someones pet optimization.
In fact, the only developers who could adapt the existing systems were the ‘old school’ devs who had been there for 3+ years. After a year I got out of there, suffering from anxiety, near depression, and questioning my ability as a developer. Within days at my new job, I was a productive, confident developer again, as the frameworks I was building on top of (and the code my coworkers were writing) had no undocumented ‘magic tricks’ or convoluted optimizations, and most of our design decisions were sensible. We didn’t need to read every line of the source to avoid unpleasant surprises, we just had to think how it SHOULD be implemented, and we were generally right.
A professional developer should be able to, at a glance (or with a few moments of uffish thought) say how they would have designed a system, and not be very far off. This requires the ABILITY to rewrite it, but not the necessity of actually rewriting it. At a certain point, in fact, you can make the call that, ‘based on the developers experience (or inexperience), they probably wrote it like this:…’. Similarly, when you see a misbehavior, you can go, ‘Ah. Based on what I know, and my experience, someone probably made this design decision, and it’s mistaken in this circumstance. Look here for the issue.’
It may also help that I spent many years doing reverse engineering work professionally, so I see many things in this context.
I don’t know any phrase for it other than ‘design intuition’, and it’s incredibly helpful in everything from over-the-phone-debugging to bug reporting in packages you just use, to building good designs up front.
As for the concept of software development versus engineering branches, I pretty strongly disagree with the idea that software development is an ‘engineering’ field. It is more a creative field. There are certainly uncreative developers, and projects which require no creativity, but those are not the areas to be working in if you’re a professional programmer, as those are the areas that will be marginalized.
This also isn’t to argue that there isn’t creativity in engineering, but that the constraints of most engineering is physical, universal, and well defined, whereas the constraints of software development are more mental, often project-specific, and cannot be very clearly defined, often because they involve people, and people just aren’t well defined. 
As for:
“If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.”
I always saw this as indicating the idea that programmers re-use, and build atop those who came before. I never saw it as a negative, really.
If programmers wrote programs the way builders build buildings, all software would come with its own Operating System.