This is not a pipe
One of the most peculiar parts about the academic institution of studying programming is the name: Computer Science. As many academics in this field will be quick to tell you, Computer Science is really not about computers. Consider this: a chemist studies chemical reactions and processes in a lab, but the actual lab is not the focus of academic interest. If tomorrow every chemistry lab were to disappear, it would not affect how chemicals, elements, and atoms interact with each other — though it might impede our ability to observe these interactions.
Much like a lab to a chemist, a computer gives us an environment where we can observe processes, relationships, and interactions. It is a tool for discovery, but in it’s absence there could still be meaningful discourse and study. In fact, for computers to even exist, there had to be people who studied how computers would eventually function before they actually existed. If Computer Science is not about computers, what is it about?
The answer is, well, a bit abstract. Literally. An abstraction is a symbolic representation of reality, and it is the central concept that academics and professional coders study. This sounds a bit dense, but it is so simple that we don’t even realize that we use abstractions on a daily basis. The numbers that we use to count things are abstractions for quantities of objects. 1, 2, and 3 are abstract symbols that represent relationships we find in reality. It’s hard to imagine reality not existing, but these symbols have no meaning without the physical reality that they describe.
Every problem we sit down do solve with code necessarily involves an abstraction, even if we don’t realize it. This fact is actually very easy to forget! When junior developers start out learning to program, the projects they will use to learn a language might not seem abstract. Tic-Tac-Toe is a common project for beginners: a tic-tac-toe game board is a real thing that I can touch and hold in my hands. It’s easy to forget that we are only working with symbols that represent this board and not an actual physical board. The absence of this realization causes problems when projects start to involve abstractions for things that are already abstract. A join table is a model of a relationship between two objects, and relationships are abstract entities by definition. If a mind is trying to process parts of a program without the context of an abstract nature, a join table ‘object’ might be a difficult concept.
Nothing captures this paradigm shift better than this famous Migritte painting, entitled The Treachery of Images. The caption of the painting translates to “this is not a pipe.” This seems silly — of course it is a pipe. But if it is a pipe, then I should be able to smoke it… Oh. Right. It’s not a pipe, it is a picture of a pipe!! It seems like it is not abstract at first because our brains are wired to attach symbolic representations to actual physical existence. This works well for day to day interactions, but will hold you back in programming.