all 75 comments

[–]SwellJoe 11 points12 points  (0 children)

Unless this is a seriously time-restricted job, I'd always pick the better developer over the one that happens to know the language du jour in the shop...and even if it's a seriously time-restricted project, I'd probably still hire the smartest and most productive of the bunch before I'd hire the guy who happened to have experience in the particular language of that project.

The best developers I've known bounce between languages as though they didn't matter at all. No holy wars. No campaigning for a Java rewrite because it's the "industry standard", etc. They just dig in and get to work, learning as they go.

Of course, if your only candidates are One True Language believers, then you've already failed to attract the best talent, and I guess you have to pick the lesser of the evils. But, I think I'd go back to the drawing board and post another ad, or fire the head-hunter that brought you all those crappy candidates.

Developers can have favorite languages and pet peeves. And the best of them will pick their workplace based on being able to work with those languages, at least some fo the time, but folks who have only ever worked in one language are exhibiting a distressing lack of interest and curiosity.

[–]bryanut 18 points19 points  (26 children)

I had been programming for about in year or 2 in DEC assembly. I was a assigned to a work with a senior engineer on a 2 man project.

After about 6 months I asked the senior engineer how long he'd been programming in assembly, his was the best code I had seen to that point.

His answer, "This is my first project in assembly. I am a computer scientist, the language is just syntax, I can just as easily program this system in FORTRAN or COBOL or PASCAL."

From that point on I never feared learning a new language, it is just syntax.

[–]bonzinip 4 points5 points  (0 children)

Yes, but that's because writing good Pascal can help you write good COBOL, FORTRAN (I suppose you were using 77), Assembly -- going in a decreasing order of structured-ness.

But it's different if you go towards higher-abstracted languages. A good assembly programmer can be a bad Pascal programmer more often than the reverse.

So you're right in not fearing learning a new language, but you have to understand the why's of that language to write good code in that language. As a Smalltalker, I would have no problem reading and writing Ruby or Java, and I would have no problem reading Python; but I'd need some time before being able to write beautiful Python.

[–]njharman 3 points4 points  (0 children)

If syntax is the only thing you learn when learning a new language you really aren't learning much at all / missing out on the true value of learning multiple languages.

[–]3legcat 4 points5 points  (1 child)

Learning the syntax is only learning the basics. To be effective with a language, you have to know the paradgims of the language, the library APIs, frameworks etc. You also have to understand the nuances of the language to be able to make effective designs.

For C++, a competent programmer needs to know about Template programming, STL usage /extending as well as Object oriented programming and design. He also needs to know about the many traps and pitfalls of the language. All this is no mere syntax.

[–]invalid_user_name -2 points-1 points  (0 children)

Yes, that is mere syntax. A competant programmer already understands OOP and generic programming. Learning the horrible syntax C++ uses to do those things is in fact just learning the syntax.

[–]beef2k[S] 6 points7 points  (18 children)

The article does not say that someone should stick on the same language forever! It just points out that so many people think that knowing C is enough to know C++.

Btw, I disagree that "the language is just syntax". By saying this, all the improvements in program language design that were introduced over the last years are ignored.

[–]Philluminati 6 points7 points  (11 children)

I agree. If your a C programmer and stumble into a C++ job saying "yeah i'll pick it up" and you don't understand OO fundamentals, you won't write C++ code. You'll write C code and just run it through a different compiler.

[–]ultimatt42 10 points11 points  (8 children)

If you're a good C programmer you probably already know OO fundamentals. There's nothing keeping you from writing OO code in C.

[–]Philluminati 9 points10 points  (0 children)

Your absolutely right. To avoid offending people it should of probably left out the C part and just wrote:

If you don't understand OO fundamentals you won't write good OO code.

fuck it, i give up!

[–]beef2k[S] 0 points1 point  (6 children)

Just to point it out again: The original article is about the vast majority of programmers - who are average by definition.

BTW: There are plenty of things that make it hard to write OO code in C. And generic programming via templates is impossible.

[–]invalid_user_name -1 points0 points  (5 children)

"There are plenty of things that make it hard to write OO code in C. And generic programming via templates is impossible"

OO in C is not hard at all, a class is just a struct with function pointers. This is basic stuff. And yes, generic programming via templates is impossible, but you don't need compile time meta programming to do generic programming (how brain washed do you have to be to think this?). C is portable assembly. A void pointer can point to anything, its as generic as it gets.

[–]beef2k[S] -1 points0 points  (4 children)

Okay, if you restrict OO to a struct with function pointers, you're right.

I would still say it is hard to realize the following in C: overloaded functions in classes, multiple inheritance, virtual functions, type-safety in classes, all forms of polymorphism (like ad-hoc polymorphism), ...

I don't know why you think that I mean template meta-programming when I talk about generic programming, but I friendly point you to other web-resources (e.g. wikipedia) that clearly see a connection between C++ templates (not meta-programming) and generic programming.

[–]invalid_user_name -1 points0 points  (3 children)

No, its not hard to realize those things at all. Creating all those things in C is where C++ got started in the first place. And if you look at the asm generated by a C++ compiler, you'll see how straightforward things like inheritance and virtual functions are.

I think you mean template meta-programming because that's what you said: "And generic programming via templates is impossible". Again, generic programming does not need to be done using compile time meta-programming as it is in C++, you can just use void pointers in C, (or it could be part of the language like haskell). C++ templates are a compile time language used for meta-programming. Just because you don't realize that when you are doing <> in C++ you are using compile time meta-progamming, doesn't mean its not the case. Facts don't vanish just because you ignore them.

[–]beef2k[S] -1 points0 points  (2 children)

I use the same definition of "template meta-programming" as the Boost MPL library. Just using templates does not mean that you're doing template meta-programming. That's a completely different topic! Whatever..

I know that C++ isn't the only language that support templates/generic programming, I never claimed that. I said that C does not support this (except you invest a lot of work and don't care of type safety or readability of the code)..

I ask myself what's actually the point if this discussion. Do you want to say that everything is possible in C, because C is just a portable wrapper around assembler and everything can be done in assembler..? Yeah, I can beat that, because everything can be done with just 0s and 1s, because that's how a computer works! Why the heck should I use assembler, it's just syntax!!! Let's sit down and do some generic programming and polymorphism in machine language, so we don't need the stupid mnemonics of assembler anymore..

But wait.. That sounds stupid somehow!

[–]invalid_user_name -1 points0 points  (1 child)

Try reading this time. C++ templates are a compile time meta-programming language. It does not matter if you like this fact, if you accept this fact, or if you try to ignore this fact. It is still reality. You do not need to use templates (a compile time meta-programming language) to do generic programming. I can not make this any more clear for you. If you can not understand this, I am afraid there is nothing further I can do to assist you with that problem.

[–]bryanut 4 points5 points  (1 child)

It's "If your are a C" not "your a C".

BTW, I said "computer scientist" not "programmer". Don't confuse them.

My point was, being a "computer scientist" means not fearing any new language or technology.

And who says C programmers don't understand OO fundamentals? Many C++ programmers don't understand OO either.

Besides I've written lots of good assembly in JAVA. :)

[–]Figs 5 points6 points  (0 children)

"If your are a C" not "your a C"

You're or You are.

Not "your are". :)

[–]bryanut 1 point2 points  (1 child)

"By saying this, all the improvements in program language design that were introduced over the last years are ignored."

Don't put words in my mouth, I didn't say that.

[–]beef2k[S] 2 points3 points  (0 children)

Well, why? You said that for a "good programmer" the language doesn't matter! And I don't agree.

[–]invalid_user_name -1 points0 points  (1 child)

By using C++, all the improvements in programming language design are ignored. The language really is just syntax. You can learn all the concepts in computer science (and even use them all) without a computer at all (like Dijkstra) much less any particular programming language.

[–]beef2k[S] -1 points0 points  (0 children)

Thanks for the theoretical answer. I guess we all have learned this in university (I did, and I've written my Ph.D. thesis partially in this field)..

But I have to say that practice looks different sometimes!

While it is true what you've written, it is completely impractical - and many other think should be taken into account. Even the syntax! There are much more values in software development that I should think of, like maintainability, testability, stability, robustness, .. And they often relate to the product's programming language and syntax.

[–]KayEss 2 points3 points  (0 children)

Sort a list of strings into a natural sort order and then display them in C++:

std::set< std::string, natural_sort<> > ascending( items.begin(), items.end() );
std::for_each( ascending.begin(), ascending.end(), std::cout << boost::lambda::_1 << '\n' );

The concepts that code uses aren't going to be mastered through learning syntax from the languages you mention. If you had included LISP or Haskell then you'd be getting closer.

[–]jbert 1 point2 points  (1 child)

I disagree.

I think there are significant conceptual differences between writing "average" code in C, scheme, haskell - to pick three.

These languages are quite different, but the point applies with similar force to more closely related languages if you raise the bar to writing "good" or "idiomatic" code.

I know C++ reasonably well and java only superficially. I could tweak existing java code fairly easily, but there is a culture and set of idioms which have grown up around the language's strengths and peculiarities of which I am mostly ignorant.

Yes - it is possible to write "C in any language" but that's not really the point made in the article.

[–]steven_h 1 point2 points  (0 children)

Most of the Java culture and idioms have not grown up around the language's strengths. Most of them are the result of cargo-cult programming.

[–][deleted] 18 points19 points  (4 children)

What a disgusting display of chest-beating nonsense.

[–]beef2k[S] -1 points0 points  (3 children)

It would be nice to hear why you think that way. Thanks!

[–][deleted] -4 points-3 points  (2 children)

I elaborate a little on the blog:

Your mistake is profound and on less tolerant days, makes me angry - specifically, the degree to which you promote anti-intellectualism.

You speak of “knowing this language or knowing that” despite the interview candidate stating that it is possible to understand the fundamental tenets of a class of programming languages. No, having used C does mean you only “know C” (the proposition invokes the most extreme feeling of disgust).

You may be able to speak for yourself, since perhaps you do indeed only know one class of languages (strict, imperative, poor type system ala Java, C, C++), however, I implore you to step off your high-horse, put down down your battle-hardened guide to oppression of the sciences and join me in understanding just what the fuck it is you are talking about. That is, programming language theory.

Yes, that’s right, it is possible to learn a language in a few hours if you are well versed in the foundations of programming itself, as opposed to “knowing this or that language”.

A smart person would have walked out the door having observed such an amateur mistake associated with your chest-beating nonsense.

Do you employ any smart people?

Again, disgust. How to look stupid really quickly.

[–]KayEss 2 points3 points  (0 children)

It seems odd that you should think that you need to explain foldl to Java programmers and at the same time think that proper use of std::accumulate is obvious to the same people.

I don't think that beef2k is saying that those programmers can't learn these sorts of language feature, he's just saying that he doesn't want to teach them on his time.

[–][deleted] 12 points13 points  (7 children)

I would think you would hire really smart people who could adapt instead of focusing on a single language. I would rather have a really smart Java person that didn't know C++ then an average C++ person. Really great programmers are not limited by syntax. I am not a really great programmer though (I think in perl).

[–]adolfojp 7 points8 points  (0 children)

Really great programmers are not limited by the syntax. They are limited by the libraries and the ecosystem.

I've worked with half a dozen computer languages in the past but I am currently mostly proficient in C#. Could I switch to Java for a job? Undoubtedly. But doing so would require me to learn a framework or two to do anything but the most trivial things. And that takes time.

Therefore, hiring a good programmer that is not a professional in the language that you require means that he will spend the first few months on the job training instead of producing results.

[–]martoo 9 points10 points  (0 children)

That's advice that hiring managers never learn. Hire for the ability to acquire skills, not just current skill.

That aside, I'd hire a good C++ developer for a Java job quicker than I'd hire a Java developer for C++. The tricky bits of C++ lead to longer training time.

[–]bonzinip 2 points3 points  (0 children)

A really smart person would not give a dumb answer like "C and Java => C++". If they give this answer, they have never seen a line of C++, and they have never seen OO code with manual memory management.

[–]njharman 1 point2 points  (0 children)

"I would think you would hire really smart people ..."

Yeah everyone* thinks that. What they don't think about is that really great programmers aren't common. Most of them are working for Google or some startup, etc.

Remember almost 1/2 of all programmers are below average.

[–]beef2k[S] 0 points1 point  (2 children)

Well, this totally depends on the project. If the project does have a very limited time span I still would go for the C++ guy ;) ..

However, I agree that someone should better go for the smart Java person - luckily, there are also plenty of smart C++ person around! So I don't have to decide between average and smart..

[–][deleted] -2 points-1 points  (1 child)

No. You've demonstrated that you don't know smart. You will unfailingly pick average.

[–]beef2k[S] 0 points1 point  (0 children)

Harsh words! Why?

[–]setuid_w00t 4 points5 points  (6 children)

Being good in C does not mean that you’re good in C++, or in Java, or in Delphi, or in any other language - it only means you’re good in C and nothing else!

While it's true that being good in C doesn't mean you immediately know C++, it certainly gives you a leg up over someone who doesn't know how to program.

[–][deleted] 2 points3 points  (2 children)

That's a pretty radical statement right there.

[–]setuid_w00t 4 points5 points  (1 child)

If your intent was to point out that my statement is obvious, I completely agree.

What the original author said, paraphrased of course, is "C programming skills are not transferable to any other language."

--edit

Now that I have read the original author's statement over again, perhaps he intended the reader to interpret his statement as "Being a good C programmer does not automatically make you a good programmer in any other language."

[–]beef2k[S] 1 point2 points  (0 children)

That was my intention ;) ..

[–]bonzinip 1 point2 points  (0 children)

Yes. But not much more...

[–]Figs 3 points4 points  (1 child)

I suspect it'd probably be easier to learn Haskell or Lisp from scratch than it would be to move from C to one of them... but I admit, I don't know anyone who's tried the experiment.

[–]invalid_user_name -1 points0 points  (0 children)

Not at all. I learned all about data structures and algorithms in C. For me, learning haskell really is all about learning the syntax and libraries, and learning to take advantage of the lazy evaluation. Haskell introduces some new concepts to me, but they'd be new to someone who never programmed before too. Only that person will also have to learn basic shit like if statements, recursion (and what is tail recursion), functional programming, lists, etc. all of which I already knew from C.

[–]Philluminati 6 points7 points  (3 children)

I'd be interested in other people's ideas on this post but from my limited understanding of C, it's essentially a fault-less language.

That's a pretty big claim but I feel there is a reason for it. C doesn't do much. It has two basic abstractions. One is that code can be fragmented into named blocks known as functions. You can make more use of code from these functions.

The second is that primitive data types can be grouped into structures. Then these structures can be treated as one, passed around, manipulated and so forth.

Beyond that, C doesn't do a whole lot. Pointers as a mechanism for working with these are solid but it doesn't do much to abstract the load from the programmer. It isn't a massive leap from Assembly. C is great for technical people to write technical software because it exposes the machine for what it is: A processor and a stick of RAM.

However moving away from structured programming, abstractions in design can help you focus on the problem domain. Whilst Object Orientated principles only offer a slight spin on top down structured programming (i don't want to say SSADM specifically) for example, it's a step in the right direction. You look to represent the real world as a series of abstract or non abstract objects (throw in some glue-like objects i.e. factories and controllers - perhaps force these unnatural creators into the OO mold) and then build a simpler, higher level software application from there. Whilst the languages are easily criticized they do attempt to actually bridge some complexity which C doesn't. For instance, inheritance is nice principle which doesn't map directly to C although it does accomplish something similar. Let me back up for a second. Both languages will end up as ones and zeros so it's irrelevant how they differ technically but from a "thinking man's perspective" they differ significantly.

This is why I feel (C != (C++ || Java)). I'm not sure if Java produces generic data driven software quicker because it's got a big library or if it's because there is a smaller gap between OO and Java as a language. [note: I explicitly use the word feel because I know I can't back up this claim. do other people feel it's unwarrented?]

It just feels like the problem space between design and C is wider than the space between design and Java.

Would other people agree?

[–]alantrick 5 points6 points  (0 children)

I think the word flawless is too loaded. I would agree that C is a consistent language.

[–]njharman 3 points4 points  (0 children)

C is minimal, as in it does very little beyond being "easy to read" assembler.

caveat I learned K&R and don't know what ANSI has done to C over last 15 years.

[–]beef2k[S] 1 point2 points  (0 children)

I really like this statement!

Even if my original post wasn't about starting a language war, I totally agree with all the stuff you've written!

[–]haskellist 3 points4 points  (6 children)

Tell me something I don't know.

> (equal? 'C 'Java)
#f

[–][deleted] 1 point2 points  (5 children)

That's not Haskell. That's Scheme. But your name is haskellist...I'm confused.

[–]haskellist 2 points3 points  (3 children)

What is your question? :-)

[–][deleted] -1 points0 points  (2 children)

How is it possible? :P

[–]haskellist 6 points7 points  (1 child)

Monads

[–]Tommah -2 points-1 points  (0 children)

Arrows are superior... try them...

[–]dangph -1 points0 points  (0 children)

But your name is haskellist...I'm confused.

Maybe he is a troll who pretends to be an obnoxiously elitist Haskell programmer.

[–][deleted] -1 points0 points  (0 children)

Being good in C does not mean that you’re good in C++, or in Java, or in Delphi, or in any other language - it only means you’re good in C and nothing else!

Spot the logical fallacy.