Computers are useless. They can only give you answers. – Picasso
Many people (including my mother-in-law) think that computers are becoming so smart that programmers will be no longer needed in the near future. Other people think that programmers are geniuses who constantly solve sophisticated math puzzles in front of their monitors. Even many programmers don't have clear idea what they do.
In this post I want to provide some explanation to uninformed people what programmers really do:
Programmers are translators of human ideas into the language of computers.
They are a link between two worlds – human and computers. Do you think it is easy to maintain this link?
Human World Background
The problem with people is that they're only human. - Bill Watterson
Humans are product of biological evolution and have a unique and precious organ for producing ideas for programmers – the brain. The brain is a complex combination of neocortex (unique to humans) and older structures inherited from mammals and reptiles. Older brain structures are mostly responsible for reproduction (sex) and survival (finding food or escaping danger). Neocortex evolved to support these function better, however it started to cause strange side effects – consciousness, thinking and curiosity. Thanks to these effects humans invented civilization and thousands years later computers.
Somebody could believe that after thousands years of development humans should become completely dull, predictable and rational species, but it didn't happen – their old brain structures, complex psychology and social behavior often make people irrational, unpredictable and deceiving. In addition, humans have poor memory, strong emotions and personal interests. However, programmers don't have choice of working with more rational species and have to work with human beigns to translate their ideas into the language of computers.
Computer World Background
Part of the inhumanity of the computer is that, once it is competently programmed and working smoothly, it is completely honest. – Isaac Asimov
A computer is the best invention of human civilization. It consist of CPU, motherboard, memory, hard drive, monitor and some other parts. Computers moved our civilization to the new level, filled our life with meaning and entertainment and compensated weaknesses of our brains. There are good chances that computers will become more intelligent than humans. (However, I am a bit concerned if computers need human programmers after it happens.)
Modern computers are completely logical, straightforward and obedient. It is pleasure to work with a computer if you know what it should do and how to instruct it. The only problem is that computers will do exactly what you tell them to do. Therefore, you should have very clear ideas and instructions for a computer to avoid feeling miserable when you see your boss or customer.
Translation Between Humans and Computers
There are three main challenges in translation:
- Language ambiguity. Human language is vague, complex and ambiguous – for example: "This program doesn't provide good user experience". Culture, background and context affect communication and meaning. On the contrary, any computer language is exact, straightforward and context-free.
- Levels of details. Humans communicate often in general terms without many details – for example: "I want this f* program work right". It allows them to save time and energy, but cause two big problems – misinterpretation and possibility that important details are missing. And a computer requires all details – everything should be spelled out.
- Thinking style. Humans often think in terms of needs, outcomes and solutions – for example, "This report should run in 2 seconds instead of 2 hours". However, computers need algorithms – sequence of steps how to achieve desired outcomes.
In order to write good software, programmers have to overcome these challenges, understand humans and translate their ideas into the computer language.
Skills of a Super Programmer
As we can see a super programmer should have two distinct sets of skills to deal with both worlds.
Understand humans and create solutions:
- Communication -ability to establish contact with humans, talk with them without alienating and even heroic attempts to share own opinion.
- Meaning - extract useful information from conversations with humans, decode and make sense from it
- Logic - clearing, removing ambiguity and controversy from human ideas for uncompromising reality of computers
- Creativity - dig, twist and play with human ideas to create good solutions
- Design - wrap programming ideas with human friendly interfaces and convenient interactions
- Big Picture – know how solutions fit into world of users, business and Universe to make your program useful.
Tell computers what to do and build solutions:
- Logic (again) – organize programmer's thoughts into cohesive software ideas and instructions for computers
- Technology - uncovering and understanding the black box of technology (black box for 99% of population)
- Programming Languages – learn the beautiful, logical and unambiguous languages for feeding computers with programmer's ideas
- Algorithms - master the most effective ways how a computer can accomplish a task
- Modeling - create abstractions and models for grasping and manipulating ideas in software code
- Practices (as Refactoring, Unit Testing, Continuous Integration) – recurrent activities to keep system solid, healthy and possible to change
There is a big difference between a human-oriented and hardcore object / system – oriented programmer.
A programmer who is specialized to work with computers only is a half of the good programmer. Great solutions require skills for computers and human worlds. Connect both worlds and become a super good programmer!