Scott Hanselman

The (Programming) Language Explosion

April 20, 2007 Comment on this post [33] Posted in Musings | Programming
Sponsored By

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.

facebook bluesky subscribe
About   Newsletter
Hosting By
Hosted on Linux using .NET in an Azure App Service
April 20, 2007 11:12
Based on what I was taught in my computer science classes, I think that exposing a new programmer to languages from different families is a good way to go. You should probably start with some functional programming language if the programmer-to-be has a mathematical background, as that will seem natual, otherwise go with a imperative language first. Declarative languages should maybe come when it naturally occurs in the learning curve - when you need it. I see them typically used for supportive functions more than for actual "executables".

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.
April 20, 2007 12:03
Historical Japanese linguistics is my area of study, but I have a little background in language acquisition.

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.
April 20, 2007 12:22
"What language should a new programmer be exposed to first?"

COBOL, obviously ;-)
Ian
April 20, 2007 12:50
hmm.. the question is, with what you wanna start.
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)
April 20, 2007 12:53
Just to be clear, I'm not looking to teach my infant a Programming Language. ;) I'm drawing a parallel between the language explosion that my son is currently experiencing (how early language learning works) and programming languages that new programmers and students are introduced to.
April 20, 2007 15:12
Hey Scott, Hope your well. I read your posting with sincere interest as my boy Ryan (2months now!) has already been signed up for baby signing classes. You and I have swapped emails about this before and it is fair to say that my wife and I are eager to give it a try. My sister is actually a speech therapist for the NHS (UK National Health Service) and whilst it is not a recognised practice, she seems to have been able to find quite compelling research on it’s success – but, who needs research when you have Z signing complex statements as yours just has!

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)
April 20, 2007 15:25
I wonder how a child's brain develops with exposure to multiple languages? I believe we're starting to see that learning affects brain structure, as in the changes in London cabbies' brains as they learn the streetmap (and they really, really do learn it - it's a phenomenal undertaking). And how might that affect their future paths?

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.
April 20, 2007 15:56
I'd go with a language in the C family (C, C++, C#, Java), a functional language (Lisp, Scheme, ML), SQL, and Assembly Language. The C family is popular, and a good example of a procedural language. Functional languages are included because they're so different, and can make some concepts clearer. SQL is included because it's also popular, and because its set based approach is yet another paradeigm. Finally, I have Assembler inthe list to give the student a betteridea of what's going on under the hood, which is important.
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.
April 20, 2007 16:46
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? :-)
April 20, 2007 17:16
I believe exposure to multiple languages can speed understanding of how languages operate as a whole. I think this gives you a good mindset when learning other languages. I was in the Software Engineering program at Oregon Institute of Technology (a long time ago) and they stressed this to some extent. I started in 89 and the main focus language was C. There was a programming languages series that taught language theory using ADA in the first semester, in the second we learned Fortran and COBOL, and in the third we learned Forth and Prolog.

k.
April 20, 2007 17:24
I think part of this debate should also include the schools. Most schools are not set up to teach anything after c (C++ if you're going to a top school).
April 20, 2007 18:12
I would say learn a systems programming language (C is the canonical example). If you want to build systems, say, at Microsoft, you're going to need to be able to diagnose gnarly stack traces and you'll need to understand how languages are actually executed using the underlying machine.

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!
April 20, 2007 18:20
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.

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.
April 20, 2007 19:08
Kyle,

Are you Kyle B. (aka Klyde)? If so, send me an e-mail sometime -- it would be great hearing from you again.
April 20, 2007 19:12
Ok, it didn't create an e-mail link for me above -- let's try TonyAlderman @ gmail.com
April 20, 2007 19:12
If English is the global common languague of business and all others are interesting and useful in their particular locale or circumstance, and if Java is akin to British English and C# is likened to American Standard English, then can we say that Java/C# are the current global common programming language with origins in C++ which we might corrolate to Middle English and C to Old English?

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. :)
April 20, 2007 19:27
Learning 4 languages is nice but if you don't keep using them you will forget them. Right now I am fluent in English, Dutch and Croatian. I am also conversational in German. I can also speak a little Italian and Spanish, in school I also learned French. Since I didn't use French after school at all I forgot almost all of it. I have 3 kids (one is 3 and 2 are 9 month olds) Am I going to enroll them to learn other languages? Probably not because they won't have anyone to speak it with and by the time they are in the teens they will forget it all ;-(




April 20, 2007 19:39
One tweak - I'd be inclined to split the "object oriented" axis into "dynamically typed" and "statically typed". They often lead to different ways of thinking about the solution space of a problem.
April 20, 2007 20:20
Based on many folks theories on languages and the attributes of Lisp... I'd almost want to equate Lisp with Latin. A dead language but yet it's influence on the features and structures of programming languages is found everywhere.

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.
April 20, 2007 22:05
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?
April 20, 2007 22:21
I definitely think learning principles, and understanding concepts, which help to learn more languages easier, is better then just learning a programming language. A great example of a good starting programming language, not sure if it is still around, is Logo. You can teach a child the good foundations of programming with this language and it is fun for them because they are able to see a Turtle respond and do what they ask it to. I know I learned a lot more when I was about 10 from a teacher that would teach us using Logo then I did learning Qbasic. As funny or sad as it is I still use a lot of the principles that were engrained in me when I was younger in the work that I do now.

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.
April 20, 2007 22:21
A shovel is a tool with which you can till the garden. A programming language, IMHO, is not a tool. A tool in our world is a piece of operating software used for a specific purpose like Visual Studio. A tool is not a language. A programming language is no different than any other language. It has a vocabulary, a syntax, idioms, usage, context and all the other fun ingredients necessary to describe, instruct, and inform, in other words, to communicate.
April 20, 2007 22:36
I took a class with this guy in college. Check out his book.
April 20, 2007 23:07
You missed some important 'think different' languages

Forth, APL, RPG (showing my age!)
April 21, 2007 1:49
I'm surprised no one has mentioned garbage-collected vs. non GC lanugages. In order to be able to learn more languages you need to be familiar with a non-GC language. It's easy to learn to not manage your memory, but if you've never learned memory management it is not as easy to move to languages that require it.
April 21, 2007 2:36
You hinted at it in your write-up, apart from functional languages - I think Smalltalk is an absolute must for people to try. Yes Ruby is an imitation that comes close - but just breaking free of C syntax with something that is very expressive, has such a long history, has great rich environments and is the source of so many ideas that we take for granted - its really worth the effort.

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.
April 23, 2007 3:25
COBOL is not actually such a bad idea, I went through "standard" education and then got thrown into COBOL, NCRL, DEC Basic, Fortran, Natural and then back to PASCAL...never got bogged down in a single way of looking at things, now I look at it like, it is just a language, whats the problem and let's move on.
April 24, 2007 13:43

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?
April 26, 2007 23:23
If you're writing WPF Xaml applications with C#(or even VB) code behind and Using LINQ for your data access, then wouldn't you be using Procedural, Declaritive and Functional programming all at the same time?
April 28, 2007 18:23
Yes, I think there is a great benefit to knowing different types of languages. I think one of the greatest benefits is from the translation process - moving an idea/technique from one family of languages to another. While in an ideal world, you can pick the right tool for the right job, it's not always practical due to architectural and political constraints. "We're a java shop" or "Who would mantain if you got hit by a bus"

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.
May 06, 2007 12:04
Why is VB listed as procedural while C# as object-oriented? Considering they use the same type system, it doesn't make sense to list them separately.

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.
May 07, 2007 12:11
Very interesting topic to discuss. Both from the viewpoint of natural languages and computer languages. Born and brought up in an extremely diverse country like India, I had already learnt 4 natural languages before I was in middle school! And am currently learning Spanish to augment that further! I agree with your observation that the more a child is exposed to early on in life, the more adaptive he or she will be in later life.
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!
June 05, 2007 6:46
your baby is 可爱

Comments are closed.

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.