This was written and compiled by Mr. R. Grigorov from YRDSB. It's a great way at looking at what it means to be a programmer.
In a nutshell, a programmer comes up with ideas to solve a problem. They express their ideas in writing, and the product of their writing is a piece of source code. IMHO, delivering a working code that somehow meets the requirements is not enough.
I’ve cherry-picked online some general (not CS-specific!) criteria about the 3 aspects. In reverse order:
Functionality – solves a need or a problem in an optimal way
Quality of the product – craftsmanship
Appeal – interesting product with attractive aesthetics
Maintainability – easy and feasible to repair
Durability/Reliability
Uniqueness/Scalability
Simplicity – can be easily understood what it does and how it works
Clear and descriptive – writing is easily understood by the readers; doesn’t lead to misunderstandings
Has logic and structure; ideas are tackled in effective and logical order.
Uses right words for the right things
Concise – uses the least amount of words to convey an idea
Sticks to conventions – the writing is consistent
Applicability – solves a specific problem at hand
Uniqueness/Scalability
Easiness to implement
Simplicity
Knowing the general criteria, below are some concrete criteria I use (in order of your competencies). A good programmer is someone who:
implements the simplest possible solution (Occam’s razor)
writes shallow code – the problem is broken down to units/sections of code
writes short (max one screen length) units of code, with limited dependencies
uses counted loop when a repetition can be described as “repeat certain number of times” and conditional loop when the pseudocode should read “repeat until/while”
uses compound conditions rather than nested if-statements
considers the best/optimal order of conditions and Boolean operators in a compound statement
breaks complex expressions on multiple lines
when possible, avoids use of language-specific syntax and shorthand expressions
uses nouns when naming variables
uses verbs when naming functions/methods
follows conventions
Last but not least, a good programmer is someone who takes every aspect of the programming (from researching the problem domain to documenting every step of the project) seriously; revises their code multiple times, until its performance exceeds the expectations.