Well code reading is executing or interpreting some sort of abstract machine, at least for me, and it's the way I push my interns to learn. You get context and specify system 1 global, unsound pattern matching set-up by familiarizing with the language, runtime, system&software design, and you use system 2 for no-false-positive-or-negative drilling. The more system 1 is 'trained' the more you're 'efficient' at code reading and I'm guessing that's one of the things that separate 'senior' from 'junior' programmers or software engineers. You look at some code on your colleague's computer screen in padding and it feels... Not right... Stopping in your tracks and sitting down to discuss.