A beginner knows a programming language, some portion of its standard library, and perhaps technologies, patterns and frameworks.
A good programmer knows how to apply them to solve and represent complex problems and real-world systems.
An advanced programmer can also make the solution maintainable, and meet other non-functional requirements.
Aryeh Hoffman