I'm surprised no one mentioned actually learning C or C++ for the experience in compiling/linking/makefiles/etc, as well as in vigorous memory management. THAT is a skill he seems to be lacking, and it's a skill that mastering can really help in the future. (Actually, I hope I'm wrong about that one :)
You program a bit differently when you have to wait minutes for it to compile in between tests.
He said he's familiar with the syntax, but that's only one piece (and often not the biggest piece).
[Edit: ouch, apparently I posted this with the last sentence unfinished! Also, I don't think the posted answer suggesting C or C++ is really talking about the same thing as I am.]
I have to agree with you. Having started life using PHP, Python, Ruby, etc... I had no idea what memory management even was. I think learning the hard fundamental languages like C and Assembly (HLA) are super important - C is easily the most influential language of our time (I'll get slapped for this, but do know that I actually don't like C, I would rather use D, but C is so widely used and pretty much every important program has - at least - /some/ C in it).
I also agree, knowing syntax is very different from working in the language at a production level for five years. Syntax, idiom, paradigm, and culture are all hugely important - some of those things are remarkably subtle for certain languages and only get picked up after being slapped by the more experienced programmers of that language!
It seems that OP don't realize fully that there is much more to language than syntax. Java's syntax is similar to C but the languages are used for entirely different purposes. I think that it could be actually more useful to choose some project and learn language with it - like write a webapp with php, then other webapp with django, then play with some AI in haskell, then your own simple shell in C etc. (maybe not best projects, but I think it makes much more sense that only familiarising with syntax).
This is exactly what I am doing now. I'm a system administrator with a firm grounding in scripting languages like perl and ruby with some experience in java. After dabbling with C I felt like it would be the best option for understanding memory management and gaining a solid foundation in programming. I started with the recommendation here http://programmers.stackexchange.com/questions/62502/small-c... of writing your favourite data structures.
Yes yes yes. The compile part of the argument is a bit subjective (sure wish c++ compilers were faster) but learning memory management. Especially with classes in c++ which tends to bitch-slap your mind so hard the first time around that you'll never forget the implications of an improper memory strategy.
SQL should be in every programmer's bag of tricks. True, it's not Turing complete, but what it does, it does well. I classify it as one of those mind stretching languages. It forces you to think in sets, and complex queries have very much an inside out flavor. From the practical point of view, a good knowledge of SQL gives you a decided advantage over those who depend on an ORM.
I am surprised nobody recommended C. It's a very useful language and if you ever want to design anything at all that scales, knowing C will help you a lot, even if you don't use it. Definitely an mind-altering language.
Also, doing some simple circuit design might be fun. Simulators are available.
EDIT: Also forgot about to mention, but I find it odd that people still talk about learning a syntax. The OP mentions how he is familiar with the whitespace and C-like syntaxes as if that is the main point of the language.
Could you elaborate on connection between C and designing things that scale? I don't get it and I think I may be missing something.
I support C too. While I don't use it everyday (actually I avoid using it) I think it is important to do some low level and system programming - and C is here important. Every programmer should code e.g. a simple binary tree from scratch (with manual memory management) just to see what it is like.
Also as a matter of fact someone recommended C but it's buried down with 0 votes.
There are a few things you can take away from having some C experience that I think are related to building scalable systems:
* Managing your own memory. If you want to build a distributed system, being able to fit more instances of your program onto a single box is going to save you a lot of money/headaches. Removing unused objects from memory is a valid optimization in most languages.
* Avoiding dynamic memory allocations. In languages like Python all memory allocation is dynamic. However, unloading/loading the same object over and over is something I've seen a lot of.
* Understanding pointer arithmetic and pointer passing usually leads to better understanding of how other languages pass data around. This leads to avoiding doing lots of copying of data structures in memory.
* More of a systems programming thing, but understanding temporary file systems, RAM disks, OS file caching and when to implement your own caching system.
* Better understanding of low-level concurrency implementations and its limitations. Most scripting languages have little support for concurrency (PHP has none, Perl and Python are pretty limited).
* Understanding of the stack and how expensive it is to make even a trivial call vs inlining code.
* Better understanding of network protocols, when to use TCP/IP vs UNIX sockets, how to arrange for connection pooling, etc.
* A general mindset of minimalism when it comes to allocating resources.
>* Avoiding dynamic memory allocations. In languages like Python all memory allocation is dynamic. However, unloading/loading the same object over and over is something I've seen a lot of.
I don't think that C really teaches you to avoid dynamic allocation. In a lot of situations, it's unavoidable, especially if the program needs more memory allocated than the stack will allow.
What C teaches, as you said in the first point, is memory management. You don't use mallocs without knowing exactly when the memory is free'd, don't allocate new memory unless you actually need to, etc. C forces you to make decisions about how you're using the memory, whether you can stack allocate it, if it needs to be heap allocated, and when it needs to be destroyed.
Many excellent answers given, but this comment, I think says it all:
"You seem to be a successful programmer, the rest is incremental. Not trying to be a dick, but ... how is your life finance-wise, relationships-wise, health-wise, fun-wise, hobby-wise? Perhaps now is the time to pursue some of those things."
I don't really think it's a good answer. To me that comment is the difference between Quora, which aims to be an opinion-based Q&A, and StackOverflow/StackExchange which aim for facts. I know his question was opinion based, but is there a need for that comment. He could very well be a happy and healthy family man who learns new languages as a hobby. And, anyway, who cares? Just answer the question with your thoughts if you have them.
I think it's an exceptionally rude comment. There's no way that the fellow is going to find it helpful in any way, and it's seriously demeaning to offer the unasked-for "advice" that their hobby is probably not worth pursuing further, and maybe they should just go do something else instead. If you have to preface your words with "Not trying to be a dick, but..." perhaps you should just leave them in your mouth.
I found the asker's response to be amazingly gracious. I would have been rather rude in return.
Its a pointless comment that is not even specific to the question. You could throw that comment into just about any thread and it will work:
"Just got my hunter to 85, what class should I roll as an alt?"
You seem to be a successful Hunter, the rest is incremental. Not trying to be a dick, but ... how is your life finance-wise, relationships-wise, health-wise, fun-wise, hobby-wise? Perhaps now is the time to pursue some of those things.
"just got a raise as a video technician, should i get my car fixed?"...
I agree it's a nice comment, i.e. it's not pointless in that context. The context is the case of a person who knows N related things focused in one areas and asking how/if he should pick up a few more for hobby. Think of the question: "I speak 4 languages fluently, what is the next language I should learn". A similar comment is then applicable.
Exactly. I'm far from a cave-dwelling nerd (sometimes I wish I was more of one) and am very interested in different languages and how they can help me view problems in new ways.
I was thinking the other day that studying programming has eaten up into much of my free time, I do it because I love it but I've thought about whether or not there's an issue with working on all day on something and then doing it for fun. Now I have all the above bases covered: Amazing family that I always give priority to over coding for fun, happy with the things I'm working on, reasonable financial health etc..
But I realized that one thing I would like is to one day experience mastery of a skill set. Success is not mastery, and there's no quick path there. I realized that maybe I'll spend less hours playing games, reading novels or just chilling, but I would like to one day have the life experience of having truly mastered a skill, and I think I would gladly give up a few side hobbies, video games, and great novels for that.
What does it say exactly? The only thing that I can think of is that it illustrates the point that there are some who seem to think they have a window into some else's life based on some trifle found on the Internet.
I too was disappointed by that book. While conveying anything substantial about a language in that little space is quite difficult, I was underwhelmed by his overviews of Prolog, Haskell, and Erlang (each of which I have some experience in), and suspect the other treatments are equally lacking. It also annoyed me how he characterized the language in the first few pages ("Scala is Frankenstein's monster!" or something like that) and then pushed the metaphor for the rest of the section.
It really helps to cover several styles of language with interpreters in one common language, to avoid getting hung up on syntax and other surface details. Anyone whose entire impression of Lisp / Python / Erlang / K consists of bitching about parenthesis / significant whitespace / "ugly syntax" / "unreadable noise" has cheated themselves.
I own and have read this book, but I don't know how strongly I can recommend it to others.
Before reading the book, I was already pretty well versed in Haskell, having developed a bunch of moderately-sized and somewhat useful projects in it. So when I got to the Haskell chapter and realized that he leaves out one of the most important aspects of the language (monads get mentioned in passing and no more), it made me worry that he'd done the same in his treatment of the other languages in the book, and as a result I wasn't sure I was actually getting much useful knowledge about the languages from the book.
I admit that the task of teaching someone the "flavor" of a language in one chapter is a difficult (and possibly intractable) one. The danger is that if your summary ends up biasing someone against the language because of what you emphasized or what you left out, they might make an uninformed judgement about that language and as a result never pursue it further (or pursue it further only to realize that they probably shouldn't have bothered, though I think this is not as bad an outcome).
So, in the end, any opinion about a language I form as a result of reading the book isn't trustworthy. So... wouldn't I be better off spending my time learning languages from a more authoritative source?
Perhaps I'm worrying too much. After all, I might never have learned _anything_ about io if not for Seven Languages, and while a little knowledge is dangerous if used incorrectly, it seems like there's benefit in learning as long as I remain mindful of my ignorance.
Good point, since I think that some concepts from linguistics can be carried over to computer languages and vice versa. The central dogma of Chomskyism ( which is ~ linguistics, at least in the US) was (roughly) that all languages are equivalent, hence linguistic relativism was BS. This approach has been shattered recently by quite a few people, I think one of the most well known is Lera Boroditsky (http://en.wikipedia.org/wiki/Lera_Boroditsky). Luckily, CS people (and the like) never had their minds warped by this paradigm so have always been free to discuss "which language to expand the (programming) mind".
My rant done, let me produce my list:
* Ancient Greek (or Latin) - inflectional: Just sheer coolness of it and the literature you can read in the original is enough. But these languages are the grand daddies of Indo-European (unless you wanna go Hittite or Lithuanian) grammar and will teach you valuable linguistic and conceptual points (i.e. cases, noun declension). Learning this is like learning ALGOL, kind of useless but you'll see where a lot of concepts have originated from.
* Mandarin (i.e. Chinese) - isolating: Two points: Seeing the syntaxlessness of these languages is mind boggling and expanding experience. Many poet/translators have remarked about the "timelessness" of Chinese poetry, because verbs don't have tense markings. And, of course, the writing system is very interesting, too. Like learning Lisp (Scheme), an interesting, expanding experience.
* Turkish - agglutinative: (Disclaimer, I'm a native speaker) A great into to the agglutinative aspect of languages (unless you want to learn an American-Indian language) and an interesting phonetic system, so regular, is used as an example a lot in phonology courses.
I'll add for Chinese that tonality in pronunciation is rather mind-opening in practice. It doesn't have an obvious symbolic attachment, but it does lead to moments of awe as you realize you're tracking and paying attention to someone's word-by-word tonality in other languages.
I'll also add Chinese's rather powerful "de" statement. It can be possessively and descriptively, but you'll often see whole sentences jammed up before a "de" in order to describe a single noun (or wildly recursive uses of "de"). About half the time I'm at a loss to translate sometime I find that I'm just not using "de" enough.
> I'll also add Chinese's rather powerful "de" statement. It can be possessively and descriptively, but you'll often see whole sentences jammed up before a "de" in order to describe a single noun (or wildly recursive uses of "de")
You can achieve the same effect in spoken English by speaking the jammed up portion quicker, and it's sometimes written with hyphens: "a (whole-sentence-jammed-up-before-a-de)-before-it noun."
Nice list and interesting point. I haven't heard of Boroditsky before.
To your list I would add Finnish or Hungarian for some hard-core agglutinative features. I don't speak Turkish, so I cannot tell to what extent it behaves similarly in this regard. See for example this list with 2253 forms of the word "shop" in Finnish: :)
http://www.ling.helsinki.fi/~fkarlsso/genkau2.html
Then to cover some indoeuropean vocabulary, I would add one slavic, one germanic and one neolatin language for good measure, although this is a bit too eu-centric.
Finnish and Hungarian belong to the Ural family, with a lot of similarities to Turkish and some other languages, so much so that people have put forward a super family, Ural-Altaic (http://en.wikipedia.org/wiki/Ural-Altaic_languages) to combine them. This is controversial, though. I bet someone speaking Finnish can pick up Turkish pretty quickly. Google "finnish turkish similarity" and you get many interesting (and some funny) results.
The existence of the phenomenon of translation proves that all natural languages have the same expressive power. You can translate a text from any language to any other language without losing its meaning, and the translation won't be 10x the size of the original. Typically there will be a close to 1-1 correspondence between the sentences and paragraphs in the original and the translation. None of which is true for programming languages, since programming languages actually do differ in significant ways.
I disagree. Meaning is lost. Maybe not for some classes of text, but for a lot of it, at least some meaning is completely lost. Also, different languages tend to reference different events, ideas, interpretations of history. Try for example translating "war on terror" into a language whose origin is a country with no problem with terrorism. Your translation may be understood on some level, but whatever compelling argument you make, it will be perceived very differently. The reader will walk away with a completely different conclusion of your thesis.
As an immediate counter example understandable even by someone who hasn't learnt another language, consider puns. They have plenty of meaning but will only be translatable to closely related languages. at best.
Actually, there are generally words that don't quite translate well. It's generally subtle connotations, so you can get the general meaning of a sentence, but not some of the undertones as easily. Since you won't get a compiler error if you miss some of the subtle differences in a translation and you'd need to be familiar with both languages in question, it's harder to pick up such differences.
For some examples of what I mean by concepts that are sometimes difficult to translate, look at most examples on this blog: www.betterthanenglish.com/
The older examples are generally better, and I don't agree with the phrase "untranslatable word", but it should provide some general idea of the kinds of ambiguities that would be lost in translation.
> Since you won't get a compiler error if you miss some of the subtle differences in a translation and you'd need to be familiar with both languages in question, it's harder to pick up such differences.
You might get a scowl, or some other non-verbal feedback, during speech.
> You can translate a text from any language to any other language without losing its meaning
You can't translate poetry. Sure, you can find the equivalent words between the language in which the poem has been written and the language you want to translate into, but the original meaning is lost. I can give you countless examples, but the easiest it would be for you to pick a poems' book written in a foreign language (I assume you already know a foreign language) and read it in original. And then read the translation in your native tongue. They aren't quite the same, are they?
You received another interesting answer. My native language is General American English, and I grew up in what was essentially a monolingual immediate family and neighborhood of English speakers, although both of my parents had had some instruction in other languages. All of my grandparents were born in the United States, but three of the four spoke languages other than English at home, and my two maternal grandparents had all of their schooling in German.
German as a second language was mandatory for all elementary pupils in fourth, fifth, and sixth grade in my childhood school district, very unusual for the United States. I had more German in junior high and senior high (in two different states) and then Russian in senior high. I entered university as a Russian major and immediately began taking Chinese, switching my major to Chinese as I grew in delight for that language. I have had formal instruction as an adult in Modern Standard Chinese (a.k.a. Mandarin), Cantonese, Biblical Hebrew, Literary Chinese, Attic Greek, Biblical Hebrew, Japanese (first in the medium of Chinese, then in English), Taiwanese, and Hakka, and various courses in linguistics (also in the mediums of both English and Chinese). I have engaged in self-study of Biblical Aramaic, Mongolian, Spanish, French, Latin, Hungarian, Malay-Indonesian, Esperanto, Interlingua, etc., etc., etc.
I have to respectfully disagree with the strong version of the linguistic relativity hypothesis. Within each language grouping, people differ far more in their personal thinking along the dimension of visual thinker or not, or auditory thinker or not, than people differ from one another in thought patterns based on language background. But it is useful to learn another language and to live in another culture for exposure to new basic assumptions, and the same applies to learning computer language paradigms. Besides the book mentioned in another reply, I like the books
Okay then, I'm asking it. Because other than relating to languages, I don't see how the question helps.
I've studied Spanish (in highschool) and Japanese (for years) and while there were some new concepts (in grammar and sentence structure, mainly) they don't apply to anything but languages. And I'm not likely to try creating a language, and I've never had trouble expressing myself in the one I have.
Yeah, I meant it just from a linguistic point of view. The original question was about "different approaches and concepts" and this clearly applies to human languages as well. Some use gender for some purpose, some don't, some express posession in one way, some in another, one language uses suffixes where the other has prepositions, etc. etc. etc. I didn't say anything about difficulty of expressing oneself in any language.
The way to say those in English is "rejoicing in the misfortune of others" and "business owner."
After edit: the saying cherished by linguists in English is "'loanword' is a calque, and 'calque' is a loanword," which I find helpful for remembering which word is which.
Its not exactly uncommon for people to own businesses and to then employ people to run the company for them. This is pretty much how most long established public companies work.
3 other people already answered with the right answer, but I think it's worth expanding on it.
Some governments actually try to restrict the usage of loan words and try to keep the language 'pure'. I think this is death for a language, and I'm glad English adopts new words so readily.
Someone recently told me that they thought that almost all the really interesting creative works were in English these days because English is so expressive, where many other languages have only 1 word for a thing. The language he used as a reference was Spanish, which he is fluent in. The word he used as an example was 'garbage'. He said in Spanish he had only ever used 1 word for it, but in English we have 'trash', 'junk', 'refuse', 'waste', etc, etc.
I don't know if that's really why, but it's an interesting thought.
The words 'trash', 'junk', 'refuse', 'waste' all carry different connotations. Be forewarned, my information is largely relative to Wisconsin. Other regions of the US may use the words differently.
If applied to a person: trash usually refers to someone that's disreputable in some grievous way, waste would refer to some that squandered some talent or resources. Junk wouldn't usually apply to a person but junkie means a drug addict. Applying refuse to a person would be silly, but probably be .
If applied to stuff that's thrown out: Trash is a generic term for anything that's thrown away. Waste is usually consider excess like banana peels. (waste and trash are largely interchangeable in conversation, the distinction isn't usually important) Junk would refer to material possessions that are no longer wanted like an old couch. No one would call banana peels junk. Refuse is a pretentious/higher class term for trash used by rich old ladies.
I don't believe refuse is in the common usage any more. I've never heard it used outside of Star Trek 6 and some older movies. It's meaning is similar to "trash" but it can also refer a place where trash is stored.
Most of english is this way. Words are extremely flexible and can be used in a variety of ways with many meanings. Context is extremely important. I'm not sure how other languages work, I only speak english.
But that's the point! Spanish has that 1 word (which I don't know) that he has used in every situation. In English, he uses all those different words, depending on what slant he wants to put on it. English is -much- more expressive. (At least in that case.)
The English words for 'schadenfreude' and 'entrepreneur' are 'schadenfreude' and 'entrepreneur' respectively. Or did you think the rest of the language came to us on stone tablets?
I should elaborate that the point I guess I was trying to make is that a lot of the time we think we have no trouble expressing ourselves "in English" we aren't strictly using "English" to do it.
The follow-up point everyone is trying to make is that your idea of 'strict English' is bogus. It's a bit like complaining that there's no English word for 'forest' because we stole it from the French, or veranda, which we stole from Hindi.
Some people think that your usual language affects how you can thnik (http://en.wikipedia.org/wiki/Sapir%E2%80%93Whorf_hypothesis; not sure if I'd agree that strongly) - so possibly you wouldn't be able to miss expressiveness you're not familiar with (simlar to pg's idea of Blub programming language).
Wish I knew more about linguistics - but I think missing tenses or grammatic logical structures are more interesting than missing vocab - like for example some languages have a tense for describing things you only know about second-hand
http://en.wikipedia.org/wiki/Inferential_mood
(missed the bit I was meant to be replying to sorry...)
I think it's more about the relative ease or difficulty of expressing a concept in that language. If a concept is missing or unnatural, it's going to be harder to deal with that concept. Common examples of languages with more expressiveness than English are the multiple Russian words for blue, or the many Eskimo words for ice.
A thought experiment that I think works better is to imagine a language where people describe facial features extensively, to where a description in that language can easily be used to reconstruct an image of a person's face. Imagine how crippled a native speaker of that language would feel trying to speak in English, or the derision they would have towards the police sketch-artist process that took trained artists/interpreters quite a bit of time to extract a description from a witness that would sound like a 4 year old trying to describe a face. That's what linguistic differences are more like.
My problem is trying to come up with ideas to use as practice. I could always do the same old thing over and over, but I'd rather find something that highlights the strength of a language.
As a multi-paradigm language, Oz is really interesting because it has all these approach into a single language, you can easily compare and see the strength of each approach. But you can even go further and see how the different approach can interact.
I would add PROMELA-SPIN a non-deterministic language for modeling and verification of systems. Plus other formal verification languages:Z or Petri nets
Also SQL! (although he probably knows it already...)
Also SQL! (although he probably
knows it already...)
That was my line of thinking in my reply. That's why I instead chose Datalog as the declarative choice. Much of what you can do in SQL can be done with Datalog (and vice-versa), but there are somethings that Datalog can do that SQL cannot.
You program a bit differently when you have to wait minutes for it to compile in between tests.
He said he's familiar with the syntax, but that's only one piece (and often not the biggest piece).
[Edit: ouch, apparently I posted this with the last sentence unfinished! Also, I don't think the posted answer suggesting C or C++ is really talking about the same thing as I am.]