From my experience being a T/A in university, I can really tell the difference people those who have the aptitude to program and those who can't.
From first hand experience, it seems that you either got it or you don't. Those who don't got it, usually can get by but barely. They get by through relying on other people, using code but not knowing what it does, or simply hope for the best. These people usually use examples online or in books and copy them and just modify them every so slightly to barely do what the assignment requires. Surprisingly they get a passing grade and move forward, but are they learning? No!
The other kind of person, those who got it, they start off maybe as the first group. But with practice and time, and self learning, they start to get it. I truly think programming is something you have to experience first hand. It is not something you can be taught. Sure someone can give you pointers and help get you started, or be there to help you troubleshoot bugs, but if you don't put in the effort to really learn it, its not going to happen.
You don't become fluent in programming until you can open up your coding environment, be it notepad, or something more complex, and feel comfortable writing your own lines of code. Writing your own lines of code without having to see someone's example. Without having to copy anything more than a function or method name. That is being fluent.
To be an expert or master would then just require memorization of the various functions, methods, and libraries, and of course a better understanding of proper coding conventions. However, I do not think memorization is key to being an expert. There is nothing wrong with going to google and looking up the documentation for a library that you didn't create. I mean, after all, how else would you know?
But really only you can tell your level of as a programmer.