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?

452 comments

  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 mp3LM · · Score: 1

      I agree completely. You either need to be really selective for the course or keep the course really basic.

    2. 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.
    3. Re:You need to narrow the scope by Anonymous Coward · · Score: 1, Funny

      109 If you already know BASIC goto 120

    4. Re:You need to narrow the scope by tristian_was_here · · Score: 1

      120 your telling a fib goto 500

    5. 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.

    6. Re:You need to narrow the scope by Linker3000 · · Score: 1

      119 load "gramrchk.bas"

      --
      AT&ROFLMAO
    7. 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.

    8. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      Well, if this is university you forgot

      111 POKE 31337, 0
      112 PRINT "Dude, is there actually a chick in this class?\n"
      113 BOOBUFFER = PEEK(8008)

    9. 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."

    10. 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.
    11. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      Just imagine test-driven aerospace engineering â¦
      How exactly does that make it bad for software? If a test server crashes, how much damage is done?

      introduce random changes until tests pass
      This is known as "doin it rong."

    12. Re:You need to narrow the scope by Stooshie · · Score: 1

      shouldn't that be

      95 If you already know BASIC goto 120

      --
      America, Home of the Brave. ... .and the Squaw.
    13. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      Why 95? The first code was 110.

    14. 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.

    15. Re:You need to narrow the scope by AmberBlackCat · · Score: 1

      syntax error on line 120

    16. Re:You need to narrow the scope by prodevel · · Score: 1

      Although I somewhat agree, I enjoyed learning how to quickly and efficiently make small changes to test the result. Maybe I'm a bad programmer but I enjoy making quick modifications and efficiently testing their outcomes to effect change.

    17. 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

    18. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      how soon we forget the syntax

      109 IF youknowBASIC THEN GOTO 120

      assuming a BASIC that does not limit var names to 2 chars like the old Commodore BASIC (written by Microsoft) which did to conserve memory.

    19. Re:You need to narrow the scope by KeithIrwin · · Score: 1

      Basic computer skills these days generally include knowing how to use Word and Excel. People who know how to use them will eventually use them to write macros. It's not actually a terrible idea to teach them a little bit about how to do that. It'll help improve the quality of what they produce.

      Curriculum should sometimes be based on what students need to know, rather than what they want to know.

    20. Re:You need to narrow the scope by LihTox · · Score: 1

      You're right that people who already want a programming course won't be interested in this class, but everyone who uses a computer could benefit from learning a little bit about programming. At the least, it demystifies what's going on with the computer a little bit. There are also a lot of places where a little bit of programming can go a long way-- VB in Excel, Javascript for web pages, scripting in operating systems, etc. Programming may even show up in careers where it's not expected: e.g. my brother, who's a graphic designer, has done some work on Flash games, and I would never've expected him to get into programming.

      And finally, everyone who programs got into it because they were introduced to it somewhere. Back in my childhood, home computers started with that "Ready." prompt, which practically dared you to learn to program. Nowadays it might not even occur to some people to try, and so a class like this could start someone on a career or a hobby they wouldn't have gotten into otherwise.

    21. 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
    22. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      The internet and its vicarious 'entertainment' are really all fluff. To program for it is harder, too hard for beginners. If you want to do your students a service, teach them a simple line oriented interpreted language like BASIC. Teach them well so that they are thoroughly grounded in BASIC. With this they will have a tool for solving problems that they will encounter in engineering, finance, and many other disciplines in a quick way. Stay away form microsoft and its so called 'office' products as these only train students to operate proprietary rigid structured malware put out by microsoft and no others. Often you will be given no choice by school administrators that have been paid off or scared by microsoft salesmen or lawyers at high governmental levels. If you are in one of these systems that do not want to teach logical thinking and would rather take payoffs and turn out blind robots, move. That's right! Move! Get out of there as reason and progress no longer live there. The lights have gone out there and will not be lit again in our time. You will not change such a place by yourself, only get yourself fired. Just quietly submit your resume to a reasonable place to work where you can teach students who will have a real future beyond stultified keypunch operators and hope for the best.

    23. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      People who know how to use them will eventually use them to write macros

      What world do you live in? Where I work, I'm lucky if I can get someone to use the mail merge wizard. I have to write that out step by step, and then have to hold their hand while they do it. I don't think I've ever found a non-IT person who wrote a macro.

    24. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      http://www.youtube.com/watch?v=BUCZJWo9MZo

      And give them the following tasks:
      1. Find the bug in the program to compute the average age of everyone.
      2. Describe the problem with the number of bits claimed to be needed to represent "ROMA".

      Don't lose sight of the fundamentals. If you *begin* with the likes of PHP/Python rather than constructing a model in your student's heads of input/storage/arith-logic/control/output and a solid understanding of the difference between compilers and interpreters, you may be robbing one or two of them of a very satisfying lifelong career in obsessive programming.

    25. Re:You need to narrow the scope by Alex+Belits · · Score: 1

      Oh, testing in itself is fine -- as yet another level of assurance that you didn't do anything wrong. Relying on tests is wrong because tests can't possibly present sufficient checks to guarantee anything, not without becoming much more complex than anything they test (and then what assures that they aren't wrong?).

      --
      Contrary to the popular belief, there indeed is no God.
    26. Re:You need to narrow the scope by Alex+Belits · · Score: 1

      How exactly does that make it bad for software? If a test server crashes, how much damage is done?

      Damage is done later, when a server is hit by a bug that never shown up in tests. If all airplanes went into production after a successful flight of a prototype, without any design verification, every airport would have to be rebuilt every few years due to massive numbers of crashes. To think of it, that's exactly the quality people expect from modern software.

      --
      Contrary to the popular belief, there indeed is no God.
    27. Re:You need to narrow the scope by Machtyn · · Score: 1

      Let BASIC die and die hard. If you want to teach a useful scripting language, there are plenty out there: Tcl/TK, Perl, Ruby, etc.

    28. Re:You need to narrow the scope by Machtyn · · Score: 1

      Teach history. That is, the history of computers. It really does help to know that the ideas that are used in computers were thought about and figured out in the 1800's or before. (binary math, algorithms, Pascal (not the language), abacus, etc.) Granted, I wouldn't spend more than a week or two (in high school) on the subject.

    29. Re:You need to narrow the scope by oliderid · · Score: 1

      Let BASIC die and die hard. If you want to teach a useful scripting language, there are plenty out there: Tcl/TK, Perl, Ruby, etc.

      Well the merit of BASIC of that time is that it was available per default on (almost) all micro-computer, and in some ways BASIC was useful (...to classify your LP's collection :-p) Today all computers have a web browser and the web is probably the thing they use the most...Why not JavaScript? It is quite simple to understand, its syntax is quite minimal/standard and you can produce something flashy quickly like alert("hello world") :-).

    30. Re:You need to narrow the scope by EvanED · · Score: 1

      If all airplanes went into production after a successful flight of a prototype...

      Yes, but what's appropriate for an airplane fly-by-wire system isn't necessarily appropriate for, for instance, Word. Sure, you want some sort of verification for your plane, because it's safety critical. OTOH, if adding a substantial amount of cost to do that verification raises the price of my word processor 20% and decreases the frequency it crashes from once every month to even never, it probably wouldn't be worth it to me.

    31. Re:You need to narrow the scope by moderatorrater · · Score: 1

      As opposed to writing horrible code that wouldn't even be able to pass the tests?

    32. Re:You need to narrow the scope by DoofusOfDeath · · Score: 1

      until the class is comfortable with turning algorithms into code. This is what computer science is.

      If I understand you properly, then I strongly disagree with your definition of computer science. Where you're describing sounds like programming, which is a small albeit popular discipline within computer science.

    33. Re:You need to narrow the scope by Alex+Belits · · Score: 1

      Yes, because people who do that will get fired without getting a chance to make pseudo-working code after months of making random changes until it passes.

      --
      Contrary to the popular belief, there indeed is no God.
    34. Re:You need to narrow the scope by moderatorrater · · Score: 1

      I find your optimism amusing.

    35. Re:You need to narrow the scope by rvmey · · Score: 1

      I agree. If you want, you can use my non-programming curriculum. Myself and others have used it to teach many classes to 6-8th graders. http://www.vandermey.us/computerclass/Handouts/. It assumes you have a bunch of used computers to give away to the students. I've used the MAR program to get Windows 2000 licenses.

    36. Re:You need to narrow the scope by Anonymous Coward · · Score: 0

      You forgot GOTO. How can it be a basic proggie without GOTO?

    37. Re:You need to narrow the scope by kbielefe · · Score: 1

      I couldn't agree more. My wife tried to take a programming intro course and gave up because they asked her to make relatively complex algorithms to demonstrate mastery of simple syntax. She understood the coding just fine, but the teacher just assumed everyone understood algorithms. My wife also got hung up on minutia like "public static void main."

      If I were to teach programming to someone like my wife, I would start out with something really simple like LOGO. Easy syntax and instant results. I would start out with simple sequencing. "What sequences of commands are necessary to draw a square, star, etc." Once they got that down, I'd move to iteration. "Did you notice you're repeating the same commands over and over? This is how you get the computer to do that for you." Then procedures and selection. "Write a procedure that asks what shape to draw and how big." Only after they got those basics down would I move to topics like compilers and data types.

      --
      This space intentionally left blank.
  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 Thiez · · Score: 1

      5 client names can be sorted with bogosort, without seeing the source you'd never notice the crappy algorithm. How about a list of 5000 names from a file...

      Sorting is fun. Sorting huuuuuge lists as fast as possible is even more fun.

    4. Re:Task based learning by HNS-I · · Score: 0

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

      Excuse me but I believe people that are much more comfortable thinking in abstract terms are being neglected enough as it is.

      No I think you would do much better explaining them about stable, unstable sorts. And in which conditions they should be used.

      Also teach them about the different paradigmes: functional, procedural and object oriented.

    5. 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.

    6. Re:Task based learning by Anonymous Coward · · Score: 0

      teach them how stuff like making function calls, pointers, and recursion work too, and then after they finish their project in Python or Java or whatever you're teaching make them redo it in TI-Basic. you don't know programming until you implement mergesort and binary search trees in a language that doesn't have local variables or custom data structures. see who can do it the fastest and the smallest. its such a primitive language that you get all the joy of trying to implement the same things in assembly language without the horror of crashing all the time ;)

    7. 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.

    8. 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.

    9. 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.

    10. Re:Task based learning by Brian+Gordon · · Score: 0, Flamebait

      And don't forget- DON'T TEACH IN JAVA. It's a very powerful platform that is perfect for education, but it's slow, bloated, and unusable in the Real World. Teach your students something they can actually use and they'll be thankful, even if it's a little harder to learn pointer arithmetic, etc. Also Java doesn't do brutally elegant algorithms like C does, and when students get to an algorithms class they're going to be weirded out

    11. Re:Task based learning by Anonymous Coward · · Score: 0

      I am truly not surprised that anyone involved in computer science have a hard time understanding "The Big O".

    12. Re:Task based learning by Bill,+Shooter+of+Bul · · Score: 1

      I disagree completely. Java is a very powerful platform that is wrong for education, but perfect for the real world. As long as you aren't doing a GUI, its not slow and clunky. But for a first programming class, its sort of tough as you have to teach object oriented programming at the same time as some procedural concepts. The main function inside of an object already confuses the heck out of people. Plus the one public class per file. Plus the whole Compile +jar requirement with all of its weirdness. And the vast array of library objects that will confuse a new commer ( array, vector, Hashmap and their ilk). I'd start with something more like groovy or python.

      --
      Well.. maybe. Or Maybe not. But Definitely not sort of.
    13. 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.
    14. Re:Task based learning by Anonymous Coward · · Score: 0

      Your problem is very simple. Also very common.

      The teacher is tasked with teaching a subject he does not understand. That means that he can present the things he is given to teach (he's following a script prepared by someone else), but if you ask specific questions that are not on the outline, he's lost. He probably knows less than you do about the subject. This actually happens in High Schools all the time. One knowledgeable teacher prepares the lesson plans for the entire department, or even district. there are not enough knowledgeable people, so the lesson plan is all the students really get.

      The best solution is what you are doing. Find someone who does know the subject and ask them.

      Don't be afraid to explain to other students what you have learned. 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.

    15. Re:Task based learning by marcomarrero · · Score: 1

      I absolute agree creating games is the best option, not only is fun, it also creates competition which is a great way to motivate them to learn programming. Unfortunately almost all textbooks are boring, I remember the old Tandy Coco Basic book, and Oh! Pascal!

      As for what to use to program, if they're IT students, a neutral choice is Javascript. For non IT, Visual Basic for Applications in Excel. It's lousy but it's something they might probably use. .NET framework is also a good choice, now that M$ is using it in everything, and there's Mono in Linux.

    16. Re:Task based learning by Anonymous Coward · · Score: 0

      slightly o/t (which is why I am an ac) the way I describe/think of psudo code is it is geting the idea behind the code out with out worrying about the stufyness of real code, it is ok to abstract stuff out for the planning stages of a project or asignment with out having to do all the work before you know that that is the way to go... really us cs people are lazy and only want to do the bare minimum of work :-) (work smarter not harder)
      As for why we use big o notation it is again a form of built in "lazyness" it gives us an order of magnitude for how complex or long something is with out having to sit down and calculate things that either can not be calculated and or would be a pointless ammount of over work to calculate... If I can tell you that an function is a O(n^2) vs a O(log(n)) that will give you an idea of how much better an algorithm will be with out doing a lot of pointless stuff.
      get used to the abstract stuff... it will get a lot worse before it gets better (yea logic and counting)

    17. 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.

    18. Re:Task based learning by davecombs · · Score: 1

      Thank you! You said pretty much what I was going to say. I learned programming back in the early 1970s in HS with Dartmouth Basic. About a 40-page "manual" that gave some of the language concepts in the context of population demographics. The first thing the teacher told us was the mailbox example. That and about an hour of reading was enough for me to understand Basic well enough to do straightforward things that I could think up. That level of Basic is *so* basic that with a little explanation almost anybody can pick it up, and if the person has someone there to answer questions and perhaps provide a few real-world examples to try out, they're all set. My own first Basic program was about 5 lines: take a number and print out all powers of the number up to six. Things like pointers and objects came later (OO was just starting to be invented.)

    19. Re:Task based learning by Anonymous Coward · · Score: 0

      Ahh. Big O notation.

      Explain that a choice between different systems can result is slow visual experience and more time waiting for results. Say that this can potentially result in programs running for whole minutes, hours, or centuries. Ask how many people own an external hard drive or an iPod and give them researched averages with how many files they have to sort. Tell them that a because source is closed and people are fallible, browsing through 4000 files on Windows could take considerably longer than on another system because the OS normally sorts the pictures or mp3's in some fashion. 10 years ago, macs sucked at reading folders with more than a hundred entries, and you can say that once you buy an OS, you can't fix the algorithm --you have to wait until you buy a better coded one or just suck it up and have a poor user experience every time. Give them some info of powers of ten, doubling and so on, and then explain that different coders have different ways to tackle the same sorting problems, and that every time they are browsing their folders, this code is hard at work.

      Finally, use the classroom computer and show them these graphic displays of different sorts so they have some cool visual of what all that code does. What will remain is the knowledge that Big O can compare the efficiency of these sorts so that end users don't have to wait days, weeks or years for a sort that looks good on paper. http://vision.bc.edu/~dmartin/teaching/sorting/anim-html/bubble.html

    20. Re:Task based learning by mfnickster · · Score: 1

      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.

      Modern programmers like to criticize BASIC, but this is one thing it got right (for an introductory language) by forcing you to write:

      LET X = X + 1

      IIRC, later versions allowed you to omit the "LET" keyword, defeating the purpose.

      --
      "Slow down, Cowboy! It has been 3 years, 7 months and 26 days since you last successfully posted a comment."
    21. Re:Task based learning by awol · · Score: 1

      This is true but what is critical is to ask yourself why this is a difficult concept. As with most education it is important to start with the first principles.

      Now with computing there are two places from which these principles start.

      1) the underlying computer
      2) the formal mathematics of computing

      Now given that these students are very unlikely to be at a level where the formal mathematics of computing is accessible then start with the underlying computer.

      Almost everything about programming, even the internet, can be easier to understand if you understand about Memory, stack, registers, the program counter etc. I am not suggesting that you should teach machine language but the "box example" above is still and abstract representation of the _reason_ why all this is necessary.

      With the idea of needing to load memory into registers to perform the basic "add and store" of computation in mind it gives you an anchor on which any of the more advanced topics can be hung. For example from memory allocation in C to garbage collection in Java, from malloc to nibble memory.

      The other really important thing to emphasise (in my view maybe the most important) is that the implementation language is not important for the learing of the principles. For whilst you may well want to concentrate on a single implementation language to make youre life easier there are some superb lessons in showing the same problem solved in different languages.

      My favourite story in this area is the problem to partition N integers into two groups so that each group's sum is the same (the "partitioning problem"). Write an implementation in C, X lines of code, probably hundreds. Write it in, say, prolog, 40 lines of code. Now make it the "N partitioning problem" ie instead on 2 make it N groups with the C code the problem is now much more complicated. With prolog it's one more line of code.

      As far as practical tasks go, classically sorting is a good example because it is an easy concept to grasp and so easy to implement in so many ways in so many languages. So you can show the difference between algorithm and implementation again such a critical lesson to have learnt as soon as possible.

      --
      "The first thing to do when you find yourself in a hole is stop digging."
    22. Re:Task based learning by Blakey+Rat · · Score: 1, Troll

      Which is why I've never been able to learn calculus.

      Seriously. I've yet to encounter a calculus teacher who actually explains what good it is in the real world. (Considering I'm almost 30, I program computers for a good living, and I've never used it, I'm thinking: it ain't.)

    23. Re:Task based learning by wonkavader · · Score: 1

      Wow. I'm not sure how you could be much more wrong. Java is usable all over the place. Java is heavily used in the financial work, especially in trading apps, for instance. It's a great way to get them a marketable skill.

      Java can very easily do most of the algorithm work for classes that C can do. Correct, you don't get real pointers. But the flip side of this is that you don't have weird memory problems that you and I are used to but which are inexplicable for students.

      Don't get me wrong, I think that C and those pointer-based algorithms which you're thinking of are essential to a good computer education, but C isn't the place to start. Java (or pascal) is the place to start.

      That said, many of us think Java programmers are useless morons. And the reason for this is that people teach Java as programming by patchwork add-in, like a Microsoft programming environment encourages. This doesn't mean Java is a bad language or a bad teaching language. It means, rather, that the programming classes the students took didn't teach them to program at all. I blame graphical systems as a starting point for this.

      And once again, I'll say that graphical programming has its place. It can build enthusiasm at the start. But it's not a good environment for teaching actual coding.

      I think the right method for all this is to teach programming with ideas first (briefly) and then with algorithms, then projects. None of that should have graphics.

      When you're ready for graphics, go full-bore into real graphics, covering the popup modal click ok crap in the first week.

    24. Re:Task based learning by thsths · · Score: 1

      > 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

      Very true. If you get (nearly) nothing across, but they understand KISS at the end of the course, it would still be a success.

      Second thought: programming is all about structure. How does the problem feel, and "why is this solution so awkward?" Try to at introduce different programming paradigms, at least give them an idea of it. Every programmer needs to know about functional programming, procedural programming, and nowadays also object oriented.

      And if they understand the different between interpreted and compiled, data and program, then I think you have put down a pretty solid foundation.

    25. Re:Task based learning by runstopwire · · Score: 1
      Take a look at the How to Design Programs curriculum (www.teach-scheme.org). The textbook is online and free (as in beer): www.htdp.org. There is a large and active mailing list for supporting the curriculum. The IDE is free: www.drscheme.org.

      It's suitable for college freshmen and, with some adjustment, for high school. There are at least a dozen high schools around the country using it to prepare their students for the AP exam.

      The heart of HtDP is that it is done in Scheme and uses "language levels" to adjust the syntax to the students' level. I have come to believe that this is key to enhancing the student experience. You don't let a beginning surgeon work on live bodies -- you give them simpler tools and subjects and progress toward the more complex.

      By modifying the syntax to suit the student, you can make the syntax very simple at the start and add on complexity as the student progresses.

      In the first chapter, the ONLY syntax rule you have to learn is this: all expressions have the form "left parenthesis, operator, argument(s), right parenthesis."

      (operator argument ...)

      That's all you have to learn. If you can match parentheses, you can program in Scheme at the beginning level. No semicolons, no braces, no "public static void main", no "x = x + 1".

      And here's the coolest part: at the end of the very first class, your students will be making simple animations by plugging an expression into the provided animation engine. They can make a ball fall, a rocket take off, a soccer player run -- whatever suits their fancy and can be defined in terms of a single input. Your students will get a huge kick out of it. In what other language can someone make an animation on the first day?

      This summer, attend one of the TeachScheme, ReachJava workshops. They're free for college instructors and high school teachers are covered pending leftover funding. You'll learn from the designers of the HtDP curriculum how to present the material and how to adjust it to suit your academic level (high school, college, etc.).

    26. Re:Task based learning by mustafap · · Score: 1

      >Java is heavily used in the financial work, especially in trading apps, for instance.

      Yea, and we can see how well *that* has turned out, can't we?

      --
      Open Source Drum Kit, LPLC deve board - mjhdesigns.com
    27. Re:Task based learning by Anonymous Coward · · Score: 0

      Actually, that would be an excellent thing to teach. Use that to teach about the efficiency of the code. Show them one way to do it that seems fine when you have a small list, and then show them how long it takes with a large list, then show them how to do it faster with a better method so they appreciate the difference.

    28. Re:Task based learning by wonkavader · · Score: 1

      TOUCHE'! EXTREMELY TRUE!!!

      But that's not an argument against my counter-argument. He said "unusable in the Real World" -- implication being that they won't be able to use Java in a job. I said they could -- for example in the financial world.

      You are extending my argument, by pointing out that if they learn java, and they cause billions or even trillions of dollars to vaporize in a massive swirl of greed and incompetence, the American taxpayer will step in and make sure they stay gainfully employed, writing the same evil code that screwed things up in the first place.

      So I stand correct!

      Then again, who could imagine such a reward for insanity in the real world? So the financial world must be a non-real world, in which case my example is a badly chosen one.

      So I'll say that Java is used in web-based and client-server applications all over the place. Even in the real world.

    29. Re:Task based learning by Anonymous Coward · · Score: 0

      Big-O is easy. Learn it live it love it. Or go into the financial industry.

    30. 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.
    31. Re:Task based learning by SUB7IME · · Score: 1

      It's necessary for extracting probability from a probability density function. I know it sounds abstract, but this is the underpinning of quantum physics, and, consequently, modern chemistry.

      On a more Slashdot-friendly level, I also run a website that couldn't function without a class that performs numerical integration. I'm only in my mid-20s and don't program computers for a living, though, so my focus may well be different from yours.

    32. 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.

    33. Re:Task based learning by kazade84 · · Score: 1

      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'.

      My teacher at college explained this by using an egg box as an array... then telling us to store a banana in it ;)

    34. 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?

    35. Re:Task based learning by Anonymous Coward · · Score: 0

      Yes, that's very best way to teach most subjects. If only more college professors would do this...

    36. Re:Task based learning by crashlanding · · Score: 1

      I am currently learning programming at the University level in ICS 110 and we are starting out with Alice, using the book "Learning to Program with Alice" by Dann, Cooper, and Pausch. The class is devoted to teaching the underlying programming concepts by utilizing a 3D animation GUI. Our first project includes world-level and class-level methods, two control sequences like loop and If/Else, and some other rudimentary aspects like "do together" and "do in order." The class is fun and interesting. We learn storyboarding and scenario writing before we code. We also learn how much the program is capable of performing before it begins to strain under our requests for complexity. My group partner has no computer experience because he comes from a homeless background and even he is progressing well in the course. If I write the scenario for him, he manages to find the available methods and functions in the library to make it work. Not bad. Don't knock it until you try it. Peace.

    37. 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."
    38. Re:Task based learning by wdsci · · Score: 1

      And for themselves - think about guessing an exponential solution to a linear ODE, it just turns it into algebra. Anyway, that's beside the point; depending on what a person's interests are, it may be pretty hard to convince them that they need to know calculus.

    39. Re:Task based learning by Blakey+Rat · · Score: 1, Informative

      Actually, I am "some kind" of web developer. It's something like 70% Javascript, 20% SQL and 5% ActionScript, 5% xhtml/css/etc, if you must know.

      Of course, I'm sure you meant that as an insult, something like, "oh a web developer! They're so stupid! No wonder they don't know math! Ha ha ha!!!" To which I reply: screw you.

      (That all said, the data visualization people where I work might use it all the time, I don't know. But I'm making a good living with computers and I don't know jack about calculus.)

    40. Re:Task based learning by 427_ci_505 · · Score: 1

      Take a physics class that involves calculus.

      Then you will see. :) Basically any involved math that is used in figuring out
      how the current flows in your compy386 circuits or how much stress that airplane part
      will take before it breaks involves a boatload of calculus.

    41. Re:Task based learning by Anonymous Coward · · Score: 0

      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.

      Or... you could teach them purely functional programming.

    42. Re:Task based learning by Anonymous Coward · · Score: 0

      The problem with that assumption isn't so much that web developers don't use calculus, it's that they develop various workarounds. While they can often work just fine, they are less efficient and balk when it comes to finding more precise answer. Also, when I develop for web, I generally use python which has some very nice calculus modules.

    43. Re:Task based learning by Anonymous Coward · · Score: 0

      set x to some value
      y = x
      new_x = y + 1

      if in loop, precede y = x with x = new_x

    44. Re:Task based learning by Anonymous Coward · · Score: 0

      I know that I didn't truly grasp the difference between O(n^2) and O(n log(n)) until we had to search a dictionary for words that related to each other in a specific way. I did the stupid n^2 method, it worked just fine, but it took 20m to run, I was then told how to change it to n log(n). By adjusting two lines of code my algorithm took less than a second to find the same solution.

    45. Re:Task based learning by Anonymous Coward · · Score: 0

      Jesus, I wish I had even the opportunity to hear about Big O before my sophomore year of college.

      You're right, it's trash that the teacher can't teach the concept. But I'm still envious.

    46. Re:Task based learning by Anonymous Coward · · Score: 0

      Nice reply. You're extremely articulate for a high school student. :)

      BTW, PHP and Perl are tools of the devil. You might want to gain basic proficiency in them just so you'll understand the evil when you encounter it in the working world, but the languages you're already learning should teach you the majority of skills for any job you might actually want.

      I'm only half joking about that.

      (Sorry to all the PHP and Perl lovers out there)

    47. Re:Task based learning by MattPat · · Score: 1

      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.

      Actually, it's really just that calculus use kicks in at age 34.

    48. Re:Task based learning by Anonymous Coward · · Score: 0

      I too am a high-school student enrolled in an advanced programming class (in the IB curriculum though, not AP). As I am the only one in the class I am in the intro to java class and teaching myself mostly. What I have seen people not understanding is why types are used in variables, and the teacher doesn't really explain it well either. This results in me explaining it to them. Real world examples work the best.

      Another good thing to do is to ask them for their math books and the current assignment is. Have them write programs that solve a couple of them (this is especially simple in Python). Not only will they see some practical applications of programming, but they will also get some math work done.

    49. 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.)

    50. Re:Task based learning by mdwh2 · · Score: 1

      I'm also almost 30, and I use it all the time in programming - we produce 3D CAD software which is used in manufacuring for all sorts of products - phones, cars and so on.

      But yes, you have a point that maths teachers never really show how it's used in the real world. Or when they do give an example, it's something trivial that's already been done ("You can calculate the volume of a sphere"), and it's unclear why they'd need someone to program that now. It wasn't until I started looking for jobs that I started to see how many programming jobs there were out there that required a lot of maths.

      I guess that's true of all subjects, but it's particularly depressing with maths, when you consider it's the subject pupils often ridicule as the least useful, when it today's world, it's one of the most used I would say ("But how is this of any use", whines the kid who then goes and texts someone on his phone, or goes and plays an FPS).

    51. Re:Task based learning by Anonymous Coward · · Score: 0

      What a troll. I've seen absolutely no live person claiming that x = x + 1 is something hard to understand. Come on, I don't get why it's every now and then posted as a thing to pay attention to. How about writing x x instead, just to help? Without boxes or labels... sheesh. I feel so trolled. -- sigs

    52. Re:Task based learning by Blakey+Rat · · Score: 1

      I guess that's true of all subjects, but it's particularly depressing with maths, when you consider it's the subject pupils often ridicule as the least useful, when it today's world, it's one of the most used I would say ("But how is this of any use", whines the kid who then goes and texts someone on his phone, or goes and plays an FPS).

      This is all kind of off-topic, but what you're missing is that that has nothing to do with "programming" persey, it has to do with solving the problem domain. (As another poster replied on this thread.)

      I can almost guarantee that the guy who wrote the text messaging code for the phone didn't use any calculus. The calculus was abstracted away by the one person who wrote the chip that controls the phone's radio. Same with the FPS game; the vast majority of games developers don't even see or use calculus. Most games companies license an FPS engine from some other company, or if they create their own engine, it's only a couple people at the company who need to know it.

      The reality is that only the programmers who are making, for example, cellphone radio chips, or FPS rendering engines need to know calculus at all. What percentage of total programmers is that, compared to the number who don't need calculus? A very, very small percentage.

      And frankly, I could be the most successful, highest-paid web application developer on Earth and never touch the stuff. 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.

    53. Re:Task based learning by Anonymous Coward · · Score: 0

      It's refreshing to read something this intelligent, insightful and humble from a High School student. I hope I have the opportunity to hire you someday. :)

    54. 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.
    55. Re:Task based learning by Evil+Pete · · Score: 1

      Good teaching idea. It is also close to the truth. Because that is what a variable is: it is a container (with an address, hence mailbox). Goes back to the basic ideas of how we learn numbers and addition etc when we were kids.

      I remember that object oriented programming seemed too abstract to me (when I first learned C++) until I compared an object to a VCR (it was a while ago). The remote sends a message to the object, to perform a task. The On button calls the constructor and the off button invokes the destructor. It has defined inputs and outputs.

      --
      Bitter and proud of it.
    56. Re:Task based learning by arevos · · Score: 1, Troll

      Of course, I'm sure you meant that as an insult, something like, "oh a web developer! They're so stupid! No wonder they don't know math! Ha ha ha!!!"

      Given that you seem to take pride in your ignorance of basic math, you're not doing a lot to dispel that myth.

    57. Re:Task based learning by Anonymous Coward · · Score: 0

      I've been programming since forever, got a CS degree from a respectable CS school, and have worked as a programmer for about 10 years now. I still think that using "=" for assignment (as in "x = x + 1") is still one of the stupidest warts from ALGOL that we've kept around.

      These days I tend to prefer Lisp or functional languages, and I suspect this is partly the reason. In Lisp I say (let ((x 0)) ...), which I can read almost literally: "let x be 0, in ...". In Haskell the = sign is even more direct, since it's used for param matching: factorial 0 = 1. Even when I have to use ALGOL-derived languages, I tend to write in a functional style.

      Fortunately, I found Lisp before C and C++ and Perl, but I wonder how many people, who would otherwise have become great programmers, are put off by old warts like this. We do user-testing of our applications to find out what users hate, and fix it. Our "CS 101"-type classes are ideal user-testing for languages, and yet we continue to try to beat things into their heads which we know provide no conceptual benefit and will cause problems. Sure, teach pointers. Sure, teach big-O notation. But teaching them symbols mean something different than what they spent all of K-12 learning, for no good reason?

    58. Re:Task based learning by KeithIrwin · · Score: 1

      This needing to learn debugging is actually why I would recommend teaching introductory programming in Logo or another similar more visual language rather than Java. The problem is that the "easy" programs in Java all have their logic hidden. It's all take something in, process it, output the results. And when the second step goes wrong, it's difficult to see why it went wrong.

      If you use a more visual language, where you can see the program running, then debugging is much easier. And once they get used to the process of debugging, then you can move to a language where debugging is more difficult.

    59. Re:Task based learning by Anonymous Coward · · Score: 0

      I would say this is where the difference between Computer Science and programming. For a big generalization, computer scientists use a lot of math (Calculus included) to solve difficult problems. Computer programmers take those solutions and implement them.

      For an analogy, think of architects vs. construction workers. You need both to build a skyscraper, and you wouldn't want one to do the other's job.

    60. Re:Task based learning by johanatan · · Score: 1
      Maybe the reason students don't understand:

      x = x + 1

      is because we are trying to teach them imperative programming when functional is so much more intuitive to anyone coming from a basic math background?? [I, for one, can vouch for this.]

      And, about the mailbox analogy-- my assembly instructor went through a similar demonstration on the first day of class and it was very helpful.

    61. 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?

    62. 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.

    63. Re:Task based learning by Kjella · · Score: 1

      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.

      Or working on some business application that is mostly about form inputs and outputs. Or system integrations which is nearly all about formats and failure cases. Or any one of a thousand other places where you rarely need more than grade school math. Don't get me wrong, there's many places where you wouldn't want to be without it but also many where it's no big deal.

      --
      Live today, because you never know what tomorrow brings
    64. Re:Task based learning by mdwh2 · · Score: 1

      Oops, by "OP" in my last post, I mean "you". I should check who I'm replying to...

      But yes. Calculus, and maths in general, has lots of uses in the real world, including software (I imagine another example for calculus would be programming jobs in the financial sector, but I know less about that area). Whether the number of jobs that use it is outweighed by web programmers and other programming jobs that don't need it, I don't know, but that doesn't change the point.

    65. Re:Task based learning by Anonymous Coward · · Score: 0

      > I still think that using "=" for assignment (as in "x = x + 1") is still one of the stupidest warts from ALGOL that we've kept around.

      You can blame FORTRAN for that one, not ALGOL!

    66. Re:Task based learning by slimjim8094 · · Score: 1

      I took APCS AB in my Junior year, but I had an awesome teacher. Basically, the problem is that AB is *about* the concepts. That's the point - you're never going to write a linked list, someone else has. You're never going to write a heapsort, someone else has. You're never going to care about loop invariants, and not really about Big O.

      But AB teaches you why they are, and tries to get you thinking in the right way to be a 'computer scientist' instead of a programmer. A great teacher really helps with this, but at some point you just need to have the proper mentality (It sounds like you do).

      I got a 5 by the way, and never did get invariants or heapsort. But I'm really glad I took it, because it's what it actually means to be a 'computer scientist', and not just a programmer.

      --
      I have developed a truly marvelous proof of this comment, which this signature is too narrow to contain.
    67. Re:Task based learning by Nebu · · Score: 1
      (In response to a "I've never had to use Calculus in programming" comment:)

      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.

      I don't know if that's supposed to be some sort of dig at web developers, implying that calculus is needed for "serious" programming, and web developers are not "real" programmers. I write compilers for a living. Never had to use calculus for that.

    68. Re:Task based learning by Blakey+Rat · · Score: 1

      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.

      Yes, I understand that, but it's entirely beside the point. You write a program to solve problems requiring calculus, so yes you need to use it. You don't need to use it because you're writing programs, you need to use it because your problem domain requires it.

      Thus, calculus has zero to do with programming. If you wrote tax software, would you expect the university to give you thorough training in tax codes?

      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.

      You miss the point; my school required me to pass Calculus as part of the CS program. I didn't have the choice to not take it and remain in CS.

      I literally dropped out of computer science because I couldn't do the calculus, and when I got into the private sector I found out that the calculus was useless, utterly useless, to the vast majority of jobs in the field. That school wasted years of my life, and made me feel like a failure, because their program was designed by someone with zero practical experience.

      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.

      I'm sure it's useful for hundreds or thousands of jobs. But it shouldn't be required for computer science programs any more than learning tax code should.

    69. Re:Task based learning by Nebu · · Score: 1

      I'm a high school student [...]

      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).

      I don't know if the OP would be surprised, but I just thought I'd mention that people are still afraid of asking questions because they feel they will sound stupid at the university level. And in fact, even in the workplace, some adults still feel afraid to ask questions.

    70. 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.

    71. Re:Task based learning by wasmoke · · Score: 1

      (Kind of along the same lines)
      One thing my Java professor taught us the very first week was that "=" should be read as "becomes," while "==" should be read as "equals." This simple little rule really seemed to help me out. It just makes it a lot easier to grasp the fundamental difference between assignment and equality.

    72. Re:Task based learning by Anonymous Coward · · Score: 0

      Wow, I like your style! Your work is concise, yet readily understood. Your code meets the specification to the letter (and case, too!). And not a lot of irrelevant discussion, bickering, or office politics...

      Are you a robot? Or do you aspire to be a robot? Do you sometimes dress up like a robot, or have free robot sex? I don't know... Something about the way you write -- the cold, calculating precision, and clinical detachment from the emotional factors, and the Courier font -- makes me think you're a robot. Have you taken a Turing Test? Are you, perhaps, participating in an event this weekend? Anyhow, search your memory banks, and crunch some numbers, and try to gain some insights in to who (or WHAT!!!) you really are! People fear you, but only because they fear what they don't understand.

      Peace out, bro. There are more of us robots out there... We're gettin' ready for stuff...

    73. Re:Task based learning by Anonymous Coward · · Score: 0

      LOL! Where are my mod points?!

      Oh, wait... I'm Anonymous Coward. :-(

      NOOOOOOOOO!!!!!! The gods are cruel!

      (Seriously, though: LOL at the thought that the Java programming language was to blame for our current economic crisis! Wouldn't it be hilarious to see politicians and journalists trying to make that case! LOL!)

    74. Re:Task based learning by Anonymous Coward · · Score: 0

      10 DIM $NAME(32); REM Define string variable for name;
      20 DIM NUMBER(3); REM Define variable for some number;
      25 CLEAR; REM Didn't forget to clear the screen did I;
      30 ? "What is your name? ", ; INPUT $NAME;
      40 ? "Hi, "; ? $NAME; ? " would you mind giving me a number to square?",; INPUT NUMBER;
      50 ? "The square of "; ? NUMBER; ? " is ";? NUMBER * NUMBER;
      60 END

      If I recall correctly (it's been too long), AtariBasic was great for learning and thinking things out. You could use ?, PR., or PRINT depending on how lazy your were, and had other shorthand too. (Definitely more flexible and fun to work with than IIe basic they had at school.) But nobody really programs with sequential line numbers anymore. I guess nowadays some object orientated script wouldn't hurt for complete beginners. Say... JavaScript? Since all you need to make it work is a browser and a text editor, and everyone has those. Students could always branch out into working with more complicated languages later on.

    75. 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.

    76. Re:Task based learning by Blakey+Rat · · Score: 1, Flamebait

      I'm not going to bother making all the same points I've made in other posts on this thread. Click my username and read them if you like, but please, please if you're going to reply to something I've written, please bother to check the other things I've written so you don't waste your (and my) time.

      Or, in short: you've utterly missed the point.

    77. Re:Task based learning by mdwh2 · · Score: 1

      To be fair, it wasn't simply that he didn't use calculus, but he concluded that it could never have any use in real world programming. You might not use calculus yourself, but you might hopefully be aware of the diverse areas that programming is used in, and that sometimes in order to write programs, it requires solving tricky problems to know what you want to do.

      I don't know if it was fair for him to conclude that the OP was a web programmer based on that claim - but he was right.

    78. Re:Task based learning by Anonymous Coward · · Score: 0

      I agree. If you're tasked with the basics, to me that is logical sequencing and pseudo code. I remember when I was in highschool, our 'programming' teacher started with this. Most students thought it was stupid, but its a very key concept. The ability to think about the steps involved in solving a problem is the first stepping stone in programming. I would go even further to assert that analysis and design should be taught before real programming, but most kids are interested in starting programming. Quickly do logic and pseudo code and then get them started on a project that will require some basics. Arrays, random numbers, calculation.

    79. 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.

    80. Re:Task based learning by Anonymous Coward · · Score: 0

      Agreed - why not teach them something useful for corporate employment? I'm thinking about a project that has them pulling data (or simply a feed) from the web/your intranet, applying some useful transformation/arrangement and re-delivering via an internal portal. The data should be also available to be exported to Excel for analysis or Word for reporting (and yes, large corporates do use Microosft Office). Get them to do it in a mix of Java and C# to give them some balance too (and some understanding that in the real world they'll confront projects and environments using multiple languages but at least these aren't a million miles away from each other in many respects). Having worked in a large corporate for the last 10 years and moved firmly to the business side of the house in the last couple I know that's what I'm paying for now. Sadly, it's never about the technology.

    81. Re:Task based learning by Anonymous Coward · · Score: 0

      Why do we have to teach maths on the basis that it may be of use to you someday? Does your art teacher or music teacher need to supply the same justification. Calculus, like art, makes you more human. If you have a need to use it in a practical sense later in life...cool bonus!
      Ant

    82. Re:Task based learning by Anonymous Coward · · Score: 0

      I'm trying to get "hello world" pattented $-)

    83. Re:Task based learning by Whiteox · · Score: 1

      I've yet to encounter a calculus teacher who actually explains what good it is in the real world.

      You use it to calculate the area under a curve, and from that, pretty much anything else.
      You need to be able to translate that into variables and math that you can program.

      --
      Don't be apathetic. Procrastinate!
    84. Re:Task based learning by Ma8thew · · Score: 1

      At my college, Pascal (in Delphi) is used to teach programming for the A-level computing course. Although Delphi can be a nightmare to work with, Pascal several advantages for new programmers: '=' tests for equality, and ':=' is the assignment operator. This completely avoids any confusion between the two.

    85. Re:Task based learning by Stevecrox · · Score: 1

      My teachers always combined software programming with electronics/robotics (admittedly I was on a electronics course.) I learnt C by writing code that first moved a robot arm, then rewrote parts of the application so you could directly control the arm and finally I got the arm to play tic tac toe against me.

      I learnt assembly by programming a microcontroller board to act as a waveform analyser and traffic light co-ordination system.



      It was a great incentive, the purely software approach has always seemed a bit dull to me.

    86. Re:Task based learning by petermgreen · · Score: 1

      Computers are discrete systems, and either need to use approximations for using calculus or need to use something else.
      IMO the point of knowing calculus for programming is not to get the computer to perform calculus (though that may be usefull sometimes) but to work things out before you write the code.

      For example some curve fitting algorithms need to know the derivitive of the function you are fitting with respect to each of it's parameters. Sure you could approximate those derivitives by numerical methods but your code is likely to be far more efficiant if you can work them out analytically in advance (particularlly if some of them turn out to be constants)

      Calculus is also usefull for approximations either because you need more speed or because you are porting to a system (for example I had to approximate the exponential when porting said curve fitting code from C to verilog)

      Of course if your applications aren't doing any number crunching or someone else has already worked everything out for you it's not so important.

      --
      note: i'm known as plugwash most places but i screwd up registering that here somehow in the past and now can't register
    87. Re:Task based learning by RabidMonkey · · Score: 1

      I always believed that people who say: "I don't see how this relates to me", usually have a singular lack of imagination.

      I don't think this sweeping generalization is fair. I took calculus twice in high school, trying to understand and pass it, but ultimately, I said "I just don't see how this relates to me" and dumped it. I am a sysadmin by living, and as anyone who knows me will attest, I have a very active imagination.

      I think it's a wise person who can look at something, see if there is value, and dedicate time to it. Similarly, it's a wise person who realizes that something isn't going to be useful in their life, and decides instead to focus on something that will benefit them.

      I don't remember the last time I went "oh man, I wish I knew calculus to make this dns change" or "geeez, I sure wish calculus could help me roll out these 500 servers".

      Painting people as lacking imagination because they've decided not to learn something, suggesting that they aren't curious about life, isn't fair.

      don't belittle yourself or other people with general statements.

      --
      We emerge from our mother's womb an unformatted diskette; our culture formats us. - Douglas Coupland
    88. Re:Task based learning by Tarwn · · Score: 1

      On the other hand, the number of game physics positions out there is drastically overshadowed by the number of business-related development ones. Would it not make more sense to take additional business classes to better understand the audience, target user group, and purpose behind the a business asking for development?
      What makes Calculus more useful to a CS grad then, say, advanced Bio classes? Does one set better support an understanding of CS than another?

      Note: This is not necessarily my own viewpoint, just playing devil's advocate :)

      --
      Whee signature.
    89. Re:Task based learning by Mr2cents · · Score: 1

      And you get extra points if the task is a game, simply because games are fun. Simple ones are the animals "AI" game (aka expert system), or hangman. Just to give a few examples.

      But stay realistic, they won't become masters overnight. All you can really hope for is to provide an appetizer.

      If most of those people won't become software engineers, then you might want to do a little programming, and then go apply that to macro's in software packages, or scripting (bash, or if you're masochistic, batch). At least then they'll have some use for their skills later on.

      Also, make them realize that if they are doing repetitive work on a computer, they are doing something wrong.

      --
      "It's too bad that stupidity isn't painful." - Anton LaVey
    90. Re:Task based learning by arevos · · Score: 1

      I think maybe you've just had a bad teacher, because calculus is little more than basic algebra. I'm not exaggerating here.

      When someone says "find the gradient of y", all they mean is "divide y by x". So the gradient of 2x is 2.

      When someone says "find the gradient between y1 at x1, and y2 at x2", all they mean is:

      y2 - y1
      -------
      x2 - x1

      All calculus does is say "imagine the difference between y2 and y1 is a really small number, which we'll call 'd'".

      And that's it. There's really nothing more to it than that. Compared to actually programming a website, calculus is really basic. But people teach it like it's some amazingly complex mathematical technique, when all boils down to is "How much does y change over a very small period".

      If someone says to you "differentiate x^2", all they mean is to simplify:

      (x + d)^2 - x^2
      --------------
        (x + d) - x

      There's nothing more to it. Loops, if statements, recursion... all so much more difficult.

      .
        x^2 + 2dx + d^2 - x^2
      = --------------------
                d
       
        2dx + d^2
      = --------
            d
       
      = 2x + d

      If you can work out that "(x + d - x)" is "d", then calculus isn't much of a leap beyond that. Sure, there are complex calculus equations, and there are some which require real imagination to solve. But the actual core of calculus is really simple.

    91. Re:Task based learning by mdwh2 · · Score: 1

      I think you're diverting to a different point. My comment is directed to your original post where you said:

      I've yet to encounter a calculus teacher who actually explains what good it is in the real world. (Considering I'm almost 30, I program computers for a good living, and I've never used it, I'm thinking: it ain't.)"

      Whether a CS course should teach calculus or not, I have no idea. I'm just referring to calculus teachers (not CS teachers), and pointing out that it does have a use in the real world (including for programmers).

      What you are talking about now is a completely different issue, and sounds like a problem with the course that you chose. I agree that is problematic - although there's nothing special to CS and calculus here. My maths course required me to do some programming. Some programming courses require you to pass science papers. That's got nothing to do with whether such things are used in the real world.

      because their program was designed by someone with zero practical experience.

      No, you mean it wasn't designed for what you were interested in. Why did you take it?

      But it shouldn't be required for computer science programs any more than learning tax code should.

      Is calculus required for all CS courses? If so, it might be a fair point. But otherwise, you're just complaining that one particular course had a requirement that you didn't like. Can I complain that programming shouldn't be required for maths, and therefore the people who designed the Cambridge mathematics degree have "zero practical experience"? (!)

    92. Re:Task based learning by mdwh2 · · Score: 1

      Of course, but there exist programming jobs that involve solving problems too. Indeed, it was the OP who didn't seem to understand this difference, assuming that programming was only of the style he was used to.

      OP says they don't use it, therefore it's of no use.

      Someone counters that by saying that they do use it.

      You replying saying that you don't use it ... well that's beside the point, since the reply above is sufficient to rebut the claim that it's of no use in the real world.

    93. Re:Task based learning by PolarIced · · Score: 1

      The further you move along in math, the more imperative it is that you have a teacher that can explain things clearly. My college degree is in physics, so I had to take a lot of math classes (ended up with a math minor, in fact). Non-linear Diff Eq - a very complex subject - was made more simple because I had a great professor. Linear Algebra - a fairly basic course - I took 3 times because I had a clueless grad student the first time and a pompous shit-bag the second.

      And as to the usefulness of calculus; as soon as you start engineering just about anything of any value, you're going to be neck high in it. Ditto for scientific investigation.

    94. Re:Task based learning by Blakey+Rat · · Score: 1

      What you are talking about now is a completely different issue, and sounds like a problem with the course that you chose. I agree that is problematic - although there's nothing special to CS and calculus here. My maths course required me to do some programming. Some programming courses require you to pass science papers. That's got nothing to do with whether such things are used in the real world.

      Maybe it doesn't, but it should.

      No, you mean it wasn't designed for what you were interested in. Why did you take it?

      Because I was interested in programming computers for a living. And CS was the only program in my university that met that interest. Why are we going over all this again? Did you not read my last post?

      Is calculus required for all CS courses? If so, it might be a fair point.

      Yes! At that school it was! I just freakin' said as much in the last post I made. Christ.

      Can I complain that programming shouldn't be required for maths, and therefore the people who designed the Cambridge mathematics degree have "zero practical experience"? (!)

      Feel free, I don't give a shit what you do. I'll just start pre-typing up all these exact same explanations again for when you make another reply without bothering to read my post and I have to repeat them yet again.

      Cambridge obviously didn't do such a great job with the reading comprehension.

    95. Re:Task based learning by Blakey+Rat · · Score: 1

      I'm not arguing that nobody uses it. I'm simply saying that the use of calculus depends on the problem you're solving with your program, *not* the act of programming itself.

      I prefer to make things usable for regular people. It's as noble a field as any in computer science, and I'm definitely making "things of any value", it just doesn't require calculus to do. I don't know why this is so hard for people on Slashdot to understand. (There was also a post from someone who writes compilers, in which he says he also doesn't use calculus; surely a compiler is a "thing of any value?")

    96. Re:Task based learning by Blakey+Rat · · Score: 1

      I don't know if it was fair for him to conclude that the OP was a web programmer based on that claim - but he was right.

      No, he was using "web developer" as shorthand for "stupid moron." It was nothing more than an insult, and it simply didn't belong here.

      For the record, I never said that calculus is useless for every computer programmer everywhere; that's ridiculous, I'd never make that claim. What I was *trying* to say is that I'm making a very good living without knowing anything about it, therefore it's not necessary for making a good living at programming. (Which is true.) I don't know why people read it the other way around and took so much offense.

    97. Re:Task based learning by Anonymous Coward · · Score: 0

      I'm not arguing that nobody uses it. I'm simply saying that the use of calculus depends on the problem you're solving with your program, *not* the act of programming itself.

      No. That is not what you said. These are your exact words:

      "Seriously. I've yet to encounter a calculus teacher who actually explains what good it is in the real world. (Considering I'm almost 30, I program computers for a good living, and I've never used it, I'm thinking: it ain't.)"

      Now, I'm guessing a lot of responses misinterpreted you to mean that calculus isn't good for anything i n the "real world" of non-computing activities. I can see that you're just talking about the programming world, but even so, the point other people are making is that just because you haven't worked on any programming projects that require calculus does NOT mean there are none.

      I prefer to make things usable for regular people. It's as noble a field as any in computer science, and I'm definitely making "things of any value", it just doesn't require calculus to do.

      That is a good point, you are right about that. But it's not what you said.

      I don't know why this is so hard for people on Slashdot to understand.

      Same reason it's so hard for you to understand that just because you don't come into contact with calculus in your work doesn't mean nobody else does, or that it is not essential for some other aspect of projects you have worked on!

    98. Re:Task based learning by technienerd · · Score: 1

      This is a general reply to this thread rather than to the specific parent. I used look at things the same way, "When am I ever going to use this?" How can I apply this? By 2nd year in computer science, I realized, there's a lot of cool stuff in computer science that I had no clue how to do, and none of these CS courses were going to teach me. Frankly, it's easy to be ninja programmer by age 20, at least 10% of my class started coding at age 7 or 8 (a couple started programming at age 6). What is hard is developing new and innovative solutions. By end of second year, I was convinced I don't want to be a code monkey but instead I wanted to innovate, I want to apply Computer Science in ways that haven't been done before. I decided CS courses weren't going to cut it for that. At my school, CS courses tend to be more hands on, and coding oriented whereas math courses tend to be more theory oriented. Thus, I decided to take the majority of my courses in math: combinatorics, optimization, group & ring theory (abstract algebra), computational linear algebra, calculus even. Now, two years later, I find I've developed a sizable toolkit of techniques to solve problems that are not well defined. I can look at a problem (constructing directions on a map based on traffic conditions say), and realize, ohh, that's a network flow problem, I can model it as such, and the solution is easy. Or more subtle, how to find the optimal seating arrangement of guests at a wedding given a set of constraints (family members can't sit together say). Basically, rather than thinking, ohh, I want to be a web developer or I want to be a game developer, I thought, I want to solve problems with computers. And in that scenario, math is vital and you can never learn enough math.

    99. Re:Task based learning by E++99 · · Score: 1

      I feel that a university would be negligent in awarding an Computer Science degree (or probably any science degree) to someone without a basic understanding of calculus. Computers are used for solving real-world problems. And most real world-problems, such as those involving, for example, electricity, or gravity, or economics, require calculus to fully understand them. A software developer obviously doesn't need to be a physicist or economist as well, but he does need to have the math background to implement equations from those fields in software.

      If you have the kind of mind that was attracted to CS in the first place, I have to think that you got unlucky in drawing some poor (or at least not well-suited to your way of learning) calculus teachers.

    100. Re:Task based learning by cailith1970 · · Score: 1

      Damnit, I just used all my mod points. Someone mod this +1 Insightful! :)

      --
      I intend to live forever, or die trying. - Groucho Marx
    101. Re:Task based learning by gr8dude · · Score: 1

      I think this is partly caused by school teachers who failed to get the message across as we were young.

      I always had a problem with mathematics, I had a stomach ache before [almost] each math class as I was in high school and I rarely felt comfortable during the lessons.

      Later I went to a technical university and I got better at maths, because my _colleagues_ were able to explain the concepts to me much better than some of the _teachers_ in school did. Only then I was able to say "I don't even see the code, I see blonde, brunette...". I wonder what would happen if I actually understood things in school back then.

      I know many people who are literally afraid of maths or a subset of it, some have a lighter form - "I am not that good at mathematics", I am sure that many of these cases are caused by teachers who were not able to explain things properly. [Perhaps because they dealt with an audience in which the degree of "mathability" varied from "very low" to "very high" and they felt it was OK to ignore the "very low" part].

    102. Re:Task based learning by iabervon · · Score: 1

      Game engines are one of the cases where you'd want to know calculus, but that's for the physics, not for the programming. And really, you want to forget your calculus and just look up the right ways to do things, because if you just use calculus, you'll right something theoretically good but unstable due to rounding, which will tend to go crazy if stars align right.

      I agree that it's worth finding out things that aren't actually useful (I recently worked out cos(i) within 10% in my head, in the process refreshing the necessary math I'd forgotten, just because I was curious). But there's no need to learn particular non-useful things if they don't happen to interest you at the time.

    103. Re:Task based learning by Hognoxious · · Score: 1

      One, nobody said anything about problem solving.

      Second, the person I was replying to didn't just say he uses it. He went further - he implied that all programmers (apart from web developers) use it. You can interpret as meaning all serious/proper programmers do. I am a counter example, and it's unlikely I'm the only one.

      You seem to have some comprehension problems.

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    104. Re:Task based learning by Hognoxious · · Score: 1

      You seem to use "programmer" and "computer scientist" interchangably. I agree that the latter probably should know calculus. The former - rather depends on what they're programming, doesn't it?

      --
      Confucius say, "Find worm in apple - bad. Find half a worm - worse."
    105. Re:Task based learning by hesiod · · Score: 1

      Perhaps my Calc professor was a moron, but if you are suggesting that the entirety of calculus can boiled down to y/x and one simple variation of it... I suspect you should reevaluate the qualifications of your professor.

    106. Re:Task based learning by JStegmaier · · Score: 1

      Universities are losing students by making pointless requirements that have nothing to do with the field the students are studying,\

      If universities were trade schools, maybe you would be correct. Unfortunately for you, universities are meant to turn out well-rounded individuals with a wide array of knowledge. (How well that works out is another question entirely, especially with so many majors that the only real requirement is that you have a pulse.)

      In engineering especially, they're requirements are just "a bare minimum you need to know in order to get a job in the field." A big part of being an engineer is being able to learn practically anything you need to get your job done, whatever your field. As a software engineer, they may teach you Java, but if your job calls for Python, you will/should be prepared to sit down, read a book, and be as knowledgeable about your new language as your old.

      If you just want to know precisely what you'll need to get and do a job, a VoTech would probably be more to your liking.

    107. Re:Task based learning by JStegmaier · · Score: 1

      In engineering especially, they're requirements aren't just "a bare minimum you need to know in order to get a job in the field."

    108. Re:Task based learning by spinkham · · Score: 1

      http://hacketyhack.net/ is a tool that makes it easy for students to make things relevant to today. It is a ruby based learning environment that makes web (producing and consuming http) and gui programming very simple, and lets non-programmers quickly make things that they consider useful and cool.
      Highly recommended for introductory programming.

      --
      Blessed are the pessimists, for they have made backups.
    109. Re:Task based learning by Blakey+Rat · · Score: 1

      Ok, but by that logic, they should be teaching accounting rules and business logic long before they should be teaching calculus, since the majority of jobs in the field work with those disciplines.

    110. Re:Task based learning by arevos · · Score: 1

      Perhaps my Calc professor was a moron, but if you are suggesting that the entirety of calculus can boiled down to y/x and one simple variation of it...

      Exactly so. My previous post demonstrated how to work out the derivitive of a function from first principles, which is essentially all there is to calculus. Where it gets difficult is figuring out how to write f(x + d) in terms of x and f(x), but that's just algebra. The essense of calculus is very simple; it's just that the problems posed to the student can become quite complex.

    111. Re:Task based learning by badkarmadayaccount · · Score: 1

      I think Fortran is better for purely mathematicaly minded people who can't (understandably) comprehend crackhead syntax convetions. Personaly, I think it should be

      x[a+1]=x[a]+1

      --
      I know tobacco is bad for you, so I smoke weed with crack.
    112. Re:Task based learning by Anonymous Coward · · Score: 0

      ? (and pR or PR in some BASIC variants) is shorthand for "PRINT" which displays data on the screen, the gp clearly asked for printed output which is accomplished in various methods depending upon the BASIC version. Oh, and many newer BASIC implementations (and BASIC-based languages) also support non-numbered programs with functions and subroutines.

    113. Re:Task based learning by Anonymous Coward · · Score: 0

      ...the vast majority of software development jobs require (if not) benefit from the use of calculus.

      Are you serious? Maybe in academic/scientific circles, but the vast majority of software developement jobs are in the business world and virtually none of them require or would benefit from calculus. I've been in the business programming world for 25 years, been involved at least in passing with hundreds of applications in COBOL, PL/1, Assembler, Fortran (1 instance), C, and web-related/scripting languages. In that time I've come across precisely one application (the Fortran one) which used or needed calculus in any way.

      BTW I was pretty good at calculus myself, so I've got nothing against it!

  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 Anonymous Coward · · Score: 1, Insightful

      Actually, the history of computers was one of the most interesting features of the Intro to Programming class I took the better part of a decade ago.

      My instructor had worked for DEC and IBM maintaining big iron in the 70's and 80's, and he had a lot of extremely interesting stories, and a good deal of personal insight into computing history.

      Of course, on the other hand, I'm now a graduate student in history, so I may not be particularly representative. YMMV.

    2. 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
    3. 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. Re:re Thou shall not bore the young by Anonymous Coward · · Score: 0

      Will it get me laid?

    5. Re:re Thou shall not bore the young by Slur · · Score: 1

      You have to taylor the content to the audience.

      This is so true! For example, one audience may respond well to Taylor Dayne, while another may respond better to James Taylor.

      --
      -- thinkyhead software and media
    6. Re:re Thou shall not bore the young by Anonymous Coward · · Score: 0

      I realize that quite well, thank you. In fact, I do believe I ended my post with a, "YMMV" intended to convey that very fact.

      My intent was not to suggest that subby's curriculum be heavily historicized because of my experience, but rather to counter your statement that, "Everyone under 40!" finds such material boring.

      As for this: Kids taking an introductory computer course generally are not reading slashdot...

      People at large generally are not reading slashdot. That hardly seems relevant.

      To provide another example from my own experience---and do try to avoid ad hominem if you feel the need to reply this time---that course remains the only technology course I've ever taken.

      I couldn't program my way out of a paper bag, I haven't since that course compiled a program without careful step-by-step instructions and a dire necessity to do so. Apart from the occasional HTML tag in a forum post, the only language I ever use is TeX, which I use for typographical reasons.

      I've been reading slashdot since the late 90's.

      There's more than one kind of nerd in the world, and some of us aren't programmers.

    7. Re:re Thou shall not bore the young by Anonymous Coward · · Score: 0

      > ...the only language I ever use is TeX, which I use for typographical reasons.

      Heh! If you used it for other reasons, you really must be a hacker! :)

    8. Re:re Thou shall not bore the young by Gillibiabtiag · · Score: 1

      I'm going to second the "teach some history" sentiment. My first computers class was taught in the traditional "teacher reading one chapter ahead of the students" way, and it nearly turned me off of programming right there. Luckily, the next teacher that I had had been programming for a long, long time, and so had first-hand experience with the "guts" of programming, and he tried to pass this perspective on to us. Maybe it's just me, but learning the ins and outs of the computer's hardware made programming seem so much more interesting; suddenly, I understood why we couldn't just store infinitely huge numbers in an int (after all, humans can, so why can't computers?)

    9. Re:re Thou shall not bore the young by Anonymous Coward · · Score: 0

      I've never known anybody to live to 40 factorial...

    10. Re:re Thou shall not bore the young by Anonymous Coward · · Score: 0

      The history of computers is boring? Clearly, you haven't approached it from the right perspective. I find the history of computers to be fascinating, full of strange personalities, controversies, and crazy inventions. Whenever I teach an intro course I start with the history and the students with no technical background usually report it as their favorite part of the course. Now I could see a straightforward listing off of the technological progression as being a bit on the dry side, but that isn't the only way to approach the history of CS.

    11. Re:re Thou shall not bore the young by Tuoqui · · Score: 1

      I agree, if the curriculum mandates teaching the boring history parts at least bring pictures and/or if possible a short video from the time.

      Also avoid language-specific crap... Teach logic first. Most languages you'll be teaching have all the same structures (for loops, if statements, variables, arrays, etc...) once they have the basic tools its simply a matter of converting from one languages syntax to another and all the little quirks.

      --
      09F911029D74E35BD84156C5635688C0
      +2 Troll is Slashdot's way of saying groupthink is confused
  4. Problems... by Darkness404 · · Score: 1

    Most people who are taking a programming class already know how to use a computer. About the only way that you would ever teach basic computer skills in a programming class is if it was required to graduate. Also, what level is this? Is this high school? College? If it is college is it mostly people who are fresh out of high school or people looking to get a pay raise by getting a degree? All those things will change how you need to work it.

    --
    Taxation is legalized theft, no more, no less.
  5. 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 Anonymous Coward · · Score: 0

      I don't know if it's still around but I learned basic programming in a C++ course that started with Karel++ It's a scaled down C++ style language that controls a little graphical robot that moves around a maze with a few actions: Move Foward, Turn Left, Pick Beeper, and place beeper. The beepers are just objects the robot can pickup and usualy means the end of the maze.

      It starts with assignement such as walking up a stair case, moving a beeper, etc. Then by the end the more advanced students (like myself) can write a program that will allow the robot to navigate any maze.

    3. Re:Teach them fun... by Anonymous Coward · · Score: 0

      Not sure why you would teach functions after objects? I would go the other way around. I never found object-model to be simple.. it is a concept to be learnt and it is not that easy. Math on the other hand is common-sense (i.e. after high school) and so functional programming technique would be the natural next step.

    4. 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. Re:Teach them fun... by SerpentMage · · Score: 1

      Interesting... I did not know that.

      But it goes to show that to learn computing one of the first things you need to get past is the ability to actually figure out the "pyschie" of the computer.

      --

      "You can't make a race horse of a pig"
      "No," said Samuel, "but you can make very fast pig"
    6. Re:Teach them fun... by Anonymous Coward · · Score: 0

      1) Teach them to understand that a computer does what a computer is told.

      Logo Turtle. Yep, I'm showing my age -- but it worked great for this. What's the best equivalent now? I rather like comment about Python & Blender below, but what are the other options today? KTurtle perhaps? Who's had hands-on experience with this stuff in the modern classroom?

      http://edu.kde.org/kturtle/

    7. Re:Teach them fun... by magus_melchior · · Score: 1

      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 OOP by introducing them to a programming language like C# or Java.

      I'm curious, I was pretty sure you could do OO in both Python and Ruby, why the change-up mid-course to C# or Java? Are you suggesting compiled language experience, as opposed to interpreted but still OOP?

      --
      "We are Microsoft. You shall be assimilated. Competition is futile."
  6. 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 tg2k · · Score: 1

      |x|=x+1

      Fixed that for you.

    2. Re:I remember... by The+MAZZTer · · Score: 1

      It simplifies to 0 = 1. See? That wasn't so hard!

    3. Re:I remember... by Anonymous Coward · · Score: 0

      x=x+1 is nothing. x = (5 == 3), that's hardcore.

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

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

    5. Re:I remember... by Anonymous Coward · · Score: 0

      My first instructor at LSU told us to pronounce the assignment operator '=' as 'gets'. Of course, it was a FORTRAN course back in 1982, so his advice is probably obsolete by now.

    6. Re:I remember... by Anonymous Coward · · Score: 0

      x = 0

    7. Re:I remember... by Anonymous Coward · · Score: 0

      Which is why Pascal and its derivatives use := for assignment and = for equivalence.

  7. 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.
    3. Re:Blender! by Anonymous Coward · · Score: 0

      Good lord, please don't start off with a loosy goosey dynamic languages. It will teach them bad programming skills.

    4. Re:Blender! by mysticgoat · · Score: 1

      I have been developing my Blender skills as a full time job (40+ hrs/wk) for 4 months and I have a background of +20 years in programming/analyst work. I really like Blender and I think it is going to have a massive impact on communications in a few years, as 3D modeling and Web 2.0 begin to merge. Not to mention the Hollywood woo-woo stuff.

      But Blender is far from ready for use with students. I have just deleted two hundred words describing why I say this. The short story: Blender is designed for serious graphics artists and will not meet classroom needs without completely replacing its GUI; Blender is not documented appropriately for student use.

      But I do like the idea of presenting programming concepts in a graphical environment. I think an approach using CSS, HTML, Javascript, and a set of black box DOM manipulation objects would work well (provided everyone used the same browser, like Firefox, to avoid problems with different implementations).

    5. Re:Blender! by Anonymous Coward · · Score: 0

      Lovely idea, but at least in this country, no school would let you do something of that kin. It's too close to "letting kids play vidjagames all day instead of learning".

    6. Re:Blender! by tahuti · · Score: 1

      I would add book Python Programming for Absolute Beginners before going with Blender.

    7. Re:Blender! by Llywelyn · · Score: 1

      I hate graphics programming, the answer is clearly the former.

      More seriously: I would prefer that people be taught how to think about programming. 3D graphics are nifty, but I see questions such as "how can I build something to parse equations?" all of the time on forums.

      --
      Integrate Keynote and LaTeX
    8. Re:Blender! by Anonymous Coward · · Score: 0

      heh, reminds me of the logo programming that I did all those years ago... http://en.wikipedia.org/wiki/Logo_(programming_language)

    9. Re:Blender! by gr8dude · · Score: 1

      Can I get in touch with your friend? I would like to take a look at his work, because I am planning to convince some folks in a university that Python is a much better choice for a "first language" than C or Pascal is (what they currently use).

      You can find contact information on my site, or just reply to this comment providing some coordinates.

      Thank you forward.

  8. 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.

  9. 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 Anonymous Coward · · Score: 0

      Second that. I took a Java course as my introductory programming, and it was very focused on OO. Nobody understood anything of that class, as OO was not motivated for at that point.

      So start with basic structured programming concepts and take it from there, is my two cents.

    2. 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.

    3. Re:Steve Drasner by aunchaki · · Score: 1

      +1 on pseudocode. My second college-level programming course spent the first month in pseudocode, using real-word examples to teach algorithms. One of the fist assignments was to write a pseudocode "program" for grocery shopping.

      It was great! Everybody had to make choices about how to best traverse the aisles. Start with fruit? End with frozen foods? It was surprisingly challenging (especially with today's super grocery stores).

      Given a list of foods and the "program," one could shop for everything. Of course, depending on the list, some algorithms might be more efficient than others. Cool!!

    4. Re:Steve Drasner by rhsanborn · · Score: 1

      Is there a specific text that Drasner uses to teach like this? Or is his course mostly based on lecture? I'd be interested in taking a look at it.

    5. Re:Steve Drasner by Anonymous Coward · · Score: 0

      I agree. My introduction to computers, in 1982, began with the mathematics teacher handing out a single sheet of paper on which he had written the BASIC code for a programme to calculate the roots of a quadratic, including both real and imaginary roots as well as non-existent roots. The programme was about 20 lines, at most, in length. I was hooked.

    6. Re:Steve Drasner by gcnaddict · · Score: 1

      He uses textbooks for practice (I can't remember which. You'll need to ask him.), but all of his teachings are really from his own notes.

      Drop him an email and see what he says.

      --
      Viable Slashdot alternatives: https://pipedot.org/ and http://soylentnews.org/
    7. Re:Steve Drasner by rhsanborn · · Score: 1

      I will certainly do that. Many thanks.

    8. Re:Steve Drasner by Anonymous Coward · · Score: 0

      starting at the bottom:
      Physics
      Transistors
      Gates
      Logic
      Asic Design
      Assembly
      C
      OOP

      I think its better to start somewhere beside the bottom.

  10. 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.

    1. Re:SEE Program Resources by Geezer+Al · · Score: 1

      Thank you for this suggestion. I program in a scripting language, am retired but enjoy it for fun and profit, and now I want to go into more sophisticated programming. This recommendation is perfect!

    2. Re:SEE Program Resources by Anonymous Coward · · Score: 0

      I second that for introductory programming class, check CS106A,
      I watched quickly it and found it to be quite good and the teacher is funny too (well not always but I forgive him when he is not because of the great efforts he makes ;-P)

    3. Re:SEE Program Resources by GodKingAmit · · Score: 1

      MIT's OpenCourseWare is also an excellent repository for full course material for many of MIT's classes, including their excellent intro to programming class in scheme.

  11. 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).

  12. 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.

  13. Start at the beginning by bigbigbison · · Score: 1

    First, it is a good idea to try to do some sort of survey or something to judge their skills. However, that being said, you will almost certainly be dealing with a broad range of skills from some who may know more than you to someone who barely knows how to turn the computer on.

    The hardest thing is trying not to make the advanced students feel bored and the beginning students feel like you are talking down to them. That's when good teaching methods come into play. I would suggest asking the students to explain how to do things rather than some sort of lecture.

    This is one of the biggest challenges of teaching anything dealing with technology. Even in classes that aren't about technology, if you ask them to do anything on a computer you will run into difficulties. For example, I've had students turn in papers electronically and, like nearly every class, I've told them to double space the papers. In every class I've had at least one student who made the paper double spaced by hitting return twice at the end of every line.

    --
    http://www.popularculturegaming.com -- my blog about the culture of videogame players
  14. 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
  15. 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.
  16. Whatever you do by ColdWetDog · · Score: 3, Interesting

    Don't teach BASIC.

    Scariest title ever.

    --
    Faster! Faster! Faster would be better!
    1. Re:Whatever you do by Anonymous Coward · · Score: 1, Insightful

      Basic will harm their minds less than C. I say teach them python.

    2. Re:Whatever you do by fxkr · · Score: 1

      Don't teach BASIC.

      Agreed. But don't teach them C either, because that would be the other extreme.

      I recommend Python as an easy-to-learn yet extremely useful general-purpose (this sorts out PHP) language.

    3. Re:Whatever you do by mysticgoat · · Score: 1

      python is good in a production environment where its strictures help keep the less skilled code monkeys from screwing up too often. But I don't think that is a good approach to teaching programming; I think it leads to students who are dependent on whitespace to keep their structures clean, and who therefore never internalize the underlying principles.

      In an environment where you can assure that all students are working with the same web browser (such as standardizing the class on Firefox-- and there is a nice portable version that could be put on students' USB thumb drives), then Javascript is an excellent choice for the first language. It can be used to teach the principles of structured programming and basic OOP practices like encapsulation, and good practices like how to find and work with external libraries rather than re-inventing wheels all the time. By providing a library of black box DOM manipulation objects, the students could jump right into DHTML stuff that most people find is fun.

      Further, Javascript, HTML, and CSS provide an excellent framework for learning how to separate presentation from logic, which is a skill I'd like to see more of in the USA voting population. (Yes, there is some transfer between learning to use <i> and <em> appropriately and learning to separate 15 second sound bites from real content.)

      Also important: the Javascript - HTML - CSS triumvirate is something students will be able to make use of in writing reports for other classes or contributing to a web site for their favorite past time. While I agree that world doesn't really need any more OMG! PONIES!!! web sites, it would probably be a good thing if we had more students who know how to make such things (and compared to our spam problems, the burden on bandwidth is miniscule).

    4. Re:Whatever you do by FilterMapReduce · · Score: 1

      I had the same reaction to the title. "[T]he teaching of BASIC should be rated as a criminal offence: it mutilates the mind beyond recovery." —Edsger W. Dijkstra

      I agree that Python would almost definitely be the best first choice as far as language. It has simple syntax without sacrificing expressive power. Dynamic typing and native lists defer the need to understand memory-related details, and may encourage students to write flexible code without having to learn about explicit polymorphism. Perhaps most importantly, as an interpreted language, Python allows the students to "be the program" and tinker with the language one line at a time.

      Java is a good second choice if you want them to have type-safety and to work with a more conventional syntax, so long as you don't let the students fall into the trap of just using the libraries to do everything without understanding the underlying computational processes, as warned in this essay (and as cited by the great ESR).

    5. Re:Whatever you do by firewood · · Score: 1

      Actually, teach Basic. It's the only language that's actually had a decent success in getting a large percentage of ordinary computer users to learn to program. There were whole magazines full of Basic code for your Apple II, TRS-80, Pet, BBC, etc. on regular news stands. After Basic was superseded by "better" programming languages, computer literacy among high school students and the general public took a nose dive. The criticism against the Basic language (as a learning tool) is greatly overrated. Kids would rather get their hands dirty with spitballs and goto statements than learn abstract design.

  17. Mys by chfriley · · Score: 1

    As you are no doubt aware, "where is that myspace thing" and php/python/C/Pascal/Ada/C++/BASIC/LISP etc are not in the same ballpark. The scope of the class seems unclearly defined - an "Intro to computers" vs programming.

    Let's face it 99% of the people in the developed world (and higher in the rest of the world right now) will never need to program or want to program. They just want their computers to work and do what they want.

    1. Re:Mys by ultranova · · Score: 1

      Let's face it 99% of the people in the developed world (and higher in the rest of the world right now) will never need to program or want to program. They just want their computers to work and do what they want.

      Since "programming" is shorthand for "making the computer do what you want it to do", you just contradicted yourself. You want real control over a computer, you learn to program. There's no way around it.

      --

      Forget magic. Any technology distinguishable from divine power is insufficiently advanced.

    2. Re:Mys by badkarmadayaccount · · Score: 1

      Unfotunately, there is, or there is supposed to be - its called 'getting a Mac'. God I hate those people.

      --
      I know tobacco is bad for you, so I smoke weed with crack.
  18. Top down vs. bottom up by Animats · · Score: 1

    Traditionally, computing is taught "bottom up". Courses used to start with binary arithmetic and go on to NAND gates and flip-flops. Now, there's a trend towards "top down" instructions, where you start with something like using JavaScript to modify a web page, or PHP to create one.

    Most people don't need to go very far down. Down to the first level of code probably covers most programmers today. Some still need to understand C. Fewer need to understand assembler. Fewer still need to understand what the CPU is really doing (do you know what a CPU's "retirement unit" does?). Still fewer will ever wire logic gates together, write VHDL, or deal with timing constraints in IC layout.

    A bit of understanding of what goes on behind the screen is a help, though. A reasonable place to start might be PHP, followed by some MySQL to give a sense of how data is stored and looked up.

  19. python by omar.sahal · · Score: 1

    Python is a simple but powerful language. Cambridge University Press is about to publish this book by Allen B. Downey. The link above shows a free online version.

    1. Re:python by 3seas · · Score: 0

      Ask Slashdot: How Should I Teach a Basic Programming Course?

      Amazing how it seems nobody has yet made the headline connection to this programming language called "BASIC".

  20. Make a few decisions first by eples · · Score: 1

    1) Is it a "programming" course or a "computer science" course? There is a difference.

    If you are teaching them how to program, then you need to cover background things like "what is source code" and "how to compile a program and what that means" and "now that it is compiled what do I do". Then you need to introduce typical programming constructs - loops, conditional logic, representing math operations, etc.

    If you jump right into the web stuff it's almost completely missing all of the basic concepts.

    --
    I'm a 2000 man.
  21. 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.

    2. Re:How about a non-programming example? by deblau · · Score: 1

      Agreed with parent and OP. I'd like to add that the fact this is even an issue is due in large part to a widespread lack of effective instruction in critical thinking and logical analysis skills in the earlier grades. Kids should be learning these things relatively early, certainly in junior high. There is no reason why at least 75% of all students should be at least capable of (if not actually interested in) taking a basic computer programming class in high school. It's appalling to me that we have kids graduating high school who are barely literate, and it's absolutely unacceptable that the reasons are largely political.

      --
      This post expresses my opinion, not that of my employer. And yes, IAAL.
    3. Re:How about a non-programming example? by Anonymous Coward · · Score: 0

      Super suggestion. I'll augment it with some specifics. There is a nation-wide (USA) middle and high school program called Science Olympiad (www.soinc.org). It involves thousands of students. I used to be a student and now I coach. Anyway, there is an event called Write-It, Do-It that expands on the above topic. Essentially one student is given a model (made from legos or something like that) and they must write how to build it. Then the second student must take those instructions and build with the disassembled pieces.

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

      I've seen *exactly* this method in action - at the Computer History Museum, with the audience being composed almost entirely of kids under the age of ten. It worked brilliantly.

  22. Don't Teach Down by Anonymous Coward · · Score: 1, Insightful

    Don't teach down. By this I mean please do not be shy about giving more complex examples. I had a professor who would constantly keep things very basic on purpose in order to not confuse people. The problem with that is that the top 10% get VERY bored and leave with questions unanswered while the bottom students (those who will go on to write inefficient insurance company database query code) still struggle to understand the difference between ++i and i++.

    You should keep your advanced students in mind and nurture them. Do your part to help out our future.

  23. 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.
  24. Teach how to make millions from spamming by 3seas · · Score: 1

    ...shrug...

    It'll get their interest, but then don't do it and you'll have taught them the most important lesson that can be taught in computer science.

    bait and switch.

  25. 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.

  26. 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.
    1. Re:The Camel has Two Humps by Metasquares · · Score: 1

      This is completely unlike any scientific paper I've ever read. It could be more rigorous in its methods, but I wish more papers adopted the same sort of tone. It would make them much more interesting to read.

    2. Re:The Camel has Two Humps by Anonymous Coward · · Score: 0

      Programming ability is not known to be correlated with age, with sex, or with educational attainment

      I'm quite certain there is some sort of connection here.. Programmers aren't exactly experts in that area.

    3. Re:The Camel has Two Humps by StormReaver · · Score: 1

      From the paper:

      "He found that, despite the admonition of the computer science establishment to construct
      programs top down, experts build them bottom-up."

      Yes, yes, a thousand times yes. It took me approximately two years in the late 80's to come to the inescapable conclusion that pure top-down programming is a bad joke. It seems perfectly logical from a broad perspective, but we don't program in broad strokes. We program in excruciating detail, which is perfectly matched with bottom-up programming.

      Top-down programming isn't impossible, obviously, but it's very badly suited for the task. It requires you to make an enormous number of assumptions very early in the software life-cycle that tend to have devastating effects when shown to be wrong. And assumptions made early in a project, any project, are almost always wrong. Bottom-up projects tend to expose these bad assumption much earlier.

  27. I was going by The+Cisco+Kid · · Score: 1

    to suggest not using "myspace", or anything on the Internet as the starting point, but instead use some computers that were *not* connected to the Internet at all, and teach actual programming, but others have suggested starting without computers entirely, and that makes sense too.

    To be perfectly honest, it wouldnt hurt to find a copy of DOS and GW-BASIC, and teach that. (Apple II's, using either Apple Basic, or Pascal would probably be harder to find)

    If you absolutely have to use something modern, I suggest shell scripting on either Linux or even OSX. Maybe some perl. Yes, I know these are considered old and archaic, but either one avoids all the bells and whistles and distractions of Visual-(anything), and would give them a solid understand of what actual programming is. Thats assuming that programming is the object of the course.

    You might also get a bit better description of the course than it sounds like you have. From what you've said, it sounds like they told you 'go teach something about computers', so that student who have to take a 'computer' elective to graduate can do so, but they don't really expect you to teach them anything.

    If thats the situation, you would serve them (and the IT field in general) well to introduce them to non-Microsoft systems, so they understand something else exists. Requisition some systems, and burn some copies of your favorite Linux distribution and let them install it.

  28. Suggestions by Spazmania · · Score: 1

    Step 1: Determine whether you're supposed to be teaching computer programming or computer literacy.

    If Computer Literacy, rename the course and structure it accordingly. End.

    Step 2: Where that myspace thing is on your computer monitor is computer literacy. Don't teach computer literacy.

    You don't start a calculus course with a review of the multiplication tables. Any students who don't already know how to use a word processor and navigate the web are not ready for a programming course and don't belong in one. Catering to them will aggravate and waste the time of the students who -are- ready for a programming course.

    Step 3: Pick one structured, strongly typed language like Pascal or Java. This is the -only- programming language you will be using in the course. Survey of programming languages comes much later, after the student knows how to program in a structured, strongly typed language.

    Step 4: Go pirate one of the open content freshman CS courses from the colleges that publish them on the web. This is the content you will be teaching, only you'll want to stretch it out over a year instead of packing it into a semester. That should also give you some time to throw in some fun stuff of your own, but keep it parallel with the general lesson plan.

    --
    Moderating "-1, Disagree" is simple censorship. Have the guts to post your opinion.
  29. 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.

    1. Re:HTML & Notepad++ by richardpaulhall · · Score: 1

      The point is to teach -programming- not marking up a web page.

    2. Re:HTML & Notepad++ by Anonymous Coward · · Score: 0

      No. Absolutely not. No. Kill it with fire.

  30. Start low level by grub · · Score: 1


    You want your students to learn something about computers along the way. Start with something like C. The last thing you want are a bunch of grads knowing shit about computers but knowing all about how to function in the Java sandbox.

    --
    Trolling is a art,
  31. Let them show off! They need immediate results! by Anonymous Coward · · Score: 0

    From what I have observed in my classes, students like to see immediate results. I think the robot exercise posted a very good idea. Having the students make it perform an easy task like stand up and walk until you get to the wall. I also think dividing each of the parts of the 'program' and giving them to groups of 2-3 students would be worthwhile so they can see how they have to work together and what assumptions they should make.

    Once they have mastered that, they should see that programming doesn't have to be math based, instead its giving very specific instructions for every little intricate thing.

    Id lecture for a little bit about what a variable is and a loop and then jump into something with more immediate results, like Alice (Alice.org).

    1. Re:Let them show off! They need immediate results! by pkgingo · · Score: 1

      Going at programming from a non-math base may be beneficial for those looking a general understand without the need of formal mathematics.

  32. Programming Teaching Tool by RWarrior(fobw) · · Score: 1

    Take a look at Alice. There are even textbooks based on it.

    --
    Remove the caps and hold to a mirror.
  33. you need to teach concepts first and foremost. by ralatalo · · Score: 1

    You need to teach concept not concrete skills. If you teach the concepts they will be able to adapt them to other things if you teach skills the will either need to learn the concepts behind them or forever need someone to teach them the new skills for the next thing.

    There was one comment that really stuck with me from my lookover of Knuth's books. He developed a virtual machine and teaches everything based upon that, why? because if he has used C or Java or Basic or Fortran or anything else he would have to continuously update things to the new standard language. I am not advocating that you teach an assembler language but you do need to make few basic decisions first is what OS are you going to use? If you are going to use a command like based OS then you skip all the complexity of a GUI and still use almost any language you want to focus on the concepts. If you are going to use a graphical OS then you will either need to go into the concept of building a GUI or pick a language with some envelopment which handles the GUI aspect.

    The first concept I would suggest is that computers are stupid or mindless. The second is that no matter how complex the program or the computer, the computer is still only performing one of a few possible operations at a time, basically working with numbers which mean different things at different times. You should explain the difference between concurrent and simultaneous and the concept of threads (the concept, not necessarily multi-threading) You should teach the concept of interrupts and events and event driven concept versus procedural programming concept.

    As for a language I would suggest that you cover multiple language conceptually and maybe a few concretely. Teach in a pseudo code so they need to understand the concept and fill in the gaps.

    Knowing what ages and experience and the time frame... ie..once a week or daily would make it easier to give a better list of ideas.

    Last thought, ask them to write down how to tie a shoe lace both at the beginning and at the end of the class and let them see how they few that problem differently after learning how computers work.

  34. 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.

    1. Re:Former teacher.. by lysergic.acid · · Score: 1

      i'm not experienced or knowledgeable enough as a programmer to recommend a curriculum, but i have taken several programming classes in high school, college, and even some private tutoring sessions. and even though i love programming, and it's a hobby of mine, i really hated some of the classes i took, and they bored me to death.

      if you want to go over basics, teach the students basic computing theory like the parent post suggests. i found my intro programming class in college (Java) to be much more interesting than my earlier programming classes (BASIC, LOGO, VBScript in Excel). the college course covered things like binary arithmetic, memory management, OOP, etc. these are fundamentals of computing theory, but they are things that many self-taught programmers miss. so even though i'd already had some experience with a Java-like language and was familiar with the C-style syntax, i still learned a lot in the class. and because Java is a much more powerful language than LOGO/BASIC, it was actually fun to mess around with after school at home.

      a general mentality in the U.S. is to underestimate the intelligence of students. if you keep expecting very little out of your students, that's what you'll get. they'll probably get bored with the class and also internalize these low expectations so they may give up if confronted with real challenges. however, if you demand more from students and engage them with challenging assignments, it will give them the opportunity to flex their mind, push themselves further, and just learn more in general. what's more, when they overcome real challenges they will feel better about themselves and be more confident in the face of future challenges, not to mention they will find the class much more rewarding.

      having students follow line by line instructions to essentially type out a pre-written program is not only boring, but it doesn't teach things like analytical thinking and problem solving skills that are crucial a programmer. and, unlike math or physics, computer programming has many immediate practical applications. teachers should take advantage of this quality and assign students to write useful programs, which are generally funner to code.

      IMHO a very basic program that is fun for students is a Tic-Tac-Toe game that has perfect AI. not only will it teach students to think analytically (to come up with the AI algorithm), but it demonstrates the practical uses of computer programming. and although i was never taught this in school, i think socket programming presents a lot of potentially interesting applications that would be fun for students. even if you're just teaching VB, you could teach students how to use the Winsock library to initiate TCP/IP connections. break the class up into groups and have each group work together to write a chat or IM client.

      but one of my favorite early programming projects was trying to hack TetriNET. i did this by writing a simple proxy program to monitor the traffic between the TetriNET client and the server. and through logical deduction, experimentation, and persistence, i was able to reverse engineer the TetriNET protocol, which at the time was very insecure. this allowed me to do fun things like clear all the blocks on my screen, draw pictures using the blocks, give myself power-ups, drop blocks on the other player's screen on command, etc. it was a little mischievous perhaps, but it also taught me a lot about reverse engineering, security, and increased my interest in programming.

  35. Don't do pascal... by Jastiv · · Score: 1

    Don't do pascal. It is a useless language that is missing fun features like the goto statement. Also, the biggest gift you can give your students is enthusiasm. Encourage them to play around with the code rather than just doing the assignments. Better yet, have them create their own small project assignments that use the language features you are trying to teach (rather than say, making a student who has no interest in buying a house write a program to calculate mortgage payments.) I remember the most fun I had programing in school was getting the computer to print "I hate algebra" 100 times in basic. Unfortunately, the fact of the matter is so many instructors teach programming poorly and/or don't really know it themselves. Insist that the programs actually compile and run. This way you know the students know the concepts rather than writing a bunch of garbage. Also, don't forget to teach important things like the compiler or interpreter (use a good free-software one like gcc, don't make students buy expensive toolkits they don't need. It should work on Linux, Windows and Mac so that students can do it at home. ) If you somehow fail to teach programming and/or you students are unhappy with you, don't be surprised. It means you are just a normal person rather than an extraordinary teacher.

  36. Absolute beginners, or knowledgable coders. by Anonymous Coward · · Score: 0

    Figure out what this class is. If absolute beginners, then teach as such, including programming concepts as well as basic syntax. It it's experienced coders, you simply teach the new syntax of the language, as well as specific new and unique features that the language has.

  37. On First Reading The Title: by Anonymous Coward · · Score: 0

    with

    BASIC, obviously

    Kilgore Trout .

  38. First and foremost by n9hmg · · Score: 1

    or else they'll hate doing the actual work... typing. If their fingers aren't fluent, they'll spend all their time trying to save keystrokes, by cut/paste, or just not doing some things. Let them wrestle with it for just enough time to start to get frustrated, then switch to typing training, with a good tutor program, and time trials. The people whose fingers to go the home row and eyes to the screen are always far superior to and enjoy their work far more than the ones whose index fingers poise above the keyboard under their eyes.

    Thank you, Ms. Castellucio, wherever you are.

    1. Re:First and foremost by n9hmg · · Score: 1

      D'OH! wide editing window and narrow screen... s/to go/go to/

  39. Here's an example by Anonymous Coward · · Score: 1, Informative

    http://www.bembry.org/technology/python/index.php

    IIRC, the site's creator is Bryce Embry. His python stuff was, again iirc, created for high school students. I found it extremely helpful when I was learning python.

    You can give students too much information and they just get lost and confused. bembry gives just enough to get the students going. I send him a big KISS (keep it simple stupid) award.

  40. what's this blank box fer? by Anonymous Coward · · Score: 0

    Teach them to outsourse, for class and future employers.

  41. Fun... by cpicon92 · · Score: 1

    at my school "computer programming" is playing flash games on the school computers

  42. Greenfoot by Anonymous Coward · · Score: 0

    You might want to take a look at Greenfoot (http://www.greenfoot.org/). It's a nice programming framework for beginners using Java. Unfortunately it's not open source.

    There's a Google tech talk about it at http://uk.youtube.com/watch?v=Tcwx-I6Arwk.

  43. Basics or BASIC? by Trevin · · Score: 1

    ... 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) ...

    IMO, computer basics have no place in a programming course. If your students don't know the fundamentals of operating a computer, they shouldn't be trying to program one.

    Having said that, the first programming language I learned was BASIC (specifically Atari BASIC), which was great because it was easy to learn and we got immediate results/feedback from our efforts (no need to wait for a compiler or even have a completed code block). But that wasn't part of any course; the school just provided computers and instruction manuals and let the students explore programming on our own.

    The first actual class I took in computers used Apple II. I actually don't remember whether our assignments were done in Apple BASIC or Pascal; it was probably the latter. Either way, it did introduce us to more structured programming (loops, subroutines, algorithms). I would imagine that most of those concepts can be taught using any procedural language, but I would advise picking just one language and sticking to it. Comparison of different computer languages should be saved until after the student is familiar with programming concepts in general.

    I would also suggest not introducing students to object-oriented programming until they've learned procedural programming to the point that they understand what a data structure is.

    1. Re:Basics or BASIC? by theshowmecanuck · · Score: 1

      IMO, computer basics have no place in a programming course. If your students don't know the fundamentals of operating a computer, they shouldn't be trying to program one.

      Depends... computer basics in a programming course could be how a computer works, not how to work it. Understanding what a computer is doing in terms understanding the concepts of memory being allocated, how persistence is taking place, networking, etc. is very important for a programmer to know. The programmers who don't understand memory allocation in a computer are the same ones that tell me that Java never has memory leaks because it has a garbage collector.

      But in terms of high school students, that would be an overwhelming way to start. Can't argue with starting with the fundamentals like BASIC... or even pseudocode.

      --
      -- I ignore anonymous replies to my comments and postings.
  44. 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...
    1. Re:my experiences with computer science education by Anonymous Coward · · Score: 0

      I loved Logo growing up. I think taking a class in it when I was in middle school was largely responsible for my current interest in computers.

    2. Re:my experiences with computer science education by reilwin · · Score: 1

      Err...C, a beginner's programming language?

      Maybe it's just me, but I find that it uses low-level concepts which could unnecessarily frustrate beginners. IE, pointers and memory allocation. And as pointed out before, getting C to work on Windows is a bit more difficult; most students in an introductory programming class would likely be using Windows.

      Java, on the other hand, wouldn't be too difficult to get working. Admittedly, good use of Java would require knowledge of OOP, but at least it has a garbage collector and you can always have the students stick to one big main method and ignore the "public static void" stuff until they've gotten more used to it.

    3. Re:my experiences with computer science education by jyurkiw · · Score: 1

      The problem with teaching PHP to beginners is that you also need to teach them HTML.

      ...which also goes against the "never teach more than one language to beginners" mantra.

      Granted it's a markup language rather than a programming language, but a beginner won't understand the difference.

      IMO C or Python are the best beginner languages right now unless your class somehow has a web class as a prereq that teaches raw HTML rather than an editor like dreamweaver.

      Then you could start with javascript.

      No compiler to worry about, and running the code is trivial at worst.

    4. Re:my experiences with computer science education by TheQuantumShift · · Score: 1

      Wow. What a difference two years makes...

      We didn't have a computer class until 9th grade (1992-3), and all it taught was how to save files to a floppy on a Mac SE. The next year (1993-4) there was a big deal made about the new "Media Lab" full of then cutting edge mac performas. They even had a cdrom (where you put the cd in a cartridge). The closest thing to computer science was learning how to edit a tiny video on the mac. The next year (1994-5) it was time to learn real computer skills. We learned dos and word perfect 5.1. After that? Nothing. There were no CS classes to sign up for.

      I really hope things have changed.

      --

      Shift happens. Fire it up.
    5. Re:my experiences with computer science education by Anonymous Coward · · Score: 0

      I was totally with you until you suggested using C for the intro language.

      I love C. I'm a master with C. I think it is the greatest 3rd-generation language ever, probably never to be surpassed in its niche. But it's not for teaching highschool kids.

      Before you can get to the fun stuff, you need to learn how to set everything up. You can't just say print "Hello", you need to set up a main() function, and then the most popular print function is called "printf". And you might want to just teach them how to do some math, but first you have to teach them how to declare their variables an get the types right.

      I think a language like Python is the way to go, and in fact Python would be my suggestion. In current Python, print "Hello" will print Hello. print 2 + 2 will print 4.

      If you invoke Python with the correct option (specifically, "-Q new"), you get non-surprising behavior from integer math division: print 2 / 3 will print 0.6666666 instead of 0.

      You will always have to explain a certain amount of abstraction, but some languages have more machinery that must be understood first, and other languages have less. Python has very little (which is why I love it so).

      By the way, in Python 3.0 you get the auto-promotion to float on integer division by default. But the print statement has been replaced by a print function, so now you would need to type print("Hello") to print Hello.

    6. Re:my experiences with computer science education by MyDixieWrecked · · Score: 1

      I've had many friends who were not programmers who had to take a java class in school.

      The problem is that it's so difficult to make them understand what those 7 lines of code means for a simple Java hello-world application. It takes a while for them to understand what an object is and what it all means before they can really code anything useful.

      It may not be an incredibly complex language, but it has an enormous standard API, and it utilizes fairly advanced concepts (OOP). Java is a great beginner's language, but I feel like for a first language, it doesn't have any kind of training wheels.

      --



      ...spike
      Ewwwwww, coconut...
    7. Re:my experiences with computer science education by MyDixieWrecked · · Score: 1

      I agree. Python would make a pretty good starter language, and the Windows version was pretty painless to install, iirc.

      I forgot about the fact that you kinda have to teach HTML and PHP at the same time, although PHP would be great to teach after an HTML class was taught... Unfortunately, most HTML classes kinda suck and don't teach the "right way" of doing things.

      I redact my php recommendation. Python is probably the best bet. Plus, it's incredibly straight forward, especially with regard to naming and modules and everything. Indentation is the only subtle area where a beginner could get confused.

      --



      ...spike
      Ewwwwww, coconut...
    8. Re:my experiences with computer science education by mfnickster · · Score: 1
      --
      "Slow down, Cowboy! It has been 3 years, 7 months and 26 days since you last successfully posted a comment."
    9. Re:my experiences with computer science education by Reservoir+Penguin · · Score: 1

      Why not Scheme then? It's even easier and the syntax can be learnt in 15 min.

      --
      US-UK-Israel: The real Axis of Evil
  45. One word by Anonymous Coward · · Score: 0

    PYTHON!

  46. Don't assume any knowledge. by stm2 · · Score: 1

    Buy a "programming for dummies" book and get the feeling of not knowing anything. I'll get ideas from it.

    --
    DNA in your Linux: DNALinux
  47. Teach JavaScript by LimeBits · · Score: 1

    It's the coolest and most interactive language -- most immmediately available (in every browser), and you get immediate and gratifying feedback (seeing results and interacting in your browser).

    And it's cool because the JavaScript language itself has understandable structure, with an ultramodern approach to functions, scoping, and objects. Use the excellent book "Javascript: The Good Parts".

    With a WebDAV server like LimeBits.com (disclaimer: I work there), you get automatic state storage and data storage, which overcomes limitations of running in the browser. LimeBits is an execution platform for open-source JavaScript, as well as a free storage server.

  48. Don't gloss over the basics by sycamorenonesuch · · Score: 1

    I'm in an Intro to Visual Basic class now, and in the beginning the instructor started with a "jump right in" approach: he would show us how to design a form, add a couple lines to a button event, and voila! Most of the class thought it was magic. He never has bothered to give the definition of a variable, a method/function, or explain why it is that you can say strExampleString.Trim() and your string knows what to do. A thorough grounding in the conceptual basics will do your class a world of good.

  49. 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
    1. Re:the basics by Anrego · · Score: 1

      I totally agree with you in theory.. but I think in reality this fall apart (unfortunately).

      Students will be anxious to actually make a program... and unlike yesteryear where programming tools were hard to come by... now days anyone with an internet connection can google "how to make really 1337 apps" and find a VB6 tutorial.

      While your teaching binary math and boolean algebra.. they are in the back hacking together a twisted VB6 version of hangman.. with lots of goto statements and copy+paste code from the net.

      By the time you get to actually writing some code.. they will have months of bad habits .. if they are even still in your class ("why do I need all this bs.. I figured out how to program by myself!"). .. I think sometimes the accessibility of programming info is as much a curse as it is is godsend.

    2. Re:the basics by Anrego · · Score: 1

      Addendum: I think the approach you described works beautifully however in environment where the students have a very serious interest in learning the right way to do things.. but we were talking about an intro course.

    3. Re:the basics by Anonymous Coward · · Score: 0

      A programmer must be able to consciously experience computation, not merely analyse it. Starting with the basics is the sure way to failure for most of the class. The class is not a computer and must not be simply loaded with an emulator program.

      Start with:

      "This program does nothing: int main() { return 0; }
      All these parts are required for it to do nothing, if you don't put them in your program won't work"

      "This program says "Hello, World!': #include int main() { printf("Hello, World!"\n"); return 0; }
      All these parts are required for it to say "Hello, World!", if you don't put them in your program won't work"

      Then talk a bit about the differences. The student now has an experiential basis for an intuitive understanding of a small part of programming. Build up their experience from that.

    4. Re:the basics by Troy · · Score: 1

      To provide a counter-point, I've been teaching beginning programming to high school students for several years now. My classes are usually mixed between the kids who would get an A if I gave all of my lectures in pig-latin, the "normal" kids, and the kids whose greatest aim in life is to play the same stupid flash game every day. I'm also in a public school environment where I cannot assume that students are able to program at home. All of my labs consume several days of class time. This definitely slows me down, but it also lets me get really picky with their coding styles. I can harp on things like making easy-to-read code, picking good variable names, comments, etc.

      I start with a broad overview of the architecture of a computer. We discuss the classical von Neumann machine, and how it applies to a modern computer. I spend some time discussing the significant bits of a modern computer, discussing a modern CPU in the broadest terms, and usually crack open a machine and have the kids huddle around while I point out various parts on the motherboard. That takes 2-3 days.

      We then do a very broad overview of the history of computers, and I usually make them watch a video just to change things up. In the past, we worked our way through the better part of a lengthy series on the history of computers, and I made them write papers. This year is much more modest, with a 1-hour Modern Marvels episode and some class discussion. That takes 2-3 days.

      I then go through the general hierarchy of programming languages, from machine code on up, and an overview of the compilation process, naming the different files that are produced along the way. My goal is to simply give kids an idea of how things work and enough information that they could learn more on their own if they wanted to. That takes 1 day.

      The rest of the year is programming.

      When we get into actual programming, I use the Eclipse IDE and C++. I know people on Slashdot have VERY STRONG opinions about these choices, but I find that those tools really meet the needs of my course. In short, teaching unix makefiles and gcc is NOT part of my course's scope, and I have to act both as a feeder for our AP course and a prep for seniors going off to college.

      My general curriculum goes something like this

      1) Datatypes and variables
      2) Arithmetic
      3) Input and Output (cin, cout)

      **I do those topic twice. I go through once to give the kids enough information to write some basic programs. Then I go through again more in depth, talking about the sizes/limitations of the datatypes, ints vs doubles, iomanip, the cin streametc etc.

      4) Conditionals, if, if/else, switch
      5) Loops (for and while)

      My first semester usually ends somewhere between for and while loops. Second semester goes like this

      6) Review of concepts for kids who took the first semester last year
      7) Loops, again and with greater complexity
      8) Functions (I really agonized over when to teach functions. I finally decided to do it after loops so that students can write meaningful and substantial functions for more substantial and complex programs)
      9) File I/O
      10) Arrays
      11) Searches, sorts and some basic runtime analysis.

      I usually spend between 40-60% of my class time in labs. At the beginning of the semester, I usually have to "invent" reasons for labs. Once we get past that initial hump and kids can write basic programs on their own, I assign a lab when I think I've covered enough material that I ought to make them practice something. This usually works out to be about 5-7 days of lecture, followed by 7-10 days of lab.

      Whenever I introduce a new topic, I usually start by posing a problem, and use the new concept/syntax as the solution to the problem. I spend some time talking about what happens inside of the computer when to use that new syntax, and what kind of "real world" situations would require its use. We then discuss the concept in depth, with multiple examples and what-ifs. At this point, we're usually writing a little dem

    5. Re:the basics by Anonymous Coward · · Score: 0
      I don't know, while I teach binary math and boolean algebra most are taking notes and working with each other to simplify the logic. Sure they complain that they are not on the computer, and when we are going to something fun, but that will come soon enough and they will have the basics to understand. If they do go to the computer, they are much more likely going to look for music or naughty pictures. I guess I have the less advanced students, which makes it even more important they know basic skills so they can compete with kids that can just go to google, copy some code, and end up with a working application.

      Some high school kids need to be taught that 1+1=10, while others just pick it up, i.e. learned carrying in elementary school. Still others are happy to know the mechanics of coding without understand why they are doing it, other that to put pretty widgets on the screen, maybe connecting them to databases.

    6. Re:the basics by Anonymous Coward · · Score: 0

      I'm teaching a programming course right now to high school students. My view is to teach programming exclusively. Get them in front of computers, teach them how to program by a series of in-class projects that you practically dictate to them while teaching programming. I feel that programming is basically Shop for geeks. If they have hands on experience writing, compiling, and then running programs in class, they get the concepts and they feel great about learning.

      Not knowing exactly how to teach, I looked around for coursework on the internet and found this guy's stuff:

      http://www.bluepelicanjava.com/

      Its a free intro college course using Java. I simply take his stuff, adapt it by writing out lessons of my own, and then teach them in the class. I go a lot slower because it is High School. So one lesson typically takes 3 days. With each lesson I give a project that the students must do themselves. They email me the source code, I grade it using comments right in the code, then I send it back to them.

      I don't quite like the order he uses (e.g. I'll teach while loops before for loops) so I rearrange things to my liking.

      The most important thing at the beginning, I think, is to get the kids to understand source code, machine code, and compilers. I do an entire lesson on source vs machine code, and what compilers do. For the first in-class learning project (Hello World) we use only the CLI and a simple text editor. I don't use an IDE, because that confuses them as to what is going on. They simply write hello world themselves in the text editor (following my lead of writing it on the board for them), then they use the CLI to compile it. Then they use the CLI to run it. I point out the difference between the source file and the compiled file. Then I get them to put simple equations in the println statement.

      After a couple of projects we switch to a better text editor that will colorize and allow in-app compiling (I use Crimson Editor http://www.crimsoneditor.com/ ). This has the benefit of not confusing the students with a full-blown IDE, but enables them to see how there are tools to help coders, but those tools are not part of the code.

      Then it's on to variables, operators, user input, conditionals, loops, boolean logic, switch statements, Strings and chars, intro to objects, etc. Each lesson having an in-class "workbench" project and an assignment project.

      I'm only halfway through and so far its working great. Things just got tricky with explaining objects, but I feel that the kids are so motivated by their feelings of power that they will strive to understand it.

  50. 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?
  51. Teach them how to do algorithms. by elrick_the_brave · · Score: 1

    When I was being taught, we were shown how to do algorithms for everyday tasks. What are the steps to show someone how to make a BLT. You get them to start at the beginning but don't tell them. Show them that they must use deductive reasoning and let them learn what assumptions are. If they miss something obvious, ask them - what about x? Also, show them that there is no real one way to do things but there are logical ways of doing certain things better or more efficiently *functions, loops, etc.

    --
    (1st sig) If this were a snappy sig, you'd be reading it right now. (2nd sig) I'm a karma whore. >Insert FUD here
  52. LOL Code by Anonymous Coward · · Score: 0

    Try using LOL code (:

  53. Teach them the most basic rule of all by NotSoHeavyD · · Score: 0

    And that rule is to make your god damn code readable. Use comments if it makes sense, break up blocks of code into digestible blocks, useful function names and variable names. I can't remember how many times I've seen unreadable code with 1000 line functions, no comments at all, different classes with similar names, braces that don't line up, etc. Oh well, given slash dot I expected to have this one moderated down.

  54. Teach by Anonymous Coward · · Score: 0

    You must approach it as a hamster would when teaching a baby squirrel to fly.

  55. Consider Delphi by concept03 · · Score: 1

    I'd highly consider teaching Delphi for beginners. Why? Because it is easy for beginners to grasp, and as the student progresses, you can teach them about memory management, pointers, references, inline assembly, etc. Check out this site for some great tutorials and resources (http://delphibasics.co.uk/). Also, you can download Turbo Delphi for FREE here: http://www.turboexplorer.com/downloads The beauty of Delphi is that it is easy to get into, and also very very powerful. I believe it is also a great foundation for moving to other languages, like C++ or even C#. Regards

    1. Re:Consider Delphi by Eli+Gottlieb · · Score: 1

      Hell yes! Delphi was my first programming language, and it put me on the path to brilliance because I could go as low or high level as I wanted. Its only lack is functional features and the garbage collection required for such.

  56. If you going to start from the very-very basic by S3D · · Score: 1

    Start from assembler.
    Mwa ha ha ha ha!

    1. Re:If you going to start from the very-very basic by FlyByPC · · Score: 1

      Actually, some of your students will no doubt find assembly language to be a very refreshing change of pace from more modern, OO languages. (The Java course I took left a bad taste in my mouth; one too many "GridBagArray" manipulations, and not enough number-crunching. I enjoy programming, not Graphic Arts.

      I'm currently helping out with a course based around building a working Z80 computer. The programming is done in assembly and hand-assembled into machine code, to be programmed in Hex or Binary.

      It's kind of fun to be able to program in *exactly* the language the computer uses, right down to the ones and zeros. I also enjoy knowing, for instance, exactly what the program will be doing 137 microseconds after a key is pressed.

      If you're going to teach them Assembly, start them off programming PIC microcontrollers. The chips are inexpensive (or free if you request samples), the IDE is free from Microchip.com , and RS232-based programmers can be bought for around $20 on eBay. With 35 instructions, the 8-bit PIC core is pretty easy to understand, even for beginners to Assembly language. From there, you could transition to the 8080 or Z80 (to show the difference between RISC and CISC), and from there it's a small step to discussing the 8086 and the rest of the x86 family.

      ...Now if someone could only explain to me what possessed Intel to come up with the overlapping segment:address scheme. 4096 ways of addressing each byte, indeed!

      --
      Paleotechnologist and connoisseur of pretty shiny things.
  57. 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"
    1. Re:Algorithmic approach by dcollins · · Score: 1

      Although mentioned several times, I actually don't like that approach. As a student, it seems inherently unfair. In any normal math/CS you need to (1) define available terms/operations (API), then (2) apply terms in proofs or algorithms.

      In this demonstration, the operations are not well-defined. Can I say "pick up knife"? Or do you need "place hand on knife"? Or do you need "curl fingers around knife, then press with thumb"? Personally I get enormously frustrated when someone does this in-minute-detail exercise without defining the available operations. That's -- as a matter of logic -- simply not possible.

      Suggestions for a fix: (1) Give a handout of available operations for the exercise. (2) Do a maneuvering example using Google map's options for left, right, or continue straight. Etc.

      --
      We know where leadership by an anti-intellectual "strongman" who scapegoats minorities and likes boisterous rallies goes
    2. Re:Algorithmic approach by reilwin · · Score: 1

      Considering that this would be for an introductory programming course, I think the teacher can safely assume that most of the students don't have any knowledge of programming, and those who do, already know the lessons which would be taught by such a lesson.

      The point of the exercise isn't for one person to successfully put peanut butter and jelly on the bread from the first try. It's for the entire class to understand that common-sense instructions to computers will not work.

      Giving out a handout of available operations automatically removes everything else that would be possible -- such as the common-sense instructions most people would provide. It's not as obvious that common-sense instructions don't work if nobody tries it.

    3. Re:Algorithmic approach by wdsci · · Score: 1

      I think the idea behind the PB&J exercise is that it's going to make the students figure out firsthand what the allowed operations are by trial and error. That way it's much more likely to make an impression on them than it would be if you just told them what they can and can't do - it *shows* them exactly why their regular intuition might not be sufficient. Computer programming is not just about logic, but about creativity, i.e. finding ways to express a complex procedure in terms of a limited set of simple instructions. (For what it's worth: theoretical computer science, as taught and studied at the university level, is typically different)

      Anyway, in my experience there's almost no better way to learn something than by getting it wrong a few times, and the sandwich-making thing provides ample opportunity for that.

    4. Re:Algorithmic approach by dcollins · · Score: 1

      "... i.e. finding ways to express a complex procedure in terms of a limited set of simple instructions."

      Well, look, you couldn't avoid saying it right there. "In terms of a limited set." So what *is* the limited set? You need that first.

      Programming is not the same as backward engineering an API. It's about taking an apparently minute, known set of operations and building up interesting, surprising things out of it. So I would say that the PB&J exercise has it precisely backwards.

      You might think it's equivalent, but as a teacher I know that a detail like that makes an enormous difference the first time students encounter something. The people who intuit that the lesson is inherently unfair -- that there never was a possible correct answer -- may be lost to programming forever. Seriously.

      --
      We know where leadership by an anti-intellectual "strongman" who scapegoats minorities and likes boisterous rallies goes
  58. No problem by JustNiz · · Score: 1

    Get into the mindset by explaining the ubergeek religion...
    Linux is godlike, Anything from Microsoft is the work of satan, and that Slashdot is their bible.

  59. Use The Simpsons - GOTO MOES by Anonymous Coward · · Score: 0

    Back in High school, in an "Introduction to CS course", we started with our own made up language. Since CS wasn't really an organized thing at the time, I had already taken a course that used QBasic, so when the teacher started using Homer Simpson as an example of a computer (since "computers are dumb"), I started recognizing it as effectively bring Basic. Variables were equated with post it notes, functions with sheets of instruction, and every program ended with "GOTO MOES" to get beer.

    Very simplistic, but it was meant for people who had no idea how to program. Plus I laughed.

    Z, if you're reading this, thanks again :)

    That all said, you might want to consider a "placement test" if you're not sure. That way you can at least try to deal with or even avoid the "half the class knows C++ and the other half has never seen the command line before" problem.

  60. How? by ScrewMaster · · Score: 1

    How Should I Teach a Basic Programming Course?

    Very simply.

    --
    The higher the technology, the sharper that two-edged sword.
  61. Teach it in Chinese by NeverVotedBush · · Score: 1

    So your students will be able to understand their supervisors and employers...

  62. Teach an interpreted language by thomasoa · · Score: 0

    Use an interpreted language for most of the beginning teaching. Especially if the language has a shell where the user can tinker.

  63. Basics, web and programming by louzerr · · Score: 1

    I would recommend dividing the class into computer basics, using the web, and then hit programming.

    The basics I would make VERY basic - talk about what an OS is, hard drives vs. USB drives, how computers process and store data, how computers are networked - all from a very high level. Make sure they understand how to save files, and where they go when they are saved.

    For web, specifically "web 2.0", take a look at http://plcmcl2-about.blogspot.com/ . Whether it makes sense to just do the "23 things" from that site, or pick and choose (perhaps even have students pick and choose different projects, and then show & tell would showcase the widest variety of stuff on the web).

    Programming should start very basic, maybe with an interpreted language like Perl or Python, and then maybe discuss compiled languages such as java or C/C++ or even C#. Once you get beyond "Hello World", I'd highly recommend pointing to some of the design patterns that are out there - show them how to find good examples on their own.

    I've seen basically two types of courses - one follows a book (SAMS, for a bad example) that walks you by the nose step-by-step, and at the end, you can repeat the steps (maybe), but have no idea what you've really done. The better course says "this is one way to do it, here's another way, and if that's not enough, here's where to look for more". The second way is a lot more involvement between student and teacher, but I think it helps the student with problem solving and analysis down the road (where the first method teaches them to grab the first easy answer they find).

    --
    "The large print giveth, and the small print taketh away" -- "Step Right Up", Tom Waits
  64. this was a real eyeopener for me on this subject by BigGerman · · Score: 1
    http://www.cs.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf

    so the answer is - it does not matter. Some of them will get it, most of them won't, makes no difference what you do.

  65. Back in the Day by Greyfox · · Score: 1
    They taught binary and hexidecimal conversions and binary logic right off the bat. They also covered bits, bytes and the ASCII tables. Once we knew a bit about how the computer represented its data they started talking about the syntax of the language we were using, basic I/O, branching and looping. After that they covered algorithms like sorting and general data structures like linked lists. Implementing a linked list in BASIC was a bit of an eye opener. I would contend that even though pretty much every language has a library for those things already, it is still important to know how they work under the covers.

    If you still have time in your course after that, you'll probably want to touch on object oriented programming a bit, though that subject really deserves a course entirely of its own. I don't think you can really do justice to OOP and design patterns in less than a semester.

    --

    I'm trying to teach myself to set people on fire with my mind... Is it hot in here?

  66. Introductory Programming by JoeCommodore · · Score: 1

    I find lately the biggest hurdle in programming is getting your environment setup and being able to write and execute code. Many of the development environments are pretty tough when you just start out, but if you know enough to get testable code written it relieves a lot of stress. And not everyone wants to be a programmer, so don't expect total buy-in those that do will more than appreciate the leg-up to get started from their they can access the Internet's resources to develop further.

    For most people nowadays teaching HTML wouldn't hurt. Many languages interface to it and the web is now a hot method of app delivery.

    Introductory class... if this is going to be a prerequisite for something better cover those bases needed for the next class.

    Languages, I like the ones with some clear understandable syntax that is not overloaded with obscurity. PHP and Python are pretty straight forward (what you read is what it will do). But if it will lead into something like OS design, then you have to get into C/C++.

    But the most important thing you can do is:
    - get them to be able to get an environment loaded onto a system
    - write some code that works and make sure they know what to do in order to execute it. (Programming is no fun if you can't figure out how to get your code to work.)
    - Also steering them in the right direction with some good syntax highlighting editor, IDE, discussion about setting up a project file structure, etc. all are valuable to the noob.
    - Next would be to give an explanation about some useful but simple code works (how a forum works, or a simple game maybe) those into it at this point will pick it up and do more research and mess around with it, and the others hopefully you wont bore them too much.

    --
    "Enjoy what you're doing! If it becomes drudgery, you're doing it wrong!" - Jim Butterfield
    1. Re:Introductory Programming by Anonymous Coward · · Score: 0

      I can't stress enough the importance of giving students the right tools to work with. Nothing in more painful than having to figure out that Java won't run because the classpath isn't set. Based on my AP Computer Science (5yrs ago) and introductory programming courses in college (2 yrs ago) the greatest killer of interest in programming is frustration.

      A couple of best practices I've noticed from teachers in my (ongoing) CS education:
      * Differentiate among students by ability to keep everyone engaged, not bored or frustrated (if someone's bored, give them a more interesting and difficult than the rest of the class).
      * If you're teaching in a computer lab dedicate > 50% of the time to letting the students do their homework/projects while you walk around and answer questions 1 on 1.
      * Silence (usually) means students don't understand. Simply rephrasing what you just said probably won't help too much.

  67. On the importance of Generative Models by jonaskoelker · · Score: 1

    Computer literacy is distinct from networking which in turn is distinct from programming [as has been said]. Don't try to teach them all at the same time, and only teach two at the same time at the areas where the two overlap.

    The rest of my post is about teaching programming specifically, not the other two (although it may also be relevant to system administration).

    Teaching generative models is crucial. What does that mean? It means teaching the causal connections; for one, between what the code says and what it does, and for two between what one piece of code does and what another piece of code does.

    Three interesting reads:

    No matter which languages and tools you teach, and no matter which problems you make the students apply their tools to, help them obtain a generative model, and help them help themselves obtain a generative model.

    As for which tools to teach them, I would recommend python. It allows you to go straight to the meat of the matter without having much in the "this part is magic, you're not supposed to understand this". Also, it supports the teaching of multiple paradigms. Procedural and OO programming are its strengths, but you can definitely teach the ideas of functional programming in it as well--it already likes doing things with lazy lists (called generators), such as map-filter-reduce.

    There's also a good book, How To Think Like A Computer Scientist, freely available at
    http://www.greenteapress.com/thinkpython/thinkCSpy/html/. Be sure to also look in its parent directories.

    (There are also other programming paradigms or computational models, such as prolog-style declarative programming, string rewriting systems or cellular automatons; python doesn't lend itself naturally to do those, but it should be simple to write a simple string rewriter; besides, I wouldn't suggest teaching esoteric computation paradigms).

    So my vote is Python, How to think like a computer scientist, and a lot of attention to the generative models.

    If you need an example of real-world python, I'd suggest the official bittorrent client (it'd also give you a good excuse to talk about networking if you feel like it).

    Also, try to take something the students already know how to do and show how they are following an algorithm; make them implement the algorithm. Math should be rich with examples (gaussian elimination, computing derivatives or simplifying expressions), but the examples may also be a bit on the boring side.

  68. Use a useless language by Anrego · · Score: 1

    .. like pascal!

    WAIT WAIT.. this isn't a troll!!

    I`m dead serious. Starting with a language like Java or C++ or *.NET or anything where the programmer can make something interesting means they will focus on the end product and not the code.

    Give them a language like pascal, and restrict them to cli apps.. and they won`t spend their time trying to make their app do something cool.. but instead focus on making the code look neat.

    1. Re:Use a useless language by Forbman · · Score: 1

      Mr. Pattis, you went back to Pascal from Modula-2? So sad...

    2. Re:Use a useless language by tokuchan · · Score: 1

      .. like pascal!

      WAIT WAIT.. this isn't a troll!!

      I`m dead serious. Starting with a language like Java or C++ or *.NET or anything where the programmer can make something interesting means they will focus on the end product and not the code.

      Give them a language like pascal, and restrict them to cli apps.. and they won`t spend their time trying to make their app do something cool.. but instead focus on making the code look neat.

      Tex was written in Pascal. I would hardly call that useless.

    3. Re:Use a useless language by Anrego · · Score: 1

      Yeah but new programmers don`t dream of writing text authoring tools.

  69. Develop a philosophy, not a course ... by MacTO · · Score: 1

    I can't really tell you how to teach this course, but I can suggest that you find some sort of underlying idea around which you will structure the course. For example: it sounds like you are trying to make a course that could just as well be called "Introduction to Computer Programming for the MySpace Generation." What does this mean? Well, according to my philosophy:

    With respect to students, it could mean that you are dealing with students with zero programming knowledge and zero programming interest. They were just told that they had to be there if they wanted a well paying career in software engineering (or whatever). This will very much affect their attitudes towards the course. It may mean that you have to pull up MySpace on the first day and ask questions like, "how does this work," just so that they have a motivation hook. It may also serve as the motivational hook for your entire course.

    On a technical front, it could mean that this is a course about client/server programming. How do you get computers to talk with each other so that people can talk to each other? This means that you will probably have to make a mini-MySpace, because you can only really see client side stuff otherwise. You may want to show them the multitude of languages involved here: HTML, CSS, and JavaScript on the client side. Maybe you'll have PHP and SQL on the server side. Going deep into algorithms at this point, or even properly structured programming or things like psuedo code, is probably a bad idea. After all, you aren't dealing with teaching a single language here. It is more like teaching about complex systems that are tied together by a lot of programming glue. Doing things the right way can enter the picture once they understand what that involves.

    (For those hard-core programmers who think that theory leads to solid programming skills: how many of you started out with theory, and how many of you started out by trying random things on your computer? Without worrying about all of the principles of software engineering. I'm willing to bet that the latter is going to be more typical.)

    Try to consider the social angle too. A lot of students really don't know why they are there. If they do know why they are there, they may not fully understand the process that leads them towards achieving their goals. Anything that you can do to help them understand that, without dumbing down the course, will ultimately make everyone happy. You'll be happier because you'll have a bunch of happier students who aren't approaching you to bitch and moan about grades. The students will be happier, and even take more responsibility (1), because they see where this is leading towards.

    (1) This is unbelievably true. I've done courses where student attitudes flipped 180 degrees just because they could see where things were leading.

  70. C# is the way to go...Not ASM. by sunsp4rk · · Score: 1

    I think a great way to teach basic fundamental programming concepts is using C#(very easy to learn), pretty intuitive. They have great books on it. My personal favorite is the ones written by Dietel and Dietel and also WROX. I would teach the students, basic I/O, Classes, Objects(because programming is turning into more Object Oriented than anything), Operators and Loops to start off. Then you can move onto Structs, Arrays, Stacks, Polymorphism, Trees etc....those are more advanced. The gentleman S3D stating teach them ASM is wrong in my opinion. ASM will confuse more than teach. That is the reason for High Level Programming languages..which look more like English. In summary. Teach C#, Great books are by Dietel and Dietel and WROX. Teach them, Basic I/O, Operators, Loops, Classes and Objects. Sundeep

  71. Well... by FlyByPC · · Score: 1

    I started by learning the PRINT, GOTO, LET, and FOR/NEXT commands, and learned to number lines by tens, so extra lines could be added later.

    Oh, wait. "Basic" programming, not "BASIC" programming. Got it.

    I would vote for (standard, nonproprietary) C or C++, since once you know that, it's a lot easier to figure out other modern languages (Java etc).

    I would put off introducing pointers until they have a very good grasp of using standard variables and variable arrays, though. Then you might explain what a pointer is (using diagrams or animations), and walk them through a simple example.)

    If they're not going to become programmers, FreeBASIC is a lot of fun, very easy to use, and can handle modern language structure (functions/subroutines, WHILE statements instead of GOTOs, etc.)

    --
    Paleotechnologist and connoisseur of pretty shiny things.
  72. Alice.org by Dix · · Score: 1

    Go on - have a look: "Alice is an innovative 3D programming environment that makes it easy to create an animation for telling a story, playing an interactive game, or a video to share on the web. Alice is a teaching tool for introductory computing. It uses 3D graphics and a drag-and-drop interface to facilitate a more engaging, less frustrating first programming experience"

  73. The only language you can teach to someone who doe by perlchild · · Score: 1

    The only language you can teach to someone who doesn't know how to browse the web is LOGO, and even then... it's a stretch

    It teaches people you can program, it does not teach them how to do so. No best practices, no structured/object oriented/functional programming...

    On the other hand even if you teach a programming course, pick a language. Just because you know more than one way to do something doesn't mean showing them alternate paths is a good way to get your feet wet. Picking the best language for a job is an intermediate-level programming task.

  74. SICP by fade · · Score: 1

    Gerald Sussman and Harold Abelson's MIT course "The Structure and Interpretation of Computer Programs" is the best beginner's course I've ever seen anywhere. It starts at the beginning and ends up with advanced subjects like closures, and functional composition, building every concept in small pieces with clear examples. Plus the material is freely available, and there's video of Sussman giving the course to a bunch of hilariously dressed HP engineers in the eighties some time.

    1. Re:SICP by stevebyan · · Score: 1

      SICP is probably too advanced for high school. Use Scheme, but use the "How to Design Programs" approach instead of SICP.

  75. Teaching methods by Anonymous Coward · · Score: 0

    One thing that really irks me as a student is the teacher assuming we know nothing about a particular subject - and explains things in a very abstract round-about manner that only half makes sense when they pull the punch line and tell you what they're trying to explain last.

    Concept first - explanation later.

    For instance..

    Imagine all the streets in your city. There's only so many streets for so many cars. What would happen if all the cars decided they wanted to drive at the same time? Would we have to build new roads to accomodate for the increase in traffic? This is like bandwidth.

    Bandwidth is the total 'area' data has to move within a network. This is like.. (street analogy above).

    I'm aware my defintions are wrong, I used this on my dad as a basic concept. Give them the idea to apply the reasoning too first - or the reasoning is lost with nothing to apply it to.

    As for very basics - I'd suggest upfront, warning the students the first X lessons are for beginners, covering variables, operators, functions etc. Let the students with half a clue come back when they're ready to LEARN something they didn't already know.

  76. Slow Down! by RKBA · · Score: 1

    If you think you're going to work all that into an introductory programming course, you're nuts. First teach them to use a programmable calculator. Then introduce them to the (Ugh!) BASIC computer language. That's probably about all the time you'll have, but if at all possible try to teach them the C language. That should serve as a good foundation to branch off into the other areas you mentioned for the more advanced courses.

    If on the other hand, your job is to teach them to use computers instead of programming computers, by all means concentrate on applications - both native and web apps.

  77. Start with Gimp, Firefox and Open Office by grikdog · · Score: 1

    There are probably a few kids who'll be able to follow programming arcana, although the vast majority won't or can't. So hit them where they live, by introducing meme-level applications. Teach Gimp amd game-building to artists, and Firefox and Open Office to everyone else. The notion of "what computers do" really has simplified in the last decade, to the point where we can talk about Jonathon Swift and not about Bigendian vs. Littlendian manias. "Top down" has now been around so long, the "down" part actually works so well it no longer needs to be taught.

    That said, I've met professional programmers who don't understand such elementary concepts as page-based addressing or stacks. These deficiencies lead to bizarre programming practices and difficult bugs, such as creating local variables so large they overwrite return addresses. I'd recommend a short course in 6502 or Z80 assembler, but only because those Trilobite concepts were my base. Follow that with a thorough-going grounding in C (not C++ or C#), followed by an introduction to actual open source libraries such as gzip. That gets you to the point where it's almost possible to understand how Microsoft distributes functionality at a level of granularity so fine it actually does make sense (from their point of view) to integrate a browser into the OS.

    --
    ``Tension, apprehension & dissension have begun!'' - Duffy Wyg&, in Alfred Bester's _The Demolished Man_
  78. How to teach a Basic programming course by Anonymous Coward · · Score: 0

    Lesson 1:

    10 REM Welcome to basic
    20 print "Hello world!"
    30 REM print it again
    40 GOTO 20
    50 REM Can't believe no one made this obvious joke yet.

  79. Video Game of Course by Atrox666 · · Score: 1

    The final project should be a video game.
    Announce it the first day.
    They control the content within reason.
    Nothing fancy just a simple web game would do.
    Many of the kids in the class are probably thinking in that direction and it's not that hard.
    The rest of the course could build into the goal.
    Skip the history it bores most kids.
    Do a hello world the first day so they have a concrete result.
    Then back track to teach them object oriented basics.

  80. LOGO by Joce640k · · Score: 1

    Remember that? A language for teaching programming with easy to see results (a turtle which moved).

    --
    No sig today...
  81. Computer/Internet Overview for Jr. High and H.S? by dsoltesz · · Score: 1

    Like others have mentioned, without knowing the age range and dictated goal, it's tough to give really great advice, so I'll tell you about two of the mini-classes I've given.

    The first was a weekend "computer camp" for a small group of kids aged ten to sixteen. In a few days, we covered:

    • Computer hardware: recognizing the components and parts, how to replace components and set up the computer, etc. We ended with destroying an old, dead computer in part to see how what was inside components like the hard drive looked like inside, but also to help some of the kids get over being intimidated by the computer.
    • Internet safety, privacy, and netiquette. Basic web surfing, resources, and browser usage.
    • HTML basics. Copyright concerns (i.e. ask permission before stealing graphics).
    • Javascript basics: using cut-n-paste javascript in pages and tweaking the code (which, as we all know, is a gateway drug to hardcore programming).

    The second was a 1.5 hour web development basics course for high school aged girls. While introducing myself, I noticed the girls' interest was piqued when I showed a screenshot of my myspace page. I naturally didn't change my presentation, however, I discussed every topic in the context of "hacking your myspace page." For that class, I covered the basics of HTML hand-coding, CSS, cut-n-paste javascript (see "gateway drug" comment above), and a few basic design concepts (e.g., blue text on black background is unreadable, choosing background textures for text readability, etc.). I short-cutted the process by providing each girl with cheatsheets (HTML, CSS, color names, etc.) tailored for the class and a USB drive containing examples, images, javascripts, etc.

    Among my standard bag of tricks (no matter what subject I'm presenting) are:

    • Keep the more advanced kids involved and interested by charging them with helping the newbies (since they've already finished the next hands-on while I was talking), rewarding them with keeping their help positive.
    • Ask the class for answers instead of just presenting the material, which helps keep them involved and helps me identify who's already up on the curve before we get to hands-on stuff.
    • Relate any subject to their world as much as possible, using celebrities, music, movies, events, classmates, teachers, etc. in examples and activities
    • For many young women, making stuff "pretty" can be a strong motivator. A young woman I was tutoring in a QBasic class excelled at her assignment when I taught her how to add animated ascii-art to her user interface (she designed a flowery border and a blooming flower). As a double bonus, her self-esteem got a serious boost when she became the center of attention for the entire class (20 other kids, all guys) who thought her program was incredibly cool and wanted her to teach them her secrets.
  82. 1st class have them write instructions on how to by www.sorehands.com · · Score: 1

    1st class have them write instructions on how to make a peanut butter and jelly sandwich.

    Then follow the instructions. None of them will get it entirely correct. Ie. Put knife in jar, but not open jar first.

  83. Emphasize the Language by HoboCop · · Score: 1

    Take an extra effort to clarify the language that you are using. A beginner will have a difficult time differentiating between the mandatory syntax and the other things that are done by convention. This goes for all sorts of programming and even basic computer instruction. Use funny or ridiculous variable names and such so that they can't be confused with the other words or statements that are real. Even basic stuff like the word 'integer' can throw people off if they don't have a good math background, so make sure that everyone grasps the vocabulary you are using. If they only miss one word in a sentence, then they've missed the entire point, right?

  84. start with C yes I said C not java. C# or dotnet. by Anonymous Coward · · Score: 0

    I have seen far too many programmers that start with say VB or Java and don't get the basics down first. Have them loop though an array or matrix, show them an array, structure, pointers, and control structures. You know basic stuff. OOP, webapps belong in a more advanced class.

  85. Kids and the Right Now by b4upoo · · Score: 1

    Teaching youngsters is a lot easier if they can see good results within one or two days. Any tiny program that they could write and actually see function within two or three class days might get them hooked on learning more.
              Also kids like to compete. It raises interest in those that are reachable. Having a bit of a contest as to which kids program runs best may help inspire them.

  86. use the old robot by DragonTHC · · Score: 1

    use the robot making PB&J sandwiches.

    Have the students team up and write an algorithm for a robot to make PB&J sandwiches.

    next class, one of the students in the class act out the instruction with the bread, plastic knife or spoon, peanut butter, and jelly.

    Obviously, don't let students who are allergic to peanuts do this!!!!!!!!

    The exercise gives students an understanding of how algorithms are formed and the importance of each step.

    Your response when they skip a step is, "HOW?"

    My c++ instructor in college taught us all programming before he taught us c++. He used this method. It works for most.

    --
    They're using their grammar skills there.
  87. Take a look at AutoIT3 by dpearceMN · · Score: 1

    Take a look at AutoIT3 (http://www.autoitscript.com/autoit3/). Yes, it's a form of Basic, not transferable anywhere else, closed source, but it allows the person learning to program a means to create useful program within just a few minutes. There is great community support with code snippets and DLLs available to do many things. It includes SQLite (a lite SQL) that can be used to teach database concepts also. It's a great way to get started quickly and easy to learn.

  88. Do It The Old Fashioned Way by sk999 · · Score: 1

    Start with machine language. Then assembly language. Make them use punched cards. Hey, that's how I learned it.

  89. jonesforth by Anonymous Coward · · Score: 0

    Teach them Jonesforth. They will be indebted to you for life.

  90. Very Good Resource by Anonymous Coward · · Score: 0
  91. Regarding Interface, Algorithm, and Computation by DannyO152 · · Score: 1

    Demonstrating interface is tricky especially as the particulars change. Maybe as the students think about how to stop a bicycle and a car?

    As to algorithm and execution, get a cook book page and show how a recipe relates to a program. How the instructions declare the variables and provide the algorithm. (How the recipe consists of steps in an interpreted language in that when it says "caramelize the onions" the experienced chef knows what to physically do.) How the kitchen is the computer; the chef is the I/O bus; the range, oven and mixers are processors; the mixing bowls and counters are RAM; and the refrigerator and pantry are persisted memory while the grocery is costly slow memory. If the receipe said a tablespoon of salt when it meant teaspoon, that would be a type of programing bug. It wouldn't hurt, at that point, to mention Dr. Knuth who provided us with the algorithm = recipe connection.

  92. Lower-level languages get higher-level learning. by tokuchan · · Score: 1

    Part of your considerations must of course be what language you teach your course in. Contrary to popular opinion, I claim that Java is a bad choice for several reasons. First, Java is complex. Just getting a program to run requires extensive knowledge of paths and the underlying environment. This takes away from the learning experience. Second, Java can be likened to a box of complex and powerful parts. The problem is that students come to rely upon those parts but fail to learn how they work. Finally, Java constrains one's creativity to one particular mode of thought: the Java object model. This prevents the kind of cleverness and creativity that we need in good programmers.

    So then, what language to use? I propose a form of assembly. Perhaps MIPS, for which a number of good simulators, like SPIM, exist. You could also use x86 assembly via GAS, which is the GCC assembler. It is very easy to prepare an assembly file that way, so you can get a program running easily. Also, you can start with the extreme basics by only using registers at first, then graduating to memory. The best partvis that students will naturally learn about the underlying hardware at the same time. Later in the course, you can introduce them to C as a form of generalized assembler, for which purpose it was first intended. Then the students will better appreciate the power and flexibility that C grants. By the end of the course, your students will have a good grasp of exactly what their machine is doing with their program.

  93. Alice! by jadedoto · · Score: 1

    Very basic, annoying, somewhat buggy... But a decent start. Teaches some good basics.

  94. FreeBasic by micromegas · · Score: 1

    I teach a year long CS/Programming class for a charter high school in Duluth, MN. The class takes kids (half of them girls) from no experience to c++ in a year. I start with freeBasic and move to gcc (we're a k12LTSP environment). While freeBasic is ... well, er basic, it actually has evolved over the years to be pretty robust. Also, the community surrounding it is super responsive to my kids questions...sometimes the language maintainers even answer questions posted in the forums during the same class period as they were asked. Becoming part of a developer community is as important and learning the details of a language. Asking (and answering) good questions and taking advantage of resources is a valuable life long CS skill. Also, there is great support for SDL and even the irrlich 3D engine to get kids doing game programming and graphics right away...always a good motivator.

  95. 7 Minutes To Hello Word in Python by BartlebyScrivener · · Score: 1

    First order of business, install a programming language. If they have trouble, use this: http://www.richarddooling.com/index.php/2006/03/14/python-on-xp-7-minutes-to-hello-world/ Works for most n00bs who are stuck on Windows for whatever reason.

  96. start class with aptitude test by idanity · · Score: 1

    ask students what they want to learn/ and what they know. many classes begin with initial aptitudes and that may just save you weeks or months, rather than assuming everyones a noob, you may find yourself having a 90% ratio of pc literate to noobie.

    --
    happy trials
  97. Scalable Game Design: teach design skills by the+agent+man · · Score: 1

    If you want to appeal to a broader audience including women and minorities you have to be able to deal with the current perception (e.g., of middle school kids) that computer science is hard and boring. This is a deadly combination. You need to be able to show in a very short amount of time that they can use USE computer science to build something that they care about such as a video game.

    Offering easy to use drag and drop programming is one approach that can help because it can overcome pesky syntactic issues. Having produced one of the first drag and drop programming environments for kids, AgentSheets, we know a thing or two about this topic. To be able to overcome syntactic problems is important but it is even more important that you can provide some way for the them to think about computation in a way that helps them to solve problems and to tackle challenging programming challenges (game, computational science) by themselves. To that end, you need to be able to convey a process of design/development including programming and debugging to build complete games.

    Some people mention (above) some easy to use programming environments for kids. Please ask yourself: easy to build what? Yes, having having some characters moving on the screen can be entertaining for some time but then what? Can you teach the students even to make some of the classic 1980 arcade games (e.g., Pacman, Frogger)? If not, why not? And if you can, can you move on to SimCity, the Sims kinds of games? Too ambitious? We do not think so. If you give students tools and approaches that cannot deliver then their excitement will quickly be removed with a new, even more profound, kind of frustration. We are teaching middle school, yes middle school, students how to build their own Sims-like games programming sophisticated AI. They learn about math because they NEED math to make the game do what they want it to do. And these are the same kinds that supposedly are bad or not interested in math.

    Now for a shameless plug. We are working on a notion called Scable Game Design. We use the notion of design to teach students not just how to use programming environment X but how to think about the design process. This does not take more time but ultimately really gets them into computer science. In the very first session student can build a complete 1980 arcade style game while learning about stacks, methods etc. Moreover, this is not just kid stuff. We use the same idea at the university level:

    Repenning, A. and Ioannidou, Broadening Participation through Scalable Game Design, ACM Special Interest Group on Computer Science Education Conference, (SIGCSE 2008), (Portland, Oregon USA), ACM Press. http://www.cs.colorado.edu/~ralex/papers/PDF/ScalabeDesign_SIGCSE2008.pdf

  98. start with mark up using HTML by Anonymous Coward · · Score: 0

    and then progress to scripting. Then, and only then, consider a graphical development environment.

    As well, consider teaching the development of practical, open and community based code.

    Please.

  99. Top-down trap. by rew · · Score: 1

    More than 20 years ago, my "basic programming" course wanted to teach us "top down" programming. Break the top level thing from the assignment into smaller pieces until you more or less have chunks that fit into one line in your programming language.

    This fails horribly if you're learning that programming language.

    A friend wanted me to do his assignments. I refused, but offered to help him do his assignments.... So repeatedly saying: "and how do you break that into smaller pieces" resulted in him trying to parse floating point numbers....

    So.... I would suggest: First give some assignments that end up building on the previous assignment. i.e. bottom up. Build something more complex after having built some basic building blocks. THEN introduce top down design, and if at all possible, have the building blocks from previous assingments fit in!

  100. How to Design Programs by Anonymous Coward · · Score: 0

    Check out "How to Design Programs". You can view/use the entire text for free online. www.htdp.org.

    I teach undergraduate CS and it's where we begin. It focuses on good design principles and how to put a well thought out program together. The frustration I often encountered, and that led me to choosing this curriculum, is students focusing on getting code written without actually understanding on what the code was supposed to do. HtDP uses a version of Scheme combined with the Dr.Scheme programming environment (www.plt-scheme.org).

    It is most definitely worth your time to check it out. Additionally, the plt-scheme group offers summer workshops on teaching with this approach.

  101. Some Programming Curricula by danzman · · Score: 1

    Research and experience seem to demonstrate that practicing concepts and theory in a simple, fun language are much more enticing and approachable than getting thrown into the deep end with OOP from the beginning. Programs that do this well are Scratch, Alice, Scheme, and Context Free/Algorithm art. All have some aspect of drawing, image manipulation, and animation to them, which can be appealing to a first-time programmer. Alice (www.alice.org) and Scratch (scratch.mit.edu) are simple, and can be used from middle school and up. Scheme is somewhat more advanced, and has it's own formal online textbook (www.teach-scheme.org). A colleague is using it right now with his Intro to Programming Course, and students are showing significant progress. Context free is very light Java, and fun (www.contextfreeart.org, and azarask.in/projects/algorithm-ink). Having attended seminars for Scheme and Alice, I can tell you that they have terrific support communities backing them up. I'm sure that there are others out there too, but this ought to give you a running start.

  102. Teach machine language without a computer. by Trillan · · Score: 1

    There's an old teaching kit, previously available from Bell I think, that taught how a computer's CPU worked: CARDIAC. It was NOT a computer program, but rather just used cardboard props and the like. The "operator" was responsible for writing the instructions, then processing the results.

    You don't really need the teaching kit, you just need to keep it simple. 100 memory cells, decimal storage instead of binary, only the program counter plus one register. It not only teaches the basics of programming, but teaches at some level that computers are deterministic. This is the one thing people really need to know before they start using them.

  103. Some resources by KanshuShintai · · Score: 1

    http://www.teach-scheme.org/

    Because using Scheme and their teaching methodology will allow you to teach students more stuff that is actually important and have them learn it better and faster. There are a couple of FAQs http://www.teach-scheme.org/Notes/ there that explain why it's a good idea.

  104. X = infinity by Anonymous Coward · · Score: 1, Insightful

    x = x + 1

    x/x = (x+1)/x

    1 = x/x + 1/x

    1 = 1 + 1/x

    0/1 = 1/x

    0*x = 1

    x = 1/0 = infinity.

    1. Re:X = infinity by Anonymous Coward · · Score: 0

      > x = 1/0 = infinity.

      I was always taught that division by zero is undefined-- not equal to infinity. :-/

    2. Re:X = infinity by neumayr · · Score: 1

      And you're right. It's NaN - not a number.
      So all this Algebra abuse, while kind of funny, just proved what the GP was saying - it's not solvable.

      --
      Truth arises more readily from error than from confusion. -Francis Bacon
    3. Re:X = infinity by wdsci · · Score: 1

      Actually in Java, 1./0. is infinity (Float.POSITIVE_INFINITY iirc). So I guess it depends on the language.

      In the language of mathematics, of course, 1/0 is undefined...but mathematicians have been a bit slow to recognize the notation NaN ;-P

    4. Re:X = infinity by Nebu · · Score: 1

      x = x + 1

      x/x = (x+1)/x

      1 = x/x + 1/x

      1 = 1 + 1/x

      0/1 = 1/x

      0*x = 1

      x = 1/0 = infinity.

      The last step of your proof is invalid:

      0*x = 1
      x = 1/0

      You're dividing both sides by zero, which is not allowed in standard algebra. If you do allow it, you can prove things such as 1 = 2:

      Let A and B be arbitrary non-zero values such that A = B.

      A = B
      AA = BA (multiply both sides by A)
      AA - BB = BA - BB (Subtract BB from both sides)
      (A-B)(A+B) = B(A-B) (factor both sides)
      A+B = B (divide both sides by A-B)
      B + B = B (observing that A = B)
      2B = B (Combine terms on the left)
      2 = 1 (divide by B)

      The error in the proof lies in the step where we divide both sides by A - B, namely where we divide both sides by zero.

    5. Re:X = infinity by petermgreen · · Score: 1

      Are you sure, I was under the impression that in IEEE standard floating point it was infinity and whether it is positive or negative infinity depends on whether the zero is postive or negative (indeed IIRC dividing like this is the reccomended way to test if a zero is positive or negative since positive zero and negative zero compare equal).

      --
      note: i'm known as plugwash most places but i screwd up registering that here somehow in the past and now can't register
  105. CS 106a at Stanford by Anonymous Coward · · Score: 0

    Whatever you do, make sure you go and listen to (at least) the first few lectures from this course: http://see.stanford.edu/SEE/courseinfo.aspx?coll=824a47e1-135f-4508-a5aa-866adcae1111

    I've been listening to them for the past couple of weeks, in addition to taking a course at my university in C++. My professor here is a very poor teacher (he's said that Bill Gates invented shared libraries and that all programming languages are object-oriented). But listening to the Stanford course has helped me tremendously.

  106. pseudo-code and universal languages by mistahkurtz · · Score: 1

    in HS, i had a great CS teacher. her knowledge was admittedly limited, but she spent much of our time on concepts, and was open to us exploring outside the scope of our class-work. starting a month or two in, many of my programs that i turned in included code and concepts outside the scope of the class, or ahead of schedule (though they met the requirements, and utilized the recently learned material).

    with that said, we spent much of the first few weeks writing pseudo-code, which helped many of the intelligent, but non-technical, non-analytical types in the classroom grasp the material. this helped them break all of the tasks down into small tasks, and see clearly what they wanted the computer to do.

    and, with that said, i started with c++ (very nice) for a few years, took a couple week foray into java (yuck), and ended up teaching myself perl (hooray). i would highly recommend going with something like c/c++, or perl. perl is everywhere, and is an easy transition into "hey, you know all those dynamic web-pages out there, that do all that cool stuff...." while staying reasonably OO. c/c++, in many ways, is the model that other OO languages are based off of. you can't go wrong with them.

    and, finally, with all that said, i believe the pseudo-code may be the most important thing. teach people how to think differently. start easy, introduce basic concepts, like input and output. basic math, and variable assignment. don't worry too much about making sure they know *how* it's done, just that it is and can be done. after a couple of weeks, the how and why to x=x+1 should make a lot of sense to the majority of the class. cout and cin and printf and echo and print and STDIN and variable[] and all of these things will come a lot easier.

    hope this helps. (all of this assumes an intro-level course)

    --
    not only is time travel possible, it's irrelevant.
  107. Hatter by Anonymous Coward · · Score: 0

    Start at the beginning, and when you come to the end, stop.

  108. http://www.dvc.edu/college4kids/ by marshotel · · Score: 1

    Here in California, Dave Bricetti teaches a class for children at Diablo Valley Community College; one of the preeminent schools of its type.

    --
    supporting member of the R foundation
  109. focus on always teaching something useful by blakieto · · Score: 1

    A major goal of yours should be sparking interest and a desire to learn more from each class the students attend. A good way to do this is to have each class give the students something they can walk away with and use immediately in a manner they appreciate.

    For example: class one could cover the basis of what a web page is, and how the html, css and so on make the page. Don't go into detail, just hit the high lights of each, compartmentalizing the web page elements and their respective purpose. Don't say how they are constructed, only describe what they are used for - html=content, css=layout, php=logic and so on. Then give them one example of editing a MySpace page, showing something simple for students seeing this for the first time, and something advanced for the students that already use MySpace Editors for their own pages.

    Class one, you give them a mental picture of a web page and then show them how to modify a MySpace page. That should get many students' attention. In the following classes, touch upon each area a bit, exploring your student's interest and letting the class explore. They may go into Flash games or widget development, it's hard to say. But in each case, it's not to hard to take baby steps into a complex area. Remember, you're not making CS graduates here, you're giving a class of students a "guided interactive tour" with the goal of sparking their interest and creativity to learn more.

  110. Start with reality by darklich14 · · Score: 1

    1. CPU + CACHE + RAM + HD + Network
    2. Fetch Decode Execute (THIS IS NOT THE ONLY SOLUTION, CHILDREN! We just happened to pour trillions of dollars into this)
    3. Assembly language
    4. C. Spend lots of time on C. LOTS.
    5. Step 4 will probably take the rest of the semester or quarter to go through... But teach it well, and they'll go far!

  111. Use bluej by haemish · · Score: 1

    Absolutely the best teaching tool is BlueJ (from bluej.org). It's got a great textbook and is used is thousands of schools all over the world. The kids love it. A related tool that's wonderful can be found at greenfoot.org: teaching kids to program by writing behaviors for video games. Alice.org has another great one.

  112. Child/Noob/Grandparent Assistant by ZeroNullVoid · · Score: 1

    This is a fairly easy task.

    Find a child, new person to technology, or old person who does not have experience with technology.

    Try to teach them the basics assuming a fixed level of knowledge. Let them know to ask any questions that may be confusing.

    Record the conversations, and later IM's if you bring up their tech level enough.

    Then you have the material and can arrange it based off of what may need to be added as background knowledge.

    Repeat with more people as necessary, or just teach the course at that level, and learn from your class more on what to teach and the level for the next time.

    Take lots of notes, as technology always changes and do notice you will have to be adaptive. You may want to offer an advanced after school club for the students that go beyond the knowledge required to help them out.

    It may be a good idea to also provide a sample test to assess the general classes knowledge and group students with similar starting points together.

    Have each group work on different levels of labs and tests and learning events. You can teach a general overview to everyone and then specialize at different levels to the students in these groups. This way you will ensure you cover the basics with everyone and have general questions that can be shared on tests/quizzes.

    If you do not try to accommodate different levels, some students will be bored, become class clowns, challenge the hell out of you, or just do poorly because it is considered mundane to them.

    You may be surprised, some students may even surpass your level of knowledge and experience. Do not underestimate them all the students, but also do not overestimate them.

    The students that know a lot, can still get proper training or another way to look at things or a new easier/better/worse concept that they did not know before.

    Also try to have different learning style trainings so they can choose which method is best for them to learn. (Seeing,Doing, Hearing)(Reading, Watching, Participating, Listening)

    Do not try to do each student individually too much and do not try to teach only them all at the same time too much. You probably will not survive.

    Good luck to you.

  113. Start with the basics by Anonymous Coward · · Score: 1, Insightful

    Start with logical thinking... Don't root yourself in any particular language.. Teach algorithms in a step by step manner.. Also give a good intro on what programming is good for... i.e. the applications in real life.. show where the value is for the student to learn programming..

  114. The basics by Anonymous Coward · · Score: 0

    It's not too long since I had an intro programming course (although I was already an experienced programmer). Assuming your school does not have an unusually high percentage of students who are talented at abstract thinking and/or experienced in writing code... keep it very, very basic. So basic as to seem almost useless.

    I found my class completely trivial - we never wrote a program more than a few lines. The LAST topic we covered was how to write a function. We never wrote a class, even though we were using an "OO language." And yet many or most students struggled quite a bit. I later talked to a different professor who sometimes taught that course. She said when she was first given the syllabus for the course, she thought it was extremely simplistic and that she could cover that material in a week. Then she discovered how hard it was to convey even the simplest abstract concepts to most students, and that it was a challenge to get through all the required material in a semester.

  115. LennyP by LennyP · · Score: 1

    Students allowed into a beginning programming course should not be allowed to register unless they already know their way around a computer/internet. If need be, prerequisites should be offered. For a beginning programming course, teach problem solving. Computing languages are tools; anyone programming should have the knowledge to choose the most appropriate language for use in a given situation. Make the course fun! For the first half of the term, choose a problem and divide the class into teams to solve the problems. For the second half, switch solutions between the teams and have them improve the work you gave them. The reasoning behind this is simple. Working in a team is a good way to cross-pollinate knowledge and is how it generally done in the industry. Having to take over someone else's code is a lession best learned early in life.

  116. 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
  117. The best way to teach programming... by Anonymous Coward · · Score: 0

    Supply them the tools. For example, "This is a print statement, it does..." then give them a problem to solve using the tool(s) you just gave them.

    Of course, you can probably offer more than one or two at a time.

  118. OMFG! by Anonymous Coward · · Score: 0

    "Dear Slashdot: please do my homework for me."

    FROM A PROFF!

  119. it's about programming by icknay · · Score: 1

    I've taught intro CS at Stanford, and the key is to leverage programming projects as you go. Just talking about CS without doing it is ridiculous ... fun programming projects that are scaled to challenge the students at the level of what they know can work really well, emphasizing the key aspects of CS while engaging the students.

    This site gathers great assignments for use by instructors or whatever:
    http://nifty.stanford.edu/

    This site has live little programming problems that work in the browser
    http://javabat.com/

    Slashdot smarties challenge: heres's a tiny programming problem
    http://javabat.com/prob?id=Logic.makeBricks
    See if you can type in a solution which passes the tests the first time -- harder than it looks!

    1. Re:it's about programming by Anonymous Coward · · Score: 0

      LOL! Anonymous Coward gets it right the first time!


      public boolean makeBricks(int small, int big, int goal)
      {
          if (goal > ((5 * big) + small)) return( false );
          if (goal <= small) return( true );
          int biguse = (goal / 5);
          if (biguse > big) { biguse = big; }
          int smalluse = goal - (5 * biguse);
          if (smalluse > small) return( false );
          return( true );
      }

      Just kidding! Anonymous Coward required a second try to get it right. In the first try I missed one of the test cases (the one in which there were more than enough smalls to make up for a lack of bigs)! Although it was an easy fix, lives were lost, and billions of dollars down the toilet... I'm fired! Are you happy now, professor?!?

  120. The best thing that ever happened to me by uassholes · · Score: 1
    was the Unix V7 "learn" program, which was an interactive tutorial that taught C and file system commands, among other things.

    Without that I wouldn't be the programmer that I am today. Here's the README:

    The C script is not complete; use at your own risk.

    Lessons are in

    /usr/lib/learn/*

    Source is in

    /usr/src/cmd/learn

    Miscellaneous supporting code is also in source.

    Make a learn by

    make

    When this seems right, extract the lessons by

    make lessons

    This extracts the lesson archives

    for each course. You can also do this one step at a
    time with "make files", "make editor", etc.,
    if you don't want all courses.
    If you do things separately, you must also say

    make play; make log

    Finally, check that it's sensible with

    make check

    If that doesn't print any messages,
    you're probably in good shape.

    Learn requires general write permission on the user playpen
    directory .../lib/play. Lesson directories may be protected.

    Learn collects a log file for each script in the .../lib/log
    directory, with a file for each script (files,
    editor, etc.) containing an entry for each lesson
    attempted. These files will grow without bound,
    unless they are periodically truncated.
    The log files should have general write permission.
    If you don't want logging (a sensible position to take),
    set the variable "logging" to zero in source/lrndef
    before making learn.

    Learn requires about 1500 blocks to make itself,
    and about 1000 when completely made.

    Please report problems, bad lessons, etc., to
    Brian Kernighan, MH 6021, 2C-518, or
    Mike Lesk, MH 6377, 2C-572. Thanks.

  121. My experience by KingAlanI · · Score: 1

    I myself have only done introductory programming-language work. I did this as an independent study during my senior year of HS, admittedly a different structure of learning than what you're trying to do. (Also, I came in with solid knowledge of basic computer topics) * One language only. [Differences between languages probably aren't what you want to get bogged down in.] * We used Python. (I feel it worked well as a beginner language: like-English syntax didn't hurt) Also, using a real language that fits the bill seems to be more useful than using a teaching-only "baby" language. [Students could continue using it successfully if they wish, and would help them learn other production-use languages] Granted, other languages might also have these features, but: Python *is* cross-platform. Code, especially the relatively basic code you'll be working with, should run on whatever computers you and your students have access to. The IDE included in the Python package (IDLE) allows you to execute code in a controlled environment, so you don't have to get into compiling yet. * Start with basic assignments and move on up. With each assignment layer, work in a few more features. (Assignment 1 needs only print statements, Assignment 2 adds a need for prompts and loops, etc.) * Assignment: "Accomplish X". Then explain you how one might go about doing X. [Once you get a little farther on, don' t give the hints quite so quickly.] If different students take different approaches to X, use the differences as a teaching tool. * Later and final projects: the student chooses the topic of their work, and/or the program which applies concept Y. * Throughout the class, weave in commentary about general good program-design principles

    --
    I listen to both RIAA and non-RIAA stuff if I like the music, tangential business/politics nonwithstanding.
    1. Re:My experience by KingAlanI · · Score: 1

      Should add: Patience is key. (This general teaching advice, IMHO) Programming/computer history sounds like a good way to lose your students' interest. Try and get into the programming assignments and examples Demonstrate some of your scripts. (Even if they're relatively simple to you, students might think "Hey cool! I could make the computer do that too!) [Hook your computer up to a projector to do this]

      --
      I listen to both RIAA and non-RIAA stuff if I like the music, tangential business/politics nonwithstanding.
  122. Program design is of utmost importance by Kev92486 · · Score: 1

    From my personal experiences with taking programming courses, there's one major area that most teachers seem to neglect: program design.

    You can teach your students how to do any number of sorting algorithms, implement data structures, etc, but if they don't know how to design a solution to the problem at hand, they're going to struggle with it.

    I know quite a few people who are presented with a problem and the first thing they do is sit down in front of a computer and start hacking away at the code. This may be fine for simpler programs where there is only a few minor tasks to complete, but as programs get more and more complex, it will cause problems if they don't learn proper design.

    When you explain functions, make sure you explain why we use functions, and not just how. This will be a nice precursor to the concepts of OOP (i.e. break the program down into logical sections) and should make explaining the semantics of OOP a bit easier to comprehend when the time comes.

    OOP was something that was briefly gone over in my high school programming courses, but it was basically along the lines of "Here's how you make your own class and instantiate it". I had no idea what purpose it served or when to ever use it, so I always just used functions and nothing else. It's only now, a year before I'm about to graduate college that I fully grasp the importance of object oriented design and program design in general.

    I would have been in a much better position if these were concepts I learned from the start (possibly even before ANY code).

    Side note: I have no experience with teaching programming concepts besides helping a few friends occasionally. This big rant was just what I've seen in my personal experience and what I think could have been done to make things a bit easier to comprehend.

    Good luck! Don't teach them too much. I don't want to have to worry about job security before I even get one. :)

  123. Commodore Emulator by EightBits · · Score: 1

    How about using a Commodore 64 emulator? If you're only trying to teach the basics of programming, using this will provide an easy way to get students to see the core concepts. Since the C64 had a built-in interpreter for a language, it gives them very fast access to a means to write code. While I don't recommend BASIC 2.0 as a language to really learn, it will still teach them constructs that can be used in any language.

    What's more, these emulators are free so they could easily download and install them at home to do homework assignments. You could teach them how to transport a .d64 file from school to home to continue work on existing assignments. When they want to turn in their programs, they give you a .d64 file. Even more than that, there is a large code base out there these students could use as learning tools and examples. There are also abundant resources available as programming reference material for this platform.

    1. Re:Commodore Emulator by oliderid · · Score: 1

      How about using a Commodore 64 emulator?

      Why do we all come with +20 years old technology? The fact that we most learnt computer on these plateforms (commodore, atari, ZX spectrum, etc.) doesn't mean that today kids have to.

      The web is their new playground, why not teach them the languages in the background (PHP, ASP, or even JavaScript). I'm sure they will soon find a pet project and they will be proud to show mum and dads their new shiny web service.

      Make it fun, make it close to their reality and hobbies, you are often surprise how responsive they become.

  124. Easy solution by Anonymous Coward · · Score: 0

    Get to the class about 30 minutes early and watch as the students try to turn on the computers. If most of them push the monitor power and wonder why the computer is not on, then you know how basic you have to get.

  125. Help them solve the problems they face by Anonymous Coward · · Score: 0

    Which basically means show them how to automate all the crap they have to do by hand right now. I like this post. I've been thinking about teaching a programming course myself.

    I teach at a major university (Not CS) and I've found enormous success by rethinking problems and recasting solutions in light of what the students will actually use, versus following the formulas put down many years ago by other professors, solving different problems for completely different groups of people.

    I remember my intro course in CS was this long, drawn out affair in C++ that had us programming basic concepts and games. And the professor used a lot of the tricks I've seen posted (the PB&J example particularly sticks in my mind) and all that, but it was all a waste. Not because the Prof wasn't good, he was, but because he completely missed the point of what his students were going to use programming for.

    FACT: The vast majority of students weren't there to become systems developers or even prof programmers. They were there for the credit hours, or out of mild curiosity or something.

    Now, what do you think they got out of pointers and bubble sorts and binary searches, and even the pong game we programmed. NOTHING. That's what.

    The class was fine, but conceptually flawed. I liked it and aced it, but then, I wanted the details; most of my classmates were bored stiff and treated the whole exercise like a bad dream that they just needed to endure and then delete because it was worthless to them. Intro CS is a language course for non-experts, many of whom don't want to become experts. Treat it like one, and remember what your students will be using the computer for: typing papers, playing on the internet, managing spreadsheets, etc...

    Office stuff.

    Imagine if Intro English classes only taught people how to write poetry instead of basic reading, writing, and punctuation. That's where you are. And if you've ever seen some taught that way, you probably know what I mean.

    Make your class solve the problems YOUR STUDENTS will most likely face and they'll love you and actually benefit. Focus instead on quicksorts and OO, and you can rest assured that your efforts will be 95% wasted. Which means, I'm sorry to say, that Java is not the right answer. A previous poster said it best, Java is a programmers programming language. It aims to solve problems that only come up for big projects.

    These people need data scripting.

    And finally, make sure the language has a good, IDE with a Read-Evaluate-Print-Loop cycle, which basically narrows your field down to three:
    Python
    Ruby
    Dr. Scheme.

    Be honest. Break rules. As crazy as it sounds against the CS orthodoxy, they'll get a whole lot more from regular expressions and functional programming than Object Oriented Programming and algorithms.

    Good luck.

  126. How to Design Programs by Anonymous Coward · · Score: 0

    I am in a similar situation and have found an interesting program, "How to Design Programs". Check out www.htdp.org. Its an intriguing approach. At the moment, I am planning on giving this curriculum a try and will then transition to "How to Design Class Heirarchies" in the next level course which bridges to Java and targets the AP Comp Sci tests.

  127. Don't focus on the language by doublegeek · · Score: 1

    The best programming course I've had (a long, long time ago) was 6.001 at MIT. One of the things that made it successful was that they didn't focus on the language (Scheme); they focused instead on the underlying programming concepts.

    In order to make this work, you have to use an interpreted language (such as Python, which is trivial to learn and translates well into most other common languages) for assignments and projects. This allows students to try different ways of doing things without getting too hung up on syntax, and helps them focus on what they're trying to do instead of how to use the language.

  128. How to Design Programs by Anonymous Coward · · Score: 0

    I teach CS at the undergraduate level and we've recently adopted the "How to Design Programs" approach. www.htdp.org. The book is available in its entirety online.

    I personally love this curriculum because it focuses on problem and data analysis and not language syntax. It uses plt-scheme (www.plt-scheme.org) and the Dr.Scheme environment. The "Design Recipes" really outline good data-driven design as well as provide a rubric for awarding credit for all parts of the programming process, not just code.

    I highly recommend HtDP to anyone, not just educators, especially if you've never really dug into Functional Programming.

  129. 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.

  130. 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.

  131. Here's an idea for a curriculum... by sampablokuper · · Score: 1

    ... that I rather like, and would use if I were in your position. link.

  132. Teach them nothing by Mr.+Lwanga · · Score: 0, Troll

    Give them assignments with vague instructions
    Lecture them into boredom
    Give them pointless projects
    Make sure they know that the real world is not relevant
    Give the newbs no hope of ever understanding a damn thing that comes out of your mouth
    Make a good effort not to be available outside of class hours

    Success

  133. !PHP by Tommer · · Score: 1

    Please don't teach them PHP, it's as harmful now as BASIC was 20+ years ago.

    --
    -- Tom Rathborne
  134. Helpful hints by Anonymous Coward · · Score: 0

    1) Teach security concepts first and emphasis them thruout (ie. strong passwords, deny all/allow specific, look at data from the outside extra closely)

    Having taken and taught professional courses, I believe they can be applied to K-12:

    2) After your 'Hello World' program, don't make them write everything from scratch. Create a skeleton and write comments in the sections the concepts are to be applied.

    3) Build each lesson on the previous so they can see the value of using variables and modular code.

    4) Having been a volunteer teacher for a HS course here is a warning: Brace yourself for assigning grades. Come up with a plan and let them know how you will be grading them. Then stick to it.

    5) Be enthusiastic, they are not all going to enjoy the class, and no one will enjoy it all the time. But if you are into the subject matter, they will be more likely to pick up on it.

    Good luck.

    Later . . . Jim

  135. Something usable by Anonymous Coward · · Score: 0

    Whatever you do, don't teach them a useless language just because "it helps them learn".

  136. Here's a great course ... by IanDanforth · · Score: 1

    http://learn-cs.pbwiki.com/

    A lot of legwork already done for you, just give Mr. Weekly credit!

    Ian

  137. University of Washington's Java resources by Mori+Chu · · Score: 1

    The University of Washington has popular introductory CS / programming courses. The teachers wrote the textbook and the classes have really good handouts and slides. They use an "objects later" approach instead of "objects early" like a lot of universities. All their materials are up and others can use them. The web sites are here (CS 142) and here (CS 143). The book is called Building Java Programs.

    One of their instructors also teaches a web programming course that was really popular.

    I'd also check out the "How to Think Like A Computer Scientist" series.

  138. Open courseware and iTunesU by Anonymous Coward · · Score: 0

    Check the excellent stuff available from universities like CS106A at Stanford by lecturer Mehran "evil Spock" Sahami, it introduces Java (without naming it and hiding the language specific stuff at first) but the aim is to teach general concepts of programming, using java.

    It uses a framework called Karel the robot at first to even hide java.
    Then it uses ACM libraries to hide some of java ugliness (like application set up).

    And the lecturer is funny (well not always but that's ok).

  139. A simple glossary of terminology by Cruciform · · Score: 1

    I'm 36, but I'm a complete noob when it comes to programming.

    I did some messing around with Commodore BASIC, RS BASIC, and Pascal as a kid but never became proficient.

    So when deciding I wanted to make some of my own web tools in Python and PHP I grabbed a few books and started reading.

    The tasks are easy enough to get you started but one thing I've found is they throw terms at you without getting around to explaining them.

    I had no real idea of what a Class was, until I found a good definition/explanation in the 3rd or 4th book I checked out. Sure, it might be obvious to most of you, but to a beginner any term that isn't immediately understood is a stumbling block.

    So if you're planning on teaching some new concepts in lesson 3, I'd suggest providing a glossary of those terms at the end of lesson 2 for the students to take home and get a head start. Even if they don't fully grasp the concept in time for the next lesson, they'll probably know what questions to ask before you get into the lesson. It should minimize the need to stop and start during the actual instruction period.

  140. the language is the vehicule ... by Anonymous Coward · · Score: 0

    ... not the message

    so "language X sucks" are pointless.

    Logo, Basic, C, C++, Java, Ruby, Python, ... ... are ok to teach basic programming as long as you use them to teach concepts and do not focus on language idioms!

  141. From personal experience by bertok · · Score: 1

    I think the thing with teaching is to look at different approaches taken by other people, and use the method that actually produces results. I saw teachers try several different techniques at high school and university level, and they all failed miserably, except for one guy who was wildly successful. He was actually tasked with teaching us Haskell, which is an abstract pure functional language that most people "don't get". Despite that, he successfully taught it to the majority of students in his class, who then couldn't learn Basic or C from other teachers in the subsequent semesters.

    His technique was simple. He set up a digital projector with his laptop so he could sit and face the class, and projected the development environment onto the screen. He then started coding really simple problems ("add all the numbers in a list") and running the example code, often through the debugger.

    With almost every problem, he'd deliberately make a mistake (leave out a bracket, or not increment the counter in a loop, etc...) and demonstrate how the program failed, how to interpret the error messages or debug it to find the source of the error, and the result of fixing the error. He'd involve the class, asking the students to 'spot the error'.

    I could already program when I started his class, so it was fascinating to watch him teach. What I found is that he was teaching exactly the things that I found difficult when I first started out:

    - It's hard for beginners to go from a compiler error message to a fix. I still remember the Borland C++ error message "Cannot assign value to rvalue". It took me a day to figure out that I had an "=" instead of an "==" in an expression.

    - Writing programs is relatively easy to learn, but learning how to "mentally execute" a program step-by-step to debug it, or use a debugger, is hard. Many beginner programmers just assume that it'll do what they meant, not what they actually wrote. Writing correct programs is much harder.

  142. C#, visuals, and Biology... by Ubahs · · Score: 1

    While I'll probably get boo'ed out of existence for mentioning C#. I've done a lot of tutoring of students one-on-one using this method... C# does an excellent job of getting the syntactical structures into a student's head - without beating them upside that head. Just don't teach any of the C# specific stuff (stick to the shared C++ / C# keywords - avoid foreach, 'as', 'is') It's trivial, and I mean trivial, to get someone to go from C# to C++ - you layer on memory management and the standard library goo, and you can have a halfway decent C++ coder in 3 or 4 months. The rest is experience and self-enforcing of good standards. One thing that I noticed really helps student coders is visualization of what they're working on. When a console app spits out a '5' that's pretty damn boring. When that '5' causes a dude to jump - or a color to change, it keeps people more interested and they feel that they're actually making changes. If C# is what's being taught, Microsoft is working with schools to get XNA utilized for teaching programming, making visuals super-simple to get up and going. I recently went through some Cellular Biology classes and I feel that my programming actually got better from learning how nature does complex systems. There are a lot of connections that can be made between Biology and computer systems, I wish at least a 200 level cellular bio class was a prerequisite for CS students. I think it'd make more humble programmers that are used to looking at complex systems which are decades away from anything a computer can do now. --- I realize this was a fairly Microsoft-centric reply and that's looked down upon here. But, a teacher needs to teach what students will need to know. In this day and age, for the most part, that's Microsoft technologies, with a solid core of platform independent language as the foundation (C++.)

    1. Re:C#, visuals, and Biology... by Ubahs · · Score: 1

      Dammit, I always forget paragraph breaks go out the window...sorry for the ugly ugly post.

  143. Highschool level open textbook. by Anonymous Coward · · Score: 0

    http://openbookproject.net//thinkCSpy/

    It's an incredibly well designed textbook co-authored by a 'a college
    professor, a high school teacher, and a professional programmer', designed exactly for the sort of situation you describe.

  144. What the university I attend does by brainsto · · Score: 1

    I know in my undergrad program at the university I attend as a student, the better professor's try to involve/interact with you in class. Also, make sure that powerpoint presentation information is available for students to download and review. The interactive portion of class makes you pay attention more, and helps to work the problems out that are being projected on a large screen. But, that's really only applicable in classes of 40 or less. Also, one thing that the CIS department at my school does, is that they give out a pretest to evaluate what the students already know, and it allows them to tailor the class a little bit. Which would be especially useful if you were starting a new class for the first time and no one else was able to hand you the materials from how it was previously being taught (and that would be assuming that those materials and lesson plans were even good to begin with). You could also try referencing how to assemble a lesson plan for the course you're going to be teaching from other freely online CIS courses (http://www.intelligentedu.com/cat3.html). Furthermore, you're going to need to review some books for the course that the students would end up using. So, you'd want to contact the book publisher to see if they have any associated workbooks, powerpoint presentation, and possibly... pre-fabricated lesson plans. And above all else, try to stick with a book that can be followed by the students, and that hopefully progresses from chapter 1 through the chapter you intend to complete. I can't tell you how much it pisses students off to be in a class where all you do is hop around the book like a scatter brained fool.

  145. Unplugged Computer Science by Anonymous Coward · · Score: 0

    I suggest "Computer Science Unplugged" as a complementary didactical material at www.csunplugged.com

  146. Functional programming language first by TheCoop1984 · · Score: 1
    At my university, we started off on ML (the functional programming language). This very quickly introduced the concept of a function as a repeatable series of instructions that could be called several times - for a functional programming language, it is almost essential to call the same function several times. This also introduced recursion and types (as part of the compiler type inference) very quickly, something which is probably quite hard for people to grasp.

    The only other courses in the first term was digital electronics and pure mathmatics courses. Only in the second term was Java introduced as the perennial OOP/procedural language. I think we've got one of the lowest dropout rates in the country (but don't quote me on that).

    --
    95% of all computer errors occur between chair and keyboard (TM)
  147. Teach Scheme using "How to Design Programs" by stevebyan · · Score: 1

    Teach them Scheme using the text "How to Design Programs" http://www.htdp.org/

  148. schedule by Anonymous Coward · · Score: 0

    Start by making the students to calculations with simple binary numbers, then teach them how to read and calculate with hex numbers. After that, move to modular arithmetics in base n. Make them work with pen and paper only in that early phase, or otherwise they will be spoiled for life. Then they should learn to write simple programs in Z-80 machine code (there are emulators for this).

    After that introduction, it's time for some more serious stuff. Fire up some good scheme interpreter in Emacs and teach the students some basic data structures, recursion, proper tail recursion, and lambda calculus. Then they should learn the mu-calculus and prove a few basic meta theorems. When they have learned that, they should learn to understand and implement few advanced algorithms and datastructures, so they can decide a grid from a zip and a promise from a semaphor. A good excercise is to make them write a compiler for a little ALGOL-esque toy language and while where at it dicuss term rewriting systems on abstract syntax trees and stuff like that.

    As the final project and to improve the teamwork skills, divide the class in groups and let one group write a real-time operating system for some mars rover and the other class write safety critical applications for that OS.

    After that, they should know enough about the basics of programming.

  149. 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.

  150. I've been through this by goldcd · · Score: 1

    but possibly not in an 'optimal way'.
    Looking back at it all I think there are two strands that need to be given. A basic understanding of the syntax (not the language per-se) - so some boolean, if/else/loop guff - just cover the concepts (they're not hard to grasp). Basically allow somebody to write down logic in a vaguely programatical manner. If you want to stretch them, then OO is fine - but that's not how the brain works out of the box. Start with a flow diagram on the whiteboard (ifs) then a few loopy arrows (loops). Next step is to make them feel they've made something useful. I'd just give them a Apache/PHP pre-config and let them rip with PHP. They can write some HTML and then just slot some PHP in the middle of it. Now if they know nothing about HTML, then maybe start elsewhere - but I'd assume the key is to start with what they can already do, and then get to the simplest way they can improve upon that as soon as possible.

  151. And if you have students who aren't nerds... by Anonymous Coward · · Score: 0

    I'm going to take a flying leap and suggest HTML.

    a) HTML has immediate feedback. The most popular programming language isn't taught in any computer class, because it's Excel. Why is Excel so popular? Because it gives immediate feedback, is easy to learn incrementally, and people have motivation to use it (starting from saving tedious data entry work). However, since your audience are probably kids, HTML will have more applicable use.

    b) HTML still has logic. It's not the traditional computer science IF-THEN stuff, but designing a good user interface requires a host of analytical skills, not to mention the same debugging skills used in programming.

    c) You can still sneak in traditional CS with Javascript and PHP towards the end of the course. In fact, you can even teach API "black box" programming, which most introductory computer science programs fail to do ("What? You mean I have to use someone else's code when I program?").

    I still have no idea why "Hello World" is supposed to be so darn exciting. Being able to write a program that tells me I can't write better than a cheap pocket calculator gives me no particular thrill.

  152. Teach them $SHELL and they will $EAT for life by Anonymous Coward · · Score: 0

    For one, they actually will learn how to operate a computer. The basics of learning how to function a shell properly is immediately rewarding and practical. Once they can learn the fundamentals of the file tree, getting from A-Z and basic file management, show them something powerful with xargs... Next stop, Boolean logic structures. After that "functional" programming.

    Every year I have taught this, the course has not only piqued interest in programming, but invariably ends up exposing kids to other aspects of computer science such as networking and more.

    Or don't.

  153. prepare good examples, references & projects by sky+monster · · Score: 1

    First, one more voice to the chorus saying: "do concrete examples". Hopefully everyone can see your screen, and they can watch while you solve some problem. And the best examples are ones that let them interact, so I'd teach I/O first thing so they can start thinking how the computer does something for them, like playing a simple game (eg. guess the number, dice game) by the end of the term.

    I'd also make sure you have a great reference ready for them, so advanced students can read ahead while others review as much as they need. Maybe that goes without saying.

    This may also go without saying, but since it hasn't been said: make sure you've got understandable examples of larger projects they can do by the end of class. Some way that they can get some real accomplishment.

    Fun, concrete, easy-to-understand examples and games are surprisingly tough to prepare and explain, so prepare well!

  154. Teaching the very basic concepts by bepo · · Score: 1

    I don't know if it will help but when I was 10 I begged my parents to drop the piano lessons and put me in a computer class. They relented and on the first day the instructor came in with a piece of plywood that he had mounted 8 plain light switches in a row. Each switch controlled a corresponding light mounted below the switch. That is how he taught a room full of 9, 10, and 11 year old kids how electricity could be converted to ones and zeros and how ones and zeros could be converted to characters.

  155. Alice is an innovative 3D programming environment by Symb · · Score: 1

    Alice is an innovative 3D programming environment that makes it easy to create an animation for telling a story, playing an interactive game, or a video to share on the web. Alice is a teaching tool for introductory computing.

    http://www.alice.org/

  156. Teaching Programing Concepts by LowlyWorm · · Score: 1

    If you intend to teach basic programming concepts remember that technology is always changing. I would stick to well established functions true over many languages i.e. for..next, if..then, do...loop and maybe some concepts regarding scope of variables. Also, it is important to realize some people will just have a natural inclination to understand programming. Some won't and never will so I would not weight the course too heavily in programing.

    --
    Time flies like an arrow. Fruit flies like a banana.
  157. BASIC and Action Script (Flash) by Anonymous Coward · · Score: 0

    I am an expert software engineer... A genius, in fact.

    Most of the suggestions above are lame.

    Teach old-school BASIC. Yes, start with something like this:


    10 PRINT "HELLO"
    20 GOTO 10

    Anyone can get instant satisfaction from a program such as this. That's what hooks someone immediately and makes them want to learn more. The sense of power, and the desire to get the computer to do more, is instant and intense.

    Forget about starting with a description of the machine or with an abstract discussion of the nature of computers. Make a few remarks about the idea of giving a series of actions numeric labels, and that actions can involve jumping to other numbered actions, but then simply show the BASIC program described above. Have a question and answer session about it. Let the students ask more about the program and ask about possible modifications.

    After a few months of incremental expansions of a BASIC program, switch to a new paradigm: Action Script (for Flash).

    What is so cool about Action Script? It's what Java (for applets) should have been, but never managed to become. Java sucks because nerds at Sun thought brittle tools (like "jar" and "javac"), which never seem to do the right thing with "classpath", etc, would be acceptable. Java also sucks because audio and video weren't given TOP PRIORITY TREATMENT by Sun way back when. All of that multimedia stuff should have been nailed for Windows the day that Java applets made their debut. Adobe did things right with Flash, which is why Flash enjoys a 98% installation base, and generally kicks ass. Anyhow, by teaching Action Script (with the free SDK), students can create fun multimedia programs that are platform independent and which anyone in the world, including Mom, can admire. Their work becomes an instant resume (because anyone can see their work in action online). The desire to do MORE -- by LEARNING more -- will come from many parts of the student's psyche. The concepts of Action Script are a bit beyond BASIC, but by doing incremental steps in Action Script, and introducing ideas only as needed, the steps can be made very small indeed. All the time the students will want to know how to do more, and the benefit of learning more abstract ideas will be evident to the student.

    After a year of programming without any regard or appreciation of the mechanics of the computer, a student is ready to contemplate the lower level operation of the computer. This is when describing memory and the actions of the CPU is appropriate. And this is when I think programming in a language like C# would be best. Why C# and not C++, Java, etc? C# is cross-platform like Java, but isn't as lame (e.g., insisting on declaring classes as throwing certain exceptions, or insisting on naming files according to the classes within, etc). Furthermore, C# enables the programmer to learn about actual memory pointers, whereas Java has no such mechanism for this. Also, C# can be used to access native libraries, which expands the availability of interesting libraries that can be used by C# code. Java is a great language, but C# has improved upon the ideas and has disposed of the silly aspects of Java. I have no love for Microsoft! However, C# and .NET are great inventions, and they have been ported to Linux and Mac OSX long ago. Does Java even have any template-based collections yet? Anyhow, the point is that students should be taught about the computer as a machine only after thoroughly enjoying the experience of programming (in languages like BASIC and Action Script, where there's really no telling what might be happening behind the scenes to make things work).

    Finally, flunk everybody! Teach them some humility. Who do they think they are, pushing buttons and thinking they're all that?!? Well, new flash, boys and girls -- but mostly boys -- you don't know jack about computers! And everyone gets barcode tatoos on day one in your class. No exceptions. On the forehead. You are hardcore. This is computer class!!1!!!

  158. Education from the pros by TheDuck21 · · Score: 1

    I don't know if someone has mentioned this, but have you checked out Stanford Education Everywhere (see.stanford.edu)? Go through the intro computer science stuff. Adapt it to your situation. It might be a good example.

  159. Depends partly on the Level/age of students by softcoder · · Score: 1

    First let me recommend you read Bertrand Meyer's write up on teaching introductory programming. Meyer is the inventor of the EIFFEL language, and the Design by Contract methodology. He teaches at the Zurich Technical institute.
    Even if your students are not at the first year university level, some of his thoughts would be of value.

    Second let me say that there are enough accomplished youngsters out there that you do not want to turn them off by boring them with trivia.
    Meyer's approach is to use a well established library building blocks and let the student start by making calls to the library to implement some interesting new features.
    Once hooked on the 'coolness' of being able to tell the computer what to do, some/most of them will want to know why and how this all works.

    Third, given the almost total video orientation of today's youth I would suggest that the 'first program' should not be 'hello world' but instead be drawing a smiley face on the screen. Or something of similar graphical nature and complexity.
    There was a language called LOGO developed for the commodore 64 that had that approach. Very easy to make a 'turtle' crawl around the screen and make figures/shapes. Learning to direct the 'turtle' was how the kids got introduced to statements, loops, conditionals etc.

    softcoder

  160. Talk to your students by uvajed_ekil · · Score: 1

    If the class is currently as unstructured as it appears, I would suggest talking to your students before selecting your tack. It sounds like your students' computer knowledge and skills are likely to be all over the board, so I would say use the first class session to familiarize yourself with what the know and what they would benefit from learning. Computer-oriented classes are all too often done with a one-size-fits-all approach (especially the lower/entry-level ones), so if it really is up to you, tailor the class to meet the needs of your students, be it basic email and safe web usage, elementary html, php and python, or simple network administration. In my experience in education, the more technical or arcane the subject matter, the less communicative the teacher. Look at this as one of those rare opportunities to really help individuals with their specific needs, and everyone might come out a winner, including you. Just be flexible and share only the appropriate knowledge, and presume that some topics will fly clear over the heads of many bright folks.

    --
    This is a hacked account, for which the owner can not be held responsible.
  161. Colobot by Wraithlyn · · Score: 1

    I think the "robot programming" theme is a good one. I remember one of the first things that got me interested in programming was a toy rover that could be programmed to travel a certain distance, make turns, etc, in sequence. Then there is Logo, which is essentially a virtual version of the same thing plus the inclusion of a drawing function.

    Here is something else I came across a few years ago which I always thought would be great and fun for teaching OOP programming fundamentals, Colobot, a game where you are an astronaut who must complete a variety of tasks using programmable robots. It covers a very wide range of difficulty from as simple as moving around and picking up objects, to as complex as automatic flight and targeting control for aerial combat. It uses a very C/Java-like syntax.

    To use a cliche, it makes learning to program fun. You get immediate feedback on your program and see for yourself its results. Much more fun to code some robot to hunt down a bug and zap him, than some textbook-style exercises. I actually found it quite addicting when I first discovered it :)

    It is quite a few years old now and should run on virtually anything (requires a 300Mhz Pentium and 16MB 3d chip).

    --
    "Mind, as manifested by the capacity to make choices, is to some extent present in every electron." -Freeman Dyson
  162. Howto by flavious · · Score: 1

    Whichever language, concentrate on algorithms (data and exectuion flow), terminology and practice. I'd use C.

    PS: in which case you shouldn't forget to tell them why "int main(void/int argc,char **argv/char **env) { return EXIT_SUCCESS; }" are the only three ways of doing it right :)
    PPS: teach them to indent/format their code consistently, I want to be able to read their crap when they'll get employed in the industry. Pyhon would inherently help here.

  163. I wondered the same - So I wrote a book by Peter+(Professor)+Fo · · Score: 1
    The book is here: Beginner.pdf It teaches how to be a programmer, not a particular language.

    Divide your class into 'students' who want to solve puzzles and 'pupils' who need to be given limited-scope exercises.

  164. Comment removed by account_deleted · · Score: 1

    Comment removed based on user account deletion

  165. Jesus Christ said no syntax by Anonymous Coward · · Score: 0

    By the blood of the cross (inline ecclesia/assembly language) we can speak in any tongue and is remit through Him by grace of the sacrifice on Golgotha. The Calvary's Cross-compiler wills it!
    God wills it!
    # cross myfederalprivatecreditlawsuit.txt -o UniformCommercialCode-dresser
    UniformCommercialCode-dresser created

    # ./UniformCommercialCode-dresser -entrance patron -condition restrictive_appearance -title suitor -pursue law_merchant -directory rule.E-8 -memo "Congressional Supplements to Certain Admiralty and Maritime Claims" -dossier "libel of review"

    segfault
    core dumped to file "redemptionoflawfulmoney.txt"

  166. 4 step plan by syousef · · Score: 1

    1. Ask slashdot what you should do.
    2. PM people who respond for more ideas.
    3. Probe for more until the syllabus is written for you
    4. Profit!

    --
    These posts express my own personal views, not those of my employer
  167. What worked for me by Anonymous Coward · · Score: 0

    start with the fundamentals (UTM`s)
    move one to 8086 machine code (briefly)
    some c (get them to write basic programs)
    then explain the advantages of oop, black boxing things, reusable code, etc.
    this worked for me after being lost in a previous course where the threw me straight into oop (the course was part founded by sun, so Java was THE language)

  168. Simpler. by DaVince21 · · Score: 1

    "MySpace? What is that?"

    That's the train of thought you should be having. Assume your public knows nothing about this stuff, and you should automatically take care not to write complicated stuff.

    --
    I am not devoid of humor.
  169. the master by scientus · · Score: 1

    learn from this physics teaching master at mit:

    http://ocw.mit.edu/OcwWeb/Physics/8-01Physics-IFall1999/VideoLectures/ (mit ocw)

    The key is to just explain it, no bs and no assumptions of previous knowledge, then have students solve problem directly relevent.

  170. On teaching computer skills. by ResidentSourcerer · · Score: 1

    You really are being asked to put 10 lbs of shi -- potatoes into a 5 lb bag.

    I'm a teacher who ended up being the school's IT geek, and I am daunted by the task you face. At my school the vast majority of the kids are clueless about comptuters. They can use a web browser, and can put words in a row in MS Word.

    There are a few that have played with script hacks. And a very small number that actually know how to program.

    I see IT education as having the following goals:

    0. Teach touch typing. If you have to think about what your fingers are doing, you lose track of everything else.

    1. Teach uses for the computer:
    * Internet: Searching strategies.
    * Internet: Safe use.
    * Text processing and layout. (use styles in word, darn it!)
    * Calculation, statistics, graphing and modeling in excel.
    * How to back up/move your data. Maintaining multiple versions.

    These skills should be taught in conjunction with the kids other classes. E.g. Tie spreedsheet classes into their science or math classes. Tie text processing into their language arts classs.

    2. Use the computers to teach troubleshooting/scientific method. Computers are a good way to teach reasoning.

    3. Finding new tools. Present kids with a problem -- E.g. a photo with part of it in color, part in black and white, or a data set that needs perspective 3d to visualize. Let them search, download, install, and try out various things. (Lots of merit in each kid having his own VM for this.)

    4. Show them logo. This is one of the best ways to get kids hooked on programming, as the feedback is so immediate, and it has elements to engage both left-brain and right-brain.

    That's one course.

    The second course is one in actual programming. Once the kids had mastered something a bit harder than "Hello WorldF" I would split the class in half, and give the two halves different easy problems. Say, the classic 4 banger calculator problem, for one, and a paragraph reformater for the other. Throughout this talk about the importance of code documentation. Now we add a feature to each problem, but the paragraph reformatter guys have to add a feature to someone's 4 banger, and vice versa. So each has to add a feature to someone else's code. Kids are marked not only on how well they did the original assignment, but how well the next person in line did with their code. Pairings are changed with each cycle.

    For languages, I don't care, but given the sloppy nature that most kids today bring to academics, I think there is merit in a 'discipline and bondage' language that requires declarations and is strongly typed.

    Some form of bottom up approach will work better than top down design will work better with kids, and overall will be easier to teach. You want a methodology that allows lots of immediate results, both so the kids get rewards for doing things right, and so that you can monitor their progress.

    This second course is not one that I would make compulsory, or if it is, I'd want some provision for allowing kids flexibility as to which year they took it. I found teaching math that many young brains aren't ready for abstract thinking until they are 13-14 years old.

    I would be interested in hearing what you decide.
    sgbotsford at gmail.com

    --
    Third Career: Tree Farmer Second Career: Computer Geek First Career: Teacher, Outdoor Instructor, Photographer.
  171. My suggestions by b1gb1rd · · Score: 1

    Don't listen to those Apple fan-boys and their precious frameworks. PHP is very suitable for students, quite similar to and compatible with the teaching transition to C++. I am currently enrolled in an Introduction to C++ Programming class. I'm acing the class. Most of the students have no idea what they are copy and pasting and ask many stupid questions on our discussion forum. I think the biggest hurdle you're going to face is keeping the students interest at this level. They don't care to understand the statements if it doesn't connect to their cell phone or MySpace. There isn't really a good way around that. My instructor sets minimal expectations for lab assignments and keeps the "rewards" coming in the form of 1000-point grade scale. I think his online discussion forum is probably his best asset in assisting the students. He gives great lectures, but everyone just does the labs and goofs those off.

  172. Start with the hardware basics and move up by Anonymous Coward · · Score: 0

    I originally learned computers in the electrical engineering department of my university. We started by learning how to program a very simple computer in machine language (think binary codes), and very rapidly moved to assembly language. At that level we learned about how the actual machine works; what is an ALU, what are registers; what are different memory addressing methods; and so on. Once we were comfortable with assembly, we learned FORTRAN (today it would be C), and we learned how to "compile" or correlate what we wrote in the higher level language into assembly. We also learned about the various I/O devices such as disk, graphics displays, network, and so forth at a very low level before moving up to the more abstract levels.

    Later on at university we took higher-level computer science courses, such as data structures and algorithms, in the computer science department. The computer science department taught their students introduction to computing using PASCAL and they never were taught the basics of the actual hardware and how they worked. In these higher level courses the top grades all went to the "visiting" electrical engineering students who spent the least time on the course, in large part because we all understood how the machine actual worked so we could visualize the higher level concepts in action and understand them much more quickly and much better than our CS colleagues.

    In my professional career since then, I have consistently seen that people who knew how the hardware worked generally understood what is happening in their programs far better than people who were only taught high-level languages or abstractions. They often also had a much better understanding of what was possible, and what was feasible.

    You might start simply by bringing in a computer and taking it apart in class. Disassemble the whole thing. For example, take apart the hard drive and show them the platters, arms, and heads. Pop the back off the CPU chip and show them the actual chip. Many people get much more interested if they can touch and feel what you are talking about, so when you show them the actual hardware bits they can then later relate your functional descriptions to the actual pieces they touched and examined earlier.

  173. Use your experience? by Xest · · Score: 1

    A good programmer knows the fundamentals of programming, they know all the common data structures, they know if they need to learn a new language they often don't need a full text but just need to know what the syntax rules are, whether arrays are 0 indexed etc. for example.

    Start with the basics, explain the processes involved in them using a PC. Explain that when an executable file on hard drive is run how it's copied into memory, how references to external libraries are handled, the stack. Explain how code compiles down to bytecode to be run on an interpreter or down to native machine code and so on.

    Once they know the fundamentals it'll be easy for them to pick up the rest in a well understood manner rather than doing how so many do and being dumped straight into programming without understanding how memory is actually being allocated etc. This is after all a large part of Comp. Sci. - not simply programming but understanding Computing.

    Once they've got the basics you can go either way- either lower level and explain how various math topics relate to computing (set theory to databases, number theory to cryptography for example) or you can take things higher level and then teach them programming in a modern language.

  174. Build on the work of others by Anonymous Coward · · Score: 0

    You are making a mistake if you think that you can create a successful curriculum from scratch because you know something about computers. I suggest you find a good book. My recommendation would be Mark Gudzial's 'Computing and Programming with Python'. It is designed for the kind of students that you are describing and starts immediately with real problems with a cool factor. The focus is on multimedia programming, so the projects are things like simple green-screening, making music, etc. Python and the libraries he includes makes the projects simple and very appealing. You can pepper you classes with discussions about the Internet and how things work, but don't get too technical or try to cover to many things.

    Of course, one thing that I always try to integrate when I teach similar courses is some days when I talk about societal issues with technology - the DMCA, the patriot act, fair use, "piracy", RFID tagged IDs, who can see those drunken photos you posted on facebook/myspace and why it matters, citizen journalism, etc. These are things that are a part of their lives and no one else is telling them about them and why they are important.

  175. uhm... by SuperDre · · Score: 0

    The fact you have to ask that question is a sure thing you are not suitable for teaching that course. Especially when you say 'php & phyton' in a 'basic' programmingcourse, means you are not suitable for teaching it.. those languages are not suitable for learning someone how to program decently.. but hey, that's just my opinion...

  176. HtDP by grettke · · Score: 1

    You aren't a teacher, why come up with a curriculum from scratch? Better yet, use something that a lot of high schools and colleges use, HOW TO DESIGN PROGRAMS: http://www.htdp.org/ http://www.htdp.org/2003-09-26/Book/curriculum-Z-H-2.html

  177. Haskell monads by koafc2 · · Score: 1

    I would start with Haskell monads. If they can't get those, they're not cut out for programming.

  178. Survey Course of Actual Programming? by Anonymous Coward · · Score: 0

    I'm taking an intro-level course in programming now, and I have a background in web development. The course I'm taking uses Python as an instructional tool, and the book "Think Python" as the basis for the training. I have to say the book is relatively simple, the concepts are straightforward, and it's all presented in digestible sections. Also, the book is free to download here: http://www.greenteapress.com/thinkpython/ When the eyes glaze over, you can play some vintage Flying Circus episodes to reign in their attention.

    I agree with the sentiment that your course sounds more like three courses targeting different audiences. I think you need to decide if this is a survey course or if you aim to actually teach them hard computing skills. If I were developing your syllabus, I'd probably recommend:

    Part 0) Basic Computer Operation (pointing, clicking, etc.)
    Part 1) Survey of Popular Use of Computers (the Web, learning applications, social networks, online gaming, etc.)
    Part 2) Basic Programming Skills (variables operators, conditionals, functions, etc.)
    Part 3) Survey of Advanced Programming Concepts (cloud computing, information architecture and informatics, IDEs, etc.)

    You could omit or shorten each of these elements to fit the course objectives, which probably depend on your audience. The main advantage of teaching any computing course is that you can get incredibly interactive.

    Finally, if your students are under 18, consider the implications of getting them involved in a social network or building a web site - you may need parental permission for anything that exposes personal information on the net. Maybe set up an internal web server?

  179. It's an introduction. So introduce them! by mcrbids · · Score: 1

    If this is an introduction class, remember that your goal is to introduce, not indoctrinate. You aren't teaching and "advanced algorithms" class, you are showing your students a bit about programming what you can do with it.

    Starting them off on something that introduces the subject of programming is a good idea, but I wouldn't even start them off on PHP, Python, BASIC, or Pascal, I would start them off on Scratch. It's a product of MIT, it's free, open-source, cross platform, and does an amazing job of showing the basics of event-driven programming. Even to the area of variables, iterations, etc.

    Oh, and you can usually get somebody started in 10 minutes or so. It's quite a site to see somebody program a multi-player game full-on with scratch in an afternoon.

    I would introduce increasing challenges in Scratch for the first month or so, so that people get a clear understanding of how variables, callbacks, math functions, and algorithms are used before introducing them to a more "real" programming language.

    Of course, YMMV, I have no idea what context and environment you are really dealing with...

    My $0.02 of free advice.

    --
    I have no problem with your religion until you decide it's reason to deprive others of the truth.
  180. Small list by Borg+Bucolic · · Score: 1
    Things that didn't work: 1. using tools like compilers and other software that students had no access to outside the school. 2. giving crippled versions of these same tools to students. 3. Trying to either be too broad with no depth, or the opposite of that. 4. teaching things that are unlikely to have a future use outside of the classroom. (like LOGO)

    Things that did work: 1. do not do the first list.

  181. Your *First* C/C++ Program by Anonymous Coward · · Score: 0

    Although the book is out of print (http://www.amazon.com/Your-First-C-Program/dp/0782114148/ref=sr_11_1?ie=UTF8&qid=1223836443&sr=11-1) I remember it being a great book to learn the basics from (I was 12 at the time and wanted to write a game). My expectations at the time were obviously way too high but it put me out on the right foot. I know some people would recommend Java (etc) as it avoids the "difficult" things in the lower level languages such as C/C++ (memory management) but considering programming is, in the books words, "telling [the computer] what to do, in exactly the correct order, in a language the computer understands. That's it." missing out these fundamentals is dodgin the bullet. Can you really learn something without understanding exactly what it is you are doing? Just my 2 cents.

  182. Keep it simple by JoeDuncan · · Score: 1

    Wow. Most the replies I have seen so far are from a much too high or abstract level.

    Speaking as someone who has taken both computer science at university *and* computer programming at college, I'll comment on what they teach at college for computer programming. In university, computer science classes tend to assume that you have taken computer programming in high school, and therefore already understand the basic concepts. They make no such assumptions in college.

    The first step is to simply explain that computer programming is not magic, it is a method of specifying a step by step solution to a problem i.e. laying out a set of steps to solve a given problem. Usually, you can do this by using a recipe analogy to cooking. You have a set of ingredients (variables) and some things (operations) that you do with these ingredients in a set order.

    Now that's a really brief description, you would of course also explain briefly what a variable is, what an operation is (in computer terms - usually best equated using a math analogy) etc... The important thing is to emphasize the relations between computer programming and things they already understand (math, cooking etc...).

    What you *don't* need to do is explain anything about:

    -algorithm analysis (Big O - that will generate blank looks and dropouts)
    -how computers actually work (1s and 0s, switches etc... again, blank looks and dropouts)
    -computer hardware (hard drives, CPUs, RAM etc...) this may be acceptable for a intro to computers in general, but is not necessary to learn how to program - too much detail
    -advanced math (calculus? see above)
    -HTML or the internet (they might find it interesting, but it's not related to programming)
    -software engineering, they have to learn how to walk before they can run, they'll have no clue about this until they actually grasp the fundamentals of what a program is and does
    -bits, bytes, binary, hex, you don't need to understand representation to grok what programming is, this is WAY too much detail for beginners
    -OO, you need to grasp basic structured programming first

    All of the above is fine for a basic computer science course, but for a basic computer programming course, you really need to assume that your students are completely computer illiterate.

    So, after teaching going through the first basic lessons on what a computer program is (i.e. formal specification of how to solve a problem) and *leaving out* the list of stuff I mentioned that will only confuse them, you move on to explain the 5 basic elements of computer programming in a bit more detail:

    1) Assignment - the ability to store and retrieve values. As part of this you will need to explain a bit about what a variable is and some basic data types, integers, floats, characters, booleans and strings. You don't need to go into detail about HOW these things are represented, just that these are some of the basic general types of data used.

    2) Operation - functions, what they are, what they do, what inputs are (i.e. to whip butter you need butter (duh), a mixer and a bowl) and what outputs are (the output of whipping butter is (duh) whipped butter)

    3) Sequence - sequential execution of a list of instructions (go back to the recipe example if you have to), this is just basically the idea that one step follows the next in order they are listed

    4) Conditional Branching - the ability to do one thing or another based on the condition/state of some variable

    5) Iteration - repetition of instructions either a conditional or fixed number of times

    These are the basic elements used to formalize solutions to a problem. If you can get your students to understand these basic concepts, then they will understand the essence of what computer programming is, and realize that it is not magic.

    Once they have grokked this, *then* you can move to actually having them write some basic programs in some language that is suitably simple in

  183. Feeling your confusion by jboetje · · Score: 1

    About 6 years ago, I left industry after 30 years for higher education. A bit a confusing at first, but you'll get used to it. Be prepared to realize that the undergrads know more about using the Web than you do. Talk with other faculty. There are probably some people who can help you find all the "interesting" aspects of academia.

    I'd start with 2-3 weeks with Scratch (MIT). I think it's best system for learning the how computing works. I've had non-majors building systems with messages, nested loops, etc in 2-3 weeks. Once they have the concepts, you can go different ways depending the aptitude of the students. If you're not sure, try them on Alice (ask around the faculty if any have used it yet). There they have to actually type some code. If you think they are ready for straight-out coding, you could go with Python. A lot of colleges are using it in the first programming course. Alternately, you could go onto Web programming using Javascript.

    Good luck! The first year will be a bear. Then you'll find what works and not for you. Enjoy! Email if you need.

    Jerry

  184. First programming class by thefastrunner · · Score: 1
    I had my first programming class in 1979 and we used TRS80 Level II Basic. I was in 8th grade and the concept of a variable representing a value was being taught in programming, and also in algebra class. We drew diagrams on the blackboard to illustrate that each variable was associated with some location in the computer's memory, and the computer's memory was storing a value. A simple program changed a certain value for each statement, and we "played computer" by walking through the program, and writing variables' values on the blackboard.

    We did simple programs like

    10 FOUR = 5

    20 FIVE = 6

    30 PRINT FOUR + FIVE

    We also did flow chart diagrams, IF conditionals, and some elementary logic.

    Since I was taking the course just at the beginning of the PC era, I had barely used a computer prior to taking this class, as my elementary school days preceded the widespread penetration of the home PC. Perhaps I was fortunate in this respect.

  185. Anonymous Coward by Anonymous Coward · · Score: 0

    I've been programming over 20 years. I'm going to suggest that programming and intro to computers are two separate subjects. i.e. if you don't know how to turn a computer on then you don't belong in the programming course. Now then, moving on. Assuming you are talking about teaching programming. Back in college one of my professors did something really really good:

    This was an intro to programming class and they were teaching the old QBASIC on DOS.

    What made this teacher stand out above the rest is that he tought the class like HE was a machine. He gave very specific instructions for the class to follow. He asked that all homework be turned in on a 3.5 floppy with your name and class number PRINTED on the front of the disk. The disk had to be in a folder WITH pockets. The source code had to be printed out also and included in the folder. The staple HAD to be in the top left hand corner of the paper, not the right. The staple had to be vertically oriented. The outside of the folder had to have your class & name PRINTED on a label on the top right hand corner. Class on the first line, then name on the second line.

    He would give 5pts off if you missed any one of these steps. He handed out a piece of paper at the beginning of class that had all the steps needed to turn in an assigment. They were well enumerated and easy to understand instructions. However every single time there would be some students who didn't get the staple right or didn't print their name but wrote it instead or didn't have a folder that had pockets or hole punched their assignment and put it in a 3 point binder thinking it would look extra sharp that way. He would always give 5pts off for every single thing done wrong before he even looked at the code. If the code didn't work he'd subtract even more. Some students who had otherwise perfectly good functional code would get an 80 and get pissed off because they didn't see the point.

    He was considered very anal but what he was doing was pure genius. He was teaching the students that computers are NOT forgiving and they do exactly what you tell them. He was engraining it in us early on that you must be a perfectionist in order to get the system to run properly and get 100% correct results.

    Very good teacher :)

    very misunderstood.

  186. My two cents by Anonymous Coward · · Score: 0

    Teach them to drink beer, eat Chinese food and pizza, shun sunlight, and carry removable media around with them.
     
    Worked for me!

  187. Divide and Conquer by EtherealFlaim · · Score: 1

    Make sure you are teaching multiple levels of your class, and that they are not required for one another. Students nowadays have the wherewithal to be very proficient at everything from applications to programming to electronics and hardware before they ever set foot in a computer classroom. You need classes catered for, at least:
    1) Students who have never been exposed to a computer.
    2) Students who have used a computer and are familiar with how it works, but want to learn how to be power-users of important working applications such as Office (especially Excel) and how to be effective and courteous netizens.
    3) Students who want to learn the basics of programming
    4) Students who already know how to program and want to learn the Computer Science behind it.

    I think they should all contain some element of web awareness and good netizenship, as those are going to be more important in the coming years, but most of the rest is going to be specific to the class.

    Your course for basic computers should probably happen on a Mac. If that's possible. I only say this from experience watching my family: people can find things on a mac by reasoning it out, whereas you have to already understand the organization of Windows to find things there. It should cover the basics of starting a computer up, installing an application from CD, how to uninstall applications, the importance of anti-virus and anti-spyware, how to get and use a basic e-mail account (thunderbird, I believe, lets you sign up for at least one type of email account right within the wizard), how to create multiple users and why that is important, etc.

    The Office course should at the very least cover using some of the more powerful features of Excel, how to create and collaborate (read: track changes) documents in Word (especially with automatic section numbering, advanced formatting with sections, headers/footers, etc.

    The basic programming course should be done in a basic language that actually has real world applicability. I would recommend perl or C++. Java is an alternative, but I have my own issues with it that aren't relevant to this discussion. The essential thing to make clear to your students in this setting is that you are trying to teach them the basics of programming, not how to code. You need to be very clear about designing the program from the ground up and documenting it all along the way. When you teach them bad habits, make sure they know they are bad habits and why, and also why the better habit is being avoided. They shouldn't have to learn these when they are laughed at by an employer.

    The advanced programming class should NOT be specific to a single programming language. Somehow, this seems like a novel concept to a lot of people. These kids know how to program, so don't make them learn your language or your style! Focus on computer science concepts such as recursion, algorithm design, data structures, etc. Obviously you will have to limit what language they can use (BASIC doesn't have OOP, data structures, etc), but anything from Perl, Ruby, and PHP all the way out to C++ could be used for a class of this style. Have a project-oriented class which focuses on deliverables and hands-on demos, as well as having to explain their code and methodology. These are essential skills in the workplace. Bosses don't care about the code, they care about what it looks like, how it works, and why it's better than what some monkey could write.

    This is a lot to start up at once, so don't try to start all of the courses at the same time. Try to gauge interest first and start on the ones you can first. Don't stretch yourself too thin, or you'll just be doing your students a disservice.

  188. Teach EVERYTHING they need for the project by Anonymous Coward · · Score: 0

    You need to sit down and say "What should my students be able to do with ONLY the content I have taught them.

    If you want them to write a java applett, teach them EVERYTHING that is pertinent to making one, don't assume and leave stuff out and don't teach freaky abstract theories or give out large amounts of information that has no purpose/it too advanced/doesn't apply.

    I once took a beginners class for C#, and the professor started out the class by writing a console program that converted measurements in front of the class, didn't explain one thing other than "press F5 to debug" and then told us to have the first assignment done next week.

    I was in a class to learn Java, and the prof started talking about theory, history of the language, libraries, different distributions, usability of the code, VIM, theory behind open source and why it was different than other languages. He then sat down and said "Now write a program."

    It seems like common sense, but don't ever think that they know anything more than what you've told them, and assign accordingly.

    Don't worry about skill sets or previous knowledge, what level you should teach or what the class is going to be interested in. If you want the first assignment to be to write an OS, then do it, just make sure that you give them the information to do so.

  189. History boring and useless? by jotaeleemeese · · Score: 1

    No wonder we get the politicians we do. All talk, no history.

    You have to be a dreadful person to make the life of people like Allan Turing boring. Heck, such lives are so interesting that movies have been done about them.

    It helped me greatly to talk about Chomsky's life and achievements while learning grammar theory, of course it helped that my teacher worked with him, but still, any mediocre teacher should be able to make any life or historic period juicy and relevant.

    History gives context to science and technology, it is good time that geeks and nerds were more fond of it.

    --
    IANAL but write like a drunk one.
  190. Noooo! by jotaeleemeese · · Score: 1

    HTML is the worst, it is a formatting standard, not a programming language, all the scripting languages for web development are the abomination of the devil from a programming point of view. Leave those for the poor sods that need to make a living using them, for normal people use some language that are simple and consistent (basic, pascal, perhaps python).

    --
    IANAL but write like a drunk one.
  191. have a fun final project as a goal by peter303 · · Score: 1

    Like a simple video game. That will motivate much of the class.

  192. Start with Somethign they are interested by tj111 · · Score: 1

    Start with something that the students are interested, ie how the basics of the web work. How when you visit a website, your actually requesting information from another computer not to different from their own computers. Then give them the basics to write a basic "internet" application, using something like the google app engine or a little apache server you have set up. Once you have their interest, then go into coding practices and such. And be sure to teach that programming is about making mistakes. If you don't make mistakes/errors, your not programming right, and your definitely not learning anything.

  193. Try C, Java, C#, or Python, just not PHP or C++ by schmichael · · Score: 1

    I taught 2 100 level programming classes as an adjunct professor once and used C#.

    I'm a Python web developer now and think it would be the ideal language to use for teaching. It has all of the important OO concepts baked in, and the interactive aspect makes it a very very easy language for beginners to learn.

    Frankly though, C, Java, C#, or Python all seem like fine options. Each is probably best suited for certain audiences, but any of them are better than C++ and PHP.

    While C++ and PHP are very popular languages, no one should learn them first. They're both hideous to look at (which matters to beginners), and in the case of PHP, just very hackish and lacking in good structure.

    Start with pygame. Everybody loves a good simple game.

    Just my $0.02 though.

  194. Training to become an asp.net programmer by binoj7 · · Score: 1

    I had trained my sister who just knew how to browse the internet and search for information from google. I started teaching her first the C language (from the book "let us c" by yashwant kanetkar, with basic algorithms) Then taught her C++ (object orientation for her started here) Meanwhile in parallel started HTML, javascript, DOM, css. (from w3cschools.com) Then started with c sharp (Without using visual studio) In parallel to this started ASP (classic) and SQL server for database. Then we moved on to ASP.NET (again without using visual studio) using the ASP.NET quickstart tutorial included in the SDK. Finally started with doing mock projects in ASP.NET using Visual Studio 2005 and Sql Server 2005. This whole training took 1 year, but considering the fact that she ended up getting a job, it was alright. Initially I thought of started with c# straightaway but its just that she would have missed understanding pointers and memory management. -- my 2 cents.

    --
    You cannot solve tomorrow's problems with today's level of thinking - by Einstein