I ran across Robert Floyd's Turing Award lecture last night. It was an interesting read and frankly there was a lot in there to make me think about the state of computer science, computer programming and how we teach those two closely related topics. One question he mentions is asking another computer science teacher "what he teaches in his introductory programming class." The answers he often got were "Fortran" or "PASCAL". The talk he gave was in 1978 and those were the languages used. Today we often get the answer "Visual Basic" or "Java" or even "Python."
But as Dr. Floyd suggests those are really the wrong answers. Those languages are just syntax and grammar and not what we really need to be teaching. We need to be teaching design concepts, paradigms of programming, ways of looking at and solving program, and in short concepts that are (usually) language independent.
The Fortran I learned in the first programming course I took is all but dead. COBOL is pretty dead outside of specific and legacy applications as well. (Not that either language seems to ever want to die completely and yes I know that people still write new applications in them.) But the concepts I learned live on and have served me well long beyond those courses.
When Dr. Floyd gave his talk structured programming was the new paradigm and now it is an old one. Top-down design was new then and now is old. But they are both still valid even today. Object Oriented Programming is the new thing and it is great. But it doesn't replace the old completely.
So what then do we teach in the first programming course? Is the language important? Of course it is. Discussion of which language to use causes great debates. My own recent post on the subject has a large number of comments. But that is not the essential question and I have come to think that it (the language) should not be the name of the course and it really should not be the foundation of what the course teaches. When the language becomes the subject the value of the course in preparing students for a live-long career is diminished.
So what do you teach (or recommend teaching) in your first programming course?
I'm not a teacher, but I have a strong feeling for datamodelling.
Teach som basic database modelling techniques, combine that with C#3.0 with the LINQ features.
I think that makes far more sense that the algoritm/language constructs we all went through.
In an earlier response I (semi jokingly) positted Sinclair Basic as a first language. My point at the time was that it's far more important to teach basic constructs than 'dancing penguins' IMHO.
I'm a massive fan of OO design and coding for instance, but all the knowledge of that in the world doesn't mean squat if you can't create a decent logical 'if' structure. I know that's some thing that we all take for granted, but we've all been doing this for some time. Does everyone remeber the difference in how C++ handles a logical && to VB's AND?
Start with a good foundation in structuring functional code, and then build out to the world of objects, and then move to an OO implementation. At that point the choice of language is probably market driven, if you know the basics most any new langauge is just a question of learning the syntax.
I had the huge chance to study computer science in a University where emphasis was put on Scheme and Lisp. Now, 20 years later, they have migrated towards Java ... and I think this is a terrible move.
If I teach someone to drive a car, and the model of car happens to be a Ford, is the emphasis about learning how to drive or about driving a Ford? Of course, it is about learning how to drive.
I think your thesis is that the programming language is secondary, and I agree. The first programming course should teach "programming," not just the syntax of Java or Basic. In order to effectively teach programming, you do need to have some concrete language involved, and you are forced to make a decision that way. So learning the syntax of a particular language is a side effect of learning programming.
My first year students learn Turbo C++ 3.0 - My reasoning is simple. Great starting language that lets the students concentrate on learning to problem solve while discovering how syntax and commands work. This allows us to cover everything before classes and I find my second years can make the move from functions to classes very smoothly.
Look at some of the "classics" and pull everything of value from them; that may mean entire books in many cases. e.g. Bentley's 'Programming Pearls', pretty much anything by Steve McConnell or Robert Glass; not just books about algorithms, but books about solving problems and other things we have to deal with in this industry (maybe even throw some Polya and Petroski in there. My bias in this area may come from our current homeschooling approach, which is based on reading classics; the Thomas Jefferson approach.
As far as example language(s) used, let me throw out one of my favorite Wittgenstein quotes: "The limits of language are the limits of one's world". Something with minimal syntax, and minimal restrictions on how you can think about solving problems.
It almost doesn't matter what language you choose as long as you understand the key concepts when you get through that first course.
I first learned BASIC on a TRS-80 computer back in the day and it sparked my interest enough to eventually go on to get a CS degree have a career building web applications. In hindsight, what I really learned with that first language is what the basic constructs are (looping, branching, comparisons, mathematical operations, etc.). Those basic programmatic atoms are within the confines of the syntax of a specific language is what a first language should give you.
I agree that in order to take it to the next level you need to understand modeling and the like, but to expect that out of a first experience is a bit like taking a course Spanish and being expected to write poetry in Spanish when you are done. In both cases, you need to understand how the basic pieces work before you can apply more complex ideas to them.
Might be an interesting strategy to mix up the languages involved - up to midterms in one, and then on in another (though similar.. say Java and C# ?). Just to encourage the focus on the concepts over the syntax semantics.
Though really, for the _first_ programming course I would go for Ruby - it's really neat, easy to read and follow, and it has an interactive interpreter. I think that's really important to grab a hold of student's interest, as their programs are instantly run, the moment that line is typed in. There's no need to debug through the entire program, which could be frustrating when starting out.
Compilers for Java, C#, and VB are fast enough to where, for small programs, there's effectively no time difference in compiling and starting a compiled program compared to starting an interpreted one.
I think the idea of switching languages mid-term is a good one, for more advanced courses. But I think it might be too confusing for a first programming class in high-school.