I can answer the specific question for you easily: you are not good enough yet. That answer applies no matter how good you are :-) But to be serious, it's very, very important in this industry to cultivate that attitude because as soon as you think you are "good enough", the industry moves under your feet. This is a job of endless learning and self development. For those that are new to the field, take note. If you are the kind of person that just wants to show up at their job, do what they know how to do and then go home, you are at extreme risk to be unemployed and even unemployable in this field in about 10 years time. There is nothing inherently wrong with wanting a job like that, but a programming job is not that (at least not right now -- maybe come back in 20 or 30 years).

On the other hand, I could also say that no matter how bad you are, where you are today is fine. There are so many roads in this industry it's incredible. It is counter productive to judge yourself harshly. I know many very talented people who I never, ever want to work with. I know very many people who don't have so much talent that I am extremely happy to work with. I'm sure most people can relate. No matter what kind of natural talent you have at programming, try to cultivate the sense that others want to work with you.

I saved the most complicated bit for last. How do I know what I suck at so that I can make sure to improve it? This is really difficult. I've seen many people feel very secure about their abilities in one way or another, when in reality the things they were most proud of were part of their weaknesses, not their strengths. If I'm really, really honest with myself, I've gone through patches of that myself. I think everybody does (although some are much more delusional than others).

The best thing to do is to try to work with a wide variety of people who have different backgrounds. When someone disagrees with you, make a note of it. Even if you end up convincing them that they are wrong, try to understand why they had that idea in the first place. Is there anything you can learn? Look for ways to invalidate your current view point.

The most difficult piece of advice to follow, I think, is to celebrate when you are wrong. It is easy to convince yourself that you are right and to put your head in the sand. It is difficult to understand that you are wrong and to figure out how you came to your mistaken conclusions. More importantly, if you really are right, then there is nothing to learn and nowhere to grow. It's only when you are wrong that you can make substantial progress. Cherish that process.

One more thing: I believe that every good programmer must, at some point in their career, build a system of significant size all by themselves. Thing of it as your master project (the project that journeymen do to be recognised as masters). One of the best things you can do is to build that system and maintain it for many years. With that you can see where your weaknesses lie -- all your assumptions will be laid bare. Be very critical of the result. If it isn't perfect, why isn't it perfect. You only have yourself to blame, and that's a wonderful piece of perspective.