The (Programming) Language Explosion
I couldn't be prouder. My little sixteen-month-old Z said "Mommy Bathing in the Water" while my wife was in the shower. He said it with American Sign Language (ASL), a language we've been teaching Z. I think it's a big deal because he independently strung these words together, one after another, and made a declaration.
The Language Explosion has begun with my little man. He's starting to speak more and more (verbally) and my wife is continuing to (try) to speak to him in her language. When he starts school he'll (hopefully) be in an Spanish immersion program, so he'll theoretically have four languages going forward. (ASL qualifies as a foreign language in college and has a different sentence structure than English.)
The "language events" of the last few weeks got me thinking about choosing Programming Languages.
(No, not for Z, hopefully he'll be much more well-rounded than I, and will NOT be a programmer.)
There are many folks who study linguistic learning in young people and the conventional wisdom says that learning between 4 and 5 languages is quite reasonable, even easy, if some basic rules are followed. Things like one language per care-giver, consistency, etc.
If a theoretical child (not mine) was to get "good language coverage" from a population perspective - trying to pick a set of languages that would enable the child to communicate with the largest number of people - they might want to learn English, Chinese, Spanish, Hindi, Russian and maybe Arabic. If a theoretical person wanted to learn a set of programming languages that would enable them to write code today with a good chance of getting a job they might want to learn Java, C, C#, PHP, Ruby, maybe Javascript and possibly Python.
However, if a theoretical child wanted to get a good set of solid languages that would enable them to more easily learn other languages, they might want to learn English and Spanish (Indo-European Family), Chinese (Sino-Tibetan Family), Arabic (Afro-Asiatic Family), Swahili (Niger-Congo Family) and maybe Japanese or Turkish (Altaic Family). These languages would give the child very broad exposure to different structures and tones.
What programming languages would a new Student of Programming want to learn in order to get good coverage and enable them, at an early age (or stage in their career) to not only learn other languages but also solve problems in non-traditional ways.
An parallel could be drawn between an older life-long English speaker having trouble learning a language because the sentence structure of the new language is so very different from English, or a tonal language like Mandarin where the English speaker's brain simply can't hear the tones.
Studies have show that children who are exposed to tonal languages at some length, like Mandarin, before their second year can lay the pathways to recognize and distinguish between "similar" tones years later. But they have to hear the tones early in life.
What programming languages should a New Programmer experience early so that they might be more able to "hear the tones later" when a new languages comes along? What language should a new programmer be exposed to first?
Should we make selections from the major Programming Language "families"?
- Imperative - statements that contain a sequence of commands
- Fortran, C, Pascal, VB, LISP
- Object-Oriented
- Smalltalk, Java, C#, Ruby, LISP
- Declarative - "It's like this, figure it out"
- XSLT, SQL (kinda)
- Logical - describe some theoretical state and the steps it implies, and work backwards to solve
- Prolog
- Functional - Keep it stateless and create functions, often recursive
- ML, Haskell, Common LISP
Should young (or new) programmers be taught many languages and philosophies, or just ones that will get them a job? Should we optimize for language coverage or language diversity?
If there are benefits in teaching young children Chinese because of the language's complexity and tonal qualities, is there a benefit in teaching new programmers Lisp for the (mostly) same reasons?
Speaking only to Basic's comparative "linguistic" value, to be clear. if Lisp is comparable to Chinese then should Basic considered on par with English Slang?
About Scott
Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.
About Newsletter
Most historical linguistics have given up on grouping Japanese in the Altaic family.
There are a number of hypotheses, but there really isn't enough evidence to solidly support any of them.
Until there is more progress, the best that can done is to classify it as a language isolate for the time being.
The younger your son is accustomed to foreign languages the better. Especially important in the first 1-2 years is being able to distinguish between phones (linguistic sounds). After a critical age, children will subconsciously begin to filter out phones that are not needed for their language environment. This makes it really difficult to re-learn how to distinguish them later in life.
The same is generally true for language acquisition, but there is a little more time. He'll master his mother language (English?) around 4 or 5. He may not be able to write a term paper, but his grammar and vocabulary will be about on par with an adult. Subjecting him to a foreign language during this period is ideal for bilingualism. The next best window is through age 10-12. It's difficult to acquire native fluency, but very high levels of fluency are possible.
Everything becomes much harder the older you are.
I think it's a great idea to subject your son to Mandarin. Distinguishing the tones later in life is fairly difficult. While the sounds are a little difficult, the grammar is not so hard. Writing is difficult, but that is an artificial concept to language.
You may want to consider Korean as well for its aspiration (not phonemic in English). It has a beautifully designed writing system as well.
I like Japanese, but the sounds and grammar are very simple. Also, writing is quite complex.
I think it's great that you're starting out early.
Expose him to as many languages early on.
He'll surely gain a lot from it.
Best of luck.
COBOL, obviously ;-)
if he is really a kid, i don't think any mature programming language will be "fun" for him.
so i would start with things, that are done for children.
like squeak or Lisa. they are really great, to teach programming principles.
(or for teachning programming to people like my girlfriend, she loves them)
There is one thing I have already thought that I must be very careful to do, and that is to not rely solely on signing - signing must accompany voice commands/statements so as to ensure both communication methods develop
I think I am right in saying that it has been widely considered that knowing 2 (or is it 3?) languages makes it considerably easier to learn additional ones. I would imagine this being true for both linguistic and programmatic syntaxes. If this is the case, then you and I Scott will have very socially confident and articulate monsters on our hands all things going to plan
Take care and all the best,
David Christiansen (Glasgow,UK)
Looking at the computer language classifications, I'd be tempted to separate Smalltlak and possibly Ruby, in that they're (simplifying madly) message-senders rather than method-callers. I learned Ruby as a planned stepping-stone to Smalltalk about four years back and haven't continued on that particular journey yet.
I was going to mention COBOL too, but let's let it RIP.
Way back when I was in school, I took an intro programming class that started out in Scheme to teach high level concepts (they way that we implemented classes was fairly elegant, I thought), and then switched to FORTRAN to give the students a better idea of what was really going on in the computer.
and will NOT be a programmer
I wouldn't have tripped over "will NOT be pressured to be a programmer" ... but this sounds like you find it downright undesirable for him to be one. Why? What's wrong with us? :-)
k.
Learn an OO language so that you can understand the paradigm. It might be easier for you to start with a statically typed OO language like C#/Java first, before progressing to a dynamically typed OO language like Ruby/Python. This will feel like you're being liberated rather than stuffed into a straitjacket :) Also the interactive nature of Ruby/Python greatly speeds learning.
Learn a functional language at some point in your life - I think that your mind needs to be prepared for this, but hey that's because I started kind of in this sequence due to my age :)
BTW - for Henri - MIT is switching from Scheme to Python as their intro CS language. I really hope C++ is not what distinguishes an elite from non-elite school!
With that in mind, I think a programming language should be learned only to illustrate the concepts behind the tasks that is accomplishing. You don't teach someone SQL if they don't expect them to write any database operation code. Similarly I find it wasteful to bother teaching someone C# AND Java. They both accomplish very similar tasks and whether one is used over an another is typically just a company/organizational preference. However, combining either of these with effective XML and SQL will prepare a programmer for life in the real world.
A spoken language should be learned for different reasons, like inciting an appreciation of other cultures, helping a child's development, and exposing a person to a wider audience of friends, family, and colleagues.
Are you Kyle B. (aka Klyde)? If so, send me an e-mail sometime -- it would be great hearing from you again.
It's an interesting discussion. Perhaps there is a thesis topic here for a combined CS and Linguistics graduate degree. And like most theses, it would lie undiscovered in the university library while it's writer works slopping up code in whatever language his employer has chosen, wondering what it was all for. :)
As for teaching programming at a simpler level. I'd shy away from using C# and Java initially because quite frankly they have too much structural overhead. Just try to right a Java program that takes standard input and returns standard output. You're quickly dealing with odd-ball libraries and streams and such and the real programming problem gets lost in a sea of confusing calls and objects. I'd be tempted to teach using Python because of the simplicity. You have the lists and plenty of Lisp influence (without as many parens), you lose curly brackets and a bunch of the syntactic fluff or formality you have to put up with when writing C++ or C# or Java. You can attack the programatic problem without having to teach about why you needed to import some special library to utilize some special form of hashed list structure. You get the basic tools in Python you need for addressing the problem. And as the student wants to do more (GUI, graphics, networking interfaces,...) there is an infinite amount of additional code available to help them grow with it.
You can teach about the differences of private versus protected versus public versus internal and the formalities of C# or something else later. Let them get the basic idea of an object and methods and properties first without having to be overwhelmed by the other stuff.
I think that there's a fundamental difference in the usage of a programming language versus a spoken/written language. A programming language is a tool to accomplish a task. While a spoken language is a medium for communication.
Can't it be argued that both programming languages and "regular" languages are just ways to express one's intent?
So I would definitely that for a potential child to get into programming it would be better to teach them the fundamentals of programming vs. just having them learn a language(s). Being able to learn and work with the ever changing playing field of programming is more important in my opinion then just being focused on a few in the large spectrum.
Forth, APL, RPG (showing my age!)
I was fortunate to learn it at university, and it took a while to get my head around it, but its a language I keep coming back to. For the Java and C# users, the Dolphin version is very approachable, with its tabbed browsers and code completion.
The thing that always gets me is how simple the basic language is - and I just marvel at how those guys invented all of those great well thought out libraries so long ago? WOW.
Can't it be argued that both programming languages and "regular" languages are just ways to express one's intent?
Sure - I think the differences stem from the audience: computers are braindead, whereas people are pretty smart. Humans, for instance, have a deep understanding of context, which allows us to interpret the same natural language statement in many different ways. There are no interpreted programming languages in the proper sense of the word, since there's no room for ambiguity. Everything is just mechanical translation, whether at compile time or runtime. Luckily, according to Wittgenstein, everything that can be said can be said clearly. Which hopefully implies that we can tell them anything we want to nevertheless. :-)
Of course, the difference in audience goes quite a bit further than that. We want and expect radically different things from computers and humans. Computers should behave predictably and reliably, and we want to be in absolute, Louis XIV-style command of them. We certainly don't want them to surprise us (the way a bluescreen or an Adobe Reader language pack update might). Also, we seldom chat with our computers - you know, sitting at the shell, typing offhand, funny commands that the computer responds to in witty ways. Humans are a different story; there's a whole emotional dimension to human communication that natural languages (and our understanding of them) must accommodate, that's just missing in programming. You might be furious at or madly in love with your computer, but there's really no way to tell it. You might try to punish your computer by removing some of its RAM, but that just comes back to haunt you, you know?
Staying away from the nuts and bolts, I see the key benefit to my background at University (C, Prolog, ML, Lisp and SQL) is the ability to switch thinking styles where that style is more appropriate to the task at hand and then apply it to the toolset/languages that I'm using.
I would also like to point out that both VB and C# are used declaratively in ASP. Outside of ASP, C# 3 and VB 9 have extensive declarative and functional elements.
Coming on to programming languages, I trace my route like this (roughly) : Logo->Basic(GW mostly)->C++->C->x86 Assembly->Java->Python->JavaScript. I am looking forward to learning Common Lisp, Scheme and OCaml in the near future.
Honestly, when I was in high school, I used to naively wonder what the need was for so many languages and used to wonder how I could learn anything at all if the state-of-the-art was in so much flux! Thankfully I found out that the more I learnt, the easier it was to learn some more and adapt to different paradigms! And it is my opinion that languages should be learnt (apart from whichever are required from a career standpoint) so as to enable one a firm grasp and appreciation of different levels of "abstraction". By which I mean that we could have Assembly Programming, C programming, Java programming and then Common Lisp/Python programming and also a bit of Prolog perhaps, as the core languages to be learnt in order of increasing abstraction. I find that people who haven't done much (or any) programming in Assembly or C usually end up wasting a lot of resources because they are so used to the abstraction of the very high level languages they work in. Ignorance of some low and middle level programming could also well contribute to the "dumbing down" of programmers. In the end, with the shift in programming paradigms, it would be ultimately incumbent on the programmer himself to make his choices and make them well. This model works for me... perhaps a different model would be more suited to another. However, in closing I would say that I agree completely with Peter Norvig's excellent advice to learn "at least" half a dozen languages. Experience counts like nothing else does. Genius comes pretty close. Combine both with a smart strategy and there can only be success!
Comments are closed.
I would prefer to teach people - especially children - visually. Giving them the basic skills needed to present something on the computer and make it do stuff, then gradually making them understand why it works. In ways like the thoughts behind the graphical Logo language. Learning while playing.