I don't; it's obviously written by Yet Another Bitter Python Hacker, and isn't even really that funny.
I think that the best First Programming Language to learn would still be C, followed by some flavor of Lisp. C, because it's both practical and teaches you how your computer works at a low level, and Lisp, because it shows you how powerful computers can be when you strip them down to the mathematical bone.
Everything else is just some balance between the two.
Define 'proper' type system; C is a static, strongly typed language, with the important feature that the type system is simple enough for an inexperienced programmer to understand and be capable of implementing.
C's type system is restrictive enough to get annoying occasionally, but doesn't protect you from loads of things it could, since it is not strongly typed.
I'm guessing you're referring to languages like Haskell here. I think the work people are doing on types in those languages is fascinating but it also seems like work in progress and I wouldn't recommend those languages to a beginner. The key concepts in the lisp-like languages (closures, higher-order functions, garbage collection etc) are easier to understand in a dynamic language IMO.
>The key concepts in the lisp-like languages (closures, higher-order functions, garbage collection etc) are easier to understand in a dynamic language IMO.
How so? F# and Scala, and Haskell aren't dynamically typed languages...
I 'learned' C first, never did anything useful. C is not beginner friendly simply because it provides no instant gratification. Python is instant gratification for newbies. You can make a GUI in five minutes. In C you have to READ A BOOK first. Console apps don't thrill young people. GUIs do.
Actually, this is the best push for Python i've ever seen. Its not a great production grade language, but I agree, getting people interested in programming is more important than getting them to grok the hard parts of programming (C/C++)
Some languages get evaluated on their inherent qualities and some by the places you might encounter them. Not very insightful even for a flippant answer :-)
These posts make me sad. If you are in a position to choose the language you're working in, choose the one that makes you and your team happy (in a gestalt sense, of course).
I don't mean to be overly reductionist. But the languages that I'm currently happiest with are statically-typed, compiled, and run on the JVM.
When I'm in a position to choose, I opt for the one in which myself and my coworkers are most productive that meets project requirements. There's not much to say beyond that.
How is it insane to prefer Ruby or Clojure or even C++? You may happen to agree with his preference, but there's a difference between saying, "yes, I prefer those languages too!" and "everyone who prefers any other language is insane."
For someone who is completely new to programming, "statically-typed, compiled, run on the JVM" means about as much as "made-of-whale-bones, faster-than-light, and eleven-pounds-to-the-dollar". Just a thought, as long as we're still talking about telling new programmers where to start.
> To achieve a magical sense of childlike wonder that you have a hard time differentiating from megalomania: Objective C
I felt no childlike wonder while doing Objective C and this compared to Java. It's less verbose, but it's nothing that good about it. It did remind me of lisp but just barely([]).
Oh, an memory management wasn't something I was looking forward to...
less verbose, really? People are giving Java crap for having to do string1.equals(string2) instead of string1 == string2, but what about [string isEqualToString:string2]. Also concating strings in Objective-C makes my eyes bleed. I still like the dynamic aspects of the language (selectors etc.) though.
The first language learning question is a though one. (1) Probably the best would be anything which goes out of your way to concentrate on the important concepts behind it. (2) It depends on the way you want to teach it.
My advice, which isn't so much advice as a recollection of what worked for me, on my own self-taught journey to programming enlightenment:
Before learning any language, first learn some DSLs, like ActionScript or Processing; they'll give you 100x the sense of "instant gratification" (really just a good feedback loop, to avoid learned helplessness) of general-purpose languages.
Then read a book on C; but don't bother trying to "learn" it yet. You won't get it, not at first. Then learn Javascript and PHP (and SQL), and use them until you get tired of Javascript's missing standard library and PHP's disorganized one. Quit using PHP; quit using Javascript for now. Read the C book again. Also read a book on Lisp.
Learn Python or Ruby now. Now read the C book one more time. This time you should understand it.
Now's a good time for a university education, if you'd like, or algorithms/data structures/discrete math books, if not. Become really good at creating normalized data structures and efficient indeces for them (to the point where you stop craving ORMs and NoSQL.) Learn to cache data.
Learn the sundry unix shell scripting languages (basically trying to live anything resembling a normal life on a non-GUI Linux set-up will force this on you, so that's a good proximal reccomendation.) Try to code some sort of compiler. Realize that, despite knowing however many of the algorithms involved, there still seems to be something magical about them. Learn an assembly language, and how the dynamic linker/loader, executable object format, and virtual memory subsystems of your OS work. Grok that compilers just do clever string processing, and write a simple one. Learn to cache instructions, and make your compiler do a few optimizations.
Keep learning other languages until the Lisp book makes sense. Then pick a language to work in, for you are now a Journeyman.
(If you'd like to like Javascript again at this point, learn Smalltalk or Lua, or look at how MOOs work. If you'd like to ever like C++, learn Haskell first and treat C++ as a compromise between it and assembler. Don't bother liking Java or C#, but learn some language on the JVM/CLR so as to like managed code in general.)
We can bitch about how language implementations never live up to our ideals every day of the week, but people trying to get good advice on where to start get caught in the crossfire.
Heck, I started with BASIC, followed by C++. Now that I've got those out of the way, I know I can tackle all kinds of bullshit.
Python still seems most reasonable as a first language, to me. Not my favorite, these days, but local maxima, you know? (Probably followed by C, then Prolog. Lua and Erlang are practical syntheses, and should be picked up easily afterward.)
36 comments
[ 3.3 ms ] story [ 87.7 ms ] threadI think that the best First Programming Language to learn would still be C, followed by some flavor of Lisp. C, because it's both practical and teaches you how your computer works at a low level, and Lisp, because it shows you how powerful computers can be when you strip them down to the mathematical bone.
Everything else is just some balance between the two.
How so? F# and Scala, and Haskell aren't dynamically typed languages...
My two cents, take it for what it's worth.
Here's an example I just made:
#-----begin------
from Tkinter import * #part of standard library
def reverse():
root=Tk() #create a windowentrybox=Entry(root) #create an entry widget
entrybox.pack() #display it in the window
button1=Button(root, text='Press Me', command=reverse)
button1.pack()
entrybox.insert(0,'type here') #add a default value
root.mainloop()
I don't mean to be overly reductionist. But the languages that I'm currently happiest with are statically-typed, compiled, and run on the JVM.
When I'm in a position to choose, I opt for the one in which myself and my coworkers are most productive that meets project requirements. There's not much to say beyond that.
And it's not a very serious article to begin with.
But you are sane. So many here...aren't...
I felt no childlike wonder while doing Objective C and this compared to Java. It's less verbose, but it's nothing that good about it. It did remind me of lisp but just barely([]).
Oh, an memory management wasn't something I was looking forward to...
works just fine. String concatenation is no harder than a format string. Writing a category on NSArray to add join is pretty dead simple as well.
Of course in Objective-C I would use casting so, indeed, it might be more verbose overall.
The first language learning question is a though one. (1) Probably the best would be anything which goes out of your way to concentrate on the important concepts behind it. (2) It depends on the way you want to teach it.
To understand the mathematical theory of computation: Turing Machine Tape
To follow the subject from its roots: Babbage Analytic Engine Heap
To truly grasp algorithms: Psuedocode
And which of the two editors -- EMACS or vi -- should I use? Paper and pencil.
Why put it off?
Before learning any language, first learn some DSLs, like ActionScript or Processing; they'll give you 100x the sense of "instant gratification" (really just a good feedback loop, to avoid learned helplessness) of general-purpose languages.
Then read a book on C; but don't bother trying to "learn" it yet. You won't get it, not at first. Then learn Javascript and PHP (and SQL), and use them until you get tired of Javascript's missing standard library and PHP's disorganized one. Quit using PHP; quit using Javascript for now. Read the C book again. Also read a book on Lisp.
Learn Python or Ruby now. Now read the C book one more time. This time you should understand it.
Now's a good time for a university education, if you'd like, or algorithms/data structures/discrete math books, if not. Become really good at creating normalized data structures and efficient indeces for them (to the point where you stop craving ORMs and NoSQL.) Learn to cache data.
Learn the sundry unix shell scripting languages (basically trying to live anything resembling a normal life on a non-GUI Linux set-up will force this on you, so that's a good proximal reccomendation.) Try to code some sort of compiler. Realize that, despite knowing however many of the algorithms involved, there still seems to be something magical about them. Learn an assembly language, and how the dynamic linker/loader, executable object format, and virtual memory subsystems of your OS work. Grok that compilers just do clever string processing, and write a simple one. Learn to cache instructions, and make your compiler do a few optimizations.
Keep learning other languages until the Lisp book makes sense. Then pick a language to work in, for you are now a Journeyman.
(If you'd like to like Javascript again at this point, learn Smalltalk or Lua, or look at how MOOs work. If you'd like to ever like C++, learn Haskell first and treat C++ as a compromise between it and assembler. Don't bother liking Java or C#, but learn some language on the JVM/CLR so as to like managed code in general.)
Heck, I started with BASIC, followed by C++. Now that I've got those out of the way, I know I can tackle all kinds of bullshit.
Python still seems most reasonable as a first language, to me. Not my favorite, these days, but local maxima, you know? (Probably followed by C, then Prolog. Lua and Erlang are practical syntheses, and should be picked up easily afterward.)