Slashdot Mirror


How Should I Teach a Basic Programming Course?

riverman writes "I have been 'provisioned' at the school where I work to teach a new Computer Science/Programming course. I'm supposed to be teaching everything from the very-very basics (i.e. where that myspace thing is in your computer monitor, and how it knows who your friends are) to the easy-advanced (i.e. PHP classes and Python/Google App Engine). I'm an experienced programmer, but I'm not sure where to start — I could easily assume that my students know something basic they don't. Are there any resources on the internet that could help me find a solid curriculum? What are your suggestions?" I'm sure many of us have gone through intro-level programming courses of some sort; what are some things your teacher or professor did that worked well, and what didn't work at all?

64 of 452 comments (clear)

  1. You need to narrow the scope by Anonymous Coward · · Score: 5, Insightful

    Computer basics, ie how to use the web, and computer programming do not belong in the same course. People in the audience for either will not be happy with the other.

    1. Re:You need to narrow the scope by theshowmecanuck · · Score: 4, Funny

      110 Teach Basic 120 End

      --
      -- I ignore anonymous replies to my comments and postings.
    2. Re:You need to narrow the scope by angahar · · Score: 2, Informative

      Test Driven Development. After more than 30 years as a working software developer and computer programming instructor I wouldn't teach it any other way. An excellent book recently released that offers this approach is Agile Java by Jeff Langr.

    3. Re:You need to narrow the scope by Anonymous Coward · · Score: 5, Insightful

      What grade level is this on? If it's a semester long high school course, or middle school, you should get up with an experienced teacher. Even if you're teaching this at a junior/university college, you should find a licensed educator to talk to. Too often computer science teachers know a bit about programming and logic, but very little about teaching. I'ld recommend covering your major points, and focus on a very VERY simplistic program that handles a few basic aspects (Perhaps a simple calculator?) and progress through whatever technologies are necessary while stressing that programming languages are like human languages, except machine friendly. Some languages are more flowery (latin) some are more coarse (germanic) and some are very powerfully in their succinctness (some asiatics).. Finding a way to bring this out of nerd land helps normal kids not want to get you fired as badly.

      1) teach background
      2) teach theory
      3) relate theory to something understandable
      4) expound. Verify learning, and repeat. And repeat. and repeat. then move on seems to work. Half the kids are not paying attention at any given time in virtually any class.

    4. Re:You need to narrow the scope by johannesg · · Score: 2, Insightful

      At first I thought to ridicule your notion that rank beginners should be taught software engineering theory. Than I thought, "I won't bother. There is nothing I can do for him now, the Mods will get him."

    5. Re:You need to narrow the scope by Alex+Belits · · Score: 4, Interesting

      At first I thought to ridicule your notion that rank beginners should be taught software engineering theory.

      BAD software engineering theory, to boot.

      Just imagine test-driven aerospace engineering. Test-driven civil engineering. Test-driven economics (okay, I take it back, that's Libertarian idea of letting everyone build "free market" by trial and error and not get wiped out or enslaved in the process). Test-driven medicine. All those area use massive amount of experiments, observation and verification, yet none would find it acceptable to abandon theory, rig up some testing contraption that may or may not be mis-designed and buggy by itself, then do job half-assedly and introduce random changes until tests pass. Or at least this is how "test-driven development" is usually implemented.

      I know one area where test-driven development worked extremey well -- biological evolution. Enjoy your ten million years long development cycles. And cancer. I mean, in products of such development.

      --
      Contrary to the popular belief, there indeed is no God.
    6. Re:You need to narrow the scope by Deanalator · · Score: 3, Insightful

      The scope is simple. Teach what they need to pass the AP computer science test.

      http://www.collegeboard.com/student/testing/ap/sub_compscia.html

      1. show an example of a for loop
      2. explain what all the parts mean
      3. give the class some problems that can be solved with that knowledge

      Following those steps over and over again for more complex concepts until the class is comfortable with turning algorithms into code. This is what computer science is.

      Once people get the basics of algorithms, you can expand out into various practical applications. Classes on web design, network programming, operating systems, etc, but that fundamental base is critical.

      Until the process of iterative and recursive problem solving makes sense, all practical application will just be seen as magical gimmickry.

    7. Re:You need to narrow the scope by Jarik_Tentsu · · Score: 2, Insightful

      What are your audience?

      As the parent, said it should be clear who it is aimed at.

      If you've got a whole bunch of completely illiterate people who struggle to install a program, then programming will probably go way over their head.

      Likewise, if your audience is a bunch of people who have a firm grasp on the very basics, the right mindset and are eager to push it one level further, then the basics will bore them.

      ~Jarik

    8. Re:You need to narrow the scope by Nefarious+Wheel · · Score: 2, Funny
      There's some view that even that's too high a level, especially if this is a university comp sci class. I'd start with the statement "a computer is just a box of switches" then back it up with ones and zeros corresponding to switch states.

      Assign George Boole as outside reading.

      Give them a little bit of overview as to how the machine actually works, and maybe later down the track they'll think before they cascade ELSEIF's or load stack manipulation inside tight loops. Make them sensitive to the tools they use, not just the media (the languages) they're working with.

      You can cover ones and zeroes, registers, memory and addresses a little easier, maybe even shorten the process by a couple of days if you give them something that relates abstracts to the physical world. Tie things together a bit.

      --
      Do not mock my vision of impractical footwear
  2. Task based learning by nurb432 · · Score: 5, Insightful

    Don't teach things in 'the abstract'. Give them a task to accomplish that needs particular 'features'.

    Then the next 'task' adds more 'features', but doesn't drop the earlier ones learned.

    And don't make the tasks abstract either. "do a bubble sort" would qualify as too abstract. While "collect 5 client names from the user and sort them" wouldn't.

    --
    ---- Booth was a patriot ----
    1. Re:Task based learning by Anonymous Coward · · Score: 4, Informative

      I totally agree. Start small and increase incrementally. Each iteration should include elements of the previous iteration so that they are continually practicing what they've learned before.

      For example:

      task 1: print "hello world"
      task 2: print "what is your name?", get name, print name
      task 3: print "give me a number to square:", get number, square it, print result

    2. Re:Task based learning by introspekt.i · · Score: 5, Informative

      Second that motion. I teach labs for an introductory programming class myself. The best way to get concepts to stick with students is to present them as pertinent problems or tasks to the students. Some examples that work for me are making small games (card games, dice games, etc) and writing programs that perform some kind of pertinent calculation (like business calculations or health BMI, target heart rate) calculations. All of these can be encapsulated in the task of presenting the program to the user in a nice interface..be it command line, web, or desktop GUI.

      These examples don't cover everything, but what you do should work for you, your students, and the concept that needs to be transferred to the students.

    3. Re:Task based learning by Vindication · · Score: 5, Interesting

      I'm a high school student who has previously taken AP-A Computer Science and is currently taking AB CS (this is the last year they're offering it, I believe), and I have never been more dissatisfied with any teacher that I have ever had.

      Programming is an outside interest for me; while we do Java in class, I experiment around with C, C++ and Python outside of school (and I am planning on trying to pick up PHP and Perl soon). I've found that many of my classmates, including friends who I know are quite competent with computers in general, are quite lost when trying to learn or apply many of the concepts we use in CS.This is understandable. However, my teacher has inexplicably continued to introduce many of these abstract concepts at the same time, without really explaining even the basic purpose and logic behind each one. As a result, I've seen many people new to CS but genuinely interested in it just give up, because it made little sense to them. Personally, I know someone who is quite talented with C, and it is thanks to his help that I can understand basic C concepts (memory management, etc.) and not be overwhelmed. This friend of mine, I believe, is quite a good teacher, and this is largely due to the fact that he a) does not assume that I know things incredibly well and b) utilizes the Socratic method to great effect.

      I agree with the parent's comment. Our current project in AB CS is to write a program that sorts an array using several different algorithms. It is supposed to help us understand Big O notation and the logic behind writing more efficient algorithms, but the teacher hasn't said a single word about Big O, instead opting to hand out papers (which my friends have told me they don't understand at all). The concept of Big O notation seems to be too abstract without practical examples.

      Encourage asking questions...you'd be surprised at how many people are afraid of asking questions because they feel they will sound stupid (at least in high school).

      Pseudocode is a necessity for some of the assignments we have, and yet many of my friends fail to see the point (they just see it as a waste of time). Make sure to emphasize its importance, because they will feel that they do not need it early on.

      Also, make sure to emphasize the importance of debugging your own code early and often. Since my "teacher" does not actually teach, I often end up having to help out my friends who are absolutely stuck, only to find that they had a small debugging issue that they could not find because the teacher never bothered explaining the necessity of debugging.

      I don't claim to be an expert in CS or teaching whatsoever, so take this response with a grain of salt. However, I do like to think that my experiences in these courses lend at least some credibility to my reply.

    4. Re:Task based learning by hedronist · · Score: 5, Informative
      I agree, go concrete. It's easy to forget that almost everything about a computer is abstract to a rank beginner. One thing I have seen students get hung up on is:

      x = x + 1

      It looks like an equality statement that couldn't possibly be correct. Just telling them it's "an assignment statement" doesn't seem to penetrate. I have found a mailbox analogy to work about 95% of the time.

      It goes like this: You are at the post office in front of a wall of mailboxes. The mailboxes have numbers on them (you could go into memory addressing if it was appropriate, but it's probably best to leave that out unless someone asks for a little more detail). One of the boxes has a label on it: 'x'. The statement "x = x + 1" means "take the current contents of the box labeled 'x', add '1' to it, then put the result back in the box labeled 'x'"

      Often, about 60% of the students immediately go, "Oh. That's pretty straightforward." For the remainder, you could have 4 or 5 cardboard boxes. Write 'x' on a sticky note and put it on a box. Write '1' on a piece of paper ... You get the idea. Seeing this very concrete representation of memory, and that the names are 'labels' on that memory, means that this thing they have been hearing about for years, 'memory', is now nothing but a bunch of boxes you can store stuff in. Simple.

      You can elaborate on this by putting multiple labels on the same box, or putting special pieces of paper in some boxes that say 'don't use me, go get/set the value of some other box', thereby demonstrating pointers. You can also demonstrate type mismatches by putting a picture in a box and then ask a student what it means to 'add 1 to a picture'. Etc, etc.

      This may sound like baby steps, but in 1/2 hour or less and you have given your students a real, usable model of one of the most fundamental concepts there is.

    5. Re:Task based learning by bishiraver · · Score: 5, Informative

      This isn't just for programming. Using pertinent tasks to teach any subject is the best way to get the knowledge to stick.

    6. Re:Task based learning by anom · · Score: 3, Insightful

      This is an extremely good way to teach. This method also makes it extremely easy to teach synchronization too (tell two kids to go modify the value pointed to by their label at the same time, and have that value on the chalkboard). You can give your students a better understanding of pointers, memory, and threading than most students have in a single class without showing them a line of code.

    7. Re:Task based learning by andymadigan · · Score: 2, Interesting

      Sometimes it's important to know the simple solution as well. Most (all?) of the algorithms that perform better than O(n^2) have a fairly high constant attached to them, which usually translates to more computing time and a difficult to implement algorithm. If you're really concerned about speed (you may have to sort 5 items from each of 500,000 lists) then you need to know how much data you're dealing with.

      However, that's all too complicated for a beginner's course. Teach them about stdin/stdout, teach them I/O basics, teach them about data structures.

      The sorts are interesting sure, but treat it more as a way to demonstrate the multiple ways of doing the same thing can be vastly different. It's a mind-opening experience, not an end in and of itself.

      A good middle or end-of-term program the might just catch their attention, write a program that can retrieve a single page from an HTTP server. They don't need to know every nook-and-cranny of HTTP to do it, and it's a good way to gain some familiarity with networking. I know it's not the standard beginner's material, but that material was written 20+ years ago, today's students want something that's relevant to them.

      Finally, I suggest Java. It's easy to learn, very powerful and (relatively) consistent. Java was the first language I really learned, before the end of the 1st quarter, while the other students were still learning what classes were, I had written my first network server.

      --
      The right to protest the State is more sacred than the State.
    8. Re:Task based learning by Vindication · · Score: 2, Interesting

      The teacher will probably be relieved to get the help. Be gentle about it though. If the teacher feels threatened by you, your grades will suffer.

      I got about 10% of my grade taken off for helping other people understand in the first grading period. Then, about a week ago, she lectured us for about 20 minutes on how we shouldn't be bothering her and we should be consulting with each other for help. Go figure.

      I honestly doubt the "scripts" are prepared by anyone even in the district; we've got one of the richest schools in the district and only one CS teacher who I believe does not know what the hell she is doing.

      The only reason many of my friends are passing that class is because I try to explain the problem to them when they get stuck, rather than just throwing in code without explaining what it does (as the teacher tends to do).

      To the OP: I stand by my original comment. Emphasize the importance of pseudocode and debugging, and make sure to provide plenty of practical examples when teaching an abstract subject.

    9. Re:Task based learning by Alex+Belits · · Score: 5, Funny

      (Considering I'm almost 30, I program computers for a good living, and I've never used it, I'm thinking: it ain't.)

      Considering I'm almost 40, I program computers for a living and have to use it all the time, I am thinking you are a some kind of web developer.

      --
      Contrary to the popular belief, there indeed is no God.
    10. Re:Task based learning by Hyperspite · · Score: 2, Insightful

      Electric circuit design. Capacitors and inductors obey differential equations. However you can use a Laplace transform to turn it into algebra. Additionally, the abstract concept of force is actually dp/dt (change in momentum with respect to time). Calculus is everywhere, but smart people simplified it into algebra for the layman.

    11. Re:Task based learning by extraqwert · · Score: 2, Funny

      One thing I have seen students get hung up on is:

      x = x + 1

      It looks like an equality statement that couldn't possibly be correct. Just telling them it's "an assignment statement" doesn't seem to penetrate.

      have you considered switching to Haskell?

    12. Re:Task based learning by Hognoxious · · Score: 3, Informative

      I'm 40, I program computers for a living and have never used calculus for it. I have never done any web development.

      I'm thinking you perhaps work in some other area of applications than I do, but don't know the difference between a problem domain and programming per se.

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    13. Re:Task based learning by iabervon · · Score: 3, Interesting

      I think calculus is, among branches of mathematics, one of the less useful for computer programming. Computers are discrete systems, and either need to use approximations for using calculus or need to use something else. Graph theory, field theory, algebra of all sorts, and (obviously) computation theory are all more applicable to general computer programming problems. Calculus and computer programming mainly only go together when you're trying to make a computer solve problems that can be best modeled with calculus; and it's always the case that it's helpful to have domain knowledge when implementing something.

      Of course, calculus is very useful for a lot of other fields, including ones as related as electrical engineering. (Unless, of course, you include as "calculus" things that are unrelated to calculus except in name and the Latin root; the lambda calculus is good to understand if you're a programmer, so that you can precisely communicate programming language behavior, but that's only related to calculus in that it's a set of symbols and manipulation rules which models an abstract mathematical concept.)

    14. Re:Task based learning by Evil+Pete · · Score: 3, Interesting

      If you do any game engine physics then you are going to be doing a large amount of calculus. Other branches of programming are less likely.

      I always believed that people who say: "I don't see how this relates to me", usually have a singular lack of imagination. That is why curiosity is a survival trait, it forces us to learn things that may be useful later on. There are some things I am terrible at, but that doesn't stop me knowing something of them because I am just curious.

      Calculus, is a less likely contender for the curiosity list but it was curiosity about it (and matrix algebra) that got me interested in mathematics, leading to a degree in it. OTOH, programming languages I find I am curious about but unless I will be using it I know there is no point learning them in detail. Ruby I've read some stuff on, learnt the syntax, but haven't bothered learning it properly because if I am not using it I will just forget it all. Whereas, Java, Python, C/C++, awk etc are different ... I use those often.

      --
      Bitter and proud of it.
    15. Re:Task based learning by tonsofpcs · · Score: 3, Interesting

      100 REM TASK 1
      110 LPRINT CHR$(33); "hello world"; CHR$(33); CHR$(13); CHR$(12);
      200 REM TASK 2
      210 LPRINT CHR$(33); "what is your name?"; CHR$(33); CHR$(13); CHR$(10);
      220 INPUT N$
      230 LPRINT N$; CHR$(13); CHR$(12);
      300 REM TASK 3
      310 LPRINT CHR$(33); "give me a number to square:"; CHR$(33); CHR$(13); CHR$(10);
      320 INPUT I
      330 S = I * I
      340 LPRINT S; CHR$(13); CHR$(12);

      You said you wanted it printed, right?

    16. Re:Task based learning by mdwh2 · · Score: 2, Insightful

      I can almost guarantee that the guy who wrote the text messaging code for the phone didn't use any calculus.

      The phones themselves can be designed with CAD software :) And as I say, calculus is used immensely in that - I assure you it's not abstracted away from me.

      Same with the FPS game; the vast majority of games developers don't even see or use calculus.

      I was thinking of maths more generally there - and even if you're using 3D engines, a knowledge of 3D maths is still handy.

      And frankly, I could be the most successful, highest-paid web application developer on Earth and never touch the stuff.

      Of course you could, but web application development is not the be all and end all of programmng. You could be an historian, farmer, astronaut and not use the stuff. But the OP suggested that it had no use in the real world. I'm pointing out that it does. That obviously doesn't imply every job uses it!

      I don't know if it's really true that the number of programming jobs that don't require calculus, or maths in general, outweigh those that don't. I'm not sure that's a useful statistic - and that's not relevant when the claim was about whether calculus has a use (and whether maths teachers explain it), and not about how many jobs use it. I think you're discussing a separate issue to what my post was about. But whatever the percentage is, my experience is that there are many jobs around that use various high level maths - not everything is abstracted away in a library (and to be honest, I find the type of programming where everything is already done for me in a toolkit, and I'm just plugging bits together, rather boring...)

      Put it the other way round - I can be a programmer without knowing all sorts of things, such as web development or how the Internet works. I could claim that programmers don't need to know about networking, "because it's abstracted away from me in a library". But it would be rather absurd of me to suggest that therefore those things were of no use at all in the real world! Clearly someone has to write things somewhere, unless you're just plugging pre-made stuff together. But for some reason, there seems to be this stigma with maths of being "of no use", and I'm just surprised to see it even here on Slashdot.

      Would you rather a teacher who told how maths was used in the real world, as I suggest? Or one who says that, because not every job needs it, it's no use worth mentioning at all? (And by that reasoning, all academic subjects are pointless...)

      My first university, though, wouldn't give a CS degree out until you knew it-- why? Imagine how many otherwise-excellent programmers are dropping out of CS programs because they can't hack the obscure math, it's criminal.

      On the one hand, I agree that it's perhaps unfair the way that CS courses often require other subjects (I did maths myself, but at my Uni, CS students had to do maths and sciences too in the first year). OTOH, if the course doesn't have what you want, then don't take it. I'm sure there are lots of other things taught in CS courses that not every programmer means, but it's rather silly to blame the course for not catering solely to what job you plan on doing.

      And what happened to learning something for the value of learning, rather than whether you planned on taking a job in it? Part of my maths course included theoretical physics, which I don't use, but it was still interesting to learn.

    17. Re:Task based learning by Blakey+Rat · · Score: 4, Interesting

      I'm not ignorance of basic math, I'm ignorance of calculus. And I'm not proud (or ashamed, really) of it at all.

      Look, here's the reason I posted that: I was part of a CS program at a university that required calculus. I failed calculus more than once (go ahead, make fun of me), and as a result I ended up dropping out of the program and feeling terrible for years. I'd go as far as saying it wasted years of my life working a dead-end support job.

      Imagine how I felt after learning that, hey, calculus is actually mostly useless for the vast majority of software development jobs. Universities are losing students by making pointless requirements that have nothing to do with the field the students are studying, and I think that should stop. That's all.

    18. Re:Task based learning by mysidia · · Score: 2, Insightful

      I'm not ignorance of basic math, I'm ignorance of calculus. And I'm not proud (or ashamed, really) of it at all.

      Calculus IS basic math; it's among the most basic math there is.

      Advanced math is used in applications like scientific computing physics, computer modelling, and developing adaptive algorithms. And in cryptography: implementing ciphers and encryption algorithms, not using pre-made cipher libraries that other people have already developed.

      Calculus is not useless, and the vast majority of software development jobs require (if not) benefit from the use of calculus.

      The fact that you have been able to survive so far (without a tool) does not mean it is a useless.

      Just because a hand saw always worked for you, and you never saw a need for using a chainsaw does not mean that chainsaws are useless.

      If you don't know how to use the chainsaw, you can still take down some trees without it.

      There are many applications where application Calculus is a great aid in software development.

      In some of these you can get around without it, or with using simpler methods (that amount to use of calculus, even if the developer doesn't recognize it)

      If you are developing very simple web applications probably not; other developers have done a lot of the work to build the frameworks you use.

      But if you so much as use the sqrt() function; someone had to use some calculus to make sure you were getting good approximations, when they developed that library for you.

    19. Re:Task based learning by mysidia · · Score: 3, Interesting

      What's the point?

      There are mathematicians who don't need Calculus in their jobs, either. They could be very successful without ever using Calculus, except for the fact that a math degree requires taking some Calculus classes.

      There are also programmers who can earn good money without knowing C, C++, or Java.

      There is some training that is so basic, that all CS people should have it, even if some people do rarely use it. Basic differential calculus is one of those.

      Everyone needs knowledge of basic math. Mathematical concepts built on Calculus or related are relied upon in many areas of computer science. Use of concepts taught in such courses is not limited to performing numerical differentiation or integration in your software. Limits, ability to do series expansions, and use those discrete approximations, and understand their error properties, are far more useful.

      Computer scientists deal with numerical data in databases all the time, and should be aware of the tools available in their software to be able properly analyze it, and be able to verify the accuracy of their algorithms with testing and manual checking. Concepts often first taught in Calculus courses are required for this.

      It is very frequent that developers need to approximate how large to make a certain data structure, a hash table, for example. And when working on a large scale, it becomes necessary to measure efficiency of software, and be able to understand profiler output.

      Calculus and statistics (modern statistics is based on Calculus) is very useful in estimating how elements of a program will scale, based on (for example), number of users.

      Just developing one narrow kind of software is not computer science. Part of CS is understanding how computers work at a low level.

      Universities don't teach students to only be able to do one specific type of job; college is not "job training". Universities worth their salt ensure all graduates will have a versatile skill set, that they can pursue jobs other than the one specific job that doesn't happen to require knowledge of X.

      When interviewing prospective software engineers, I would consider task-relevant questions best-addressed or only addressable with a Calculus-inspired solution fair game.

      Abstraction is a temporary tool that has its limitations.

      Abstracting away things is not and never was a way to avoid understanding the basic concepts. Someone else may have written the sqrt() function for you, but how are you going to tell if a certain formula using it is precise enough for a certain use in your application?

      You need to be able to look at either documentation that indicates its error properties, or look at sqrt()'s source code, see the method it uses, and sample its outputs, to estimate its precision for certain ranges of numbers, if you want to be confident about the numerical precision of your results.

      Calculus and some of its results are very useful tools that can in many cases provide a very elegant solution, where matters would be very difficult otherwise, even web developers deal with numbers and statistics.

      You need some understanding of how to make bounds on the error.

  3. re Thou shall not bore the young by jelizondo · · Score: 3, Informative

    You have to taylor the content to the audience.

    Not knowing what age range is your audience makes it difficult to give you concrete
    advise.

    Avoid the history of computers, most young people (i.e. everyone under 40!) finds
    it boring and in reality it is useless.

    You can use Scratch as a great tool to introduce
    programming concepts without the boring theory.

    In general, do not bore your audience, that's the secret.

    --
    Be very, very careful what you put into that head, because you will never, ever get it out. - Cardinal Wolsey
    1. Re:re Thou shall not bore the young by jelizondo · · Score: 4, Insightful

      Kids taking an introductory computer course generally are not reading slashdot...

      That is why we are nerds, we like stuff that bores other people to tears...

      Once you are old enough to realize this, you will function better in the world at large.

      --
      Be very, very careful what you put into that head, because you will never, ever get it out. - Cardinal Wolsey
    2. Re:re Thou shall not bore the young by SteelFist · · Score: 3, Interesting

      When I took an introductory programming course (high school), the teacher went into painful detail about the history of computers, binary code (with paper and pencil), and so on and so forth. Later in the course, he admitted that it was to weed out the kids who were taking it for a typing course and not the programming course it was. After making it through the weed-out portion of the class, I actually appreciated what the computer was doing more than if we had jumped right into the coding.

  4. Teach them fun... by SerpentMage · · Score: 5, Interesting

    1) Teach them to understand that a computer does what a computer is told. So as a class building exercise get them to "program" a robot in pseudo code. You give them a fairly complex assignment that involves decisions. The test in this is that you the teacher are the robot. And the students who thought of this as a joke or simple assignment will quickly realize that garbage in garbage out means something.

    2) Do the assignment again, but this time add "testing" routines. Make them write little assignments, that are assembled into bigger tasks. Show how this could be a "test driven" environment. You teach the robot little things, and then those things are assembled into bigger things. This teaches them components, modules and test driven.

    3) Take all of that knowledge and apply it to a programming language. I personally would choose something along the lines of python and ruby. They have enough problems and they need a quick turn around.

    4) Teach them about OO by introducing them to a programming language like C# or Java.

    5) Finally teach them functional

    Though I would stress team exercises thus giving them the benefit of XP (Extreme Programming) type training.

    --

    "You can't make a race horse of a pig"
    "No," said Samuel, "but you can make very fast pig"
    1. Re:Teach them fun... by SerpentMage · · Score: 2, Informative

      I have been thinking more. Here is a robot exercise.

      "We have a class room here. The task is to get that robot over there to pick up the apple and bring it back."

      The challenge in this exercise is that while you think it is easy to navigate a room, telling a robot is not. It will involve the students having to understand the concept of "x steps and then turn". AND it will involve the students on having to come up with a language.

      After all how does a robot know that steps means to step. A step is a "keyword" that implies a set of actions.

      In the second step of the testing, etc routines the objective would be to define what a step is. After all x steps depends on the step size.

      So after this the students will understand the following:

      1) Language is garbage in garbage out
      2) Keywords imply some action and those actions need to be repeatable.
      3) Consistency and testing are the names of the game.

      --

      "You can't make a race horse of a pig"
      "No," said Samuel, "but you can make very fast pig"
    2. Re:Teach them fun... by xenocide2 · · Score: 4, Interesting

      Computer Science Unplugged is a curriculum out there designed to teach students computing principles, and they recommend a game like that. The game works like this: one person is playing the role of "programmer" and the rest of the class will try to follow their instructions. The goal is to duplicate a drawing that only the programmer can see.

      The first game(s) the rules are easy -- the "computer" can ask questions and the class can see what the machine is doing. Then you introduce restrictions. The computer player will be restricted from speaking, for example. At the end you have the programmer obscured from the class, only able to speak to their classmates to describe a picture. As programmers we rarely get the "full picture" so to speak, and have to give precise instructions that both we and the computer understand identically.

      The most important challenge to this as a teacher is selecting appropriate examples. They have a few, but I'd also add: a formula, with exponents, parenthesis, variables and subscripts. A pixel art smilely face ala CSS testing. A curve. A full binary tree with 4 levels. A small section of text, with bold, underline, paragraphs and bulletpoints. These are harder, but high school students can do it and it illustrates both rendering techniques and the need for language. For highschool students, I'd suggest spending a class on this, and then asking them to either write a paper (1 page tops) on the significance, or if the class is fast and small enough, hold a discussion.

      --
      I Browse at +4 Flamebait

      Open Source Sysadmin

  5. I remember... by Anonymous Coward · · Score: 4, Funny

    ...my first class in programming: the teacher wrote "x=x+1" on the blackboard, and my reaction was "Huh? That is unsolvable!"

    1. Re:I remember... by francium+de+neobie · · Score: 2, Funny

      For an encore, try proving black is white at the next zebra crossing.

  6. Blender! by saterdaies · · Score: 3, Interesting

    So, one of my friends in college did his senior research on alternative ways to teach introduction to programming and gave a very convincing argument for teaching it with Python and Blender (the 3D content creator). Blender allows you to use the Python programming language to set everything up and manipulate the objects so they learn programming, but it's a lot more satisfying. For example, what's more fun: reading input from stdin and saying if that integer is divisible by 3 using % or creating some 3D objects and moving them across the screen in a specified way?

    Maybe someone else has a better idea, but I thought I'd share

    1. Re:Blender! by baxissimo · · Score: 4, Informative

      If you're going to go this route, Alice is probably a better choice, since it was basically designed as a tool to teach programming with 3D graphics.

      As opposed to Blender, which well, wasn't actually designed at all. :-P
      (kidding -- Blender is great, but as a way to teach programming... the phrase "now you've got TWO problems" comes to mind.)

    2. Re:Blender! by Plaid+Phantom · · Score: 2, Informative

      Agreed. I helped teach a one-week summer class for junior high kids using Alice, and I don't think there was a single one that didn't enjoy it. And it demonstrates Object Oriented programming well.

      --
      All comments are properties and trademarks of the voices in my head. Not like I'm gonna claim them.
  7. It must be going around. by dummy_variable · · Score: 4, Informative

    This was a recent topic on stackoverflow. There are some really good suggestions there.

  8. Steve Drasner by gcnaddict · · Score: 4, Informative

    Find Steve Drasner. He's a Computer Science professor at Northern Virginia Community College in Annandale.

    His intro to programming class starts at the bottom, teaching only pseudocode without the use of computers whatsoever. After giving the students a good grasp of concepts of structured programming, he uses it to segue into the concepts of object oriented programming.

    I took Java prior to Drasner's class and, while I understood most of what I learned, I never quite understood the purpose of OOP/D until I took Drasner's course. Everything snapped into place.

    http://www.nvcc.edu/home/sdrasner/

    --
    Viable Slashdot alternatives: https://pipedot.org/ and http://soylentnews.org/
    1. Re:Steve Drasner by mattMad · · Score: 4, Insightful

      Focusing on pseudocode might be fine in college - but in HS it is very important to start with topics that are actually motivating the students. The danger is that you lose 80% of your students on the way if you do not give them "something to play with" every once in a while.

  9. SEE Program Resources by TarrVetus · · Score: 4, Informative

    You could check the Stanford Engineering Everywhere program's resources. They released some great beginner level programming courses under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported license. Those could be adapted for teaching the subject to students, and the content used for instructional material.

  10. I Haven't, But Know Someone Who Has by ricegf · · Score: 3, Informative

    I attended a fascinating talk by Mr. Vern Ceder at the past PyCon (Python Conference) on teaching programming to secondary students. You might review his papers from that and other conferences, and email him for advice (see linked page).

  11. Eduardoare by FirstEchelon · · Score: 2, Interesting

    As a college student currently enrolled in an introductory java course, what I found particularly interesting was the initial teaching of really basic HTML and its tags to introduce the idea that programs need to follow a rigid syntax for them to function. Although I already had previous knowledge in Java and understood this, the rest of the class seemed to benefit from the way that the class was introduced. Regardless of the language, the professor can then go into basic programs for the target language (Java, HTML, Ruby, etc.) and build from there.

  12. Different types of students by mrroot · · Score: 3, Informative

    Thinking back (waaaay back) to my first programming class in HS, there are going to be two kinds of students, those who have an active interest and those who do not.

    The ones with an active interest will just need a little bit of "fuel" and point them in a direction and let them go. For these students you can show them a quick demo, tell them where to find more information, give them a project, and all you need to do is be available for questions. Too much guidance or restriction will either bore them or make them frustrated.

    The other kind, lets say they have a passive interest, might be curious but maybe they don't have the same motivation as the others, so they will like to see many demonstrations, and have hands-on exercises where you guide them through something. I don't know if the active and passive interest students could be taught effectively in the same class.

    --
    I Heart Sorting Networks
  13. Multiple languages by Dan+East · · Score: 2, Informative

    If you are covering more than one language in a "basic programming course" then you are already off mark. Now if your goal is to do more like a survey of programming languages, or an introduction to programming languages, then it is appropriate to explain why there are different languages, the types of languages, why languages are used in specific roles, etc.

    If you are truly teaching programming, as in at the end of the course the students will be creating programs that do things, then you need to stick with one single language and development environment. Otherwise, every time the students begin to grasp the language and how it is invoked you are switching to something entirely different.

    --
    Better known as 318230.
  14. Whatever you do by ColdWetDog · · Score: 3, Interesting

    Don't teach BASIC.

    Scariest title ever.

    --
    Faster! Faster! Faster would be better!
  15. How about a non-programming example? by VikingBerserker · · Score: 4, Interesting

    When I first learned to program, I remember the teacher asking us how we got to school that day, in as minute details as possible. Example: awaken, open eyes, elevate torso, rotate 90 degrees, bend legs until they reach the floor, stand, walk to bathroom, etc.

    From there, you can explain the concepts of procedures to compartmentalize the code. Brushing your teeth may take thousands of steps, yet cut down dramatically with looping, etc.

    While it starts out as a new way of looking at how computers process the steps in a more methodical sense than we do, it soon becomes a way to introduce functions, procedures, and other syntax in a practical sense.

    1. Re:How about a non-programming example? by wfstanle · · Score: 4, Insightful

      I remember a story about a teacher that did something similar. He brought in the making for a peanut butter and jelly sandwich. He then asked the class for instructions on how to make it. It went as follows.

      1. "Put the peanut butter on the slice of bread."
            He held the jar over the slice of bread and started to shake the jar.

      2. ""No you take the knife and use it to spread the peanut jelly"
            He started to grab the knife by the blade end.

      3. "No grab the knife by the other end."
            This time he holds the knife correctly.

      4. "Spread the peanut butter on the slice of bread"
            He starts to put the peanut butter on the edges of the bread.

      This went on in minute detail until it dawned on the students that in everyday speech, we leave a lot out assuming that everyone knows what we are talking about. The students got an understanding of how we must communicate with computers. This in turn opened the discussion to other topics.

  16. Computer science is hard for most people. by gillbates · · Score: 5, Insightful

    The majority of people - even those with college degrees - have a difficult time with logic. Something as simple as an if-else construct can be very confusing to the average person at first.

    And there's another twist. About 40% of learners can understand and manipulate abstract concepts, and learn them without any practical experience whatsoever. The other 60% require experiential learning - they have to do before they understand. Fortunately, computers can very easily demonstrate concepts such as if-else...

    And how computers work is a mystery to most people. Before you start the course, you should come up with a simple mental model that you can use to explain how a computer works to someone with absolutely no understanding of electronics, logic, etc... For a basic programming course, you should first assess class understanding:

    1. Do they know how a computer works at a basic level - files, memory, cpu, etc?
    2. Do they know the difference between an application, and the files it creates ("I saved it in Word..." etc..)
    3. Do they understand how to solve a problem by breaking it down into its constituent steps? Believe me, there are people that really struggle with this, and expect the instructor just to teach them to solve a particular problem, rather than how to instruct a computer to solve problems. In fact, that might be a good introduction to programming, "Computer programming is the art of instructing computers to solve problems."

    For most programming courses, you should not even assume your students understand how to use the compiler. Furthermore, you should probably come up with a series of simple examples which demonstrate your point without any extraneous code. Because most people learn by doing, one of the first exercises should be to build a simple "hello world" type of application to familiarize themselves with the build tools.

    And have fun! Come up with interesting problems. Your students will most likely spend most of their corporate careers doing boring stuff, so they'll appreciate the chance to do fun things like games.

    --
    The society for a thought-free internet welcomes you.
  17. What my education left out by cjonslashdot · · Score: 2, Interesting

    I was not a comp sci major (a physics major), but I took comp sci classes, and am self-taught in compilers, language theory, and everything else I know about computers - including the hardware level, like the majority of people in the field. Looking back on the courses I did take, I feel that they left out a discussion of the flaws in the current paradigms. For example, the failure of the core von Neumann model of computing to address the problems of parallelism. The failure of procedural languages to enable intentional decomposition so that one can be sure a program is correct. The failure of OSs to be secure, and why that is. People think this technology is mature. It is anything but. The situation we are in has to be transitional, or we are in "deep sh**". While teaching them how to hack in the current languages (one can do no better than that), give them the message that this stuff is fundamentally broken, and that something better is needed.

  18. The Camel has Two Humps by eddy · · Score: 4, Interesting

    As a starting point, I suggest this (draft) paper, because it's interesting, and short, flippant, and gets you thinking. The Camel has Two Humps

    Learning to program is notoriously difficult. A substantial minority of students fails in every introductory programming course in every UK university. Despite heroic academic effort, the proportion has increased rather than decreased over the years. Despite a great deal of research into teaching methods and student responses, we have no idea of the cause.

    It has long been suspected that some people have a natural aptitude for programming, but until now there has been no psychological test which could detect it. Programming ability is not known to be correlated with age, with sex, or with educational attainment; nor has it been found to be correlated with any of the aptitudes measured in conventional intelligence or problem-solving-ability tests.

    We have found a test for programming aptitude, of which we give details. We can predict success or failure even before students have had any contact with any programming language with very high accuracy, and by testing with the same instrument after a few weeks of exposure, with extreme accuracy. We present experimental evidence to support our claim. We point out that programming teaching is useless for those who are bound to fail and pointless for those who are certain to succeed.

    --
    Belief is the currency of delusion.
  19. HTML & Notepad++ by Pakled · · Score: 3, Informative

    HTML in a basic text editor is a great place to start. It teaches how to open and close tags and the importance of correct syntax.

    You can also make it more complex by adding CSS or Javascript which resemble real programming.

  20. Former teacher.. by Anonymous Coward · · Score: 2, Informative

    Former teacher here. I was in a similar situation. Here are some pointers:

    * Go low level. Dedicate a lecture early on to bits and bytes and how binary logic becomes maths. The students don't need to know how to build a processor, but you need to dispel any notions of magic from the bottom up. Without some understanding on this level, computers will forever seem slightly magical. (Keywords: Relay, light-switch, bit, byte, register, instruction, Assembly, bus, ram, hard drive.)

    * Build upon the previous and explain digital audio and more importantly, graphics, as examples of how the numbers become sounds and pictures. (Bitmaps, graphics memory, sample rates, bit depth.)

    * Operating systems. Students should know which ones are out there how they differ and what they have in common. (Driver layer, process, program, gui)

    The more you put into these steps right away, the easier it will be to teach programming. Also, it tends to equalize the student pool. I put it into two two-hour lectures, but you may want to be even more through.

    Proceeding from there depends a lot on what the goal is, but for programming, I found that interwoven lectures and exercises with support time (teacher/TA in the computer room) usually works the best.

  21. my experiences with computer science education by MyDixieWrecked · · Score: 3, Interesting

    One of the issues I had when I was in school is that the computer classes were radically changed as I progressed through my grammar/middle/high school career.

    In 3rd and 4th grade, we learned LOGO on some old Atari computers and were basically taught about pixels and where home row was on the keyboard. It was all very simple to grasp and we did a lot of projects (drawing pictures in logo) that required us to use the keyboard a lot.

    In 6th grade, we had a BASIC class (not Qbasic, not visual basic... straight BASIC) on PCjr systems where we learned how to draw shapes to the screen and were taught the basic ideas behind computer resolution, very simple loops, how to print text to the screen, read input and use if/then. We also learned what input and output devices are and the names of the various computer parts (monitor, keyboard, printer, etc).

    I liked those classes and they went at a good pace which was great because I was the only kid who had a computer at the time (this is like 1991/1992) and everyone seemed to get what was going on and it was great. When I got to high school, there was a VisualBasic class which had a pre-requisite of Intro To Comptuers. I opted not to take that since not only did I have a computer for my whole life, but I also had the previous classes. When I talked to my guidance counselor, he said that the intro to computers class was just a typing class. The visual basic class was not a programming class... it was a class that teaches you the basics of computers (what a floppy is and how to print) and then ends with showing you visual basic.

    I opted not to take either class.

    My senior year of HS (98/99), they added a c++ class which I managed to sign up for by talking to the teacher and showing him that I already knew a little C++ and already knew computers better than most others (I would have had to take intro to comptuters and the VB class, otherwise), but that class wound up spending half the year teaching about how to use a web browser and what the difference between RAM and ROM is before we even got to 'cin' and 'cout', and that's all we ever did.

    So my advice is to spend very little time on the basics of computers in general and dive right in to projects that get them applying what they do know to do things that they want to do. Also, use a language that lets you dive right in. Java is a programmer's programming language. New programmers never understand it because it requires so much up-front knowledge to even understand what a simple hello-world app does. Especially if they are coming from visual basic or something similar.

    I think that C is the best beginners language out there. It's very simple. It's super straight-forward. There's a ton you can do with it right out of the box.

    PHP may be another good beginner's language, too, since the web is what most people use the most when they're on a computer and it would enable people to show off what they've done. It would also spark much more interest than C, especially since building a C app to work in windows isn't really a piece of cake... although programming in windows, in my experience, has been very difficult... there's a limited amount of free tools and it comes with virtually nothing built-in for that.

    --



    ...spike
    Ewwwwww, coconut...
  22. the basics by fermion · · Score: 3, Interesting
    I was taught, and teach others, in the fundamentals. This means that I understand what is going on, and not just what to do to get a the proper response. So here are my thoughts.

    Start off without a computer. At the basis, computers are sequential, even if some other from is used in the programming. Students must be able to break processes down into steps. They will invariable create ambiguous steps or leave steps out. Act out the process to show the missing steps. Use humor show undesired outcomes. Kids tend not to fully comprehend cause and effect, sequential logic, and the like. They tend to want to told a process, then apply the process mindlessly. The creativity and flexibility at the basis of programming a computer must be taught. At this point language only limits the students options, so it is not necessary to worry about that yet.

    Second, the student must understand the limitation of a computer, and how they function. A sideline into binary math and boolean algebra is useful to teach these limitation, and get the student to think on this detail. If an AOI circuit simulator is available, this can be used to teach these limitations, as well as get the students used to using the computer in a product creation manner. This last bit is important, because many students have never used a computer to create anything significant, and don't really understand that this is what many professionals do. They know how to use proxies to bypass security, but not how to load an IDE to create a program. Many can't even comprehend it, and play with their proxies not understanding that there is something else they could be doing.

    This is a bit abstract, but computers do work in the abstract, which is why CS majors, and scientists, engineers, and math people tend to earn a premium. Such people can think in the abstract, and they can not only because of innate ability, but because they were taught to. Teachers that shy away from the abstract because the kids complain and it is easier not to are leaving out a part of the educational process. But use concrete examples to keep the abstract grounded in something the students can relate to.

    At this point, when everyone is familiar with the computer function, some time can be spent detail the general workings and components of the computer. I have seen children as young as 9 forced to memorize, rote, the names of each part of the computer, and match the name to the part. I have seen high school kids repair computers with a high level knowledge, not quite knowing how everything really fits together. I don't know what level of detail is necessary for computer programming. They should now what a computer is, but I would not formally assess or punish the lack of rote memorization.

    At this point, it depends on what is to be taught. Something like Alice can teach OO concepts in a very accessible and high level manner. Since most everything is moving towards using a high level API with short bits of glue code, this may not be such a bad choice.

    If actually programming is to be taught, I would not use an overly complex IDE or language. The basics need to be taught. for instance, to switch values i=j; j=i does not work. Variable scope is important. How one passes parameters is important. Global variable can be very bad. That sort of thing.

    At higher level, creating reliable contained data structures is always a fun topic. Write a web engine or a word processor is now a well known problem and can be handled in a year. If there is a science or math component, well formed solutions to such problems are also quite instructive.

    A key thing that is often missed in debugging. Give students time to debug their work. Don't cave to the crying. Let them help each other. Assessment is best done in their ability to fix a bug, rather than sketch out a section of code or a data structure.

    And of course project based and group learning is the soup du jour. As mentioned, it is possible to have the students write a si

    --
    "She's a scientist and a lesbian. She's not going to let it slide." Orphan Black
  23. Teach them basic hygene. by bennomatic · · Score: 3, Funny

    We need to change the stereotypes of future generations of programmers!

    --
    The CB App. What's your 20?
  24. Algorithmic approach by Amigan · · Score: 2, Interesting
    I agree with previous posters that have said act as a dumb robot and follow the classes instructions exactly .

    The simpilest example I can give you to use is the making of a peanut butter and jelly sandwhich. Bring loaf of bread, knife, jar of jelly, and a jar of peanut butter to class and ask the class for instructions on how to construct the sandwhich.

    statements like 'put the peanut butter on the bread' would result in taking the jar of peanut butter and placing it physically on top of the loaf of bread. Similarly, the statement 'add the jelly' would mean moving the jar of jelly onto the pile you've created. Until the students understand that each (and every) step must be stated, they won't correctly grasp the concept of what programs do.

    Jerry

    --
    "Software is the difference between hardware and reality"
  25. watch how others do it ? by Lennie · · Score: 4, Interesting

    Maybe now that you are in teaching, maybe you should have a look how others do it, here is an example:

    http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

    I've been watching these for a while now, I liked them (although to much beginner for me, it's a nice way to get to know a 'new' language).

    --
    New things are always on the horizon
  26. Teach Them: I CAN DO IT! by anorlunda · · Score: 3, Interesting

    I've taught introductory programming several times. I never thought that my goal was to teach a skill, or an abstract concept, or logical thinking. My goal was to convince the students that programming is fun and easier than they thought. If I succeeded, my students would run out of the class saying I CAN DO IT!

    To capture their imaginations, I used Visual Basic. I taught them how to draw a ball on the screen, how to make it move, how to bounce it off the wall, and finally how to turn it in to a kind of Pong game. I can take a group of random people off the street, and teach them to make their own Pong in about 3 hours.

    Graphics and motion are much more emotionally appealing than any kind of abstract logic. It also presents them with the opportunity to analyze symptoms to debug their own programs. They are better able to grasp the relationship between incorrect behavior and incorrect programming when the subject is graphics and motion.

    Something fun like Pong, also teaches the students that programming is a means to an end, not the end itself. The interesting part is clearly what happens with the ball, not what the source code looks like. Later in more advanced courses, a subset of the students might become entranced with programming as an intellectual end, and go on to become software professionals. Good for them.

    For those who never do become professionals, they at least grasp that,given a lot of work and common sense, one can create source code that shapes and steers behaviors in the run time. Never again will they think of software as some kind of incomprehensible black magic.

  27. Logo by david.given · · Score: 2, Interesting

    Let's face it, most programming languages suck from the point of view of teaching. Python's pretty cool, but the syntax has lots of special cases and many, many weird (but useful) language features, all of which are confusing. Ruby ditto. Java is useful but unspeakably complex. C++ is even more useful and even more unspeakable. C requires you to be anally retentive. Basic is a crime. etc, etc. If you pick any of these, you end up having to teach the language, rather than teaching the abstract concepts that underly the language.

    My university got round this by designing their own custom language, S-Algol, and all the algorithms courses were done in it. Of course, it didn't help that it was a weird, half-implemented language (a garbage collected language with no actual garbage collector!) with lousy error detection (anyone who knows it will remember, and shudder at, the phrase 'void and void are not compatible in this context') and a half-assed IDE (the only editor I've ever seen where you had to move the cursor with the mouse. Yes, the arrow keys didn't work).

    If you want an existing language that's powerful enough to teach proper algorithms and yet simple enough for novices, you could do a lot worse than Logo. Yes, yes, stop laughing. But underneath the cute turtle interface it's surprisingly powerful and rather deep: it's best described as a stealth Lisp.

    Logo's biggest problem is that when it was introduced and heralded as the best thing since sliced strings, most affordable computers weren't powerful enough to actually run it; I remember Acornsoft Logo on the BBC Micro, running a Prolog-alike rules database, where a simple query took several minutes. Since the only thing that would reasonably run on a Logo on one of these machines were toys, Logo itself became known as a toy.

    But if you have another look at it today, you might be impressed. Okay, the syntax is a bit weird in places --- particularly when it comes to local variables --- and there's no object oriented system (although it's pretty much trivial to write one), but it's pretty much ideal for teaching basic concepts such as conditionals, iteration, abstraction, data structures, etc. And that bloody turtle gives instant gratification, making simple programs considerably more interesting than they would be in, say, Python.

    These days, you still won't find a better introduction to the utter basics of what computer programming's all about than the hoary old Logo tutorial. You know: "Let's move the turtle around! Let's draw a square! Let's make a procedure that draws a square! Let's draw several squares! Let's change the procedure to draw different sized squares!" That one.

  28. Let them build what they use by Collin · · Score: 2, Insightful

    When I was in 6th grade, computer class used Apple II's and we learned out of the Kids and the Apple II book, which took us through the basic language from the ground level and, looking back, I think it did a decent job of teaching us programming concepts in a fun way. I think this background gave me a good foundation of programming that helped me even through college C++ classes.

    But I'm not writing to specifically recommend that book, but to share my observation about that time period of learning. Sure, we had our share of boring calculator programs, and I wrote a fair amount of spaghetti code, but the most fun we had was when the teacher assigned us to write an adventure game, in the vein of choose your own adventure. Since textual and graphical adventure games were what we liked to play at the time, it was a real thrill to be able to try to create even a pale imitation of them.

    But then things got too complicated. Games got to good so it wasn't really possible to imitate them on a low level. If you learned C or C++ in class, it was really difficult to create games or GUI apps without learning all these other tools and platforms. Programs had to be compiled and took all the immediacy out of trial and error programming.

    Years later, when the web came along and everybody was hand-coding or frontpage-ing static HTML pages for their "homepages," I never got into that. I knew that the professionally done sites like yahoo or amazon weren't using static HTML but had server generated pages. When PHP finally came around with the ability to programmatically generate web pages, I felt a thrill just like back in the BASIC adventure game days. I could create media the same way those "in power" created it.

    Today's kids are voracious consumers of media, but they like to create it too. Whenever tools come along that let them create media "just like the pros," they jump on it. For example, when CD burners came around, everybody made mix-CD's just like the compilation CDs sold commercially. When sound and video editing came out, kids jumped on that, first using DVD burners and then YouTube.

    Following this observation, kids nowdays live on the web. To them, Facebook is professional media. If they could create dynamic sites like Facebook, they would feel the thrill of creative programming and be able to connect with the reason for why people program computers.

    For this reason, I think one of the web-oriented languages like PHP or Ruby is a great way to introduce programming to students. They can build pages like what they use and see the results in their web browser immediately without compiling and feel the thrill of creating again.