Just wondered what are the features of the three main programming languages which show you are an 'expert'? Please exclude 'practical' skills such as indenting.

Am I right in saying for C++ the most difficult aspect to master is STL/generics? Java seems much easier as memory is handled for you. I'm not entirely sure on C# either?

I'm trying to use this to guage my current level of ability and what i wish to aim for.

ps this was posted on stackoverflow but got binned due to arguing, please do try to keep it civil as I am really interested in the answers from everyone :)

  • 2
    Perhaps a thread for each language? Seems that each might get overtaken by the other two. – Chris Dec 2 '10 at 23:18
  • Each of the languages is relatively simple to learn, the hardest part is understanding and making the best use of all the libraries available. There is so many no developer can be an expert in all of them. – Peter Lawrey Dec 25 '10 at 18:43

Honestly, I don't think that you can really group those three languages together for such a question. Java and C# might be close enough to work together - though it wouldn't suprise me if some of C#'s more interesting features were more difficult and therefore more in the "expert" realm than the features that C# and Java have in common - but C++ is in a different league entirely. It just has too many things in it that do crazy stuff if you don't use them right. And some features - like templates - are just way more powerful and complicated in C++ than in Java or C#. I would rate very few features that these three languages have in common as being of "expert" level. In general, the stuff that makes you an expert at a language is the esoteric stuff that other languages don't necessarily have and which are more likely to trip you up.

Measuring your knowledge as a programmer without regard to programming language means measuring stuff more along the lines of algorithms and data structures. How well you understand design patterns and good software engineering principles matters far more in general than how you indent.

The types of skills that make you an expert programmer in general are not the same types of skills which make you an expert at a particular programming language. It's good to have both (and if you're not at least reasonably competent in the language that you use, your non-language specific knowledge doesn't do you much good), but you're talking about two very different things when you're talking about what makes someone an expert at a particular programming language and what makes them an expert programmer in general. And since even relatively similar languages such as C++, C#, and Java differ quite a bit in the details - especially the ones which would tend to qualify you as an expert in the language itself - trying to group them together when trying to determine what makes you an expert at them really doesn't work.

  • +1: When asked this, I like to tell people "C#/Java/C++ like some spoken languages, may have a similar alphabet, but otherwise they're very different." – Steven Evers Dec 3 '10 at 0:59
  • C - pointers
  • C++ - pointers and STL/Templates
  • C# - the gigantic libraries
  • Java - the gigantic libraries
  • I'd say templates rather than STL in particular. The STL tries to take some of the pain out of using templates. – Henry Dec 3 '10 at 2:06
  • C++ += Boost library and having read Scott Meyers books. – comonad Dec 5 '10 at 2:59
  • Java += outsmarting the GC (to not leak memory or fight against the GC) – comonad Dec 5 '10 at 3:04

The most complicated feature of C++ is templates, because of their power and awkward syntax. It isn't hard to use pre-written ones, and it isn't hard to write a simple templated class or function, but C++ templates are a compiler-executed Turing-complete language.


I rather think that the syntax of each of those languages you list are not hard to learn at all. The "hard" part is twofold, in my opinion:

  • the frameworks that come with them (STL for C++, JRE for Java, .NET Framework for C#) are voluminous and can take a long time to master.

  • patterns, practices and paradigms. The three languages you mention are hallmarks of Object-Oriented Programming Languages and we've come a long way since "Cat is a subclass of Animal". Knowing proper techniques (SOLID, GoF patterns, etc.)


Making programs thread-safe and scalable to many, many cores.

But that is hard in any language.


The Programmer Competency Matrix can be a good way to gauge your skill level and goals in a language-agnostic way.

You can then make it language-specific by asking yourself if you can reliably do thing X in a given language.


I believe the hardest part about the languages is not knowing the features but knowing when to use them. Take iterators in C# as an example:

IEnumerable<int> Ints()
    yield return 1;
    yield return 2;
    yield return 3;

Well yeah that is a working example but is it an appropriate usage of the feature? I think not. The same really applies to the features of any language. I've been working with computational expressions in F# and I do understand them. I even know a few good examples of when to use them. The thing is I'm not yet skilled enough to apply them to a new problem.


The hardest thing for me to grasp in C# were delegates and lambdas. I use to write all my LINQ queries using the SQL query format. Since I've been learning F#, the C# lambdas have become much, much easier and I really enjoy them. All it took for delegates was a little concentrated effort (which required me to not be lazy) and then they made sense.

Overall, I don't think the C# libraries are that big of an issue (unless you talk about 3rd party ones) since Microsoft has thorough documentation (IMO).


In C#, the hardest feature is easily generic covariance and contravariance. Go here, scroll down and read the blog posts one by one from bottom to top. Make sure you understand every word of it, in particular all the examples. Warning: your brain will hurt.

Once you understand all that, then try to an understanding for it in practice. Understand why you can make a covariant stack (source code is given on one of the posts on the page I linked), but not a covariant queue (at least, not without a significant speed hit).

Finally, try to find a use for them (not trivial ^^), and then try to implement it yourself. I'll give you bonus kudos if you use it in a recursive structure, and figure out you have to 'hide' the generics from the compiler to get it all working.

If you do all that, congratulations! You've managed to acquire skill at a highly complicated piece of the C# language that you will probably never use again.

  • Re-reading your question ("I'm trying to use this to guage my current level of ability and what i wish to aim for."), then no concrete answer will ever answer your question: if you want to be proficient at a language, you need to know many different parts of it: there is no linear path from the easy stuff to the hard stuff. – Alex ten Brink Dec 3 '10 at 15:56