Although I’ve written briefly on the topic before, I’m still trying to figure out what makes computer science really hard, and more specifically programming.
Bret Victor says that a definition of programming is “blindly manipulating symbols.”1 In many ways, this definition is pretty good. Bret dissects the definition into two parts: “blindly” and “manipulating symbols.”
Programming is “blind” because it does not work with the direct objects that they represent. Everything is only imagined and visualized in the mind—hence, the mental model. For example, when programming a tic tac toe game, there isn’t a real board. The “board” is only represented by representations (double the representation) of nine squares, that are usually drawn with the knowledge of the top-left position and lengths. The squares aren’t actually drawn in the same way they are drawn on paper. They’re drawn mathematically, and they’re definitely not visible while they’re being “created” in code.
Programming involves “manipulating symbols” because drawings aren’t directly manipulated through code. Lines and shapes can’t physically be changed; the variables and lines of code that represent the drawings have to be understood and changed.
So that’s probably why programming is hard. It’s about creating algorithms to solve problems, but in an indirect manner. Drawings are a great medium to visualize and learn the big-picture concepts, but the code is a way to represent them abstractly in written form.
It’s like math. ∂, ∆, π, ∑, ∫, ø are symbols that mean who-knows-what. If you never learned it, then you don’t know it. And if you don’t know it, you’re lost. But every symbol means something that’s fairly easy to understand by itself. And it’s much faster to write something with a symbol than it is to state its definition verbosely every single time the meaning is needed. Instead of writing “change of x, change of y, change of z” all of the time, the shorthand notation “∆x, ∆y, ∆z” can be used instead. Symbols are really powerful.