There are various levels of understanding a specific concept. For example, we could really understand it, or we might only think we understand it.
There is no measurement tool to determine our level of understanding. However, some heuristics could help figure out where we fit, which I find quite precise.
Step 1: Explaining
To confirm that we understand a specific topic, we should try explaining it to somebody else, preferably someone who doesn't know anything about the subject. If we find it difficult to explain, we might have some gaps in our understanding that we need to fill in.
Also, a vague explanation is not very useful, as it might not share any real insight. Let's consider the practice of "refactoring", for example. I could try and explain it as follows:
Refactoring is when we re-write code to make it better.
It doesn't say a lot, does it? It doesn't explain what does "better" mean or why we would re-write it. Is it a complete or partial re-write? Do we change anything about its behavior? There are many unanswered questions. A less vague explanation would be:
Refactoring is the process of changing our code, sometimes moving it around or even deleting parts of it, but without changing the implementation of features and the actual functionality of the code. Doing this will help us extend it more easily in the future while also becoming easier to understand by other developers.
This technique is also helpful when I'm having a hard time figuring out a solution in my head:
- Explaining my problem to a colleague will force me to put my thoughts in order and see things more clearly. Sometimes I figure out the solution myself while explaining the problem.
- We could just as well simply speak loudly, explaining the problem to an imaginary person or an inanimate object, like a rubber duck. I was utterly blown away by the result.
Step 2: Simplifying
Whenever I have to use many words to explain something, it usually means that I do not thoroughly understand it. Therefore, being able to explain shortly, clearly, and concise can be another metric to evaluate our level of understanding. Albert Einstein also said, "If you can't explain it simply, you don't understand it well enough."
So, iterating on the refactoring explanation, we could simplify it as:
Refactoring is the process of restructuring our code without affecting its behavior, thus making it more maintainable.
The same information is conveyed as in the previous variant but using fewer words. Of course, if we can concisely explain something, we could always elaborate and go into more detail. The opposite, however, is not valid.
Step 3: Metaphorizing
We could go one step further and try to explain using a metaphor or an analogy. This method could be a powerful hint that we deeply understand the topic.
Refactoring is similar to home maintenance: we have daily duties such as washing the dishes, weekly tasks such as taking the trash out, or less frequent duties such as repainting the walls.
This technique is also beneficial when teaching because the others' can better relate and understand our explanation, particularly if we use analogies from their circle of knowledge.
There is a subtle difference between knowledge and understanding. Knowledge is mostly about acquiring information. Understanding, however, is an iterative process that requires a lot of practice and repetition until we actually get it.