There is something we seemingly cannot escape doing when we tackle a problem. We typically take it for granted, but it is of the utmost importance. Pretty much the first thing we will do is to separate ourselves from the problem in order to observe it.
> Here is where *Laws of Form* hits with all its might. Be sure to have the previous discussions about them in mind.
Think of how many times we have silently done that in the previous chapters. How familiar are we with this act? How explicitly can we become aware of its occurrence? How much can we use the process we are trying to describe to observe ourselves applying the process itself, so that we can describe what we do with enough detail so that we can describe it inside a computer?
Good programming depends on powerful abstractions, a clear mind where to observe the reflection of the abstraction, and clear expression of intent to reflect the abstraction into the computer. Note how this observation does not require our first person presence in the process, thus suggesting we should write programs thinking in the third person instead on the grounds that it is less involved and thus requires less effort.
Perhaps this task seems daunting. However, the fact remains: we go through these motions all the time. We learned how to accomplish this somehow, and thus it follows that there is a way in which this knowledge was encoded in our minds for the first time. All we need to do now is to copy the signal processing structure we depend on to live our lives, by using the signal processing structure itself.
Note how doing so is an excellent opportunity to set up a tight feedback loop by which the abilities of our signal processing mechanism sharpen themselves…
So, to begin with, if we remove ourselves from this problem as well and look at it from the point of view of *Laws of Form*, what distinctions appear before us? What differences in value are we looking at *exactly*?
A possible way to interpret what we do when we try to solve a problem (and in particular when we do object oriented work), is that one of the most important differences in value we pay attention to is whether the presence or absence of a distinction significantly affects the result of the evolution of the system at hand. In other words, after separating ourselves from the problem, the first thing we seem to do is to sort things into the following two buckets. > In other words, take partial derivatives on each dimension of the observed space so a gradient can be used both for prediction purposes and to detect coordinates with small enough values which tell us the dimensions we can ignore according to the resolution we choose to perceive with.
* Things significantly related to our problem.
* Things not significantly related to our problem.
The threshold between significant and insignificant is dictated by the required quality that our solution to the problem in question must have.
This is typically why it is so hard to think about problems in which we are a part of the system that computes the solutions by means of the emergent properties that arise from the chaotic interaction of the system’s parts. Our very presence affects the results, much in the same way that the uncertainty principle seems to ruin our attempts to obtain ever more precise observations. In order to think about our problems in a more powerful way, we need to create a context of observation, to carve out a portion of ourselves which is as perpendicular as possible to the issue at hand — because it is from this point of view that we will sort things into the “related” and “not related” buckets.
This is our first distinction, the boundary that separates ourselves from our environments and distinguishes us as observers.