(Note: I never got the chance to go beyond first semester in CS. I learned my first half-dozen languages by self-study, and picked up the underlying principles only much later. I think that might be part of why our POV differs so radically.)
re-reading my post, I think my 'approach' is really more geared towards a longer course as opposed to a crash-course on coding.
Difficult to do if you lack the vocabulary to express algorithms in. I know that in formal CS study, that vocabulary is taken from the field of mathematics and (theoretical) CS itself, but that kind of vocabulary is basically unknown outside of the math / CS faculty.
Advocates of Lisp dialects (I'm not one of these by the way, I haven't used Scheme since first year university) say that it is a language in which it is
extremely easy to cook up a test program or an algorithm implementation. In relation to C, imho lisp dialects are a magnitude easier to pick up and use, so can get people with less natural flair coding in less time. (You cannot pretend that it does'nt take natural ability to cognitively cope with pointers immediately - apologies for double negative).
Agreed. However, the first language is the most difficult to learn (so it really doesn't hurt to have them learn it in the lab instead of the first job position), and it does shape your way of thinking about problem solving.
Agreed. It seems in this point you are taking my point of view more than yours. I'm not sure if that is the case or if I'm misinterpreting. It is important that the first language be a simple one (as it is the most difficult to learn). And C does not qualify as that. (Sorry, but it really doesn't. Take the posts from mohammed in the OSDev subforum as an example).
And that is where the CS world and the "hands-on" world differ dramatically. I keep hearing that Lisp (and dialects) can teach you wonders about how problems can be solved and data be represented, but at the end of the day, "no-one" uses Lisp outside of the lab (except for the Emacs people, but they are {beeep} anyway ).
Here I would argue that the intention is not to imply that you should use Lisp in your everyday coding life. It is to teach
a language that can be picked up easily and used quickly to illustrate concepts.
An example is my lecuturer had a laptop and projector, and would write algorithms from start to finish on the screen in front of us, in about a minute. This would take a lot longer in C, and would probably see the lecuturer use ready-made programs (here's-one-I-made-earlier style), which IMHO is not as good.
That was quite a bit of an aside - the point being that this initial language is meant to teach
principles which can then be ported to C, C++, Assembler, PHP, Perl etc etc (remember that not everyone uses C, many people make their money via web development, and these principles are just as valid there, possibly more so given that most webdevs have never heard of a binary search...)
And I use Emacs
As I said, the first language is hardest, and shapes your way of thinking. Yet, you are suggesting that people should go through this with a language they will probably never use again. They learn lots of stuff, sure, but they still most likely have to switch to a different language in their first job, which is most likely an imperative / OO language.
Yes, and where's the harm in that? Most people don't learn only one language and stick with it. Hell, most people start with BASIC or something of that ilk - they don't expect to stick with it the rest of their lives.
Who knows what the language of the future will be? Granted, 90% certain it will be an imperative language, but it probably won't be Java and although C has stood the test of time so far, surely something else will come along. Again reiterating - it is much less the language that matters and much more how you use it.
Being a professional for over seven years now, who got excellent ratings for his work in a variety of fields and languages, I still don't really know what a "closure" is (or a "lambda calculus", for that matter), and every time I get around to looking it up, I dismiss it after a few paragraphs because I feel it has little impact to my everyday work. (*)
A closure is code and data combined - that is, code with an associated environment and scope that can be passed around as a parameter. The code in a closure is sometimes mutable, but not always. (Think Ruby, modifying classes dynamically).
I feel personally that explaining pointers right from the start can have a negative effect on people. It is a difficult concept to understand, and while Solar may have 'got it right', using good teaching methods etc, it can all too easily backfire.
Yet, pointers are something I encounter every day.
Me too, but that does not mean that they are the best teaching tool in the box. (A personal opinion, please don't take this as an affront - you have much more experience than me and I'm just trying to put my point across
)
I think both approaches - yours and mine - do that. However, once we got our respective classes walking / running, they are moving on two different roads: Your class sure knows the theory behind it all, and can probably design a parser or compiler-compiler no problemo, while my class knows at least one mainstream programming language and can solve everyday problems in an everyday project right away.
I would agree, and possibly my approach is why so many university graduates are initially air-headed about the world of work
. For this reason a middle-road might be appropriate.
It is a language that can do three things at once: demonstrate 98% of all ugliness, bad habits and horrors programming has to offer
Is that a good introduction to programming?
JamesM