To me, at least, the distinction is that a code monkey merely produces code without really thinking about it, where as a "proper" programmer is a professional. They use engineering techniques to produce higher-quality code and have an awareness of the system as a whole, do better planning and more thorough design.
For example some features of a "proper" programmer (although be aware of cargo cultism) might be:
- A programmer is involved, to a certain extent, with the entire software development lifecycle, not just coding. Code monkeys may be coding up designs or to requirements that were dumped on them, rather than created in consultation with them.
- Programmers create extensive designs (including tests) before writing any code. They are fairly certain that the design is good (fast, efficient etc.) before they start writing it. Code monkeys jump straight in. They don't know if the design is good until they run it.
- Programmers take responsibility for planning their own work. Code monkeys just do what their manager tells them, when they're told to.
- Programmers are valued as an individual for their creativity and skills. Code monkeys are seen as interchangeable black boxes that output code.
- Programmers are adaptable; they can apply their skills to numerous areas, languages etc. Code monkeys over-specialise, and get lost if they have to work with a new framework.
- Programmers always look to develop themselves as a professional. Code monkeys stay where they are in terms of skills and experience.
I've used two points at opposite ends of a spectrum here - I suspect most jobs will lie somewhere in between. In addition, it's unlikely that an entire career will stay at the same place - a good company will strive to move its employees towards the programmer end of the scale through training and professional development. It may be worth taking a junior programmer job at the code monkey end if the employer has a graduate scheme or similar that will result in "proper" programmer status eventually.