Hopefully not how many non-trivial projects they've completed, because for me that would be around 0. If it's how many non-trivial projects they've gotten halfway through before getting bored and doing something else, or coding themselves into a corner through near-total lack of design and going through about ten full rewrites, then I'd probably be the best programmer in the world :)
Personally, I would say it's to do with their analytical skills and their ability to creatively solve problems.
it's to do with their analytical skills and their ability to creatively solve problems.
+1
I strongly believe that being able to digest a problem and proposing a valid solution is what distinguishes a programmers skill level.
For example, if you are asked to write a function X that does A, B, C and you write this function using a FOR loop which gets the job done but consumes more memory or time or whatever. And this same functionality can be implement using a WHILE loop which is more efficient, then I believe there is a distinction in a skill level.
Personally, I'm really lazy and instead of writing out, "Hey I agree with this statement" or "Yup, you are right" or something along those lines, I usually do a +1 indicating I agree with this person.
Seems you all are equating algorithm skills to programmer skills. While most programs run most efficiently using a good algorithm, I prefer not to equate algorithm skills to programmer skills based on my working experience.
A person can come up with a 'grand' algorithm but if he is equally poor in implementing the algorithm, he is none the wiser. This indicate he is an algorithm specialist but not a programming specialist. Then they are two different entities together.
To me the perfect match would be a person who can devise 'grand' algorithm and also implement them to perfect unison and that is then called true programmer skills.
@CreativeMFS,
It gives you one point in an imaginary point system that doesn't exist.
@sohguanh,
IMO both are important. You need to be able to devise solutions to problems and implement then as well. Your skill in unifying the two would be what distinguished you as a great programmer rather than merely a good one. Personally I'm better at the implementing part, to the point that I usually just start writing code and hope that the solution comes to me halfway through... I have some bad habits :P
A good programmer should be able to write clean code. This is a necessary, but not satisfactory condition. (If that's how you say it in english. Sounds kinda weird, but meh).
To me a beginner is someone who knows very little about the language, they don't have a grasp on all of the basic concepts or even the all of the terminology yet and they cannot visualize the problem in the context of the language. More time is spent on the message boards then developing.
An Intermediate user will be comfortable with the basics and understand the code they are writing. They will be able to "see" what their code is doing and why that may not be what they intended. This is when you begin to deveolp your skills at "Rubber Ducking" solutions to your problems. Less time is spent posting on message boards to find your answers to your problems because you understand the problem well enough to google the question yourself. You know to test a solution rather then ask about it. I feel like the most time is spent in this stage.
An Expert would be someone who has finally put all of the pieces together in a way that they can understand. They would be able to visualize the problem AS code even before they sat down to write it. I'm not even sure that this level is achievable in the way that I think of it.
See, I consider myself an intermediate programmer but I can often visualise code before I write it - I'll think about what classes I want, etc. OOP sure does make it easy.
Yeah, I can psuedo-code in my head to. There should probably be level between Intermediate and Expert, maybe Advanced? Of course the definitions are generalized and they should be but maybe there should be more stages. I just don't want this too seem like we're defining skill level's or achievements in an RPG or anything distracting like that.
A good programmer should not only write good, bug-free code, understand algorithms but also understand a non-technical context of programming. A programmer that comes to the project team leader one day before the project deadline and tells him "look, if we rewrite all those simple for loops into this multiple self-adapting hashing scheme using artificial neural network, SVMs and butterfly swarm optimisation I've just found in this article, we can get a 30% performance improvement!", is *not* a skilled programmer.
Not unless the team is chalk-full of stereotypical "real" programmers. I just had to say it. :)
I find it very hard to define the term "good programmer". There are many aspects of being a programmer that one has to consider, and some programmers that are referred to as "good" do not have skills in one area of programming but excel at others. This is just food for thought.
A programmers skill can also be based upon their ability to focus on the end-user. How will this person perceive my program? What are the possible errant pieces of information that could be inputted and how do I check and correct this problem? When someone can write efficient code that caters to their end user and has that sort of focus to be fully aware of them, then I think they are one step up on the ladder. But as has been said, it is such an ambiguous concept with so many aspects and truthfully an infinite number of levels that it is hard to concretely define.