# C++ knowledge ratings...

This topic is 4683 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I was recently asked to rate my C++ skill level from 1 to 10 with 10 being the highest. I've been programming in C++ for a little over 4 years now with most of that coming from my undergrad education at VT. I was just curious what you all thought you should know at certain levels. level 1 - you should know this level 2 - you should know that . . . level 10 - you're a c++ guru [Edited by - fartocci on April 25, 2005 6:05:35 PM]

##### Share on other sites
Well i had to rate myself in the same way for a placement application and i put myself as 7. The thought behind this was that i know most, if not all of the basics and am well in to learning the more advanced stuff. What i dont do is know the best patterns and perfect syntax for nearly all OO problems.

ace

##### Share on other sites
Of interest.

There are no markers for knowing a language apart from how competently you can write a program that you intend to write. The only way I know of doing that is by trying to do it and seeing how well you do.

For example, you could write a text editor.

##### Share on other sites
Quote:
 Original post by flangazorOf interest.There are no markers for knowing a language apart from how competently you can write a program that you intend to write. The only way I know of doing that is by trying to do it and seeing how well you do.For example, you could write a text editor.

I suppose a better question may be: What topics in c++ programming can be considered novice, intermediate, and advance?

Which subgroup would namespaces, templates, polymorphism, inheritance, overloaded functions, overridden functions, overloaded operators, virtual and pure virtual functions, abstract classes, concrete classes, etc etc be considered? Thats what I'm wondering. That was an interesting article...

##### Share on other sites
A good starting point is probably the Guru of the week series of articles. These are rated on a scale of 1-10, although the author does note in the associated books that what some folks find a 4, others might find a 9 (and vice versa).

I think a lot of people also underestimate just how flexible a lot of C++ is, and how much you can do with it. The most complex stuff I've read is probably the Modern C++ Design stuff (ie the Loki library) and some of the more esoteric Boost libraries - be interesting to see what level some of those are considered to be.

Jim.

##### Share on other sites
Heh, those sort of "how would you rate yourself on a scale from 1 to 10?" questions are given as interview questions by my current manager. It's always a kick to hear a "level 8" unix admin flounder to the question "how do you list current running processes?" Especially at interviews, nobody answers low.

I now think that most of the things in that list are novice. Intermediate depending on what the templating actually involves. Most of the things that make a programming guru are not language features, but design, debugging and algorithmic skill.

##### Share on other sites
If you know all the basics (making destructors virtual, etc), including multiple inheritance and basic STL usage, I think you should rate yourself a 5. A 7 would be able to explain in detail about the last time he was bit by the Koenig look-up rule. A 9 could re-implement boost::mpl from scratch on the whiteboard without bugs :-)

Here's another way of thinking about it:

Consider the C++ standards document. It's about 1000 pages, and it defines anything from "here's what an if() statement does" to "here are all the member functions of the strstream standard library class". If I were to take a random page out of those 1000 pages, what are the chances that you would be comfortable with the topic covered on that page? 100% == rate 10; 50% == rate 5.

PS: Actually, the standards document does NOT define what "most specialized" actually means for template function selection. Grr.

##### Share on other sites
Thanks everybody... I always hate the self rating questions and just wanted some input on what others thought.

##### Share on other sites
Level 1 - I know how to write a simple program (loops, structures, memory allocation, cout, etc...)
Level 2 - I understand virtual functions & inheritence
Level 3 - I know how to use the STL (stringstream, deque, vector, map, set, etc...)
Level 4 - I know how to customize the STL (adaptors, functors, allocators, etc...)
Level 5 - I can write (useful) Standard C++ code that MSVC6 cannot compile
Level 6 - I have knowledge of all features (bitfields specifiers, koenig look-up, & other esoteric things)
Level 7 - I grok virtual inheritence (interfaces)
Level 8 - I grok advanced template topics such as partial ordering
Level 9 - I have several bug patchs credits in boost, ACE, Loki, etc...
Level 10 - You have to pay me six-digits to talk to you

Hehe, I'm a 9 with this list ;)

I think metatemplates are rated a higher complexity than they really deserve - the meta-template algorithms are not that complicated, it's the implementation that's a pain only because advanced templates require you to know some of the more esoteric rules.

When they ask these questions I think they are more looking for you to critically assess yourself. A sign of gross incompetence is to greatly over-rate your capabilities.

##### Share on other sites
Virtual inheritance isn't really that complicated is it? o_O

:: makes mental note to find himself a good reference on the implementation of that stuff. ::

##### Share on other sites
Right, virtual inheritance should be a lot easier to understand than non-virtual inheritance (huh ? my class implements this interface twice ? :D)

If you want to rate yourself, I'd suggest you to head over to www.brainbench.com and take the C++ fundamentals test. I really liked their test, the questions were surprisingly well thought out and dealt with actual C++ knowledge, not basic programming skills And in the end, you get a nice certificate to show around (no I'm not getting paid for writing this) :)

-Markus-

##### Share on other sites
I don't think you need to know every aspect of C++ to be a guru at it. A guru is just someone who advises you on the best practices of the language. You don't need to know a lot about boost, for instance, to be able to advise someone on overriding virtual functions.

There are a lot of the more tedious aspects of the language that you don't, and never will, need to know about to write pretty much any C++ program.

##### Share on other sites
Quote:
 Original post by Anonymous Posterit's the implementation that's a pain only because advanced templates require you to know some of the more esoteric rules.

Not exactly, i'd say the difficulty for some people would be that it requires a different mind, it's more akin to pure functional style programming.

##### Share on other sites
I think the goal of this kind of questions is to test the confidence of the candidate on any given subject. It's also more of a relative scale. For example they'll want to know if you are more of a C++ programmer or a VisualBasic one.

So basically you have to give yourself a good rating in your area(s) of expertise (not 10 though that would just make you look arrogant) and then evaluate the others relatively.

##### Share on other sites
Quote:
 Original post by JingoI don't think you need to know every aspect of C++ to be a guru at it. A guru is just someone who advises you on the best practices of the language. You don't need to know a lot about boost, for instance, to be able to advise someone on overriding virtual functions.There are a lot of the more tedious aspects of the language that you don't, and never will, need to know about to write pretty much any C++ program.

That was exactly what I was thinking. Some of the things other people mentioned seemed well... I don't want to say useless, because I don't believe anything is ever really useless... but... Ok, let me put it this way, just because you understand crazy "esoteric" aspects of C++ does not mean you are any better at the language than someone who doesn't. I have been programming for only a good 4 years now, but I've found that sometimes you just don't need to use those super advanced techniques unless you just want to boost your ego (no offense to people who enjoy using them, cause I'll admit, sometimes I like to "show off" with my code). Granted they exist for a reason, but how often are you going to encounter those reasons in the real world?

While trying to place a numerical value on ones skill in any language or in programming in general may be impossible or impractical, I'd have to say I measure a persons skill based on how well they can solve a problem. Can you write code that can do task X? 1. Does the code work? 2. Does it follow the standards and is it readable and maintainable? 3. Is it fast and/or efficient? 4. Is it the best way to solve the problem without making new problems later on? If you can sit down and write code for any task X, and answer yes to all four of those questions, you know your stuff, even if you don't have every little aspect of the language burned into your brain.

I dunno about anyone else, but I constantly look up how to do things I've done 100 times before. Often times in the process I learn new stuff. Someone else mentioned rating yourself based on how comfortable you would be with with a randomly chosen topic from the C++ standards document. I'm not so sure I agree with thier assessment. I think if you can open it up to a random topic and read about it and understand it and make use of the techniques presented if necessary without any prior knowledge THEN you can rate yourself a 10. You don't need to know everything already, you just need to be able to understand everything when it gets thrown at you.

##### Share on other sites
Quote:
Original post by BungoMan85
Quote:
 Original post by JingoI don't think you need to know every aspect of C++ to be a guru at it. A guru is just someone who advises you on the best practices of the language. You don't need to know a lot about boost, for instance, to be able to advise someone on overriding virtual functions.There are a lot of the more tedious aspects of the language that you don't, and never will, need to know about to write pretty much any C++ program.

That was exactly what I was thinking. Some of the things other people mentioned seemed well... I don't want to say useless, because I don't believe anything is ever really useless... but... Ok, let me put it this way, just because you understand crazy "esoteric" aspects of C++ does not mean you are any better at the language than someone who doesn't.

No, but the prevailing odds are if you're l33t enough to debug stripped core files, re-impliment network drivers, or the such you're going to be able to handle something as 'mundane' as pointers and inheritance.

Quote:
 I have been programming for only a good 4 years now, but I've found that sometimes you just don't need to use those super advanced techniques unless you just want to boost your ego (no offense to people who enjoy using them, cause I'll admit, sometimes I like to "show off" with my code). Granted they exist for a reason, but how often are you going to encounter those reasons in the real world?

In game programming, fairly often it seems.

Quote:
 While trying to place a numerical value on ones skill in any language or in programming in general may be impossible or impractical, I'd have to say I measure a persons skill based on how well they can solve a problem. Can you write code that can do task X? 1. Does the code work? 2. Does it follow the standards and is it readable and maintainable? 3. Is it fast and/or efficient? 4. Is it the best way to solve the problem without making new problems later on? If you can sit down and write code for any task X, and answer yes to all four of those questions, you know your stuff, even if you don't have every little aspect of the language burned into your brain.

I disagree. Or rather, just because you know your stuff doesn't mean you're a 10.

Say I'm given task X, and at the same time Fruny [sorry Fruny, just an example] is given the same task. I take 4 hours to write up the code, and the rest of the week debugging it. Fruny solves the same problem, but takes 3 hours to write up the code, and 5 hours debugging it. Ignoring quality, am I just as good a programmer as Fruny? We'd both answer yes to all 4 questions... but I think by anyone's measure, Fruny in this example is a far better programmer than me.

And that's ignoring the inherent benefits Fruny's solution would have over mine by virtue of his knowledge and experience. Just because someone can "solve" a problem doesn't mean their solution isn't by far worse than another's.

##### Share on other sites
level2 I dont use stl

##### Share on other sites
What would be defined as esoteric concepts of C++?

##### Share on other sites
Quote:
 Original post by SfpianoWhat would be defined as esoteric concepts of C++?

Something like this?

std::use_facet<std::ctype<std::basic_string<std::string::value_type>::value_type> >(std::locale::locale(std::locale::locale().name().c_str())).tolower(&(reinterpret_cast<char*>(static_cast<int>(""<:*"":>)?5:static_cast<int>(""<:*"":>))[(int)&(*s.begin())]), &(reinterpret_cast<char*>(static_cast<int>(""<:*"":>)?12:static_cast<int>(""<:*"":>))[(int)&(*s.end())]));

##### Share on other sites
Quote:
 Original post by CygonIf you want to rate yourself, I'd suggest you to head over to www.brainbench.com and take the C++ fundamentals test. I really liked their test, the questions were surprisingly well thought out and dealt with actual C++ knowledge, not basic programming skills And in the end, you get a nice certificate to show around (no I'm not getting paid for writing this) :)

"C++ Fundamentals Available Plan Learn Test \$49.95" :(

##### Share on other sites
Quote:
 sez Jingo:std::use_facet::value_type> >(std::locale::locale(std::locale::locale().name().c_str())).tolower(&(reinterpret_cast(static_cast(""<:*"":>)?5:static_cast(""<:*"":>))[(int)&(*s.begin())]), &(reinterpret_cast(static_cast(""<:*"":>)?12:static_cast(""<:*"":>))[(int)&(*s.end())]));

Equivalent to:
std::use_facet<std::ctype<char> >(std::locale::locale()).tolower(&*s.begin(), &*s.end());

Transforms the std::string s into lowercase using the default locale. Am I correct? If yes, can I have a cookie? ;)

[Edited by - Sharlin on April 27, 2005 5:21:05 AM]

##### Share on other sites
Quote:
Original post by Jingo
Quote:
 Original post by SfpianoWhat would be defined as esoteric concepts of C++?

Something like this?

*** Source Snippet Removed ***

This is not an esoteric C++ concept. This is unreadable, unefficient and poorly documented code. [wink]

Sorry, I can't login here, so you'll have to guess who I am (just kidding).

--
Emmanuel D.

##### Share on other sites
Looks like people are trying to say that you are only going to know how good you are by seeing how well you complete a project.

I think a text editor is a good project. Try it out!

##### Share on other sites
Level 11 - I Document my code.

##### Share on other sites
Quote:
 Original post by CibressusLevel 11 - I Document my code.

That'd make me at least level 12 - my code is self documenting.