Foreword to The MMIX Supplement: Supplement to The Art of Computer Programming Volumes 1, 2, 3 by Donald E. Knuth
Why are some programmers so much better than others? What is the magical ingredient that makes it possible for some people to resonate with computers so well, and to reach new heights of performance? Many different skills are clearly involved. But after decades of observation I’ve come to believe that one particular talent stands out among the world-class programmers I’ve known — namely, an ability to move effortlessly between different levels of abstraction.
That may sound like a scary and complex thing, inherently abstract in itself, but I think it’s not really too hard to explain. A programmer must deal with high-level concepts related to a problem area, with low-level concepts related to basic steps of computation, and with numerous levels in between. We represent reality by creating structures that are composed of progressively simpler and simpler parts. We don’t only need to understand how those parts fit together; we also need to be able somehow to envision the whole show — to see everything in the large while seeing it simultaneously in the small and in the middle. Without blinking an eye, we need to understand why a major goal can be accomplished if we begin by increasing the contents of a lowly computer register by 1.
The best way to enhance our level-jumping skills is to exercise them frequently. And I believe the most effective strategy for that is to repeatedly examine the details of what goes on at the hardware level when a sophisticated algorithm is being implemented at a conceptual level. In the preface to Volume 1 of The Art of Computer Programming, I listed six reasons for choosing to discuss machine-oriented details together with high-level abstractions, integrating both aspects as I was presenting fundamental paradigms and algorithms of computer science. I still like those six reasons. But in retrospect I see now that I was actually blind to the most important reason — that is, the pedagogical reason: I know of no better way to teach a student to think like a top computer scientist than to ground everything in a firm knowledge of how a computing machine actually works. This bottom-up approach seems to be the best way to help nurture an ability to navigate fluently between levels. Indeed, Tony Hoare once told me that I should never even think of condensing these books by removing the machine-language parts, because of their educational value.
I am thrilled to see the present book by Martin Ruckert: It is jam-packed with goodies from which an extraordinary amount can be learned. Martin has not merely transcribed my early programs for MIX and recast them in a modern idiom. He has penetrated to their essence and rendered them anew with elegance and good taste. His carefully checked codes represent a significant contribution to the art of pedagogy as well as to the art of programming. Although I myself rarely write machine-level instructions nowadays, my experiences of doing so in the past have provided an indispensable boost to the quality of everything that I now am undertaking. So I encourage serious programmers everywhere to sharpen their skills by devouring this book.
- D. E. K.
Stanford, California
December 2014