You're an expert in c if you can answer all the questions tagged "c" on stackoverflow.com without blinking.
Some may disagree but I think experience is key to being an expert in any language. I know plenty of people who've past the certification test but couldn't apply their knowledge to anything practical in the real world.
So I think overall being an expert is a product of having enough knowledge on a given subject (C) and then having applied it to enough real world scenarios to make the mistakes that we all do and learn from them.
Generally speaking, nobody attending a job fair is an expert in C.
I'd say the point at which you are an expert in C is where you have knowledge of the standard to such a degree that you understand why things like Duff's device work without needing individual explanations. Also, you need a couple of big projects under your belt.
To someone less skilled than you, you're an expert.
To someone more skilled than you, you're a newbie.
I would say that for any given language, experience is the key thing. It just takes time to learn a language and learn the APIs and 'idioms' that the language uses. Whether someone is an expert in anything or not is something that should be asked of ones peers. To paraphrase Jeff Foxworthy, "If you answer more questions than you ask, you might be an expert."
When I interviewed with Google, the interviewer told me to think about it this way. On a scale of 1-10 for C proficiency, to say you're a "10" means you've written papers and/or books or been a speaker in a conference on programming in C. Based on this, very few people are 10s.
FWIW, I have been programming in C for 15 years. I consider myself very proficient. I'd perhaps give myself a solid 8 or 8.5.
I think a fair answer would be understanding all of the intracies of ISO C.
The reality, as any comp.lang.c regular will tell you, is that almost nothing that people need to do can be done in pure ISO C, as you generally need to interact with your environment in a more well defined way. That's where POSIX comes about.
I would not blink at anyone who self-ranked themselves as an "Expert" who had a solid understanding of the language of C, a decent understanding of what ISO C promises, and a working understanding of the POSIX functions.
Interview questions like this are always tough. You want to blow your own horn a little, but not sound like a blowhard.
If you have done a lot with C (say, worked on open source projects in C), then I'd respond with that, but not just by pointing to the list of accomplishments on your resume, but by talking about one or more of them and what was particularly interesting or challenging about it (in regards to its use of C).
How about having read "Expert C Programming" by Peter van der Linden and remembering everything he covered?
Experience is key, knowing the "rules" and syntax of the of the language is of course a must, but it is only a base. Learning the common pitfalls and idioms for doing things right is key.
Knowing what if any resources exist to get help from while your programing, and of course, knowing you're tool chain. I've known many C++ "experts" who had never used a debugger, or a memory tracker. If you ask me, being an expert in something is different from being proficient in something in you knowing all aspects of it.
Lacking a standard test there's really no way to decide what expert level is but here are a few of my litmus tests, everyone's list is different, I'm sure.
Without looking at documentation:
Know the precedence of the main operators so you don't have to litter your code with parens to avoid getting the wrong order of evaluation
Be able to write a prototype for a simple function pointer
Be comfortable with passing a pointer to a pointer
Understand block, function, module scope
There are more items like this.
On the other hand, I don't think you have to be able to understand or be able to write out Duff's device or figure out obfuscated C contests in your head to consider yourself an expert.
Even if I considered myself an expert (not sure I do) I probably would never claim it in a job interview.
Andrew
I think the trouble with this question is that the answer is kind of meaningless. I see people talking about experience, and that's good, and I see people talking about understanding the intricacies of the language, and that's good. However, if I were hiring someone to work on my C project, and I had a magic 8-ball that would give me an accurate answer to any one (and only one) question, I would never ask it, "Are they a C expert".
Why?
Just because someone is a C expert doesn't mean that they're a good software developer. Experience and language familiarity are good, but I think they are both trumped by that intangible, un-quantifiable property that makes someone a "good software developer". What I'm trying to say is, "What makes you a C programming expert?" is not a useful question, because there are more important questions. If someone is a Good Programmer, they will rise to the occasion.
As an example: You can be a C programming expert and be horrible on a team. You can be a C programming expert and refuse to use version control. You can be a C programming expert without knowing how to actually DO anything with C.
The "without" clauses in those sentences are equally important questions: What makes you a good team programmer? What's the best way to use SCM x or y? How do you approach programming a client/server game, or billing application, or web browser, or operating system, or compiler, in C? If a candidate told me "No, I am not a C expert", but gave me great answers to these other questions, I would hire them in a heartbeat over the guy who the magic 8-ball said was a C expert, but doesn't know how to check his code into subversion and hasn't learned a new language in 12 years.
This doesn't directly answer your question (sorry), but it might help you decide how you classify yourself.
Instead of just "expert" and "clueless newbie" I prefer the three-level system of expertise used by the medieval guilds:
Apprentice
- Still needs to RTFM.
- Getting to grips with the tools and techniques of his craft.
- Needs supervision.
Journeyman
- Has Read The Effin' Manual.
- Competent with all the standard tools and techniques of his craft.
- Can work alone, and can supervise apprentices on routine jobs.
Master
- Could have Written The Effin' Manual.
- Is developing or adopting new tools and techniques.
- Can oversee a major project that might never have been attempted before.
At a job fair? There are no experts: everybody's an expert. :)
The answers to this question do make for some interesting reading - it seems that we can't get good convergence on what defines an expert here. What hope is there going to be in a broader forum like a jobs fair? :-)
But to put my own 2 cents in... I think there's two kinds of C expert.
- There's the expert in the academic sense (as in "could write their own compiler", "has written papers").
- There's the pragmatic expert. I would like to define this as "someone who can write elegant C code that anyone can understand".
I would take one of the latter over the former in a heartbeat. If you've got a chunk of code written by an expert that is so brittle that can only be read and understood by another expert then for all intents that code is unmaintainable. It's all very nice that the author of this code remembers the intricacies of type conversions in the middle of expressions, but it's much better if the code has been written so that it's completely unambiguous.
Projects usually have enough technical challenge without adding the need for all team members to have memorized the C'99 standard.
Knows the answer more often than not, doesn't make mistakes often, understands the concepts behind the code, is aware of his own limitations, and of course able to read (and understand) almost any piece of code - and able to write it better - but knows enough not to bother - since he's been there and done that.
Being able to write papers/books doesn't make anyone an expert programmer -Look at Academics. Writing papers and the occasional book doesn't make them great coders, just good teachers for beginners.