In my short experience here at programmers.stachexchange, when someone needs help to get started at programming quite a lot of users suggest learning this or that language, but few suggest learning the basis of programming (data structures, flow structures, algorithms, paradigms, etc.) So I'm coming to the conclusion that the programming community in general puts more value on language that on core programming skills, and here is where my question comes:

Is knowing a multiple programming languages and understanding every single implementation detail more important that knowing how to abstract, transform and create some code that solves a certain problem?

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

3

Hi guiman, Programmers.SE is a question-and-answer site, not a discussion board: real questions have real answers. Can you rephrase to ask a question instead of trying to start a discussion?
–
user8Jan 18 '11 at 8:43

How Programming skills is different from language guru? You mean knowing OOP is a programming skill and knowing Java is language guru?
–
Tech JerkJan 18 '11 at 9:42

Good edit, guiman! That said, I feel you've created a false dichotomy: learning multiple languages and studying library implementations are common paths to understanding the more fundamental aspects of programming... At the same time, studying data-structures won't necessarily grant you the wisdom to know when each is appropriate! Can you describe why you feel such study might stand in the way of obtaining problem-solving skills?
–
Shog9♦Jan 18 '11 at 18:32

@ Mr._CRT I think that maybe there is no dichotomy, insted what i tried to do with this is clarify why some people tend to learn how to land before learning how to fly, if you know what i mean. In my opinion, is not one or the other, they should go in parallel and non of them obstruct the other, but i've faced situations where a professor insisted on using Java and Objects to resolver algorithms before even telling us how the algorithm works and why to use an object, so it felt like being backwards.
–
guimanJan 18 '11 at 18:52

11 Answers
11

You see, people usually experience feelings, and sometimes those feelings are a barrier to do the most important thing: team work.

There are those who have excellent problem solving skills, and those who manage to remember all the tiny little deatails of every language. And over the years I've met people having one and lacking the other, and vice versa.

I once worked with someone having superior problem solving skills. He'd participate in programming contests acheiving excellent results. He was a star programmer.

But then, working with him on a team as a partner on daily basis was more than just complicated. His "team work" skills were something like "the rest of the team cheering him to do all the work".

Then I moved jobs and met the Architect. He knew all the Desing Patterns by memory, creating tons of layers of abstraction just because "It makes sense to keep things separarted", leading to an over engineered solution twice the size of a more simpler one.

And again, instead of communicating his "solution" to the rest, he'd open Eclipse and write all the code by himself, just because it was "easier".

Finally I met Q. He wasn't as smart as the first one, nor he knew all the desing patters like the Architect. But he'd code like a machine, creating elegant and simple solutions.

His most notorius skill was explaining things, a skill the other two completely lacked.

Nice one! In general those are the most valuable participants, because they can communicate their knowledge to others, creating a better workflow and rising the groups abilities.
–
guimanJan 18 '11 at 17:29

But programming is not an individual activity it requires a team of developers. It is always useful to have a least one 'language lawyer' and one 'Solving Genius' and an 'architect' (keeps the big picture in mind) on the team. But in reality you need a modicum of all these skills to be a good programmer.

Nothing beats getting stuff done. So I vote for problem solving skills, too. Knowing every detail of a language is less important, though I wouldn't call someone skilled who doesn't know how to write idiomatic code in the choosen language.

@ammoQ I've met immensely clever people who just didn't care. They would solve problems all day but would lose interest as soon as they had to translate the solution into code. Most of the worst working code I've ever seen came from them.
–
biziclopJan 18 '11 at 16:49

1

@biziclop: They're not actually solving any problems then, are they? The solution to a software problem is working code, a bunch of ideas (as good as they may be) don't solve anything, they're just ideas. The devil is, as usual, in the details and you need working code to cover the details.
–
mu is too shortJan 18 '11 at 17:44

Not really. Some of the best problems solved have shit code written to solve them which is unmaintainable not reusable and can become maintenance nightmare for a Business Application. Look at the solutions at Topcoder most of them are so poorly written that they are very difficult to understand.
–
GeekJan 18 '11 at 8:54

@Geek: You're right, deploying the best programming practices is surely important to implement the best ideas. But I'd still rank problem solving skills at the top.
–
Programming EnthusiastJan 18 '11 at 8:58

Say instead of a software developer, you are some sort of construction foreman. Imagine you are tasked with some problem to solve. You could be a fantastic problem solver, and instantly see the solution in front of you, however, if you only speak English and your laborers only speak Zulu, you are not going to be very effective. Conversely, if you are fluent in both English and Zulu, but are clueless as to actually solve the problem you are tasked with solving, you again will not be effective.

So as a software developer, instead of organizing a team of Zulu laborers, you are organizing computers. You need a strong command of both problem solving skills, as well as being able to communicate the problem, both in your spoken language to colleagues or your programming languages to communicate to the computer.

Many big companies want the hole package (who doesnt) but i think that if you know your stuff, learning a language is as is as sitting 2 months with some book and a text editor.
–
guimanJan 18 '11 at 16:57

Agreed! But, for fresh graduate, hoe can we get to know all the nook & corner of a language? For example, we need to know core Java, JEE(most of the JEE techs), HTML, CSS, JS, etc. It's impossible.
–
Abimaran KugathasanJan 18 '11 at 22:48

The one trait often overlooked but important in my opinion is common sense. Okay, common-sense and self-reflection, that's two important traits.

Common sense is to decide what is worth and not worth doing. More often than not, a developer isn't seeking the ultimate truth, the Perfect Solution, often there isn't such a perfect solution at all anyway. So we're making trade-offs every day. But the costs of bad trade-offs can be enormous, so I rate anyone who can reliably make those devisions very highly.

Self-reflection is part of the same process really, every time you're about to start working on something, you ask "Why am I doing this?" and only proceed if you've got a good answer. (Mind you, even "Because marketing said so." can be a good answer, at least you know not to set your expectations high.) A lot of unnecessary work can be avoided by constantly being aware of the purpose of the piece you're working on.

Granted, these are all somewhat vague meta-abilities compared to problem solving or language skills, but they are vital in stopping you from being carried away by them.

Update: I've just thought about a somewhat less subjective answer to this question: we can take say the 100 most popular answers from StackOverflow and categorize them into one of the three types. It's not a perfect method but probably the closest you can get to a definitive answer.

It's all about the programming skills and it's nothing about languages, so that's why you make a conscious decision before you suggest someone a programming language, because you want to give them a good paradigm combo where all the great concepts shine through in their true form.

Take Java for example. It's a great language. It's sucks as a first language tho. You'll send someone on a venture where they'll be banged with OOP, OOD, encapsulation, atomicity, bla bla, and all of a sudden the shift turns to primitives, they stop talking about objects and now it's variables, values and types. Does that not defy or, at least, shy away from everything you've read till that point?

That's why I immediately suggest they pick up two languages up from the start. Go through the first and, once you get your bearings there, in good time pick up the second. The paradigm clash will reveal which bits were concepts, which were language smell. That's how you make programmers and that's exactly why we are suggesting languages.

I would say those two and more such as understanding how to design an library or at the very least a proper class. Some basic understanding of algorithm (do you know the difference between an array and a List? would you ever use listVar.ElementAt(offset) when listVar has a few hundred thousand elements?).

Also i would say a guru would know a diverse amount of technologies. If someone has never used IPC, or doesnt know how to write a class and dump/load from and to a binary file i wouldnt call them a guru. (they can cheat and use serializable in .NET as long as they actually know how to implement it on a class they wrote).

I wouldnt call someone a guru if they know how to problem solve up the wazoo and know all the syntax to their language of choice if they think they need a zip lib to decompress some files. (hint: popen or Process.Start)