| The gap between learning to code and producing usable software is... ... ability to perform complicated abstract reasoning, ability to reflect on own performance plus some experience. Almost everybody is able to perform simple programming tasks in isolation. For example, follow a tutorial to build simple app using framework X or google solution to problem Y and ctrl-c/ctrl-v into your codebase. Complicated abstract reasoning is necessary to be able to put together abstract concepts, flows, in new patterns that are required by the application. Ability to reflect on own performance is necessary to learn from mistakes, look critically at the code, understand strengths weaknesses, evaluate solutions, etc. A person that lacks ability to reflect on own performance might be for example deaf to complaints of other people, might be blind to problems with the code they are producing (for example overcomplicated code), or trying to find faults anywhere else but themselves. If you can't reflect on yourself you are cut off from being able to effectively learn and improve and this is critical to being able to produce usable software. Regardless of how intelligent and self-reflective you are, some experience is needed. |
> Getting hooked on computers is easy — almost anybody can make a program work, just as almost anybody can nail two pieces of wood together in a few tries. The trouble is that the market for two pieces of wood nailed together — inexpertly — is fairly small outside of the "proud grandfather" segment, and getting from there to a decent set of chairs or fitted cupboards takes talent, practice, and education.
- Poul-Henning Kamp
[0]: https://queue.acm.org/detail.cfm?id=2349257