&gt; if you can&#x27;t run the program in your head, then you simply don&#x27;t understand what&#x27;s going on<p>Agreed, and sometimes it&#x27;s surprisingly tricky to describe what&#x27;s happening not in terms of the coding abstractions we all know and love, but just in plain English.<p>I remember I did a contract years ago for a PhD student which was basically doing some statistical analysis of a massive dataset. When I was doing progress reports she&#x27;d often drill down and ask, out of genuine curiosity (she was an academic, go figure :-) just <i>how</i> the computer was doing the things I was describing.<p>I couldn&#x27;t use abstractions like &#x27;well I just loop over this set and accumulate x and...&#x27; because that&#x27;s gibberish to her - so I had to kind of break down what was actually going on in plain English (obviously with a degree of abstraction from the hardware etc). I did so very awkwardly because I was used to just &#x27;thinking in code&#x27;, but remember it was very helpful for me to be forced to do this because it really tested that I actually understood what my algorithms were doing.<p>But obviously there&#x27;s a limit to the usefulness of this line of thinking. Abstractions are always present - <i>ad adsurdium</i>, we&#x27;d never talk about electrons flying around etc. It ceases (except in extremely rare exceptions) to be useful to describe what is actually happening in more detail than &#x27;this black box does X, and I use it with another black box that does Y to achieve Z&#x27; right about the level where you&#x27;re writing &#x27;real&#x27; applications with frameworks and whatnot.