Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I wonder if high natural language aptitude translates to high programming language aptitude, that is, not the ability to write good code but rather to write code in diverse languages.

It seems the skill set often associated with good programmers in my general impression as well as in some papers I read (good working memory, good implicit learning) is present in language aptitude as well so this sounds likely to me.



I started programming when I was 12. I'm 24 now and based upon where I went for school and where I have worked I'm pretty good at it.

I took Latin and Spanish in high school and was terrible at both of them. They were my lowest grades, and I hated them. My memorization skills are generally my weakest point.

So based on a sample size of one I think that programming stresses a different skill set. Programming anything that isn't simple stresses abstract thinking capability above all else. You alluded to this by mentioning good code vs diverse languages.

Good working memory pretty quickly stops being the largest factor as the problem size scales out. Instead organizational skills and the ability to abstract layers of complexity becomes the most important factor in programming ability.

I have noticed that I rely more on language references and code completion than some of the other good developers I know. Supposedly Spanish is derived from Latin, and I have seen many examples, but I found my experiences in one rarely translated well to the other where as my experiences in one programming language almost always translate well to other languages.


As someone who has been captivated by studying related languages and noticing similarities between them, I think the way that learning one language "helps" with learning a related language can be quite narrow. The main benefit is probably a built-in set of mnemonics for cognates (whether at the word level or the morpheme level).

For example, if you've learned the Latin verb conjugation endings -o -s -t -mus -tis -nt, you have a useful starting point for memorizing the Spanish equivalents -o -s -ø -mos -is -n (which derived from them), or the Portuguese equivalents -o -s -ø -mos -is -m, or French -ø -s -ø -ns -z -nt, and so on. Similarly, the numbers provide good mnemonics: Latin unus duo tres quattuor quinque sex ..., Spanish uno dos tres cuatro cinco seis ...

Similarly, if you know the personal pronouns in one Semitic language like Arabic or Hebrew, you've got a major boost for learning them in another because they're extremely similar:

https://en.wikipedia.org/wiki/Semitic_languages#Independent_...

But in each case you still have a lot of memorization because there will be sound changes and lexical changes that are not predictable a priori, include extreme cases like suppletion, where one verb partially replaces another.

https://en.wikipedia.org/wiki/Suppletion#Examples

In the programming context suppletion might be as if someone started implementing an API from one language and then decided to use a different API as the basis for half of the function names.

I think learning many natural languages (whether related or not) helps because it builds up your conceptual framework and repertoire for how things can work, especially in terms of syntax and morphosyntax. For example, Indo-European languages have a wide range of ways of using participles and infinitives (some of them different from the ways that English speakers are familiar with), and seeing a few of these can help with understanding how they work in other languages. Or there's relative clause structure (like "the first foreign language that I studied") and indirect discourse ("she felt that natural languages and programming languages were similar"), which are handled quite differently in different languages, and it's helpful to get a sense of some of the ways that these things can happen.

Maybe a programming language analogy would be ideas like indexing starting from zero, which is not necessarily always used in every context in every single language, but which is an important concept to know about. Or list comprehensions or anonymous functions, which are again not available in every language but which are useful to understand. Or lexical vs. dynamic variable scope. :-)

A given programming language can in theory make totally arbitrary choices about these things at the whim of its designer, but in any case it will probably do most things in a way that's conceptually related to at least some other programming languages that have come before.


Even more interesting to me is if one could create a test for prospective programmers that could be taken before one even knew how to program and would distinguish people who would be good at programming and those who wouldn't. Is this even possible? Programming is more complex than learning a new human language in that there are a lot more things that go into it than just knowing the language. But it's clear that some people are better at both programming and learning new programming things. Could one find a verifiable way to predict this ahead of time?



One US university used to (may still) have a program where they would take relatively non-technical people off the street, and if they could pass an aptitude test would consider them (interview) for a programmer training course. This test was notorious for the failure rate, but the program consistently produced coders who quickly became able to maintain the university's systems. (Trainees were taught a procedural language for a mainframe, but in the early 2000s they were gradually migrating to web and Java.)

This test, supposedly developed by IBM in the 1960s, had nothing about programming. It was all pattern recognition - look at a series of geometric figures and predict the next, and some variations on this concept.

I was skeptical of the suitability of this test, but the U. was convinced by the apparent results.


I suspect that at least two aptitudes are involved, and different programming languages/platforms place different demands on those two aptitudes.

One aptitude is essentially the math/engineering ability. The other is linguistic.


Also the working memory and a certain willingness to sit there doing purely mental work for significant periods of time (well I guess the latter is part of 'math/engineering ability'). The working memory aspect is what makes this sub-thread not a complete digression.


FizzBuzz, pseudocode variant.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: