Well in my opinion (even though I'm not a great programmer lol) I think a great programmer is someone who can think of what something will do in his head and be able to put it out on paper and get it all working properly. I hope to become that good one day
I can accomplish tasks but anything now i find myself looking up documentation alot...is a good programmer someone who gets it done or knows it all in his head(function names and such)
A good programmer gets things done! On time and to specification!!
But it does involve a lot of reading. You will come to know quite a lot of things by heart due to repetition, but there is always new material to learn. And you should always double check anything you're unsure of.
And at this time, with the appearance of C++11, even experienced C++ programmers have plenty of new stuff to learn.
A professional programmer is highly unlikely to know all the function names in the codebase they're working on as they do get rather large. Unless they're one of those unusual people who has a photographic memory/total recall. But they will usually know the overall large scale architecture and where their code fits into it. And have a detailed knowledge of what they're implementing, but even then it doesn't mean you know all the function names. (That's what Doxygen and ctags, and Visual Studio's Class View, are for!)
I've been a Windows programmer for a number of years now, and still don't remember all the parameters for the Win32 CreateProcess function. But that's because I'm also a C++ programmer, so I wrap up a lot of API calls inside classes and then use those on a daily basis.
PS A good programmer will also be good at finding stuff on the web, of course. Without having to ask loads of questions.
I look up documentation all the time. I can't even remember the order of the parameters for std::fread. It's completely fine not to be able to remember things. Creative, but logical, thought is far more important from programming than having a good memory - the computer has enough memory of its own.
I once had the epiphany that a huge part of being a good programmer is being effective at finding the information you need, to complete a task. This includes both finding documentation, and finding and understanding the information you need within the documentation, or specification. A good programmer also reads enough to be familiar with the technology they are working with on both a technical and non-technical level.
They know the word on the street. They know what tools and technologies are out there to exploit, they have an idea of where things are going in the future, and they are able to envision how to get started putting together all of this knowledge into a successful project.
The thing is that there is so much information out there, and we only have so much brain capacity and time. You need to be smart about how you use it.
Good programmers are hard to come by and are defined by many aspects. Some that come to mind are: attention to detail, thinking about future maintenance, leveraging available tools, and writing good tests.
I'm a big fan of the last two. Writing well-tested, lint-clean, valgrind-clean code with good coverage and documentation is the ultimate goal.
From there, add experience and education, which brings: best practices, patterns/idioms, gotchas to avoid, and a focus on algorithms.
There are some awesome course recordings on Youtube on Richard Buckland's algorithms course. (I'd recommend viewing the whole set.) Anyway, the best thing to take away from his talks is when he mentions Problems-Algorithms-Programs-Processes (P.A.P.P.). He goes on to explain that running a program on a faster machine is optimizing the process; using optimization flags, register variables in loops, etc. is optimizing the program; optimizing the algorithm is where you want to invest your time to get bigger returns; and, of course, if you really want to change the game--you change the problem. The impact is greater the farther left you can go in the acronym--and good programmers know this. This is the aptitude that companies like Google look for in their interviews.