- Programmer: anyone who can write working programs to solve problems, given a sufficiently detailed problem statement. I have no use for programmers.
- Good programmer: a programmer who collaborates with others to create maintainable, elegant programs suitable for use by the customer, on time and with low defect rates, with little or no interpersonal drama. I can never get enough good programmers.
- Great programmer: a good programmer who understands algorithms and architectures intuitively, can build self-consistent large systems with little supervision, can invent new algorithms, can refactor live systems without breaking them, can communicate effectively and cogently with non-technical staff on technical and non-technical issues, understands how to keep his or her ego in check, and can teach his or her skills to others. I need a few great programmers on a team, but they're overkill for many programming tasks.
The amount of time this takes depends on your personal skills, personality, and training. It also depends on the experience and opportunities that you have during your career, and how you react to them.
I would add a further category:
- Outstanding programmer: a great programmer who also discovers new way of using programming languages, finds new algorithms, new patterns, push forward program's design, and/or with programming performs new tasks and solve new problems in a specific domain. There is the need of someone of them who give a reasons for programming.
Finally some opinions on programming that Cosma Shalizi shares with his students of "Introduction to Statistical Computing". Let's say that should be use to become a programmer. Great the first statement: