“What makes programming languages are suitable or unsuitable as introductory languages? Which languages are better learnt first and at which order? And why what the masses think is the most suitable introductory programming language is not in fact that. This paper examines several approaches to which programming language is the best, and afterwards gives several useful relations for which languages should come first. Finally it gives a final verdict, defends it and then gives some other good food for thought.”
Perl??? I don’t mean to rag on Perl, or to start a flame war, but do you really want people to learn how to program using Perl? I’ve been programming for 25 years now, and have been using Perl for almost 10 years, and I really like it. I can do lots of things, very fast. The problem is, Perl doesn’t lend itself well to readability and/or maintainability.
Last year I introduced a young friend (we met through Amateur Radio) to programming using Python. I gave him a CD with the ActiveState Python 2.4 release for Windows and some tutorials on Python, in PDF format. Yes, I had to answer a few questions from him, and to gently point him the right direction from time to time, but he learned Python AND programming, in a very short amount of time.
I have no experience with Ruby, so I’m not going to talk about it either way, but I think Python is a much better choice to teach programming to “newbies” then Perl. Leave Perl for when you’ve been programming for a while, and already have a couple of other languages under your belt. Teaching new people to program using Perl is no better than teaching them to program using the old BASIC from the 1980’s.
Edited 2007-04-11 17:38
100% concur!
Yet again, 100% agree with your thinking/idea. Python makes a great beginning language. More on this in a second…
I love Ruby, more than I love Python (which I do love…) – but I feel Python is a better choice for teaching/learning as a first language. The reasoning is simple, Python has a “do it one way” type of design, which just about forces people to do things at least in a uniform way. Now, to me, as an experienced programmer, I prefer Ruby’s OO methodology and also the fact that it isn’t quite as constricted as Python, and I also don’t like the whitespace strictness of Python – but as a NEW programmer, or a teacher teaching a new programmer, I think Python is the best choice.
They can get down the basics/logic of programming without all the temptations/confusion of 50 different functions doing the same thing. They learn good code formatting habits, so the code is readable (they have to, you can’t mess up the whitespace in Python!) Etc, the list could go on.
So, I’d say – start with Python, then give Ruby a go. I think Ruby is more flexible (personal opinion) but a new programmer should try both, and determine what fits *their* mind best. Python is absolutely the best start, however!
Perl would be a good third language (or should I say roll of duct tape?) After that, if they are masochists, they can endeavor into Java/C++, or if they are more procedural programmers, they can hit C. This would give them a nice broad language comprehension, and they would have the tools they needed for just about any programming task that might arise. Not to mention great job opportunities!
Edited 2007-04-11 18:11 UTC
I couldn’t agree more. Python and/or Ruby are fantastic. You can grasp the _concepts_ of programming quickly and easily _and_ have highly usable code to show for it in practically no time.
Both of these languages make great foundations. And, like mentioned, it can be taken further later with Perl, C++, C, Java, etc.
“…it isn’t quite as constricted as Python…”
Thanks for that great pun. Intentional or not.
Intentional, and I spent a good 2 minutes thinking it up. Here I was thinking nobody would even notice, and now you’ve saved the day! Thanks for making a rather dull morning quite cheery. :p
I dunno – I kind of think perl is a good starting point, but then I’m thinking of scripting rather than 30k lines of code. I’d also point out that perl’s “read only” aspect is largely a product of people being dickheads about a) the way they code, and b) commenting code. It’s easy to make c hard to read, too, but I’d never say c is a bad language because of it. That being said, I have to admit that sometimes it seems like there are actually *too many* ways to do things in perl, and that can certainly lead to confusion.
The reason many universities focus on java is one simple and logical one, Java sells. If you want a job atm the most “asked for” programming expertise is java. Also look at sourceforge and see that java is also the largest language in terms of projects and lines of code. Wich is also an indicator of what other people use, and will pay for. Though Im not saying java is a very good introductory language, just that i think i understand why it is teached as such. *demand* Indeed a very interesting article with many valid points. ++
I don’t think it matters that much. What matters is that people are taught good programming practices. These can be taught with C, C++, Java, QBasic, Ruby, etc. Learn to encapsulate behaviour in functions. Learn to stop passing information by side effect (global variables). Learn to plan out your code and not “think with your fingers”. Learn efficient coding. Learn to format your code well with indentation. Learn to name things well. Learn to comment you code sufficiently.
All of those things can be done in any language, and are far more important than than the language used.
I still think that BASIC — with its emphasis on being for “Beginners” — is the way to go.
(In my programming classes, I routinely get ragged upon by my fellow students for occasionally slipping up and referring to a modern concept with a BASIC 4.0 term, or for writing notes longhand instead of using a laptop. I have yet to point out to these “more advanced” students that I’m head of the class…)
My son took a programming class his junior year in high school (last year), and they started with QBasic. It was kind of neat to me, since I started with basic – gwbasic. It amazing what you can do even in a language like qbasic. I kind of miss the simplicity of those days.
I also started with QuickBasic.
My experience is, if I would have started with Pascal first, it would’ve been easier to me to learn it the right way.
I guess if you’re good enough, Basic won’t hurt, but if you’re not born to program, Basic is not a good start, as it lends to bad taste and the “I don’t know what really happens here” attitude (which many fellow students tend to have, even without basic).
It’s not the language that makes a coder. It’s the knowledge.
I always find that very many people who claim that can code in one language and the other and love to fight over which is the best “first language” to learn or teach to be the worst programmers that can be. Both in practice and in theory. I don’t like language-zealots any better than any other zealots.
If a coder lacks the basic knowledge about algorithms, structures, coding techniques, and so on, even numerical mathematics to an extent, I don’t consider him/her a good coder. I really don’t mean to offend, but I state that a coder without solid theoretical knowledge is just a monkey. No use on the long term.
For a programmer with a good background knowledge and a few known languages another language is not an issue. When I was beginning programming back in the days every new language I saw, I learned it, used it, perused it. Then learned others and others. Then use which you think it’s best for the task at hand.
I say, it doesn’t really matter with which one starts, it just matters what one can do with the gained knowledge in the end. And remember, a language is just a language.
Sure, but some languages will facilitate the acquisition of that knowledge more than others. It’s easier to learn about linked lists if I don’t first have to wrap my head around pointers, memory allocation, memory leaks, dereferencing pointers, allocating on the stack vs. the heap, etc. Some languages do a better job than others of getting out of the way and letting you learn and use “algorithms, structures, coding techniques and so on.”
I still kind of hold on to the old school academia practice that Pascal is a good language to teach programming, logic, and design. Its type enforced, its heavily structured, and it uses more English words and silly symbols so it tends to be a tad bit easier to think things through logically at a beginners level. Structure is something I see a lot of modern programming lack. Java/C++, declaring variables all over the place leads to unreadable code. Scripting languages such as Perl, PHP, and other scalar based languages make it too easy to make simple mistakes due to the lack of type enforcement. Trying to grasp programming concepts is difficult enough without having to equate things like || = OR, && = and, == equality checking, = assignment, which always tend to lead beginner programmers to simple logic errors such as “if (a = 5)” instead of “if (a == 5)”. Once basic concepts such as logic, design, algorithms, and data structures have been digested, anything else is just syntax. The only exception is with OOP, but I consider that a topic beyond the beginner level anyhow.
I don’t have any experience with Python, so I can’t comment. But I do hear good things about it.
I once tried to learn Pascal. I loved how it was setup. The only reason I stopped was lack of support for the language. Since then I haven’t ventured into programming outside of web development.
If you’re an instructor, you don’t want to have your students use Perl if you hope to be able to grade their assignments. You’ll have to figure out what the hell they are writing, and while a good Perl programmer can write elegant, maintainable Perl, it too easily degrades into line noise.
I think Python is probably a better choice, even though I’m more familiar with Perl than with Python.
If you are just doing an intro course teaching “procedural” programming stuff. Perl is good and I would say better than Python and Ruby. If it goes into more than that I would say Python as you *can* get into OO stuff if you want to and even cover UI stuff with wxPython (which has really good support).
MIT teaches Python as their intro course and this is supposed to be a really good book for it (and is the tome that MIT uses):
Python Programming: An Introduction to Computer Science
1) Easy to read and understand. Preferably one that facilitates commenting.
2) It should be tight and unambiguous. Strong statically typed languages are best.
How people think about the world around ultimately relates to which language will serve as a better starting point. For example: an object oriented model is not going to work very well for a person who thinks in terms of processes, but it may work better for somebody who thinks about how the various bits of a problem are related.
The other thing is that programming isn’t just about the language. It also has to do with how you structure and solve problems. And while the author is correct by suggesting that an IDE has very little to do with that, the IDE does reduce the overhead in the learning process.
One thing is how to best teach programming, but I think the answer depends not on how easy it is to teach programming with a given language, but what we want students to learn.
I don’t doubt that Python is an elegant, readable language from a human point of view, but it’s very slow. Do we want to create hordes of programmers who create programs that, although they use the most efficient algorithms, are around 20 times slower than they have to be? I don’t think so.
Now you probably think that I want to burden new programmers with strange symbols and programs that could just as well be written in cyrillic, along with the dangers of pointers and all that stuff. But no, teaching beginners C isn’t a good idea.
So why not Pascal? It creates fast programs, compilation is fast (so you can test/run/test/run like an interpreted language), it doesn’t look scary and it’s strictly structured. What more can you ask for? (Yes, I know you just LOVE to write in a cool programming language that’s unreadable, but is it really a good idea?)
This is for *beginners*, so the objective is to get them thinking like programmers. The fact that Python’s slower than a compiled language is irrelevant for this use.
I wonder how much programming you’ve done, since once you’ve got an understanding of algorithms, it takes comparatively little time to adjust to a new programming language.
Let’s face it: it’s more convenient to program in a language like Python than it is to program in Pascal. When people know a more convenient language, do you honestly expect them to learn a less convenient one? I surely don’t, it would be evil.
So let’s just pick the best of the compiled languages in the first place.
since once you’ve got an understanding of algorithms, it takes comparatively little time to adjust to a new programming language.
I know, learning a new procedural or OO language once you know another is really easy. But read what I said above: Will people learn less convenient languages when they know one that is easier to use? Not really.
I wonder how much programming you’ve done,I know Basic, Pascal, x86 assembly, PHP/HTML/CSS/JavaScript, and basic C, C# and Java. I’ve written my own basic compiler (no interpreter bottlenecks).
While I agree with your comments to the most part especially when dealing with the inherent nature of humans, I would disagree with your point in some cases.
In cases where the known language is not robust enough to readily or easily solve a program or perform a function or a more fine control over the processes of the program are required, those individuals with a high level of accountability will learn a “less convenient language”;
In cases where the programmer doesnt code for a living but for fun and wishes to accomplish a specific task or cases where the programmer does code for a living as an auxillary task to his/her primary job functions, the individual will learn a less convenient language.
Just my two cents
Python could be three times as slow and still be a good language for beginners. The point is to teach programming as a way of thinking about problems, and not just “coding”.
If the language is good in helping newbies “get” programming, then they’ll be able to tell a particular language is adequate for the job or not, and they’ll also be able to learn a new language quickly if needed.
And, btw, Python isn’t slow.
Yes, it’s slower than a bunch of languages out there, like C and Java and stuff, but that’s exactly why there are all those languages out there. Python fits most needs, but when you need performance, you look elsewhere. At least, you look elsewhere for a language that allows you to make modules callable from Python .
The article is quite good and comprehensive and might be a good read also for someone hoping to find a good and easy to learn first programming language for him/herself.
However, I find it a bit odd that while the article talks about a good introductory language it, on the other hand, blames Ruby especially for not having enough advanced documentation for advanced users.
Ruby is the youngest and smallest of the three dynamic languages recommended in the article, so obviously Ruby still has less documentation than the other two (Python and Perl). However, if we are talking about total beginners needing a first introduction to programming, Ruby does have lots of good beginner stuff both online and as books for non-experienced people: books like “Learn to program”, and sites listed, for example here http://www.ruby-lang.org/en/documentation/ .
In general, I think, Ruby might also be a good compromise between Perl and Python.
Edited 2007-04-11 18:15
This is probably an odd choice for a first language, but I picked up PHP on the first read through of a book I bought back in the PHP3 days. I found later when I started teaching myself C that the similarities in concept and syntax made it absolutely painless (the hardest thing for me to grasp was the difference between #include and include(), which is a testament). I constantly advocate PHP as a first language when people ask about learning to program.
Edited 2007-04-11 18:12 UTC
1) Php makes it easy to write spaghetti code
2) Php is basically useless without HTML knowledge and useless for anything but web programming.
So they have to learn HTML first. When you are done there’s not enough time to learn PHP.
What? So does every other language with control structures…
Even an elementary knowledge of PHP lets people write useful web applcations. You write your calculator in Perl, and I’ll write my blog in PHP. At similar skill levels, each is reasonable. And I know people who don’t understand the separation between “Windows” and “the computer” that have learned an impressive amount of HTML and CSS just in editing their livejournals, myspaces, etc.
IIRC, someone was working on GTK/Gnome bindings for PHP.
You can program in PHP without using any HTML, just like any scripting language.
As a layman who has chosen to run Linux at home after much learning through trial and error and has had no formal computer training and learned HTML back in 1995 on my own before all of the WYSIWYG exditors there are now, I would just like to say something here.
As I got into the Linux thing back in 2000, I realized I was in for a steep learning curve. With an online community of Mandrake, RedHat, and SuSe as well as the help of Linux Magazine (back when it actually targeted newbies and helped us out) I discovered that I had to learn the shell commands, especially to gain the control over my system that Linux had been lauded to give me in the first place.
All the books/forums said it was C like and to learn C. Then they were recommending I learn C++ rather than C. Then, trying to learn C++ used Microsoft compilers et cetera rather than gcc. There was no how to really good beginning GCC tutorials that taught C++ in combo with Gcc/g++. I turned to languages Perl and Python. I originally bought a book on learning python by O’Neill, but it was too boring and didnt allow me to hit the ground running. I wanted to write stuff that worked NOW! After a year or two of trying Python and getting frustrated, I stepped away from the problem.
This past Chrismtas, I googled “beginner + programming” and found Learn to Program by Scott Pine based on Ruby. There was no Microsoft based software required, I didnt have to learn to use the compiler in Linux, I could just download the program for free, compile it, go through the examples and run it! BAM!
I finished that bare bones book in two weeks and for once had a raw basic idea of what key elements required to program. (Hey Scott, put more examples and the answers in the next edition, if you are listening…Other than that, your book rocked and changed my life!)
I bought the Pickaxe a few weeks later (Considered the defining Ruby book at this time), and now, four months later, I have managed to write a program for dosing aminoglycosides and theophylline that is used in clincial functions for my hospital where I work. I have also started writing a character creation program for the role playing game I am writing.
I consider my self a skilled programmer by no means, but I can play around in there enough to get the things done that I want to get done. I would recommend starting with Ruby for any people with an interest in learning programming rather than for a marketing or resume angle. Especially if you are a linux user writing for tools to help you at your job when your job is a microsoft shop.
Edited 2007-04-11 18:25
I have a question. Did you find “irb” useful?
To answer your question, yes and no.
I was originally used to using Kate and the command line to run my programs. I was so used to doing it that way I though irb wold be a pain.
Once my programs started getting big, however, I found that using irb helps me debug a chunk of code very quickly before integrating it into the main program.
For instance, the first program I wrote determines patient weight a number of weights than uses an algorithm to determine which one applies it then uses the weight and the patients age to determine the initial dose and interval.Then it takes those two numbers and uses some measured values to determine the next dose and ainterval.
I originally wrote thsi thing as a big mass and even with the line numbers shown in the error statement, I would lose sight of where my errors were coming from (especially with nested loops and the methods I’d created). Now I write a block of code, irb it, and when it is fixed, I integrate it into the whole. Works like a charm, especially when you want to try something that Scott Pine doesn’t mention in his book but that you want to try anyway.
I think that a direct functional language such as lisp or scheme should be the first one. It’s very easy to grasp programming concepts with lisp, since the syntax is very uniform and the interpreter makes very easy to experiment with the language and concepts by testing things in “runtime”.
There’s no better way to learn concepts I think, I could only understand closures and continuations by looking into scheme.
If you introduce people to programming using lisp, you will end up with people that can’t do any sort of real world programming tasks, if they can program at all.
Those languages may be powerful, some of their constructs may be useful (and are finding their way into other languages), but the world is imperative. And imperative thinking is much closer to the way “normal” people reason about problems than functional programming, which is closer to how mathematicians reason about problems.
“I could only understand closures and continuations by looking into scheme.”
Funny enough, I could only understand closures by looking into Javascript…
This is advanced stuff, beginners don’t need to know about closures. Heck, most programmers don’t need to know about closures either…
I recommend you read Tim Sweeney’s article on “the next mainstream programming language”: http://www.st.cs.uni-sb.de/edu/seminare/2005/advanced-fp/docs/sween…
He’s the guy behind Epic (of Unreal) fame. I’d hardly label him an ivory-tower academic. In the presentation he points out that the 250,000 lines of computational code in the Unreal 3 engine are “essentially functional”.
That said, Lisp’s in general make far better imperative languages than any other I’ve encountered. If the Java folks creamed their pants when they got “foreach”, they’d probably have heartbeat irregularities if they got Common Lisp’s “loop”.
This is advanced stuff, beginners don’t need to know about closures. Heck, most programmers don’t need to know about closures either…
A closure is a fundamental concept. You teach somebody about closures, and you’ve given them all the knowledge they need to understand C++ function objects, Java inner classes, C# delegates, and Python iterators, oh, and the basic concept of “object” in all of those languages.
The lack of focus on fundamentals is one thing that really pisses me off about software “engineering”. A real engineer goes to college for four years, and spends three of them just learning math.* Sure, you can make an airplane without knowing math, but we already have airplanes. It’s the math that let’s you say if the design is correct, or how good it is, or how to make it better.
Software engineering is completely different. They try to get away with doing things as ad-hoc as humanly possible. If your average software engineer built the columns to hold up a building, he wouldn’t do it by working out the math to figure out how thick it should be. Instead, he’d guess. If the building collapsed, he’d try another size, then another, until he got one that worked. It doesn’t matter that he could have saved a lot of time, money, and energy by doing things the right way the first time. Because theory isn’t for “real programmers”, just for the “eggheads” in their “ivory towers”…
*) Oh, they won’t call it math after the first year or so. But I spent my math classes solving differential equations, and I spent all my other classes… solving differential equations. Most engineering classes degenerate into “this is the differential equation that’s relevant to ___ (first week); here is how to solve, approximate, and model the behavior of this equation (rest of the semester)”.
Edited 2007-04-12 00:18
I haven’t learned Python or Ruby yet; I have the book on Python cited above, and it does look good, although I think I need something higher-level (so if anyone can recommend something, let me know). I have worked with Perl, and IMHO it was a sharp wit who observed that Perl was the first “Write Once, Read Never” language. (Although perhaps not the first, considering APL.)
I learned to program in Pascal, and I liked it but the original language is a bit dated. BASIC is even more dated.
Personally, I like Eiffel. It has the readability of Pascal, the clean design of a pure object-oriented language, a speed comparable to C (although the memory requirements tend to be higher), and a Design-by-Contract philosophy that in my experience works beautifully. It isn’t just a language; it a method for software engineering. There is “one way” encouraged to write Eiffel programs, although Eiffelists don’t seem as restrictive as “the Python way”.
Sadly, the two major Eiffel camps have forked (ISE Eiffel and SmartEiffel) and both compilers seem to be in transition, but I very much like both dialects.
Seems like the web server has stopped working on my host. The Backup URL is:
http://www-backup.shlomifish.org/philosophy/computers/education/int…
Ruby would be the best I believe. It’s very clean, has every OOP concept in it, and doesn’t contain a lot of “programming in the large” boilerplate code. Definitely the best of the lot.
I disagree with the fundamental thesis that a beginning programming language should allow you al lot of expressiveness. A good argument for a stripped down, safe language is that you are trying to teach basics. BASIC is an excellant teaching language (not Visual Basic, but a clean, simple BASIC.) Even things like object orientation can get in the way when trying to teach fundamentals. (I don’t view OO as fundamental as I view analysis of algorithms). But let’s start with what you’re trying to teach:
1) Solving problems by developing algorithms.
2) Analyzing algorithms
3) Data structures
4) Abstraction
Every language mentioned does all the above. Some make one part easier than another or more conversational. Some make life easier or harder for beginners. I would say what’s more important:
1) An editor that makes writing code easier.
2) Debugger that is easy to understand and use.
3) A conversational session
The first one can be satisfied by an IDE or even just a syntax highlighting editor such as emacs. The second allows people to examine a running program and error conditions. It would be nice if the language had primitives to enter the debugger (ie. an “assert” or “break” primitive that kicked open the debugger). Finally, being able to open a “session” with the system like a Ruby irb session, comand line BASIC, Python or a Scheme session.
I think I’m more partial to ruby because it has great support for all 3. I don’t think you could go wrong with BASIC, Python or scheme, either. I’m a professional programmer with some perl experience and get lost in the syntax, so I wouldn’t recommend it. As a contrast to perl’s funk, I don’t use Python but I find it easily readable. I’m writing all compiled langauges off. Java IDEs have excellant debuggers, if you learn to use them. I’ve seen to many people get hung up on compile/link (or library reference) problems with compiled languages to really feel comfortable telling them to start with a compiled language.
My pick? Probably ruby. But they’d be well served with scheme, BASIC or python. I love lisp, but it’s too large a language for the beginner. I love objective C, but it really helps to know C first. Java is a great language for people who already know how to program. C/C++ cause students to get hung up on stupid pointer problems.
i believe that the first approach should be a multi-pronged approach.
introduce youngsters or students to each of the following at the same time:
* PRACTICAL programming – python, perl, shell, whatever makes its easy to get easy results fast. there is no point scaring people away with lots of boilerplate code, however virtuous, that doesn’t appear to do a lot.
* UNDER THE HOOD programming – the most valuable lesson I ever learnt was tot understand what really happens inside the computer – bits, bytes, stack pointers, instruction pointers, accumulator registers, caches and memory scans… this way you’ll appreciate what your higher level language is really doing and what it is hiding from you. why? it helps to choose approaches you know will be more efficient if there is more than one way of doing it. many students or youngster don’t know why naive sort is not as good as quciksort or other sort algrithms… they’re all just as fast in their world. this feeds also into logic or functional coding too where it is very useful to know what is really happening – tail recursion is an option but it makes the difference between make or break for some data sets.
by the way this doesn’t have to be done with real assembly coding – i learnt it at age 11 using a hypthetical CPU (the zap-1) which our teacher introduced us to illustrate instruction fetch, load and execute, register manipulation and memory lookups and so on … (whils on this topic the ARM assembly language was very clean, logical and learnable, in contrast to 8086)
* GOOD DESIGN PRINCIPLES – its worth teaching at the same time good design principles – and not just enforcing them using a language that enforces them – but explain WHY. try getting one student to fix or debug another student code – or even work out what it does!!
The nice thing about them is, you can learn to produce usable and useful stuff very fast indeed.
However, you find yourself learning all kinds of basic skills almost without noticing. Loops, regular expressions, branching and control instructions, getting user input…
For what platforms is Hypercard available?
HyperCard is not available anymore but it’s sucessors live on.
SuperCard is available for Mac OS X (http://supercard.us)
Runtime Revolution is available for Mac OS X, Linux, Windows (http://www.runrev.com)
Runtime Revolution also has older versions for FreeBSD, Solaris, HP-UX and Mac Classic.
By the way, RunRev has many strong points for being the best introductory language:
* English Like syntax.
* Built-in support for GUI, Networks and Databases allowing the newbie to do advanced experiements as he advances his learning.
* True cross-platform, a stack created on one platform will run unmodified on all others. Depending on your license you can create standalone applications for all platforms from a single one.
Cheers
andre
Derivatives. Revolution, PythonCard…
alcibiades, nice seeing you here.
yes, HyperCard and other xTalks are wonderful environments for learning how to code. A bonus point is the english like syntax.
add 1 to i
is much easier to understand than it’s C cousin:
i++
The english like language doesn’t scare away newbies like other languages might do. At my university, the first language they teach is C and the next one is Assembler for 386 computers. Guess how many students got so scared that they are now focusing on network admin jobs and not on development jobs…
But the user might get distracted from concepts when he see that it is that easy to create windows, buttons and apps…
You have me interested.
For what platforms is Hypercard available?
Macintosh, System 7 and earlier.
I would point you to my wiki page about Hypercard, but it seems they’ve deleted it. But the syntax of Hypercard’s scripting was very close to natural English, and apparently allowed a lot of leeway.
GW-BASIC rulez – only kidding
pascal was my first language. as others said, it has strong typing, a rather natural language, has not many “tricks” *a++ ternary ops etc. the best thing is that you can teach pointers and with delphi also oop. oh and btw asm and compilers should be taught too…
Browser: Palm680/RC1 Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/Palm-D053; Blazer/4.5) 16;320×320
just learn how to program? There is a significant difference between the two. Is your ambition is to eventually have job with the word programmer or developer in the title or do just want to make your current job slightly easier with some excel macros, or perhaps learn how to do simple things with MAXscript in 3D Studio?
Most programmers have a hard time grasping that most people who want to learn to program to want to become programmers. If you’re an architect you’re may very well be best off learning AutoCADs scripting language, if you’re a 3d animator you should probably learn Mayas mel scripting language. If most of your work day is spent in excel, then learn to write excel macros.
Basically people will take to programming much easier when they see direct uses of what they learn to simplify their current daily job.
As successor of Pascal and Modula-2/3, I think Ada is the right choice. Simple programs like “add 3+2” are today kind of curious, and programming in the large is the task for today/tomorrow. Ada is the language of choice for me since 12 years – available on many platforms and an ISO standard. Tasking included. What else do you wish? Programmers heaven. Think of ISS & F-22 & JSF & Space Shuttle — complex tasks and Ada is in there. Strong typing … if you need to be very safe, use SPARK – a subset of Ada. I’m just curious of other peoples usage of C and derived languages. Debugging all the time…
time over estimated project livetime. Funny….
I have used Perl as my main programming language (I am a computational biologist) for seven years now. I know Python, too. While we have both a Perl and a Python camp in my department, the newcomers to Perl generally start producing results faster and are more productive throughout their PhD or postdoc and beyond. And don’t get me started on Perl being unreadable or unmaintainable. It is possible to write clean, maintainable object-oriented code in Perl with a little discipline, and still be more productive than in Python. And in competitive research, productivity is what counts.
At our university we started with Eiffel. I programmed C/C++, Java, Basic, PHP and Perl for more than 9 years before. Imagine me as being some kind of arrogant against this new language. I was pissed because I _had_ to learn Eiffel.
Why no curly braces? Why “%N” instead of “\n”? These were my first impressions… but soon they changed.
As we continued using Eiffel and studied it in deep and compared it to other languages I more and more came to the conclusion that Eiffel is the way to go.
Eiffel made me a better programmer in an overall manner.
This is because it is clean OO. It has proper multiple inheritance. And it has many many fundamental principles just implemented in a sound way.
“Uniform access” for example just to mention one.
Software Engineering without Design By Contract is just not the same. Of course you can write in a comment that you expect a non empty string. But Eiffel enforces you by checking such statements at runtime and it integrates it nicely into the documentation, where it belongs! Otherwise one simply happens to read the documentation and uses the function in a wrong way.
So it is a pity that the author did not consider Eiffel. Most likely because the author did not think of it. But now everyone should…
Edited 2007-04-11 21:39
May seem crazy, but I wish I had learned assembly language first. Everything after that would have made much more sense.
No chance. I used assembly language to speed up my (turbo) pascal programs. I now consider this as wasted time. Modern compilers are nearly as fast as asm and the programs are portable, which is more important than the last few % of execution time.
A lot of those who have written more than 100 lines of code already *know* why we love Perl. Sure, many features, easy string processing, more than one way to do it, but just as JoeBuck put it, teaching it to someone who has never programmed before is a pain, and I’ve burnt myself with that.
First of all, because reading Perl code written by someone else is very difficult for someone who is not used to reading code in general. Heck, it’s a pain in the neck to read your *own* Perl code. When I learned programming (I learned Pascal, if it has any relevance… and quickly forgot it, too), I would often look over code written by other people, like we all did in fact, and it was an useful experience. Having difficulties in understanding how the program works is more than enough an obstacle for a beginner. Spending several minutes to understand the way the program works is enough — I wouldn’t like Bob Beginner to spend even more time to understand what Perl would get from that gibberish.
Giving grades is also very difficult with Perl, and that’s exactly because there are several ways to do it. I found myself in the nasty sittuation where one way of solving a problem was perfectly valid, as in, it worked well and with good performance. It was simply not too elegant (a little bit of “extra” Perl knowledge would have made it more “slim”, if you want). What could you do in such a case? It’s very difficult to explain a student that, well, his assignment was perfectly solved, but there is some funky feature of Perl which could have made it “look” better. Someone who has done serious programming already knows why good style is important — but how can you teach writing clear code in something like Perl?
The other problem I’ve found with teaching Perl was what people were doing after they learned Perl. Sure, sure, it’s a nice programming language. Now have a student whose first programming language was Perl trying to learn C (and don’t give me the ‘C is dead’ thing now, please :-D), and use that horrible, mind-blowing, retarded set of string functions.
Just like with any other type of language, the first programming language and the habits you learn are very important, as you’ll have a hard time getting rid of them if you need to. I had a great deal of problems myself trying to abstain from using some idiosincracies of Pascal.
Quite frankly, I’d go for using Basic or Ruby as an instructional language. Even more for Basic. Sure, it doesn’t sell, but the aim of an introductory programming class should be to give an inside of what programming is, why it is important, to teach basic algorithms and to explain the approach you take when trying to solve a problem, not to get you a job. You can do all of these in Basic.
Don’t get me wrong: Basic should be abandoned as soon as one understands what binary search is. And, Perl is a wonderful programming language, just not an instructor’s (and probably not even a student’s) dream.
>>Even more for Basic. Sure, it doesn’t sell<<
Basic may not “sell” but it can be extremely useful.
Microsoft uses BASIC, or BASIC-like, stuff everywhere: VBscript, spreadsheet formulas, VBA for task automation, and so on.
And, if you want to be a professional developer, VB is one of the most popular programming languages. I know of one guy looking for an experienced VB developer and offering a salary of $100K.
Don’t get me wrong. I am no MS fan, or BASIC fan. But it can be a very useful language to know.
http://www.amazon.com/Ada-95-Beginning-3rd-Skansholm/dp/0201403765/…
I see several problems with this approach. One is that it is important that children will be taught English starting from an early age – as early as possible.
Has this author ever left the small island on which he was born and grew up ?
It really depends on the person learning to program.
Some guys like to write fancy code right away.
On the other hand for me it is very annoying if concepts appear out of the blue and I’ve absolutely no idea how they’re implemented.
That’s probably why I like C or perhaps C++ best.
Anyway, the rule of leaky abstractions is gonna get you so the only question is if you want to learn abstract concepts first and discover why they don’t work as they should or the other way around.
In my case it was a C-program that relied heavily on tail calls. It ran out of stack space which made no sense to me until I saw the generated assembly and read about C’s retarded calling convention which makes optimizing complex tail calls hard and sometimes even impossible.
That’s actually one of the few things I hate about C…
Anyway, teaching Perl as the first languages seems to be a bad choice.
It’s way too complicated.
Wouldn’t the most straightforward way be HTML -> Javascript? I don’t know JS (yet) so I cannot say if it is suited for beginners.
While we’re at it: Which book would you guys recommend for learning Javascript?
“While we’re at it: Which book would you guys recommend for learning Javascript?”
There are several good ones and a number of bad ones, but one I’ve found useful was “JavaScript: The Complete Reference” by Thomas A. Powell and Fritz Schneider.
http://www.amazon.com/JavaScript-Complete-Reference-Thomas-Powell/d…
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1036.h…
http://www.cs.mdx.ac.uk/research/PhDArea/saeed/
That is easy, Assembly. To use it you have to understand computers.
I learned programming by learning C++ (well, the C part of C++), and I still regret it. Learning C is all about learning the “C virtual machine”*, and it really boxes your thinking down the road. I like what some universities do (MIT for one), which is to start with a functional language Scheme or ML. Ultimately, this starts you off at a more fundamental level, because after all the C model is just one out of many possible ones for hardware, while symbolic computation is just math, which is universal.
On the other hand, I don’t subscribe to the notion that some people have that youo can learn all you need to know about programming from just one language. The difference between math and programming is that the latter depends very heavily on good taste, and there is no way to learn good taste other than through by reading a lot of very different code. It’s a lot like writing, actually. You can learn to write correct English by reading a grammar manual, but the only way to learn to write good English is by reading a lot of books.
*) The idea that every computer in the world is just a really fast PDP-11 with a lot of memory…
Hmm…How about the IO Language?
It has no keywords, only sytax. Not a lot of things to remember, just syntax and principles.
Actually I kinda like IO, it’s just not a stable language yet.
there was a time when smalltalk was THE language to learn first.
I don’t know for sure what the best language for learning is, but if you don’t learn C first you really should learn it second. I have found that the easiest way to determine whether a programmer is going to be useless or not is to ask them to write some simple C code. I have yet to meet a programmer worth a damn that could not at least function in C. In my experience, the people who live and die by Java or by VB or even by languages like Python or Ruby have gaping holes in their knowledge. Being forced to write your own linked list or write your own heap or write your own binary tree or track down pointer issue or sanely track memory allocations on your own or… is a pain in the ass, but is an important part of understanding computer science.
I completely agree with Joel Spolsky’s article “The Perils of JavaSchools” (referenced in TFA). I would extend that beyond Java to a lot of modern languages. Modern high level languages are great for getting things done, but not so good for learning basics.
(BTW, this guy’s pushing perl as a first language? What the hell?!?!? I don’t mind perl, but it’s kinda evil and it’s hardly intuitive.)
Agreed, perl is evil and must be destroyed.
It’s an example of a language with features bolted on by necessity with design being a distant second. It’s probably more an example of what shouldn’t be done with a language.
C should likely be a second language. With the caveat that the compilations should be done with either as many warnings as possible or even with a C++ compiler to catch as many errors as possible.
C/C++ really are powerful but they really only work if you make & enforce strict policy decisions for using them. That’s something done on the job and not really appropriate for learning languages (although it wouldn’t hurt to teach some about making & enforcing programming practices for team programming).
I still really like the idea of a very simple language like IO which is is a great “building block” language. Performance is really irrelevant when it comes to educational use.
Readability and maintainability are paramount concerns. That’s why “here’s your predecessor’s directory of Perl scripts” gives one of the most sinking feelings in the business. Sad thing is, there are a lot of sloppy programmers out there, and Perl does less to limit their damage when you’re having to work collaboratively.
I for one had to reuse someone else’s library once, and then had real time wondering why my previously tested code was breaking – it turned out that Perl allows a stand-alone next statement inside of a function to affect loops in the calling function. Why would any language do this?! What C++ and Python take pains to do is encapsulate and define interfaces, even if not in the OO sense, and side effects like that disqualify Perl as a language for larger projects with multiple programmers.
Maybe Perl 6 will clean things up a bit, but students need to learn how you successfully write reusable code when the line count goes over 10,000, and they’ll do that better when they don’t have to fight the language. You’re talking about a mindset where the default behavior is all variables global unless declared otherwise, variables created on the fly unless declared otherwise – “my” and “strict” shouldn’t have to be explicit.
Perl’s not a bad language. It just grew too quickly without careful planning for how it would scale. That’s why I think it needs to come after Python or C++ or Lisp. If you’re going to code with less type safety, you should already have learned good discipline elsewhere.
…the various constructs and concepts of programming languages in the course “Programming Languages”. It was really just an introduction to programming starting with the history of programming languages and the basic concepts of variables, compilers vs. interpreters, etc. That kind of stuff.
Python was great because it was easy for me to lay out assignments, easy to use for the students and free as well.
The most important advantage of Perl is it’s easy to learn. The most important disadvantage is its philosophy: doint the same thing many ways. So, I can choose whatever idiom I want, and without the proper documentation, the code easily becomes unreadable/unmaintainable. After working with Perl for about 4 years, I came to believe that it is not a good idea to build any mission-critical application using Perl as a primary language. You can put together something quick and dirty, but in a long run it’s going to bite you. Or, most likely, it’s going to bite someone else who’s unfortunate enough to maintain your code. I wonder who’s maintaining the code I wrote. Even with all the comments I left.
I’m less proficient with Python, but seems like it puts some bounds on what you can and can’t do, and that’s good thing. Granted, the learning curve is a bit steeper compared with Perl.
1. The author wants us to believe that “learning how to write quick and dirty code is a mental leap that is large enough as it is”.
If you feel this is true, you should not be programming. I’ve been a developer for several years now. Every developer I’ve met in my professional career has been able to whip out some “quick and dirty code”, but when I have to debug it a year after the author quit, I wish s/he was a little more capable.
2. “Almost all Java code looks the same, and feels boring” is a lie, plain and simple. I don’t know where he came up with his issues against Java, but it’s a very elegant and expressive language.
The downsides in my opinion are lack of multiple inheritance and excessive memory usage. Surely the former is not addressed by Perl and the latter should not be of concern in an introductory language.
Personally, I feel that C++ would be the best introductory language since it’s the best of the (widely used) languages period. Java is certainly more elegant and would be perfect if it were not so restrictive.
Perl and python should not be taught because they are literally scripting languages!
Perl DOES support multiple inheritance. Perhaps you do not like the way it is implemented. Or perhaps you just do not know Perl well enough…
After some research, I see that you are correct. While I may be biased, the C++ way of doing inheritance seems much simpler to me.
“Perl and python should not be taught because they are literally scripting languages!”
Define “scripting languages”.
You have a language that can be compiled to an executable (or Java .class files and whatever the .Net version is called) and doesn’t rely on calling external programs for every little thing.
So what is really the reason not to teach it? Because you categorized it as a “scripting language” and put it in a group with bash/awk?
Feel free to argue against Python/Ruby/Perl because of dynamic typig, performance, standard libraries or readbility. Just writing them off as “scripting languages” just makes it look like you haven’t even tried them.
If I write a complicated program in a scripting language, I spend most of my time trying to find the typo in the variable name. Compilers make learning how to program MUCH easier.
“I spend most of my time trying to find the typo in the variable name.”
You do?
Then you obviously didn’t write Perl, where ‘use strict;’ will force you to declare variables before using them. I usually use an environment that’ll help me with the variables, like eclipse/pydev. Sure, it’s a little less helpful than for Java due to the dynamic nature of Python, but it’ll find most things for me.
I too struggle with writing complicated things in what some people call “scripting languages”, but the difficult ones are bash/awk and the likes, not the dynamically typed languages like Perl/Python/Ruby. Misspelled variable names are very rarely a problem in those.
But that might just be me.
Introductory languages depend on the Programming methodology you are trying to learn.
1) Object Oriented
2) Functional
3) Top down
4) Bottom up
5) Evolution
6) Prototyping
7) Modular
Really, you can learn a lot by not using any particular language.
Just use a fictional or pseudolanguage at first. The idea behind this is that it frees you from a particular syntax and lets you explore the concepts themselves. I remember a very popular introductory course here where they’d teach you basic processor architecture and programming by using a fictional processor and assembly language. It was very strong on the concepts, which is what you really need. With that you can later translate into whichever processor you want.
Another idea is taking two courses at once: One on low-level processor architecture and assembly language, and another one on higher level language constructs and logic. If you do both with fictional or pseudo-languages, you can quickly give the pupil a great understanding of programming concepts.
Later, translating those concepts into a particular language will be easier.
Most experienced dev have started with the most hated programming languages on earth ( basic, cobol, assembly … ).
That was decades ago when options weren’t available.
today we’ve got a wealth of languages that almost have the same syntax and ancient concept (like pointers) are deprecated.
Like “everybody” i started with basic but quickly hated this stupid language.
So I learn with 2 key languages :
– Pascal for strong typing procedural/fonctionnal programming. Use english word as keyord that mean what they do
– SmallTalk for strong OOP principle that are almost similar to a spoken language.
These 2 languages are at 90% pointless in my everyday job in c#, php, SQL and java.
But as I used dozens of languages in my life, I find that these 3 are horrible for learning as they are
1. use braces for syntax bloc that aren’t easily distinguished from parenthesis.
2. Give too many path for writting a working code
3. introduce too many programming paradigm at once.
4. learning with script is bad for your mental health.
ANSI C… Is there any other language? Maybe perl or applescript for when you’re lazy or need to parse text. If you need object orientation, I’d say Java.
“C++: an octopus made by nailing extra legs to a dog.” – Steve Taylor
The language by which I learned programming, and by which I would like to learn it again if that was somehow possible, was one of the simplest and weakest languages: C64 basic. You only had global variables, you had line numbers, you had goto, you had gosub,… Okay, the only thing I would leave out are the line numbers and similar syntactical restrictions like two-letter variable names. And you wouldn’t hear about the high-power things like OO or closures.
Why? Because you can explain to a newbie in 10 minutes how the language works and have him start programming. At that time I would never understand what procedures are about, but understanding what gosub *does* was simple. If you told me at that time about functional programming, you would’ve killed me. Don’t underestimate the complexity of what we accept as normal now! Even local variables are a complicated thing.
The second big advantage of that approach is that you can move on to more powerful languages later. My route was c64-basic, gw-basic, q-basic, C, C++, Java, and then came the exotic stuff. With each of these steps I was confronted with a range of differences, new features (e.g. real procedures, or later virtual methods), or features left out (like goto). But now I had already made the experience what life is like otherwise, and then you understand how these features make life easier.
> 3. introduce too many programming paradigm at once.
Bingo it’s what has been fiddling around my mind for the last couple of hours.
I remember my own experience the first time I tried to learn LISP and I couldn’t understand a damn thing. I already knew procedural programming, but I was experiencing something which was 90% new and I was receiving a lot of information that was completely strange to me. I had to take another shot at it, a couple of weeks after, to let the little information I had acquired settle down.
I guess the same would happen for someone who is not acquainted with programming, when trying to understand a language like C. There are important things in C programming which are simply too hard to gasp, like string processing functions and pointer manipulation.
That’s why BASIC is probably so cool. There are very few concepts you need to explain that are related to the language itself, and you can concentrate on what is essential.