I will begin with a story about programmers that I have heard repeatedly.
I asked Joe to write a simple program that makes <xyz>. The work was there for several hours, at worst for the day. It took him several days, for which he wrote a much more complex framework than was required. Why is he so naughty again?
Perhaps the fact is that Joe is an Abstract Programmer (
AOP ).
Here are some template phrases (
snowclones )
If you often over-engineer your programs, you may be
AOP .
')
If you spend more time thinking about tomorrow's problems than current ones, perhaps you are
AOP >.
If you like to look for deep connections, feel a pleasant shiver from unconscious insights, or reason with analogies, perhaps you are
AOP .
The need for abstractions
Software development is one of the few activities in which one constantly has to deal with abstractions. Programming languages, data types, graphical representations, control flows, etc. are real-world abstractions, hardware abstractions, and often abstractions of abstractions.
The sharp increase in processor performance (in accordance with
Moore's law ) creates a need for abstractions. I started to program on computers with processors, in which transistors went hundreds. The Motorolla 6800 had 4100 transistors and a clock frequency of 1-2 megahertz. Zilog Z80 had 8500 transistors and a frequency of 2-8 MHz. Understanding the operation of processor registers, interrupts, and other physical processes in one sense helped a lot when it was necessary to force these computers to do something really useful.
Now in mass production processors are launched with a billion or so transistors. For example, Intel Core i7 contains about a billion transistors, and has a clock frequency of 2-3.5 GHz.
This is approximately a billion times the computational power of computers thirty years ago. Man, however, failed to evolve so noticeably. There was a need to effectively use the increase in processor power. This is where compilers, virtual machines, complex interfaces, various optimizers, high-level programming languages, and other tools appeared. Between the hardware and modern programs there are many layers of abstraction. And, of course, they are necessary.
Thus, there is nothing surprising in the fact that programming attracts people with a penchant for abstract thinking ... and, perhaps, a person with abstract thinking has more chances to enjoy work and achieve success in this area.
But, arguing in this way, it is very easy to forget that not all people have abstract thinking. You can even conclude that all programmers are abstractly oriented, or it can be mistakenly concluded that abstract thinking is the best option for them.
Abstract thinking
To begin, consider the definitions
Abstract (adjective)- abstract, not related to the direct perception of the real world (i.e. facts)
- not applied or practical, theoretical
Abstraction (noun)- the process of formulating generalized ideas or concepts by extracting common properties or patterns from a specific set of examples
Abstractions are, by definition, the simplification of information, which is achieved by considering a large number of examples and compressing them into a general pattern.
For some people, abstract thinking is natural, while others prefer concrete facts. Abstractly speaking, it is about the way people
process information .
Consider the
Myers-Briggs type personality indicator, which is widely used in business. The indicator allows you to define four types of personality, which are divided into based on intuition and common sense (N and S, if you use the typology of symbols) - respectively, the abstract and concrete thinking. (There are other psychological studies with a similar division of personality types)
We list some features that manifest themselves in abstract and concrete thinking.
Due to the fact that many people adjust their behavior to circumstances, you can also interpret the above information as an abstract or concrete current state of consciousness, although it is believed that each person has a dominant tendency.
Signs of abstract / intuitive thinking
- Thoughts and ideas
- Reading between the lines
- Future life - more interest is shown in relation to future opportunities.
- Better memorized patterns, context, and relationships
- You feel comfortable working with vague, blurred data, when you have to guess their meaning.
- Greater reliance on abstract or theoretical information, relationships, and patterns
Signs of concrete thinking
- Real objects and things
- Reading the lines themselves
- Focusing on “here and now”
- A large number of details and facts are stored in memory.
- Preference is given to clear and accurate information; I do not like to put forward guesses when there are no clear facts.
- Preference is given to information in real time, which can be felt one of the five senses
- Distrust of guesses that seem to have come from nowhere.
Back to joe
Let us return to the story about Joe, which began this article, where he complicated (over-engineer) code. For an abstract-oriented programmer, everything is logical
- Today we have problem X
- X is a separate example of a more general class of tasks, which also includes Y and Z
- So that Y and Z problems do not happen in the future, I have to write code that solves X, Y and Z
However, when, during communication with Joe, we asked him to solve only Problem X, while he knew that Y and Z are inevitable in the future, we doomed him to frustration because of poorly performed work or even the confidence that in the future make extreme.
This is where the current situation comes to the fore. The ability to think ahead can make you a hero. Also the ability to think in advance easily turns you into a burden. Concentrating solely on immediate problems, you will become a hero ... or a burden.
The trick is in understanding what approach would be appropriate in a given situation, in other words,
adapt .
It is also very important to coordinate the chosen strategy with colleagues, in other words,
communicate .
I will give some reviews that I have heard about abstract programmers ...
Positive
- She takes on poorly assigned tasks and copes with them perfectly.
- He deeply thinks through the problem, as a result of offering elegant solutions
- She constantly tries different tricks in search of a better approach.
- The team ( AOP ) unexpectedly put forward a number of great ideas.
Negative
- He constantly battles with future problems, I can’t get him to make a quick edit when necessary.
- It often greatly complicates (over-engineer) its code. Sometimes I just need a quick hack.
- He is constantly trying to rewrite our entire code base. Inherited code works - just leave it alone.
- Why she does not follow the general work plan
- Meetings of our team ( AOP ) are constantly evading urgent problems. Of course, the discussions are interesting, but we need to concentrate on the problem to be solved.
... and the same thing about specifically targeted programmers (
CPC )
Positive
- He does not argue for a long time. Just take the task and solve it.
- She is aware of our technological processes and follows them.
- He demonstrates common sense
- This team ( CPC ) is constantly engaged in the task that they can and should do.
Negative
- Its code solves a narrow circle of problems. This is enough to pass the tests, but not enough for real use.
- Her code is inflexible and difficult to maintain. Every time we add a new function, we are forced to rewrite everything anew.
- He sees nothing outside the current task. His code will not last long.
Mini test
List A. How many of the items in it describe you in the best way? (Answer without thinking)
- You are more interested in the idea in general, than the subtleties of its implementation
- You often think about the fate of mankind
- You can easily distinguish general patterns from concrete examples.
- You often talk about the complexity of life
- Do you think that almost everything can be analyzed
- You can easily understand the new theoretical principles.
- You often spend time thinking about how to do something better.
- You can easily calculate the different ways in which the situation can go
List B. How many of the items in it describe you in the best way?
- You are bored reading theoretical books
- You prefer to rely on your experience, rather than on theoretical alternatives.
- It's important for you to try doing something with your own hands.
- Analyzing the situation, you focus on its current state, rather than possible consequences.
- As a rule, current classes worry you more than future plans.
If you agreed with a larger number of items from list A than from B, you must be abstract oriented. Conversely, if statements from list B prevailed, you are a particular type of person.
[I want to make a reservation right away. First, the type of personality is not destiny. Very often, life requires us to adapt our behavior for the sake of family, work, friends, etc. Secondly, it may well be that, depending on your current situation, you can answer the same questions differently. Thirdly, it’s about describing your dominant way of thinking - no need to take it as a call to action.]
Adapt thinking
A few years ago I heard a good analogy. You can be right-handed or left-handed. Most people use one hand as the main hand, some are fluent in both. But just from the fact that someone often uses his right hand, it does not follow that he does not need the left at all. In addition, some tasks require the use of a specific hand - try using scissors for right-handed left-handed or driving a car, switching speeds with the wrong hand, which was assumed by the manufacturer.
We all know how to handle both facts and generalized patterns, but more often we have a tendency to something alone. In the same way, there are tasks for which a certain type of thinking is more suitable. From my own experience, I can say that programmers get stronger when they understand their natural inclinations, but learn to adapt if necessary.
Here are some examples of tasks in which certain types of thinking are preferred (they are all generalizations)
- UI development requires attention to a lot of details.
- Specifications benefit from broad thinking, but can be supported by concrete examples (as tests of generalizations, readability is improved when specific examples are given, which allows to make sure that the generalizations have not lost their connection with reality)
- Scalable systems and architectures with a long life cycle require abstractions.
- Object oriented programming is abstraction oriented.
- Colleagues who are not programmers and customers may find themselves with a particular type of thinking. An abstract-minded person, communicating with a specifically-minded person, risks being misunderstood, giving the impression of flying in the clouds. If you think abstractly, it would be good to learn how to communicate with other people in a language they understand.
I did not set a goal to show what style of thinking is better. Instead, I advocate the idea of self-awareness and exercise flexibility in thinking and communication.
Being an absolute abstractionist, I want to finish with a wonderful example of abstract thinking.
All generalizations are false. Including this. Mark Twain
And Mark Twain was an abstract writer ...