views:

2043

answers:

22

I was wondering if it is necessary for programmers to have expertise on at least 1 programming language?

Programming languages like C#, java, VB.Net etc change every year or two. Should a programmer have mastery over C++, which is a stable language and rarely undergoes changes?

I am a C# developer and using it for about 7 years now, I still don't have mastery on it.

EDIT I think my question is being misunderstood. I am not against changes or evolution. I love the new features and abstraction provided by languages such as C#, VB, Java. And I keep waiting for new features if it makes a programmers life easy. But this fact also make this languages very difficult to master. They are continuously evolving. Languages like C++ have slow evolution cycle. So given this scenario, Is it helpful to be master of C++? This is what my original question meant. Note:- Based on the answers by friends below, I have understood that languages and framework are tools for expressing the concepts. Also it might be a good idea to express the concepts in different programming languages.

+65  A: 

Programming languages like C#, java, VB.Net etc change every year or two.

They don't "change" but evolve. Your knowledge and experience are not lost.

Should a programmer have mastery over C++, which is a stable language and rarely undergoes changes?

Programming is all about new and change. If you don't like it, consider another profession.

I am a C# developer and using it for about 7 years now, I still don't have mastery on it.

If you were to achieve mastery, the life would become boring and maybe even pointless. Maybe it's not the target but the road that matters?

EDIT: After reading your comments I feel that you misattribute the volume of the .NET class library to the complexity of the C# language itself. Don't mix them. The C# language is relatively simple, it's easy to "master". What you're mentioning as useful methods of the char datatype are just helper methods from the .NET library. It's one of the assets of the platform. It's what makes .NET developers so productive, because they don't have to waste hours digging for third-party libraries to make basic operations for them: XML, imaging, networking, databases and more it's all available directly from the .NET library. Naturally, its sheer size might frighten you and provide an impression of it's being endless. It ain't! Just use what you need and leave the rest be.

Developer Art
Run out of votes for today, otherwise an immediate +1 from me...
David M
I think you got me wrong. I enjoy programming in C# and also wait for the new features. I like change and evolution in it. My point of view was that advanced C++ programmer can immediately develop code in C++ without worrying too much about unknown syntax/concepts. As an advanced C# developer, I still have to search for syntax even for simpler things.In this case is it necessary to have C++ mastery?
Yogendra
And like Neil says below, C++ evolves too. For those of us who are neck-deep in C++, those evolutions are very significant, even if more casual users find it hard to see their value.I've been using C++ for 10 years now (professionally), and I can still find new things to learn in it. So really, "stability" doesn't mean all that much.
MadKeithV
@Yogendra: If you have to search for even simple syntax solutions, are you really an advanced developer? Also, why do you think C++ coders can work without worrying about unknown syntax/concepts? I'm not even sure what you're trying to say here...
FrustratedWithFormsDesigner
@Yogendra: Knowing C++ has benefits of its own since you'll better understand what's happening behind the scenes of a high-level language like C#. But a mastery in C++ won't make you a master of C#.
Developer Art
@Yogendra: Besides, C++ is a vastly complexer language. To achieve a mastery (whatever this is) in C# is far easier than in C++. I don't know where do you get this... unusual opinion about "advanced C++ developers". They also look up things all the time, likely even more than C# developers.
Developer Art
@FrustratedWithFormsDesigner : By simpler things, I don't mean i need syntax help for primitive or routine task we do. eg. yesterday, I had to use the 'char' type in C#. I had not used it for long long time. I was surprised to find the helper methods it provides.
Yogendra
There is the language and there is the framework, the c# or Java language itself is not that big but when you have to add the .NET framework and the JFC then it becomes a lot to keep track of
SQLMenace
@Yogendra: .NET library is quite huge, it's one of the assets of the platform. I also discover new things all the time, but I learned not to be worried about it. Unless you strive to become a master of C# and nothing else in programming, you won't learn it all. Focus on your projects and see the language with its library just as a tool. Any day you learn something new - enjoy it!
Developer Art
@Developer Art : Agree with you. :). I was getting worried about not knowing many things the library offers.
Yogendra
"Programming is all about new and change" I disagree. Programming is about making software, not about "new and change". Not everything that is "new and changed" is actually useful.
SigTerm
+1  A: 

Programmer should have expertise on concept that's almost all :)

mathk
Huh? (I need to pad this out to be a valid comment, but really - Huh?)
Binary Worrier
I think what mathk is getting at is; learning different languages are MOSTLY learning different syntax. Once you've learned a concept like OOP, you can apply that to different languages.This generally holds true when comparing functional languages to other functional languages, imperative to imperative, etc
Software.Developer
Actually if you think of it. You need to know concept and when to use them and when not. Understanding a concept is not an easy task.Is like learning a language, you need the best word and sentence that fit you purpose to make it perfectly clear what you are writing.But that is very difficult it also depend on how many PL you know...
mathk
+1  A: 

Do you have "mastery" over English (or whatever language you speak)? I have been speaking English for 30+ years and still don't have mastery over it. In this respect, I don't see much difference between English and C# (C++, VB, Javascript....) languages evolve, keep learning, that is the best you can do.

Muad'Dib
+1  A: 

I think you're mixing languages and libraries. While the languages that you mentioned do change, their changes are usually eclipsed by (and are often paired with) changes to their class libraries.

That being said, there's nothing "unstable" about these languages. They "change" by growing, not moving. The fact that C++ (as a language) stays largely static is neither a good nor a bad thing about it.

Adam Robinson
+32  A: 

C++ has changed enormously in the time I've been using using it, and is just about to undergo another enormous change with the adoption of the C++0x standard. If you don't like change, you are in the wrong business.

As for "mastery", I would say that anyone who claims complete mastery of every facet of C++ is probably lying through their teeth (and that would include people like Stroustrup, if he ever said such a thing). Most experienced C++ programmers are expert in a subset of the language which is useful for addressing the specific problems they are interested in - get them outside the subset and their lack of knowledge becomes quickly apparent. But of course, they can equally quickly learn the new stuff.

anon
+1 for being the only answer to point out C++0x.
Matthew Flaschen
"probably lying through their teeth" or hopelessly delusional :-)
Anders K.
thanks for pointing out the C++0x
Yogendra
I thought most C++ developers were hopelessly delusional already?
MadKeithV
This lead me to strongly think that c++ is not a good PL for learning PL. I don't say that C++ is a bad language but regarding learning and teaching C++ is not the best one. So in other to become a good programmer I will not consider C++ as a criteria. C++ is so huge that someone clamming to know C++ do not tell mush on what he is really knowing :)
mathk
"complete mastery of every facet" -- [facet](http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/classstd_1_1locale_1_1facet.html) pun intended? ;-)
James McNellis
@James Surely _nobody_ has or will ever have complete mastery over those!
anon
+1  A: 

To master something actually requires to work hard with that something. Languages are only a tool, not a prerogative, like text editors and xml parsers. A programmer must have a strong language independent knowledge that can be applied at every tool and language to resolve problems.

Somebody says that programming is an art, and art is still art, regardless the tool and tecniques used.

vaitrafra
+2  A: 

If you use C++ then you should know the language features. I used to be a very high level C++ but now I use C# then I'd have to refresh on it. Sometimes having too much knowledge can be interference so I don't care.

Answer: Code C++ everyday = yes, code c# = no

Be clear you can't have mastery over something like that unless that is all you are doing or at least every single day, at least it was that way for me.

Curtis White
A: 

My problem is with the word "mastery".

I doubt if you studied your entire life, that you'd understand every nuance of any one subject. I've been speaking English for 33 years and still find myself at a loss as to the form it takes sometimes.

DarkBobG
A: 

The 'problem' with Java, c# is that you don't just have to learn the language but also the libraries that come with it. Now take C++ what if I told you you also need to learn ATL and MFC with it and memorize all those things...this would be impossible

SQLMenace
A: 

In our universe, everything is constantly changing.

Luca Matteis
+4  A: 

I program in half a dozen languages, but a thorough understanding of 'bare metal' concepts is probably your best crutch to help you between languages.

For me, this means knowing c/c++. Once, for example, you can appreciate the object oriented design of the Linux kernel - written in C - it's easy to appreciate the 'short cuts' (read core language feature) provided by other languages and when and how to asses there efficiency.

So, yeah, I think a good comprehension of a low level language is great asset to any programmer. C/C++ fits this bill perfectly.

Jamie
+2  A: 

Most programming languages change and evolve continuously, and the same is true of C++. Syntactic changes come with every new revision to the Standard, and a major one (C++0x) is on the horizon. But even while new versions of the Standard might be fairly infrequent relative to the advancements in technology, the understanding of that technology continues to evolve. For example, when the current C++ Standard first came to be, most people were not using templates or exceptions. As people gained experience with the newer features they learned not only the syntax of the mechanism itself, but the larger implications of using those facilities. If you look at an application written today it may look much different than an application written just a few years ago, even if both were written by "experts."

If you want to become a master programmer, then the path to mastery is learning. As much as you can, in as many different areas as possible. I believe one of the best ways to do this is to learn as many languages as possible, if only to gain a rudimentary understanding of that language. Learn all the 'big' languages, like C++, VB, Java, C#, etc. But don't limit yourself to them. Learn the little languages too, and the more academic languages. Every language you learn teaches you not only that language, but how to program.

Take a look at this book, 7 Languages in 7 Weeks

John Dibling
Shouldn't we start calling it C++1x?
JeremyP
@JeremyP: Stroustrup doesn't think so. :) "I'll keep referring to the upcoming C++ standard with the feature set defined here as C++0x. Think of 'x' as hexadecimal" source: http://www2.research.att.com/~bs/C++0xFAQ.html
John Dibling
@JeremyP The "x" isn't a placeholder anymore. It's now C++0x_.
aehiilrs
A: 

What is really important is not loose some minutes googling an answer for the best way to write something, is the ability to write good code or the ability and the desire to search for it, C#, java, VB.Net are are intended to be abstractions that made your model clean, safety and less error prone, and writing code as human readable as possible. If you want to develop games, program for windows, linux, drivers, or everything that needs really the best performance or maybe win a contest for most obscured line of code, choose C++, in the other hand you should choose a another platform. I love technologies which evolve, that's a merit not a defect.

dev-cu
+1  A: 

Hi,

I've questioned myself similarly on this. My opinion (from being a nothing-to-C# programmer) is that you reach a stage where the language becomes the means to an end. You can do stuff in any language so long as you know the basics in it (I've had to do bits in C++, VB, and Python).

Its the advanced areas of a language that allow you further control and what you would argue separates the "Professional X" programmer from the "Hobbyist/Occasional X" progammer (I know C++, but I use it once in a while. I know C# and use it every day.).

Don't worry about not knowing a certain language - at the end of the day, languages will continue to evolve - none of them are guaranteed to be in existence for the duration of your professional career (though some are highly likely to lol).

Adam
+6  A: 

I believe a true "master" programmer has a varied toolset. She may be specialized in one or more languages, but overall she will make sure that a broader set of bases is covered, rather than going deeper into tiny specifics.

Some things that I find useful:

  • One language that gets close to the metal. C, C++, assembly language, to learn how your programs can interact with hardware.
  • One relatively pure OO language (C#, Java), to learn OO concepts at the same time as realizing that OO is not a silver bullet.
  • One functional programming language (Lisp, Haskell,...) to get outside of the procedural / imperative box.
  • One "scripting language" - a shell script language, or something like Python and Ruby, because sooner or later you'll want something that "has everything" to quickly cobble together some utilities.

Having those under your belt will make you a better programmer in any language.

MadKeithV
@MadKeithV: + 1 from me. Well said.
Yogendra
@MadKeithV: true, very true
chester89
+16  A: 
Norman Ramsey
+1 from me. It's a good answer.
Yogendra
Good answer, but C++ as a machine-level language? Aaarrgh. Write something in assembler, with dynamic memory allocation, communications, and threads. Then you will know how the machine works, and how programs interact with an operating system!
Cylon Cat
@Cylon: I like C actually, but I've been worked over in this forum by the C++ fans one too many times. As for assembler, it's great for a procedure here and there, but I can't see the value in building a whole system in assembler. In fact, it's not clear we even ought to be doing firmware in assembler---Intel has put out a call for proposals to find ways of building firmware that require much less assembly coding.
Norman Ramsey
@Norman, I hear you; I was partly tongue-in-cheek about assembler. I was doing that back in the late 1970s, though, on IBM 370, and the site had only Fortran and Assembler. So assembler it was! Lots of fun, but wouldn't want to go there again. Between timers and interprocess communications, I wrote my own event-driven model with a dispatcher and message queue. That made a lot of later programming tools and environments seem not so scary.
Cylon Cat
Hey, Lua's not simple, it's just not that big of a language! ;)
RCIX
@Cylon: Crippled site! We wrote a (student) operating system for the 370 using IBM Pascal/VS and a little assembly code. There was also PL/S although maybe that was just inside the company. But compared to the chaos that is Pentium, 370 assembler was not so bad. Good macro stuff; I still remember when I finally figured out `DSECT`.
Norman Ramsey
DSECTs were cool! They opened up so many capabilities. 370 assembler was pretty well designed; I particularly learned to like some of the exotic instructions, like Execute, Translate, and Translate and Test. Very powerful stuff.
Cylon Cat
+1  A: 

I think the answer is that it depends on what you need to do and whether you want to specialize or have more general experience/skills (don't discount the latter even if it is not always as fashionable). This is similar to most engineering (and indeed other) disciplines, and I don't think there is a right or wrong approach.

Using the auto industry as an easy analogy, opening a Volvo specialist in a small rural town is unlikely to be a smart business move, where a more general auto repair business would probably be a more appropriate venture (unless you live in Sweden of course...). In a large affluent urban area, the opposite may well be the case. Each business would require different levels of specialist and 'generalist' technical skills (and tools).

Having said that if you do have the opportunity to get a deep knowledge of one language and/or environment, you will probably find that your experience with it will help you in other languages/environments also.

Mick
+2  A: 

A good programmer should know as many languages as possible. C++ doesn't have a special status there. A programmer who knows C++ is better than one who doesn't, just like a programmer who knows Python is better than one who doesn't.

If you don't need to write C++ code, then no, you don't particularly need to be an expert at C++. It doesn't hurt, and learning the language will certainly teach you things that you can use in other languages as well.

But the same is true for other languages.

jalf
A: 

I think that C++ is a mistake. Compatibility with C has killed the language from the start, lack of a good template library has put in trouble programmers for years.

Now that it is relatively stable and mature, it remain a mistake, with a lot of infrastructure trying to kill you and some infrastructure really helping you.

I subscribe to most of the questions raised in this "interview".

Language designers have tried to fix the problems of the language first with the design of Java and C# leaning too much on the safe side.

Go is a more recent attempt to create a C with classes with speed, speed, speed in its very design. Go is still not mainstream, but it would, if it depended on me.

All in all, i think that ANSI C is still a powerful and useful language, the number one tool when performance comes first (or number two, considering Go).

Ah, and you can definitely master C in a few months, the language design is not made to raise questions on the structure of the solution.

I would definitely teach C to students and maybe Python or Java (or Go) to show OO practices and design.

mico
A: 

I don't think it's necessary to teach yourself a language you don't think you're going to use. Some C/C++ knowledge is good to have in your repertoire though, and if you have some interest and some time in learning C++ then by all means go right ahead. It never hurts to learn something new. I'm an advocate of developers who are generalists, with specializations in specific areas.

Mastery of a language is something that is difficult to attain... it would suggest knowing a large chunk of the library from heart. That takes a lot of time writing code with a lot of different packages/namespaces from the library. As someone that's done some C/C++ and Java/C# for about four years, I'd say that I'm on a need-to-know basis for the library. I'm constantly encountering new parts of the library that I need to learn/use. The challenge in .NET programming, for me, is learning how to use new parts of the framework. Writing the code consists of the same transferrable programming skills I've been using for years.

Let me ask you a question:

What language do you naturally "think" in? I know that when I approach a problem for the first time, I seem to naturally think in C for simple/low level stuff, and C++ when I'm dealing with a project that lends itself to object-orientation.

baultista
+1  A: 

I would say it's necessary for programmers to have expertise in at least one programming language and preferably two.

The keyword here is "expertise", not mastery; I agree with the opinions of several posters that true mastery of most general-purpose programming languages is an elusive and nebulous level of excellence probably beyond the achievement of most software professionals. The issue is not so much lack of time or ability but rather a lack of comprehensive exposure to a very broad range of programming problems. You are ultimately limited by the type of projects that you can currently work on within your organization(s), etc.

The need for expertise in one language is obvious. A decent level of knowledge and experience in at least two languages is useful to better understand the limitations of any given language, as well as to provide viable options for choosing an appropriate tool for a given project. Expertise in more than two languages may also be desirable, but I find it to be difficult in practice to any degree of depth. Generally one's ability to maintain a high degree of expertise in multiple programming languages declines rapidly after the first 2-3.

Ultimately, the important thing is to establish and maintain expertise in whatever languages are most useful for the type of work that one is currently doing and/or expects to perform in the near future. Stay abreast of changes, try new tools out, and be prepared to adopt and embrace something fundamentally new whenever the need arises.

Joel Hoff
A: 

The same factor that makes C++ stable makes it hard to master: it's large, complex, and relatively complete.

Mark Ransom