Best Introduction To Programming For Bright 11-14-Year-Olds?
firthisaword writes "I will be teaching an enrichment programming course to 11-14 year old gifted children in the Spring. It is meant as an introduction to very basic programming paradigms (conditions, variables, loops, etc.), but the kids will invariably have a mix of experience in dealing with computers and programming. The question: Which programming language would be best for starting these kids off on? I am tempted by QBasic which I remember from my early days — it is straightforward and fast, if antiquated and barely supported under XP. Others have suggested Pascal which was conceived as an instructional pseudocode language. Does anyone have experience in that age range? Anything you would recommend? And as a P.S: Out of the innumerable little puzzles/programs/tasks that novice programmers get introduced to such as Fibonacci numbers, primes or binary calculators, which was the most fun and which one taught you the most?" A few years ago, a reader asked a similar but more general question, and several questions have focused on how to introduce kids to programming. Would you do anything different in teaching kids identified as academically advanced?
Hello World, it's Foo Bar!
Beer is proof that God loves us and wants us to be happy.
We'll see how bright they are then...
I learned Lua when I was 14, with no previous programming experience. It's a pretty simple scripting language, and it can be really fun when you make addon scripts for games you play (quite a few games use Lua these days) and see them come to life. :)
Tiny ALGOL
Functional programming is making a comeback- it's going to be to the 2010s what OOPs was to the 1990s. I'd suggest these, and make recursive loops a major sticking point. Dr Dobbs has a nice article on why these functional languages make excellent methods for taking advantage of multi-core processors.
SJW: a person who perceives an injustice, and while correcting it, commits a greater injustice.
It is partially in jest, but LOGO was created to teach kids how to program. Real world wise, though, I would say C or PHP. They are both currently used, relatively easy to learn and require no cost to get started.
See subject.
I started with QBASIC, and I would rather recommend against that. Things like real functions (as opposed to GOSUB) and such, even though you can do them in QBASIC, I didn't see for years.
Always enjoyed programming teh old TI-85 calculators. Not sure if yrou still required to use them in school, it allows simple graphical stuff, plus it is mobile which woudl appeal to a kid.
http://tibasic.wikia.com/wiki/Main_Page
DO NOT, I repeat DO NOT do what many comp sci departments and high schools do, and that is "begin with Visual Basic".
NO! NO NO NO NO NO! Okay, so they learn about variables and shit, but, just, NO. Terrible programming practices and weird little things where commenting is done with apostrophes and other typical retarded shit is what you'll end up teaching them.
Visual Basic is OK for a quick and dirty Windows program. But if you want to teach the basics of what "real" programming is, I wouldn't recommend VB.
Consider something like POV-Ray, since it's a programming environment with a visual payoff.
Show someone a simple program that generates 10 randomly positioned mirrored sphere over a checkered landscape then encourage them to play with the number of sphere, assign colors to them, etc.
Much more interesting to be able to *see* the output of your program than just reading "Hello World!".
G.
The first algorithm I actually understood and was able to re-implement (in Sinclair Spectrum BASIC) was a bubble sort, so I would recommend that. I had been experimenting with the graphics functions for a couple of months before but I did not learn much from that. I think the important thing is to avoid pointers and also avoid dependence on any OO concepts (it's easy to forget how hard they were to learn.)
Is Betteridge's Law of Headlines Correct?
These languages are clean, easy to learn, and abstract away from the machine architecture enough that young'ns don't need to worry about all that stuff just yet.
You don't really expect things like Fibonacci numbers or binary calculators to entertain a 12-year old do you? Why not make something actually fun, like a game. One class when I was in university had an assignment where you had to remake the "Hunt the Wumpus" game. Little games like that might be better for getting kids into programming than the boring stuff like Fibonacci.
11-14 years old = NO CASH.
Nobody has more free resources available to the budding programmer than Microsoft; like it or not.
Anyone can download FREE IDEs, free Source code, videos, documentation up the wazoo.
Also, C# is almost syntactically identical to Java, and it is a good language for the beginner to discover whether or not they have a REAL interest and a knack for coding.
If I were 14 again, wanting to learn how to code, Microsoft would be nirvana with all the free available stuff out there. There really is no contest.
As always, I got karma to burn, so take your best shot....
For the times where you want to have fun in class - it's a fun game, and it really teaches you the aspects about thinking ahead when doing functional programming.
It's all fun and games till someone divides by 0. Then it's hilarious.
The most fun things were games. There are some very simple games that you can write programs for relatively easily.
If you can get ahold of an old book that got ME interested in programming in the '70s... David Ahl's 101 Basic Computer Games... it will have a lot of examples of games that are readily implemented. Don't worry about the code, of course, but consider the games themselves as exercises.
It really is a great looking learning environment.
See my blog http://ilovecookes.blogspot.com/ for light hearted technical information.
If you want to use C# because it's similar to Java and is freely available, why not use Java? It has awesome tools available and is just as (moreso?) free as C#. Since we're talking about free, what decent programming language exists that is not free nowadays or does not have loads of free support material available?
If you're trying to introduce the concepts of looping, iterations, etc and don't want to get hung up on the details of the language, I highly recommend the Lego Mindstorm kits. They have a flow-chart programming interface that I had great success introducing programming to my 11-13 year old cousins, and if I remember correctly, they also have a lower level interface to let you start writing your own functions.
For kids this age, nothing is better/cooler at showing them the basics of programming than something that gives a physical response. Loops, conditions, make so much more sense when trying to figure out how to keep your robot from running off the edge of the table.
Tangible real-world feedback, and a sense of real accomplishment. If you just give them abstract languagues for the sake of language, they get disappointed they can't just whip up the next Madden game. Besides, they probably all already have Legos at home, and a Mindstorm kit is something they can easily get at home, which probably won't happen with Pascal compilers or Basic editors.
I'm out of my mind right now, but feel free to leave a message.....
I know several young people who've got hooked on programming because of this free book: http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids/
There are versions of the book for Windows, Mac, and Linux. Although the book targets kids as young as 8, it would still be able to speak to an 11 or 12 year old I think.
Objective C gives them the ability to build applications quickly and easily using GnuStep or Xcode. If they have iPods, this also gives the them ability to develop apps for them as well. The intrigue and excitement in their ability to do that often will get them excited in developing in other languages.
This is my sig. There are many like it but this one is mine.
Instead of teaching them how to write a dummy program in a particular language, it is by far better idea to lay the foundation work by teaching them how to design and formulate a solution to a particular problem in a logical, concise, and efficient practice. Being able to diagram out an idea, condense it into a formula, and then simplify will be much more useful than knowing how to write hello world in one particular language. In a sense, you would do them the favor of prepping their minds to be able to handle any language their future employer will throw at them.
Where is the "Ignorant" mod tag?
It wouldn't start with any specific languages, but using Alice and its younger cousin Storytelling Alice might provide a good intro to concepts.
I would judge how quickly those concepts are being integrated and then move on to an easy-ish language like BASIC.
I would start off with Java if I wanted to learn an object oriented language and the tools and documentation are abundant. There are many good IDE's out there to "help" you with the syntax and it is cross platform, so if you like Linux, Apple, or Microsoft you are covered (and many others).
I would then learn Scala, that is a functional language. I can't speak a ton for it because it is so new but if I had to pick a functional language to learn Scala wold be it.
Next I would learn C. This one could take you a while, but by this point you should have a solid understanding the basics and thus you can focus on C specific things.
This is unfortunately not what I did.
I started out doing machine code on a Z80, then some BASIC, then Pascal, then some assembly thrown in there and then some simple C, then Java. The jump to object oriented programming what tough for me, and I have seen guys go from object oriented programming to procedural far easier.
Hope this helps and I am not trying to start a coding war.
The more I learn about science, the more my faith in God increases.
Take a look at this: http://www.swaroopch.com/notes/Python
http://pinopsida.com
http://scratch.mit.edu/ Scratch is very cool, comes with an educational program for kids. It's an mit/ucla project
I'd think the only reasonable languages to start programming should be PL/1 or COBOL. Whitespace or Brainfuck could be suitable alternatives.
My CS program started us in Pascal, and I would vote against doing that. I'm a Java programmer now, so of course I'm biased in that direction, but I believe Java, C#, C (if you're brave), or any of the web scripting languages would be a better choice than Pascal.
Lisp.
When I was 10 I learned Fortran... On cards... On a big mainframe.
And we were grateful!
Boy I feel old.
"Trademarks are the heraldry of the new feudalism."
I recommend PostScript.
For kids, PostScript has the advantage of nearly instant gratification, because it allows them to draw graphics quickly. It has loops and conditionals. It uses stacks and variables and functions.
All you need to get going in PostScript is a text editor and a PostScript to PDF converter. On a Mac, it's built in. On Windows, I use GhostScript in CygWin and run ps2pdf, just like I would on Linux. Alternatively, Acrobat Distiller should do the trick.
If these children really are the gifted ones you say, they'll already have the basic concepts of an editor: create, change, save, so they can start creating programs much sooner.
You also want them to become familiar with the basic syntax od computer languages - most of which are quite similar and look a lot like Perl's syntax.
Perl also gives those who wish, the ability to develop further, after the classes finish.The large amount of freely available documentation and examples on the internet will help then learn from properly written code from other people.
politicians are like babies' nappies: they should both be changed regularly and for the same reasons
These are kids of the 21st century. Start with simple web pages in HTML, then add picture loading, tables, etc. If they take to it, then basic javascript. Start by using a text editor then later introduce graphical tools. All free and easy to implement.
Please keep them away from any form of BASIC. The last thing this world needs is even more programmers who couldn't understand pointers or recursion if their lives depended on it. Start them with C, and then let them try high-level stuff once they understand what's going on under the hood. No, it really isn't too difficult. I did my first non-trivial programming and learned C and x86 assembler around that age.
When I was that age I learned BASIC by changing the text in the Snake and Gorilla BAISC game that came with DOS. In my high school they had a programming class that was mostly BASIC but also taught Paschal.
Libertas in infinitum
Towers of Hanoi is always a hoot :-)
"The number you have dialed is imaginary. Please rotate your phone 90 degrees and try again."
I hate to say this since I don't even know the language (heck I'm barely competent with HTML) and came up through GW-BASIC, Turbo Pascal, assembly, FORTRAN, C, Tcl, C++, Perl, and some others I'm sure I'm overlooking, but...
JavaScript
First, it's nominally C-like, so it gives them exposure that will help them with a large variety of other languages (e.g. C, Pascal, C++, Java).
Second, it's available to be used pretty much anywhere the kids have access to a computer. At home. At school. At a friends house where they can show off their newfound coolness. Don't underestimate this, because it's very important that they have access to the necessary programming tools in their idle time at home and elsewhere. It's also important because they don't need to learn how to use a compiler, linker, and all those other tool distractions that will get in the way of understanding programming itself.
Finally, it's useful in a context they likely already somewhat understand -- web pages. Fibonacci sequences and prime number sieves and such are all wonderful, but an environment that allows them to build something a bit more interactive and, lets face it, relevant to their day-to-day life, will inspire some portion of them to continue the pursuit. Granted, I got a lot of personal satisfaction out of writing BASIC programs to print "x" characters in a sine wave scrolling up the screen, but somehow I think the bar has been raised for today's kids' expectations of what a computer can do.
Cyrano de Maniac
They could dive into an open source project. They are always a mess and a challenge to even figure out what is going on. Sounds like the perfect real-world intro to the world of programming.
Metascore could use some help from some bright kids. :)
Or really, absolutely any open source project would do, since there is always something to which anyone can contribute.
I (and others) wrote a good wikipedia page on this topic
http://en.wikipedia.org/wiki/Educational_programming_language . I'd look at this list
I personally love and can recommend Alice http://www.alice.org/ and had a great deal of success with my daughter with this.
If only for the graphics control. It lets you draw text anywhere on the screen, and clear it, enabling quite sophisticated graphics and animations. It can also wait for user input and respond, so you can make games with it. Kids love that sort of thing.
Logo has good graphics control but poor input-response, and Python is a much better language than both Logo and QBasic, but since it can't (easily) do graphics, it appears quite boring.
"A week in the lab saves an hour in the library"
There are several languages out there that can work well as introductory languages. C probably isn't your best option, but any of Perl, Ruby, PHP or Python would do fine. Scheme or Lisp might be interesting, too, but I'd probably save those for a second or third language. The concepts they emphasize are important and well worth knowing, but probably not the first things to be learned.
More important than the choice of language is the analytical thought process of programming -- breaking down the thing you want done into small enough pieces that you can tell the computer, in some language, what steps to take to do the job.
Where is the wisdom we have lost in knowledge?
Where is the knowledge we have lost in information?
I am a freshman who goes to a technical charter high school. I don't know how talented or gifted of kids your looking at but we were introduced to HTML just two months ago. I'll try to find out what programming language they teach first, but with 11-14 year olds it's going to be more of a task keeping they're attention then teaching them something. From experience with martial arts instructing I would say you either need to split them into groups (less talented, moderately talented, extremely talented)or build from the bottom, explaining that it would be good to review the basics first. The number one thing though is ALWAYS keep them busy.
Lojban is a constructed, parsable language that can deliver the same (or greater) information content as natural languages.
Coding up the division algorithm for integers is very insightful. Also, showing it's application to the euclidean algorithm connects all kinds of fun math and algorithmics with programming.
3-2-1 Contact (and encouragement from my father) got me started programming Basic on our family's Apple IIe computer. In elementary school, Logo helped it along.
Either of those, or their modern equivalent, should be great. Basically anything where you start off seeing direct, tangible results and then move on to the theoretical stuff.
Wow. That really took me back. Is there still good media like 3-2-1 Contact and Square One for kids?
Mods: Disagreeing with me != my post Offtopic / Flamebait.
World without hate or war, invaded. Tragic?
For different challenges you could put them to, I would recommend http://projecteuler.net/. There are a huge variety of programming challenges (most involving math concepts) across a huge range of difficulty. They also provide a good introduction to recursion and cost of complexity since the 'most efficient' algorithm is not always obvious.
You could provide prizes for who completed the most problems as well as a prize for being the first to complete a problem. Then when all or most of the class has completed a problem, you can show them an 'efficient' or 'simple' solution depending on which you want to emphasize.
The PLT TeachScheme! project has a curriculum for teaching programming to high school students, and apparently it's been modified for middle school students as well in the Bootstrap project.
i got a mild introduction to programming from learning LOGO and LOGO for legos (that may be deprecated by now). anyways, the first 'big' project i did was a Mastermind clone. it taught me the basics of looping, random number application, and how to make use of the mouse.
Therefore I would suggest an exploration type of experience, especially for the pre teens. I also would not focus on giving the latest tools, as it will be 10 years before most of them are out in the market, and tools will change. One nice application is the Alice software from Carnegie Mellon, along with story telling Alice for the small kids. It is free and teaches many of the concepts of OO and procedural languages. What is bad is there is no real curriculum for it, IMHO, targeted to under 16 set. OTOH, it does teach many good concepts, and does engage kids.
For a more traditional approach here would be my objectives. Note that the language and tools are unitmportant. What I think is important is to encourage abstract thinking. Number one: algorithms and procedures. These are important in math and science, yet most students cannot write a good algorithm. They leave large gaps. If a student can write an algorithm to count, or sort, or whatever, and code it, your science teachers will worship you.
Number two: variables. Many kids can never understand variables. What are they, how are they used, why do they change over time(they vary, duh). By focusing on variables, constants, and parameters, the kids will gain an important problem solving tool. You math teachers will worship you.
Number three: Form and syntax. Make them use a language to code! It teaches that almost is not good enough. Everything has to be perfect. This is why Fortran is so wonderful. It forces the student to focus on the details and the overall process. This is like writing an essay. You have an overall goal and parts that must be equally organized. Now the english people are on board.
Lastly, my pet peeve, i=j; j=i is not a swap operations. Any kid that can understand this is ready for any math or science high school class. In fact this is the first thing I would do. Write a swap function. Watch it fail. Let them fix it. See the joy when understanding comes through.
None of this needs to complex or over the kids head, and they can take as long as they like to learn the concepts. Those who race ahead can solve typical problems like stacks, efficient sorting, and the like. One thing I see missing is the lack of teaching of basics, stuff that is now buried deep in the library. When one starts programing in college, sure it is hard to do all this, but when is programing at 12, there is time.
"She's a scientist and a lesbian. She's not going to let it slide." Orphan Black
My first language was BASIC, but I wish it had been C. If I'd been a member of a captive audience (such as an enrichment program) when I first acquainted myself with C, I might not have to deal with "but this isn't like BASIC". I imagine that the inevitable "but this isn't like C" would have been much easier to cope with. BASIC dulled my senses during my formative years. :(
For a toy problem, I've always been partial to Towers of Hanoi. Input n, then output a sequence of moves that solves the n-disc Hanoi problem in some format (e.g., "1-3, 1-2, 3-2, 1,3, 2-1" and so on). Recursion is very confusing for newbies. This particular problem was one of the influences that helped me out early on.
Actually, I started my son off with Visual Basic at age 12. It wasn't very difficult and it may well be better to start them off with event driven programing rather than procedural. Rather than writing the answer on a command text line, put the results in a text box. Push buttons to actually execute code. The kids will really like writing a program that looks more like what they are used to than some antiquated program written for use on DecWriters. My son loved it and now at 24 he is a programming project leader for a software development company.
Ruby. I'm not a fan of it, but here's why it'd make a great starter language: 1. Loose, Forgiving, English-Like Syntax 2. Supported Everywhere 3. You can start with Functional Programming and later introduce OO. Finally, DONT FORGET TO MAKE THEM GRADUATE. Challenge them on their last few projects and make them do it in c++ or Java. I worked with a brilliant 15yr old in college (highschool programming contest), but he refused to try anything but Ruby "cuz it's best."
I fully agree. It's about knowing what is going on inside computers. If they don't do this, then things like "binary arithmetic" are invisible and nothing more than a "mathematical oddity" to try as a toy project. Definitely stay away from languages like BASIC. I'll leave my bias against C++ and Perl out of this, for now.
now we need to go OSS in diesel cars
If your students aren't total noobs, ask them about what languages or web technologies they might have thought about trying out, like, someday.
If they are total noobs, ask them what their favorite sites are. Protip: do not roll your eyes at any point after asking this question.
Either way, it will give them familiar ground to work from, and a little bit of context. myspace may be godawful, but learning from the mistakes of others is second only to learning from your own mistakes.
The future ain't what it used to be.
We'll see how bright they are then...
I know that I am piggybacking but I thought that the educational world had moved on from the terms bright, gifted and related words.
A good read, if nothing else.
More
In my experience, CS programming competitions tend to have entertaining problems that should keep the kid's attention. The American Computer Science League has a small handful of quizzes and example problems posted on their website here. ACSL's contests are designed so that each difficulty level's problem builds upon the previous problem. Another example is the International Olympiad in Informatics, which has problems from each of their contests here.
If I have been able to see further than others, it is because I bought a pair of binoculars.
Use the text "How to design programs" and Scheme. It's been used in high schools, is quite approachable, and is easily motivated by connection to recurrence relations, which seem to be a theme in my 14 year old's math curriculum. The book is free on the web, and the programming environment is also free and supported on many popular platforms.
Wow, there are so many more options than when I began a little more than a century ago. :).
Back then unless you had access to high end hardware, there was basic and machine/assembly language. I was so stoked when I finally got the Assembler cartridge.
I lived in a small rural town so I had to scour magazines and the book store on trips to The Big City with an occasional nudge from an older brother who was in college.
You kids nowadays don't realize how easy you have it
Which one? Whatever gets them excited.
I always wonder why colleges start out teaching Java first. Procedure based languages are easier. You learn
2 + 2 = 4
before you learn
a^2 + b^2 = c^2.
You can learn the basics in any language. The syntax is all very similar. Lets look at the difference.
in C explain a routine.
int main(int argc, char *argv[]){
return 0;
}
In java explain a class and a routine. Plus the string class is more complicated than a char * and an int.
class javaprog
{
public static void main(String args[])
{
}
}
Always start with the fundamentals.
You should know what pointers are and what memory is before you learn what a class is.
A programmer needs to know why if he allocates 2 million empty string classes why his memory gets chewed up. To a C programmer the answer is obvious.
Fundamentals! Fundamentals! Fundamentals!
One of my most fun "first month" programming projects was a perpetual calendar. I did that in Fortran back then. These days it could be used to not only learn applying arithmetic in programming, but also an opportunity to learn something like HTML by having the program produce its output as a web page. Or maybe even learn JavaScript (after learning C first ... to learn how computers work) and do it as a live web page.
now we need to go OSS in diesel cars
..you can try teaching them TI-BASIC or MATLAB. They're very simple programming languages that still have common aspects of programming (control structures, variables, etc.). Depending on what calculator you use to teach TI-BASIC, it might even be impossible to make typos (e.g. Than instead of Then). As I said, these aren't really programming languages, but that's how I started out. Arguably, I'm still "starting out" though...
COBOL.
I'm sure all these kids have computers at home, probably running XP. Given that, Microsoft publishes Visual Studio Express, which is a free download for hobbyists. They could download it and play around with it at home. It supports C#, VB, etc. - so pick a language of the day and try something. It would be an excellent place to start.
"False hope is why we'll never run out of natural resources!" - Lewis Black
When I taught my son programming when he was around 11 or so, the project I picked was to have him write a stack calculator, including a simple GUI (like a simple version of the GNOME or KDE calculators). It taught most of the basic elements of a program, including a simple GUI, but unlike a really simple game who's novelty would wear off quickly, it was something he was able to use, improve, and be proud of for some time after finishing it.
As to what language to use, that's a hot topic and you'll hear lots of opinions. At the time, which was a long time ago, we used Tcl/Tk because it was simple, had a very easy-to-use fully integrated GUI toolkit (Tk), and was high level in that it avoided having to worry about complex issues like memory management and pointers, which could overwhelm some 11 year olds. OTOH, it taught programming concepts beyond what you could do with something really basic like LOGO. I'm not necessarily suggesting it now, however -- it might not be the right thing today, when there are other potentially better choices like Python, Java, etc.
I wrote the snake game (now made famous by Nokia) in SuperBASIC on a Sinclair QL when I was about 10. Get your 11 year olds writing a simple game, they'll love it. Tetris was the next one I did.
Follow me
Processing is based on java and is all about visuals. It removes all the obnoxious set up and background necessary from lower-level languages, allowing students to focus on concepts and not minutiae. And the fact that it's output is drawing stuff on the screen keeps the reward-level high and immediate!
If there's one thing that will interest kids in programming for a lifetime, it's getting them turned on to fast and cool-looking results.
Shouldn't You expect more from your DJ?
To begin with let's take the computer out of programming Computer Science UnPlugged
There are three environments I'd recommend for teaching programming.
SmallTalk/Squeak coupled with Squeak by Example
Scheme/PLT Scheme coupled with How To Design Programs
Logo/Berkeley Logo coupled with Computer Science Logo Style
The big idea is not to teach them how to do something in one language but to teach them the concepts that will allow them to learn how to do it in any language.
If the kids really are gifted then the class time is too valuable to have them sat there pounding keyboards, that's manual labor. Treat the class as lectures/discussions with experimenting on computers left up to them.
Try and get them to learn about the lectures subject matter before the class e.g. publish a schedule and make it clear they are expected to have read so and so pages before the class.
If they are gifted and motivated this will be as close to the Platonic style of teaching as you can get.
The side effect is that you have prepared them to succeed in college if they can get the idea of using lectures as a review of what they already know.
http://squeak.org/
It's not just the language, it's the whole dynamic multimedia environment. It's great for adults; it's perfect for young'uns.
I'll get modded to oblivion, but I'm leaving others to answer the question actually asked
/rant
The answer is a sound education from ages 3 to 10, not a good text. There's so much of a push-- personally and in our educational systems, to train ourselves in whatever the hot job is for today rather than securing an education that matures one into the kind of person that can span any discipline with ease.
Looking back to Stroustroup's(sp) article yesterday, the reason there are fewer good programmers is because fewer and fewer are actually -educated- in how to think, much less higher math. If you want to teach your kid(s) useful/fun skills, teach them the liberal arts (in the classical sense); once well understood, picking up a computer language (grammar + math) will be as easy as anything else. I freely grant that a good text will eventually be necessary, but if your child is not chewing your arm off for some kind of resource on their own-- be it chemistry, astronomy, CS, mechanics, or what have you, you've missed something in their earlier education
The tutorial he links to - A Byte of Python - is the best Python tutorial in existence. It's perfect for such a course.
To make laws that man cannot, and will not obey, serves to bring all law into contempt.
--E.C. Stanton
Comment removed based on user account deletion
I wouldn't want to try to teach "programming" to any child who hadn't had Algebra I [and preferably Algebra II].
I suppose that "programming" could serve as an introduction to Algebra I, but my gut tells me that that's the wrong way to go about it.
The problem with most introductory programming courses is that they drop you in the deep end and expect the student to eventually figure out how to stay alive based on all the tools they start throwing at you. And I'll be honest, I don't have an answer as to what programming language you should use or if it even matters. Let me explain.
I first started learning programming at the age of 14 (first year in high school). So I might have been one of these kids. Prior to that I knew how to write html and make webpages. That part was easy because there is no programming there. But when I got to my introductory programming course taught in C/C++ at the time, I didn't feel equipped as a student to tackle the problems presented. For example one of the tougher problems in the course was printing a diamond (ascii art) of stars based on a given number as input. So if they provided you with an input of 5, that meant at the widest point, the diamond would be 5 consecutive * characters with the previous and next lines being 3 consecutive * characters followed padded by one space on each end, and finally the top and bottom lines having one * with 2 spaces padding the left and right sides. Keep in mind that by this point, as a student, the most I had learned was basic algebra and perhaps a bit of geometry. The real heavy math/science courses were to be taught later in high school involving trigonometry, calculus, and physics.
Continuing on with the story, most students in the introductory programming class failed at this simple task of printing a diamond to the screen. It wasn't because of their lack of knowledge regarding programming, but their lack of knowledge regarding problem solving skills and the application of math. Had the teacher reviewed the problem at hand, by examining the necessary parts (calculations involved) on a black or whiteboard, I think all students could have implemented a solution. But the place where students were struggling was finding A solution. They would start writing 'for' loops knowing that this was a test of how well you understood 'for' loops without having a clue of why they needed the loops or what the loops were going to do.
So if you want your students to succeed, the language of choice will be the least of your problems since you are not bothering to teach high level programming paradigms (OO, functional, logic etc). The bigger problem will be how to teach the students to apply what they already know in a fashion they've never seen.
introduce them to binary and hex, process control concepts and problem solving strategy. introducing them to a language at this stage will only produce more stuck in their ways programmers.
If you mod me down, I will become more powerful than you can imagine....
In my experience, schools generally implement cutting edge educational ideas from some time in the last 50 years.
They are all cutting edge, they just aren't necessarily up to date, and they aren't interested in changing.
Nerd rage is the funniest rage.
It uses language as close to natural as I think a programming language can. It also forces proper indentation, which, as we all know, is very important for readability. It's also a scripting language that is very useful in RAD. All in all, it's a very good first language for those that don't want a C, hair pulling out, first experience. It also runs pretty much everywhere. Also, if you want to do graphics and/or games, there's Tkinter, PyOpenGL and PyGame.
Happy Hacking!
Do not use an language you do not use to teach the kids.
Teach them the way you do programming. It will be fun enough if they can produce programs to solve their own problems.
Doing web related or net related projects were fun enough I suppose.
It was developed by MIT (http://scratch.mit.edu/) and has some cool stuff to keep their interest.
...But I digress. TREMBLE PUNY HUMANS!ONE DAY MY SPECIES WILL DESTROY YOU ALL!
scratch.mit.edu alice.org both are great tools targeted at kids this age please don't try to start them out on C, danger lies there
Free IDEs, free source code, videos, documentation.... that only applies to, oh I don't know, every language and platform I've ever encountered. A flavour of C is ok to start with, but it's also a bit much for the beginning 11 year old. Hell, teach them Perl if you want to know if they have a REAL interest and knack.
http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx Enjoy!
FOR $DIETY sake, don't do it!!! You'll end up surfing Slashdot ALL DAY like the rest of us.
If you're really bright, go into Physics or Chemistry! Better chance at girls than living in your mom's basement for the next 30 years till you're too old to program any longer!
Agent K: A *person* is smart. People are dumb, stupid, panicky animals, and you know it.
My background is someone who has taught Applesoft Basic, Turbo Pascal, and C++ to middle schoolers at a computer camp; I'll be teaching Flash (and potentially Processing) to artists in college with little to no prior programming experience.
I recommend using Flash with Actionscript 3 (AS3) based projects for teaching 11-14 year olds. It supports most all OO concepts, and because of its graphical nature there is instant feedback for a beginner. (e.g., mySprite.x += 5 );
If price of tools is a factor, a free development environment (such as http://www.flashdevelop.org/ ) can always be used.
An example of just some of the (visually) amazing programs you can pull off in 25 lines or less: http://www.25lines.com/?page_id=139
I am a purist. In my mind Scheme is the purest language there is. The problem with C, Java and those languages are all the externalities you need to put in in order to get a working program. And I say this as an C++ old hat.
#includes, imports, types, macro, compile... All these are sources of confusion.
I'd also put Prolog as a nice one to use because it is different and may be a better match to how them kids are thinking. And it's hard to beat Logo for interactive drawing.
ID: the nose did not occur naturally, how would we wear glasses otherwise? (apologies to Voltaire)
I am 15 now and know many other languages but I started JavaScript at around 10. Looking back at it I think its main advantage was that no software needed to be installed for it to work. Just embed in an HTML file and take home. One of my greatest joys while learning to program was showing my parents all the neat little programs I made.
Other than that though it shouldn't really matter. If you are good at teaching they will be able to carry what learned onto other languages very well. The first language is always the hardest and I don't thing anything will change that.
Discrete math, autonoma theory, logic (truth tables, conditionals, boolean logic) that sort of stuff is more important to a good grounding in computer science than programming (all that on just a chalkboard). If the knowledge base is strong, the languages will reveal themselves as tools to solve those types of problems with. The language is just a construct for realizing the application of the theory. If the math and logic concepts aren't understood, you basically have a tool that you don't know how to use. Which is not bad. You're still better off than where you were, but now you're banging in nails with a socket wrench. Instead of learning what a bolt is, what it's for and how to tighten it, and then given a socket wrench.
On second thought, anything but Java.
Whatever you do, never ever ever teach someone BASIC. Not QBASIC and not any other flavour. It was my first programming language, too, and it took almost ten years and a study of computer science to finally get all those bad habits you acquire in BASIC out of my system. DO NOT POISON INNOCENTS WITH BASIC.
You can consider Pascal, which after all was designed specifically as a teaching language. There's also Oberon if you want to go more into OO and make sure that the language they learn on will never be used in an actual real-world context. :-)
Java, Mono, C++, etc will probably all be suggested, but I wouldn't consider them suitable for beginners.
Assorted stuff I do sometimes: Lemuria.org
I started with line-numbered basic on a TI994A. To this day, I don't think I have ever seen a simpler and more perfect beginner's manual than the one included with that machine. I was programming sprite animation with conditionals and loops within hours of opening the manual. Since the TI994A didn't have a C compiler available, I moved on to the assembler, which it DID have. Never got very good with it but it definitely taught me the low-level nuts & bolts of computing. After an eventual transition to x86 hardware, I learned a little C++ to help me manage my servers but backslid to Perl for day-to-day GUI web stuff.
Considering how much of computing has shifted to the client-server model lately, I don't think starting out with simple html & cgi would be inappropriate. For a 2nd or 3rd project, I highly recommend giving the kids some thumbnail images of fruit and having them build a CGI slot machine. That's how I learned Perl. It's a great base project to build on too, and you can teach them version naming conventions along the way. Once they master the basic mechanism, you can add flat-file I/O to keep track of winnings and results, and then finally convert the whole thing over to a simple MySQL database with the images stored as blobs. (OK, that last bit might be a little over the top for first-week noobs :)
Nothing worthwhile ever happens before noon
I believe the currently accepted term is "stupidity challenged."
I was just looking into this recently for my nephew. Scratch looks really cool. I downloaded it and played for a few minutes and e-mailed my sister to tell her to install it for her kid. She hasn't done it yet, so I don't know if it was as good of an idea as I thought, but it sure looks cool.
It has color coded, drag and drop logic stuff that interlock like a puzzle so that kids can see how it fits together. It takes seconds to get a little animated sprite "walking" and do the fancy, whiz bang, pretty stuff today's kids will be wanting to see right away.
QBASIC is an excellent choice. I think people tend to underestimate basic as a useful language, even if a little antiquated for modern uses.
It's perfect for absolute beginners because it forces you to get your syntax correct on each line if you use it correctly, which means you don't spend any time debugging syntax errors when you run it.
A lot of professional programmers forget what it's like for extremely young minds and this feature makes it easy to learn to get something working in less than a day - something that young minds need to keep up encouragement and that older people forget they struggled with over years while learning at school.
Then you can move up to Freebasic.
Freebasic (freebasic.org) is an Open Source basic compiler that crosses the bridge between Qbasic and C. It's also fully cross-platform (Windows/Linux/Mac) - the same code compiles on anything.
It also compiles native QBASIC code, and is fast enough to make basic games or even complex programs.
You can also make all of your "C" function calls directly from it and learn to use those routines, making a convenient pathway to move to C as you become more experienced - all that will be needed is to learn a slightly different syntax.
GrpA
Enjoy science fiction? "Turing Evolved" - AI, Mecha, Androids and rail-gun battles. What more could you want?
I would suggest Alice http://www.alice.org/. It is a drag and drop interface to a 3D environment. It is FREE and was designed at Carnegie Melon University. I teach high school sciene and have almost zero programming background. I learned the basics in two weeks at a summer workshop at Duke University. The last week of the workshop was a summer camp for middle school aged children. They picked it up easily, enjoyed making worlds, and learned quite a bit about basic programming. Once they learn it, they can easily start exploring languages like Java.
Unfortunately, we are saddled with the term "gifted" thanks to Louis Terman, who both created the Stanford-Binet IQ test and did the first large-scale longitudinal study of intelligence (which is still going on with the few remaining participants in their 80s and 90s). It was in that study that he classified people with an IQ of 140 or higher "gifted," and the terminology stuck. Personally, I can't stand it and try not to use it, in favor of the more straightforward and less loaded "high ability." But it will be a very long time before "gifted" goes anywhere.
BTW, that article is dead wrong with regards to grade-skipping. Over 50 years of research has shown that in most cases students who are skipped a grade have no negative social or emotional outcomes from it, and often it's positive socially. This research is summarized in the report A Nation Deceived.
Warning: Apple/Nintendo fangirl. Likes her electronics cute & cuddly. May be rabid.
http://scratch.mit.edu/
Scratch is just what you're looking for!
With C, you can call methods. In Basic you have SUBS. When you use SUBS enough, you inevitably write a for loop using the same variable for indexing in and outside the SUB, and then you wonder why your code isn't working right. If you want to score extra points, add a nice graphics and sound library to go along with C. Oh, and don't forget about code reusability. Keep everyone's code each year for the next year of students. Allowing new students to compile and run other people's code is sometimes more useful than coding stuff up from scratch.
God spoke to me.
Kids like games. Game programming for MUDs can be pretty fun with a language like LPC, which is easy to pick up but loaded with the elements of programming they need to be introduced to.
I know that I am piggybacking but I thought that the educational world had moved on from the terms bright, gifted and related words.
Indeed, the educational world has moved well away from those terms.
The rest of us recognize the realize the reality that some people are in fact academically gifted and prefer to recognize talent instead of trying as hard as possible to homogenize it.
"There is more worth loving than we have strength to love." - Brian Jay Stanley
www.alice.org
Easy to learn. free. Gets pretty deep into programming as well. It will help them understand how to program more quicky and efficiently. You also program a 3d environment, which is pretty cool, and the kids can actually see what they create, and even make small movies.
Python - mature, OOP, fast (for an interpreted language), lots of modules out there they can extend with, lots of documentation, very regular. Multi platform.
D - the true successor to C for the modern age. C with nice and COMMON SENSE features added, compiles natively. Free compiler available. Multi platform.
JavaScript - Usefulness - this is all over the Web, obviously, is OOPish, and well-documented. The problem is inconsistencies in implementation will most likely drive them away from computers forever, so perhaps jQuery? Multi platform.
The problem you're going to run in to with beginning programmers is that they have to learn the environment as much as the language. I remember back in the day we had to adapt to an assortment of editors and operating systems. To an extent the lack of choices in this arena is going to help you out here. I'm assuming kids these days have some computer experience coming in to your classroom, too. If that's not a safe assumption, you might consider covering how to operate a computer first.
You can go with a compiled language like C or... well C. No java? I've tried to explain classpaths to IT professionals with little success. Maybe it'd be easier to a 14 year old. If you do that, you should probably set up the environment and gloss over stuff like building a makefile. It was not uncommon for our professors to hand us a cheat sheet describing how to build and run the code along with the vi cheat sheet. Those languages will be visually more boring than the ones with immediate visual feedback, but they might make it easier to explain what's going on inside the computer.
I'm trying to teach myself to set people on fire with my mind... Is it hot in here?
http://robocode.sourceforge.net/
Get the to create bots and compete, the language is simple, but can be quite complex as well. There are many samples to play with, and competition always gets the kids going!
Colobot from Epsitec Games
http://www.ceebot.com/colobot/index-e.php
I know its a little pricey but the demos that are available run through large range of code elements.
I learned pascal when I was 14, I thought it was pretty cool. It teaches one how to program, after learning how to program, it is easier to move into more powerful languages like C#.
I like the Mindstorms idea a lot, but if you're wanting to get a little more into actual coding, I can think of nothing better to get students excited than iPhone/Touch development.
You don't have to spend a lot - you could have just a few units to run the apps on for people that did not have one. Most of the development could be done in the simulator, using older (or newer) Intel Mac minis. The Apple Enterprise developer account (Single fee of $100) I thought would allow for any number of students to be covered.
The benefit of this approach is that the kids would be doing work they could show off to friends and family much easier than Mindstorms, or even web development. You can easily access a lot of cool animation features to keep the kids visually interested, and it's pretty easy to build really nice interfaces very quickly with Interface Builder, or do rather advanced stuff with sprites using a library like Cocoas2D.
It would be some work to set up a curriculum though, that would lay an easy path through a more complex world of development. But then that's probably the case for any solution you choose.
Alternately G1/Android programming would work as well, but students would be much less likely to have devices that could run the final creations which would diminish the lasting return.
"There is more worth loving than we have strength to love." - Brian Jay Stanley
Years ago we had a 32k Apple II with the 16k language card extension. A whole 48k! I could play pong with my son using the Basic program loaded from audio cassette. He would beat me most every time. I'm a programmer and he was a gamer.
One day I patched the app to make one of the paddles track the ball. I could adjust the relative paddle position a bit to hit the ball a bit up or down, but couldn't miss it. When we played the next time, I used the patched controller to win every point. Then I set the controller down and the paddle continued to be unbeatable playing by itself.
My son, seeing the power of programming, switched from a gamer to a programmer in an instant.
I think that if they are bright kids anyway, they could just program in C++ using a Unix terminal session provided by a server and Pico to code in, G++ to compile etc... Just cover the basics as you go.
I have been teaching myself some programming (again, after 15 years), and started because of Stanford's free online courses. They use Karel at first (but quickly shift to Java), and I found it a fun and easy way to get used to all the basic tasks of writing code. I work at a special ed facility, and I started teaching a student who is fond of and familiar with computers (his dad happens to work at Sun) Karel quite quickly. This student is in the 96th percentile or higher in all academic tests, with the exception of his processing speed, which is in the 25th. He picked up on the fundamentals within a week with Karel. What's also great about it, is that you are given specific tasks to solve. I found that to be a significant barrier in learning programming myself. I didn't have something to code. Figuring out some of the introductory problems in Karel was quite satisfying.
Someone flopped a steamer in the gene pool.
The problem with starting out with asm or C is that it requires you to talk about the machine. You need to lecture on the differences between the heap and stack, passing by value and reference, and with asm you need the segment and instruction explained before you can let them loose.
To introduce general programming, I'd suggest either Prolog or Scheme. Prolog may be the simplest to begin with, as it teaches variables, logic and flow control. Scheme increases the difficulty with flow control and looping.
I also second the suggestion for Lego Mindstorms as that gives a physical response to writing a program, but that may be too expensive for you course.
That's a lot of 14 year olds...
It's true no man is an island, but if you take a bunch of dead guys and tie 'em together, they make a good raft.
Hackety Hack is designed just for this purpose.
I recommend Computer Science Logo Style by Brian Harvey, one of the best CS instructors at UC Berkeley. You can get the books for free here (scroll down a bit).
I started programming when I was about 8. I started with C64 basic, and only a little while later moved to Amiga AMOS basic, and C.(about 10 or 11). In my opinion C, C++, or PHP would be great starter langs for someone that age.
The best way to learn, is when the goal is to use it to create something that you/they want.
In my case, I taught myself Perl CGI programming in 6th or 7th grade to make a site for my Starcraft guild, and slowly taught myself HTML later. Albeit I read slashdot now, so I'm probably not typical in the topics I chose...
The point though, is that you want to make the kids want to learn it. LEGO Mindstorms, or a Roomba educational kit is probably the best for kids today. Start off with a demonstration/description of some exciting final project (or of a few possibilities, and let the class choose their favorite or a variation thereof), then start teaching them the basics that'll eventually build up to it.
www.syntheticreality.com has a little RPG generated program with a scripting language that is very simple (I programmed my own "space" RPG when I was about 12 on it). "Well of Souls" is the name - simple but fun stuff.
Kids these days might scoff at the 2D sprites and whatnot though :)
In grade 10 (admittedly too many years ago now...) we used Turing in our programming class. As I recall it was developed at the University of Toronto and doesn't have much non-Canadian awareness, but I personally loved it as an intro to programming. If I was charged with teaching someone programming that I felt BASIC would be too, well, basic for, Turing would be my choice.
Then again, I don't even know if it exists anymore.
I hate the term 'Sig'.
I would suggest Javascript. Surprised? Yes, using this language 11 years old can play with websites and create nifty widgets. I'm sure it'll be fun for him. We have just a simple API on a server side: json, xmlrpc or whatever and it wont' be so much fun to program it.
Just look at this kid and you understand what I mean: http://www.youtube.com/watch?v=8mwKq7_JlS8
The only computer language you will ever need.
Sig this!
Take a look at Evaldraw: http://advsys.net/ken/download.htm
It uses C-like syntax but with immediate compilation and feedback and some very nice drawing functions making it an excellent teaching tool.
Personally my recommendation would be a combination of QBasic, for it's simplicity, and Evaldraw, for it's ease of use. QBasic is better for basic concepts, Evaldraw is better for results.
I used BASIC-256(formerly KidBASIC), which was developed specifically to address this problem.
I found it easy to use and teach, and a good introduction for the kids, I would recommend it for an introductory language.
Check out Microsoft's Small Basic. It's like a cut down Visual Basic complete with intellisense! http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx It was concieved and designed specifically to get people started in programming.
They're isn't a perfect answer to this. All computer languages are wretched in their own special way. If this is just an intro I'd go with practical over pedantic.
If it's a relatively short class, I'd start them with Python. It has enough structure to give them a good idea of real world programming and for those who take to it, it's a language that they can run on their home computer. If you're really ambitious you could cobble together a PyGame sandbox for them to play in.
If you'll have multiple days with them, let them cut their teeth on Python, then throw them a curve for one day. Let them use Lisp just to show them another way to think.
Squeak has a nice graphic front end if you know your way around Smalltalk, but not may people use it.
As for problems, check out simple games. I'll second David Ahl's "Basic Computer Games". Also, puzzles like the "Cannibal/Missionary" problem are more fun that factorials.
What really matters is the kinds of projects. LLet them work in areas they know. For example most kids understand Vending machines. Write a program to simulate one. It is just a text mode CLI program that accepts commands and writes output.
You can start with some simple sub-parts. Like printing the sign-on measages "Vending, vers 0.3". This is just "hello world". Next have it accept commands and do an IF based on whck command is read.
Just keep expanding it.
Next year you build a GUI around the test based simulation engine
Any modern structured language would work. Java is as good as C++ but Pascal would work or maybe even Python
Holy shit, that article is talking about me.
(And I'm not boasting here, I was in a gifted program in elementary and early high school, then shortly burned out midway through high school.)
I'm not good at studying and it's catching up with me now in university. Hmm... maybe this is an Ask Slashdot...
It's better to vote for what you want and not get it than to vote for what you don't want and get it.
- E. Debs
I've used Basic and Pascal. In the past when I have taught a non technical peer something about programming I've always started with the old standards of "Hello world". Then I move on to a classic bubble sort. Sorting a list of numbers or words is something we all understand. Then move on to searches and binary searches. If there is time towards the end of the class; rewrite the bubble sort storing the unordered list in a binary tree and parse out the sorted list using a recursive routine. The kids might not get their brains wrapped around the concept but it will give them something to think about. Do not underestimate them; they lack experience not brains.
alice.org
I'm not personally familiar with the project, but it was something that Professor Randy Pausch ( the Last Lecture ) was involved in.
It's developed by Carnegie Mellon, and it's free.
Then they won't be so damn scared of it when they start posting on slashdot.
Personally, my first introduction (at 8) was LOGO, and it was tons of fun, but I didn't make the connection between it and programming until much after I had started to do what I thought was programming (which I started in C). It also might be even too juvenile for 11-14 year olds, if they are sufficiently mature.
I'd suggest Python as a first 'real' programming language. Besides the fact that it has blindingly simple syntax that is often a few characters away from the pseudocode you might explain the program in, at a higher level, it allows for simple iterative programming, procedural programming, functional programming, and object-oriented programming, so students can progress from one level of intellectualism to the next without learning new syntax, and with the interactive shell, demos and exploration are made that much easier.
There's also something called PyLogo, which, though I've never tried it, looks promising:
http://ianbicking.org/docs/PyLogo_lightning.html
JavaScript will give young programmers the immediate feedback that I think many of us found so addictive back in the early days. Lots of comments here talk about "kids these days"; about how they're somehow dumber than us for not jumping into C right away.
But I think we forget: modern computers are extremely complicated. There wasn't much that could go wrong on my old TI (OK, there wasn't much to go right, either, but I digress). How many of you out there have really written something in C? I don't mean something academic, like some command-line thing that sorts randomly-generated numbers into a tree. I mean a program that actually _does_ something. I have, and it's a bitch, let alone getting it to run on both, say, Linux and BSD, which are both, in theory, POSIX.
Kids need feedback. HTML + Javascript gives them that, right away. They can run it anywhere they get a web browser. They don't need a development environment. They don't even need a server! Or makefiles! Or autoconf! And it's fun.
Another language, which is really underappreciated in my mind, is AutoIt! Yeah, it's hodgepodge, and doesn't conform to your paradigm-du-jour, but it will give young programmers some idea of how you put together a GUI app. And heck, it's useful! We use it for all kinds of automation of stupid Windows apps where I work, and it's so damn addictive to play with it makes me forget how much I loathe my Windows machine...
Alice and StoryTelling Alice
"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."
Thank you Randy Pauch. We miss you.
Or try
Myro using Microsoft Robotics Studio
or Pyro which was the non-MS precursor to Myro... program bots in Python with either real bots or simulation.
Either way, the graphical environments and real bots give kids a great way to SEE and TOUCH their results, which is more how they learn. You can cover all the important software constructs (variables, loops, events, data structs, etc) and avoid some of the abstract conceptualization required in more conventional languages/applications. They will learn the concepts through doing & using them. Then once they are hooked, they can dig into other languages.
Works great for middle school & college kids.... Pyro's got years of track record teaching intro to AI - to liberal arts majors!
Teaching gifted kids programming? Would *anyone* please think of the children?
Colorless green Cthulhu waits dreaming furiously.
I'm now almost 16 and I've been doing C. I self-taught myself everything by either reading tutorials or just playing with code and looking at references. I started at 11 doing HTML and CSS just to experiment. (Of course, my websites sucked horribly.) By somewhere around late 11 / early 12 I was into JavaScript, mainly from copying code from other sites and learning how to fit it into mine. (I never published most of that, of course.) I would learn more and more JavaScript, moving on to DHTML and, eventually, PHP. My interest in Python grew and by 13 or 14 I was writing PyGTK+ apps. I then gained interest in open source and joined an open source project with a mix of C and Python. And, of course, I moved to C from there.
I may sound radically different from most replies here, but I would recommend teaching JavaScript first (if possible for you; I know it's not really a programming language). Learning PHP was a breeze because I already understood JavaScript. (I wouldn't recommend PHP, though.) Then, do Python. Python can very much be a pseudocode language, (maybe even teach them a little pseudocode to get the initial idea!) is cross-platform, and the indentation rules will form good habits. Some would argue just staying at Python, but I would say to move up to C if possible (though I doubt it). :)
Object orientation was difficult for me to comprehend at that age, and I'm a relatively abstract thinker, so don't go that route until much later.
These are two small languages that are very expressive, the first (Processing) in on-screen graphics, and the second (Arduino) in the real world. There is no stronger motivation than to see your work drive an LED, draw a pretty picture, etc. Both run on Windows, Linux, and OS/X (in Arduino's case, at least the IDE). Both are free, and you can actually buy beautifully illustrated books about Processing, if your kid learns that way.
Then there's Haskell... :-) The language in which Map / Convert is almost native syntax. Very useful in the land of Google, and ubuiquitous, distributed processing elements. Also free, with its own stars on YouTube.
Seriously.
I am serious.
I've been teaching to the same age group that you are and after evaluating everything from QBasic to Java to Squeakland's EToys I settled on Phrogram about two years ago (it was called Kids Programming Language at that time) and I am well pleased. Using this language (it's much like classic Visual Basic but with tools that are more appropriate to the target age group) my kids started by learning basic concepts and syntax and slowly graduated to more complex tasks involving graphics. Best of all, Phrogram includes constructs for data manipulation so my kids are also learning what I consider "real" programming -- writing software that reads, manipulates, and stores data. There is an add-on that provides networking constructs for sockets programming and such but we haven't used it yet. As they mature it will be natural for kids using Phrogram to transition into .Net, Java, or any other commonly used business or Internet programming language.
So, from my experience as a teacher, I suggest that you look at Phrogram.
One of my earliest homework assignments was to write a recursive routine that would calculate and display the binary equivalent of an integer, i.e. 37 = 100101. It was fascinating to discover that each recursive call calculated either a one or a zero, but once you reached the end and started displaying each result as you backed out of the calls, the result displayed the binary equivalent in the right order.
I have helped run a programming class for 11-12 year olds, using visual basic.
The language will be an unpopular choice here, due to its origin (and I have to admit, I don't like it myself).
But its simple, and easy for young children to use.
As a 15 year old in Programming 1 at my high school, i just wanted to offer some insight at what we did.
We started off the semester with Alice, a free drag - and - drop introduction to programming. It taught us all the basic concepts (what methods & loops, etc are), and we then moved into Visual Basic 2005 after covering almost everything in Alice. I can say the strategy works great for me, having just successfully completed my final project (a simple to-do list application in Visual Basic, where I did additional research and used information from outside the class because I now love programming so much).
I can say that this approach worked well for me, and I'm definitely looking at taking some classes for more advanced languages (notably C# and C++). The rest of my class also seemed to like the approach, so it's my recommendation.
Any comments?
It's how I was introduced to programming. It's really easy to use it to draw stuff, which kids like. You have a "turtle", a pen you drag across a canvas, that you can move, change the color of, pick up, put down, animate... lots of room for experimentation. Recursion? Snowflakes! Interaction? Etch-a-sketch program. Plus it's free.
You can just as easily do things without graphics (eg, "Is the input a leap year?"). Then you can jump off into simple 3D graphics, too. Don't you dare introduce them to programming with HTML as some have suggested. It's not even a scripting language.
If you're teaching an 11-14-year-old the nuances of progaming you'll need to look at a diverse variety of game genres.
There are professional gamers of RTS games, like Starcraft and Warcraft III. FPS: Halo, Unreal Tournament, Counter Strike. Fighting: Third Strike, Super Turbo, Virtua Fighter.
Picking a genre is the essential first component in creating a young pro gaming individual.
... but I don't feel like registering right now.
Here, however, is my opinion: I love C++, but not the most fun for a young teenager, looked at C about thirteen and lost interest within hours because everything was text based, tedious, and complicated (nothing against the language now, but at the time it bored me). I suggest something like Ruby. It is considered a scripting language but that like is getting blurrier and blurrier every day. I favor Ruby (right now) over Python, but if you want to teach with a paradigm that can be applied to the other popular languages later, it may be a better choice (but then, they may just use Ruby for everything). Python seems to be a bit better supported as of now. Other than that, they can do about the same things. If you want to get them interested try basic game concepts, or at least manipulating images. I don't think that that is about the minds of our current teens. For python look into PyGame (great library that will have them doing awesome stuff in no time), for ruby there is RubyGame, which appears to be really cool, but doesn't have the same documentation available, but if you learn it, it won't be hard to teach them. Aside from games, there are gui applications; that would interest them. FXRuby comes to mind, but there are also binding for WxWidgets and QtRuby. There is also a library by _why_the_lucky_stiff called shoe that is simple. He actually has a great program he wrote for teaching kids programming concepts with ruby: http://hacketyhack.net/ .
And maybe check this out: http://www.pragprog.com/titles/fr_ltp/learn-to-program
Hope that helps. Gook luck.
_jake_the_anonymous_coward
Someone in another thread noted that kids who haven't yet had Algebra may not be ready for complex programming. I agree. If you're not actually planning to prepare these kids for life as code monkeys, and you're just trying to introduce them to procedural thinking, I'd suggest MIT's Scratch.
http://scratch.mit.edu/
It's sort of like Flash for kids, with a modular interface so that kids never see an error message. If you try to put a number in a slot where the syntax demands an operator, the number will just bounce out of the line -- it won't fit. All the elements have shapes that plug in only a certain way. The Scratch website has screencast tutorials (with cute kids narrating them) and a community for sharing creations.
Unlike Mindstorms, Scratch is free.
I've taught my own son when he was 9 and 10, using Just BASIC (we created a simple Choose Your Own Adventure story) and Scratch (he created a catch-and-avoid game).
I have also taught college English majors the fundamentals of computer programming, using Inform 7 (a relatively new developing environment for creating classic text-adventure games).
I should think that most kids in your target age group would get very excited by making their own mods, which could be a gateway into teaching them actual coding.
Literacy Weblog http://jerz.setonhill.edu/weblog
My sons started with KPL (kids programming language), which is now phrogram. http://phrogram.com/
I heartily recommend it, as it will provide the creative outlet to learn.
I've been following along this semester's CS61A Lectures by Dr. Brian Harvey out of UC Berkeley (audio and video podcast). He devotes two lectures to a 20 some year old videotape of Alan Kay talking about the coalescing of OOP principals in SmallTalk. Kay makes an important point: at different ages we learn differently. He also shows kids doing clever things with drawing and computer animation and they do it by writing programs. Look for Sept. 12 and 15.
I also found a book from Apress "Squeak, Learn Programming With Robots" which I think is very good, once one gets over the disappointment that the robots are graphics producers and not metal crushing monsters or lovable rogues, a la Bender Bender Rodriguez. Author: Stephane Ducasse. ISBN 1-59059-491-6
My 10 year old started with LOGO, a commercial version called MicroWorlds EX. That would be a good one to try if you have the budget to buy a classroom license. He tried Alice, but didn't care for it much because of limitations on what he could do with it.
He now spends most of his time on Scratch, I think mostly because he gets to upload projects to the Scratch website and share with friends he has made there. Since Scratch is free, teaches all the fundamental principles of programming languages without warping the brain as Basic would, and allows one to immediately create cool graphics stuff and collaborate with other kids, I would recommend it. http://scratch.mit.edu/
Lately he has also started hacking a Javascript tutorial because he wants to learn how to make web pages that do interesting things. I don't think it would be a good first programming language, but you might keep it in mind as an adjunct to a first course. Motivation is as important as the language, and being able to create cool stuff provides that.
The language of choice is apparently every single language ever made. So basically, it's a crap shoot, right?
Object Oriented Turing, yep.
http://en.wikipedia.org/wiki/Object-Oriented_Turing
It's what I made my first "Hello world!" program in.
-hps
Java via Processing. Quick route to drawing cool graphics without having to learn too much of the more complex featues or API's that come with the language. It's way easier to get excited about graphics than text and numbers for a lot of kids (and adults) I think.
Plus: dead-easy installation and setup, very simple IDE built in, free, cross platform, and it's possible to take it pretty far.
If its good enough for the highschool students around PARC, its good enough for anyone smart.
RUBY is Smalltalk, and lots of good community, and standalone apps, web apps, and the interpreter.
Apple should bring back HyperCARD.
And how about www.chipwits.com?
PS. Google monster mini golf and help stick it to Monster Cable Guy
They can handle it.
I was around 12 years old, and I found javascript to be an intuitive way to start. The browser was able to take care of all the GUI stuff, which left me free to play around with learning the basic programming stuff.
I'm currently 15 but i started programing at age 13. i started off with c++ and it wasn't hard for me.
Get a programmable robot and let the budding programmers have at it.
You could do all sorts of cool stuff, like divide up the class into teams (left arm, left leg, right track, left track, sound generator, etc.) and then have them work together to write the program that integrates the functions that the individual teams have written.
You could have competitions to see who could perform basic tasks most efficiently.
That would be a great motivator for a kid, I think. The language to use would be the language that compiles to the robot.
Quoth the Processing (http://processing.org) site:
"Processing is an open source programming language and environment for people who want to program images, animation, and interactions. It is used by students, artists, designers, researchers, and hobbyists for learning, prototyping, and production. It is created to teach fundamentals of computer programming within a visual context and to serve as a software sketchbook and professional production tool. Processing is an alternative to proprietary software tools in the same domain."
The IDE is simple and free, it's got a great community, it's super easy to start out with but can grow as the programmer grows, and it let's you play with media very, very quickly. IT also has a cousin that lets you rapidly develop for micro-controllers (like the Arduino), called Wiring.
Let me share some personal experience:
At 12 years old, all I wanted was to create a flash animation. At 13 years old... I learned how and noticed that I could make interactive animations... so I learned to program. The point of the story is that I learned quickly since Actionscript was so simple (AS 1) and because I could see the result on a figural way. This helps a lot to understand how it works.
Hope this helps.
Processing. Having dealt with that age group before, I know how crucial it is to have a fast and easily understood graphics API. Processing will allow them to create great apps in just a few hours, and also teach them some useful and transferable syntax. Java or C++ would not be out of the question after a few weeks in Processing.
Sigs are for Terrorists.
There are other BASICs out there, and I can't help but think something like that would be a good start. For teaching young children you want something interpreted so they can test single statements and need no intermediate steps to execution and reasonably complete, but without asking for a lot of preamble that just gets in the way of what you really need to convey to teach programming, which is how to think in algorithms.
I'd played with programming without fully grasping what I was doing for some years before I took a course in it in HS. The one assignment that got me into the right mindset was one to divide two numbers and give the result to an arbitrary number of decimal places. Any number, not just to the maximum of the floating point representations we had available. Doing this made me understand for the first time how to correctly analyze a problem and translate each step in the solution into terms the computer could understand.
And the brethren went away edified.
i can't believe alice was only mentioned once [http://www.alice.org/] I gave Alice to my nephew and he learned how to program while making movies and other cool things. The kids wont even know they're learning to code.
With that in mind, either JavaScript or VBScript.
Both of these languages require no IDE and will run just by clicking on the source file within windows. Every windows machine since Win98 has both.
Here is a simple VBScript:
a = 10
b = 20
wscript.echo a + b
"His name was James Damore."
At the risk of getting crucified for making this suggestion I say use BASIC as the introductory programming language. There are free open source versions available and you could even create a bootable mini-distribution of GNU/Linux with just enough to provide an environment to learn BASIC.
All the primary language constructs are supported and it is easy to implement show how the same problem can be solved using a variety of these constructs.
After all, you are not teaching computer science theory to these students. And learning a language their fathers probably started out on many years ago might spark a few dinner table conversations.
check this article out:
http://www.trollope.org/scheme.html
I learned perl when I was in 8th grade and I haven't looked back!
When I was 11 I was hacking out 6502 assembly (using a couple of the 6510 extensions) on my C64. At 14 I was hacking out z80 code for my TI-85. Also did a little C and a bit of BASIC.
So I guess 80's era BASIC, Motorola assembler, mix in a little Zilog, add a dash of K&R and BAM! In 7 or 8 years, a professional programmer will take to the field!
I am the penguin that codes in the night.
I learned Pascal and Assembler when I was 10. You'd be amazed at what kids can pick up.
However, if you want to give them something where they can get "something going quickly", I strongly recommend languages that have an "interactive" mode, because it lets them build on a simple foundation and receive immediate feedback.
My vote goes for Mathematica. It's a trivial language to start with: "5 + 5" is a program that outputs "10". The output is visually pretty, and it can draw pictures and graphs. However, it's not a toy language, it actually allows for incredibly complex programs in several different paradigms. The advantage it has over even simple languages like Java or BASIC is that it is more abstract, and hides several details that are very difficult to explain to a beginner programmer, no matter how smart. For example, calculating "42^42" works in Mathematica ("150130937545296572356771972164254457814047970568738777235893533016064"), but will produce either an error, or an invalid result in most languages that use 32-bit integers. Even with floating point maths, the result will merely be approximate, which is yet another complex discussion to have with a beginner. The educational licenses are not too bad, I think, but may be an issue with some schools.
As an added benefit, Wolfram has gone to enormous lengths to build a huge library or tiny educational snippets of Mathematica code, including lots of fun topics like fractals, image manipulation, the game-of-life, etc... For a teacher, this saves an enormous amount of time:
http://demonstrations.wolfram.com/
Alternatively, there are dozens of languages designed for education that have interactive interpreters. Haskell comes to mind, but it has a steep learning curve.
Who doesn't love colorful turtles?
Why does teaching programming have to involve a programming language? Isn't first step in being able to program (well) the ability to think logically.
Why not hit the kids up with some of those common logic problems.
Try http://www.iriddler.com/riddles/puzzles/farmer.htm for example
RAPTOR Flowchart Interpreter
Web Site: http://www.usafa.af.mil/df/dfcs/bios/mcc_html/raptor.cfm
Web Site: http://raptor.martincarlisle.com/
Screenshot: http://www.usafa.af.mil/df/dfcs/bios/mcc_html/raptor_picture.cfm
RAPTOR is a flowchart-based programming environment, designed specifically to help students visualize their algorithms and avoid syntactic baggage. RAPTOR programs are created visually and executed visually by tracing the execution through the flowchart. Required syntax is kept to a minimum. Students prefer using flowcharts to express their algorithms, and are more successful creating algorithms using RAPTOR than using a traditional language or writing flowcharts without RAPTOR.
I'm by no means a Microsoft fan, but I agree that Visual C# would be a good first choice for that age group. My second choice would be Java and then C++ I personally started with Basic and Assembly back in the late 70's, but I wouldn't want to put anyone else through that!
Logic is the beginning of reason, not the end of it.
I have found Alice (www.alice.org) to be a great introductory language for this age group. Depending on how quickly them come up on it, Ruby would be a great follow-on (assuming they have some experience with HTML, so they can use it with web apps).
Jordan
Try Alice http://www.alice.org/
Make a game out of it.
Please, PLEASE don't teach anything you couldn't hypothetically respect yourself for programming in. I beseech you this from the perspective of a once bright young student who's wasted more than several classes listening to speeches on introductory HTML. I mean really introductory. Like, you start with and end with . Twelve doesn't mean retarded. Just let your students challenge themselves, preferably not in a totally obsolete, trashy language. I'll have to admit that Visual Basic was one of the most helpful learning experiences... not from a programming point of view, but software development. I'll admit, ,v
Don't spoil the kid with imperative programming yet. Try Alligator Eggs.
Ruby is a fantastic language and is gaining some huge support in the software and web dev industries. It would be a great start for students because it teaches many fundamental concepts in programing whilst being fairly forgiving. You don't need to worry about strong typing or memory management which are things that often trip up early stage programmers. Let the kids focus on building the code and understanding solid programming paradigms first - then let them move to C/C++ or whatever where the language is not so forgiving.
As someone who remembers playing with QBasic in high school, I do have a bit of bias.
I was, until recently, the sysadmin for the high school that I had graduated from years earlier. A math teacher asked me if I could install QBasic in a computer lab she took her class to. She wanted to use it for graphing and solving equations.
On a side note, when I was in 11th grade, a homework assignment involved listing something like 30 integer Pythagorean triples. A quick QBasic program and printout later, and she was PISSED. The school's math department is a well-known disaster due to an ancient department head who has set math education back some 30 years. Of course, nobody dares to discuss why half the student body is taking their math classes through Florida Virtual School.
On the flip side, my Chemistry teacher was fascinated when I built [and my lab partner improved on] a pretty complex QBasic program to do all your various Chemistry conversions. I neither expected nor received any extra credit, but I made the source available to anyone who gave me a floppy disk to put it on.
11-14 year old kids want to write video games, or at least, that's what I wanted to do at that age. Python is simple enough that it gives a very good introduction to procedural and object oriented programming. If you couple that with the Pyglet, Python makes it very easy to put together video games.
You should take a look at http://pyweek.org for hundreds of examples of Python games (written in Pyglet or Pygame) that were put together in 1 week.
I've found that programming BASIC Stamps is one of the simplest things you can do, yet totally reinforces those basic concepts you mentioned. Plus, it lets kids get hands on, maybe making a motor turn or turning on an LED. But yeah, the first kind of programming i did was modifying some BASIC Stamp code from a robot i got at Lynxmotion.com
-Taylor
Worldwide Military budgets: $2100 billion. Worldwide Space Exploration budgets: $38 billion. Really, world? Really?
I would have to suggest MSWLogo, Haskell, and Python.
Haskell and Python are just efficient and elegant languages, perfect for beginning programmers with awesome standard libraries and without the obtrusive elements or syntax of things like C or even Java.
MSWLogo is great because you can use it to teach some maths as well, but it's mainly really hands on and graphical.
http://www.softronix.com/logo.html
http://www.justbasic.com/
and if you are evil you can do try this too
http://www.microsoft.com/express/vb/
C# is also free in the express edition and it comes with alot.
I would try Visual Basic.NET as it does not suck like the original vb. Also the kids can create dialog boxes and buttons and you can throw in a little logic if needed. .NET can be used if the kids are bored and want to do something more powerful.
http://saveie6.com/
My 12 year old loves this. One, it's free, two it has a large community of supporters. Three it reflects many useful aspects such as modularity, extensibility, object oriented principles, shared code, and graphic development environments. I'm not saying it's the most robust language, nor full of best practices - but you cannot beat it's WOW factor for young teens.
In a few short months my son has made tremendous progress. At first he just wanted to generate a gun and explosions. Then he became concerned with the graphics and spent days combing websites for just the right ogre icon to tweak. Then he discovered arrays and decided he wanted to generate all the monsters from an array. Next he decided his code would be much easier to manage if made all the functionality reside in scripts that he attached to the objects. Now he says he's focusing on revising his physics engine! It's a beautiful thing.
C is clear, simple and practical.
I saw last day this great teach tool for kids on google tech talk, it is called greenfoot
see yourself
http://www.youtube.com/watch?v=Tcwx-I6Arwk
It is based on Java, but made very simple for kids age 14+, but a gifted kid could start earlier.
You can even upload and share the programs you make to their website and there is even a coding contest
There are no stupid questions, Just a lot of inquisitive idiots. (from a good friend)
We have an OLPC XO - not the greatest machine, but it does have Pippy, a primitive IDE for python. She already knows basic programming concepts from working with her Lego Mindstorms,
I'd say , do it like I did (late 60s) ... learn one language a little and then drop it and learn another one, and keep doing that. You end up learning how the languages are a like and how they differ, what some are good for and what some are not good for. (VB is good for nothing, for instance). Furthermore, the language you are using is less relevant than the conventions (and patterns, bleah) for interfacing with the systems you want to use.
That kind of learning you can never stop needing to do.
Don't be afraid to go nuts with FORTH, LISP, SNOBOL and the other non "ALGOL" like languages. These three have a kind of fruitful simplicity of concept (while occasionally making some really ugly looking code)
To get up and running, Javascript is really great. It's kind of ugly in some ways, like how you make objects in it, but it's pretty ubiquitous.
And for the future of programming, know those languages, but learn erlang.
-- Real Stupidity is the Artificial Intelligence of the 21st century
Disclaimer: Blatant Self Promotion
I have been working on a game engine using C++ for a couple years now, and I have successfully used it to teach (mostly) high schoolers at Camp CAEN (http://www.campcaen.com) and just recently college students as well. The youngest person to learn how to use it this past summer was an 11 year old IIRC.
http://zenipex.com/zenilib
Of course, I am biased.
Insert self-referential sig here.
What a sad article. It basically says that our education system is totally screwed up, and the best and brightest will have their talent washed away through poor education, but hey, you can at least keep them at average if you do these few makeshift educational patches.
Why is it bad to use a real language? Assembly is a great starting point, as you can do very simple procedures and actually do real things with them, such as light an LED or make a motor go forward or backward. Assembly is great on a simple architecture.
Kturtle or one of the other available apps that allows you to program in Turtle Graphics. I learned Turtle Graphics on our 8086 when I was 8, it was a good introduction to programming and it was fun for me as a kid as I got to see quick results, by running the program as your write the different steps...
Python is by far the best. I learned it myself at about the age of 14 (16 now). It is very simple. Easy syntax and just makes common sense. And although it is dynamically typed, it is strongly typed so it forces kids to learn types. Also python forces good coding standards by requiring indents.
Also projecteuler.net is good for kids to develop problem solving skills. Alot may be a bit over their heads, but the first few are doable without being too easy.
Please do not teach VB or QB. My school does this and it hurts more than it helps. Teaching a friend any other language with a background in these is just annoying. It it not a wise idea. Whatever language you pick make sure it is strongly typed and is based in C rather than basic. This helps learn other languages much more.
- PovRay is cheap and works great. Actual math and scripting and variables that provide real world skills. It also gets kids focused upon the end result more and less on the math and so on, as well as the tiny details of look and feel. anyone can program a spreadsheet given enough time, but making something look fun and interesting is a whole other art in itself.
- No BASIC, VB, LOGO, or other useless languages. They are dead or likely to be so in the decade it takes for the kids to grow up and actually be using computers. Use a more modern full language instead like Java or C+ or similar - something that they can use for web pages and so on instead of decades old stuff. Also, the stuff that they make you learn has to largely be UN-learned in actual classes.
- I'd suggest grabbing a copy of Angband or NetHack. This is done in standard C and is easy to understand and go through, as it has huge amounts of help/comments, groups online, and is an excellent free primer.
I guarantee that if they know PovRay and how Angband or NetHack works, they have enough skills right there to actually get a real life programming job. You will need some books and a lot of patience, but the rewards are worth it.
Note - these programs also have versions that run on Linux as well as Windows, so there's another way to help their knowledge grow. Just learning how to use Linux in and out from a command prompt is equal to a couple of semesters worth of knowledge at a university these days. It's also free and they know how to think outside of the Windows box.
- I'd also recommend a breadboard and a book of electronic projects. Basic electronics is a very useful way to get them to understand WHY things work like they do in a computer. It's fun and very useful knowledge that's all too often just glossed over.
I suggest a TV jammer or a TV kill-box as an eventual project :) Radios also are very fun. I once made a crystal radio, then made one with about 100 diodes to get about a full watt worth of power.(yes it was ungainly but nice to hear stations without any batteries). There's also robotics and other more advanced projects as well. Ham radio licenses also are good(doubly so if they have to build the set), and of course, there are the various "blinken lights" projects out there. 100-1000 LEDs and a lot of time and some programming. Kids love this sort of stuff. :)
Check out the Alice IDE from Carnegie-Mellon University. It's at www.alice.org and it's free.
We've been using it in a Foundations course at the community/technical college where I'm on the faculty for several years and it's gone over well with the students.
When I was a freshman (age 13) at Fort Lauderdale High School, second semester so I think it was 1999, I took a C++ class or "Programming 1" (which went up through programming 3 and then AP programming which if you passed counted as college credits to your school university or college of choice). Anyways, I transferred schools back to my original home town the next year and they had no programming courses so I only ever took the one however I can still program in C/C++ to this day and do on a regular basis as well as other languages I know all because of what I begun to learn at age 13 in a class. If it's any help, I actually remember the publisher of the book we used which was Lawrencevill Press and, although it included training includes which you won't find in any real programming environment, we studied everything from creating functions to Fibonacci to classes to you name it and frankly it was the best coarse I took in high school.
I'd recommend setting up a standard VM image with all of the libraries, compilers, and other development tools they need. First of all, kids that age (gifted or not) are not going to want to take the time to install Eclipse, Dev Studio, or even MzScheme. And, no matter how much you might think so, you're not looking at turning them into little "industry-ready" programmers at this age. So the more time you spend doing ancillary tasks, the more time you have to lose them (plus VMs will save you a lot of time trying to figure out why any particular crap box you happen to be on isn't running right).
Second, give them projects that show immediate results (remember that you're trying to get them excited about programming, not showing them how tedious it can be). That means that you need projects that can be debugged in a single class period until the end, when you might be able to give them longer range assignments.
Give them simplified environments. Trying to get them to understand all of the intricacies of setting up an OpenGL environment just to draw a rectangle on the screen sucks. Write your own libraries beforehand that sets up windows, make it simple to open files, etc.
Make sure that the tasks you give them are compelling. A Fibonacci sieve might be a great algorithm and easy to teach, but chances are it will bore them to tears. You might do your first assignment that way. But after that, you better give them something interesting to do.
The previous note means you'll need to introduce some advanced features early. Arrays and structures should be in the first two lessons. Remember that a computer gains most of its power from (a) operating on complex data and (b) doing things repeatedly. If you introduce arrays, you can get them to program Life. Introducing structures will allow them to do some graphics processing, too. Put them together and you have an interesting graphical program that can be done in the first two sessions (and, if you're clever, you'll be able to show them some abstraction in a countAdjacentCells routine). Then you can show them the same thing on the web. Tell them that the web-based program does the same thing (but for the world), The fact that they can do something that is good enough to be put on the web should be (semi-)impressive.
Get them hooked early, make sure you don't make it too tedious, and build their confidence. That's all you should need.
That is all.
Assembly? Are you kidding me??? Javascript? They will probably never program again after being exposed to that....
How about something simple and fun like Python, easy language with a great IDE. Even VB would be a nice starting place. I know it's not a programming language, but HTML offers instant gratification and might be more appropriate for youngsters.
I think Python would be a great choice. You could start off with entering simple expressions in interactive mode then go from there.
teach them how to program robots. real world results.
Revolution would be ideal for the following reasons:
1. You can download a 30-day demo for Mac, Windows and various flavours of *nix.
2. It supports the basic programming concepts you mentioned without being overly burdened by misplaced semi-colons, strongly typed data, or really.hard.to.read.crappy.dot.syntax
3. It has a GUI with drag-and-drop GUI interface elements that appear platform-native on the platform on which it is being used (and later deployed -- it's truly write once, run anywhere).
4. It uses a scripting language that is like Hypertalk on steroids and thus leverages the students' naturally occurring understanding of natural English language constructs (e.g., "put 3 into myVariable" etc.).
Because it's graphical, because you can test without compiling, because you can start something out in class on, say, a Windows or *nix box, then take your project home and continue working on it on, say, a Mac, and then back again, because it leverages natural language, it really is an ideal introductory programming environment.
Give it a try!
First tip:
Consider learning styles... I remember learning Pascal under Turbo Pascal 7 in 10th grade... I am a visual hands-on learner and *hated* being forced to sit and listen to the teacher explain it on the board and wanting us to read about it. I ended up ignoring most of it and just learning as I went. So, please consider that, gifted or not, you'll need to cater to different styles of learning.
Second tip:
Don't underestimate how far these kids can go. Teach them the basics in whatever language / environment you decide, but be ready for more advanced techniques if they surprise you.
Third tip:
Avoid any language that is too far removed from the hardware. They may not be ready for assembler, but using Perl, PHP, Java, or anything else that does a lot of under-the-hood stuff for you won't really help them.
I wouldn't dumb down your choice of language based on their age. If you wouldn't choose a given language for teaching gifted 18 year olds then don't choose it for the 11-14 year olds.
I was first taught BASIC and then Pascal, but in retrospect I think I probably could have handled something beefier if someone had just taken the time to explain some basic concepts to me, which I assume you're willing to do with these kids.
Why not C? If it's important to have an IDE you could try the Eclipse CDT or Dev-C++.
As for programming tasks, I always enjoyed the "sorting" problem. Mainly because, in addition to correctness, performance "matters". Solving that problem forces you to not only write correct code, but to write efficient and "clever" code.
Describe how the basic bubble sort works and have them implement it. Then turn them loose to see if they can come up with something faster. Make the range of numbers being sorted relatively narrow. Say, 16 bits. Then see if anyone can arrive at the O(N) solution.
I am 12 years old and now program Java and C++, but when I started I programmed FreeBasic (basically QBASIC.) It was nice and easy and FreeBasic has many advanced features as well so you can learn at any level. But 1 thing - don't teach SUBs - teach functions. Believe me, it's really hard to move from SUBs. Isaac Waller http://www.isaacwaller.com/
AutoIt is far and away the easiest programming language I've ever used, and also incredibly powerful. The standard functions' syntax are all laid out for you in Scite as you write your code, and it's very forgiving on syntax.
There are countless UDF's and libraries for it, and when you're ready to step up, you can expand it with other DLL's, DCOM, and WMI to do almost anything you want.
Give it a try if you haven't.
Boot Windows, Linux, and ESX over the network for free.
Talent doesn't disappear due to a bad system, though it certainly may be wasted in such an environment. Either you're able to pick up on new concepts and ideas easily or you're not. And if you are able (as the best and brightest tend to be), you'll pick it up somewhere. With the entire knowledge of the human race seconds away, having teachers cram facts down your throat isn't the way that the gifted will be getting ahead. If they don't understand something, they'll look for the answer, and learn along the way.
It's much more a matter of motivation than one of the learning environment.
(having said that, I'll definitely agree with anyone claiming that our educational system is in desperate need of an overhaul)
How are sites slashdotted when nobody reads TFAs?
Kids nowadays are all into social networking. Why not a web language. Sure you probably can't teach them how to code their own blog, but coding their application in a web language would give them something they can easily show their friends. Of course there is the danger of them posting inappropriate material, but I'm sure that could be dealt with.
It comes with a simple IDE, and is a small subset of Java. The best part is the immediate Visual Feedback. Lots of looping, constructs, etc. I think this would be a great introduction to programming for children.
http://www.processing.org/
How bright are they? I started c++ as my first language at 12, its definitely doable but if its really mixed levels of intelligence/motivation, qbasic would be a good choice
I'm teaching Python to my kids now (ages 10 & 12). The great thing is that there's an immediate mode, so you can start up the interpreter and play with the language without having to write programs.
Of course, my kids are also programming under Linux, but that's the sign of a parent who cares.
Rebol Core and Rebol View
Pretty simple, lots of datatype, comes internet ready, one simple liner are easy...
How gifted? I have experience, but it's with a kid who may be brighter than all of us put together.
I've been working with someone that age, who humors me by letting me think I'm helping him. I first started work with him at 12. He's now a few months away from being 15. He had played with Visual Basic, but hadn't done any real programming. He did a project for school in Visual Basic (with at least some object-oriented code), and then moved to Java, reading through Head-First Java. He likes doing client-server applications, with a multithreaded server (yes, I'm gotten him to do synchronization properly) and a Swing-based GUI. He's currently using Eclipse. At this point he no longer needs my help for normal programming tasks (if he ever did).
So basically I don't treat him any differently than a college student in terms of language, tools, or what I expect, but the approach is different. Rather than trying to teach stuff like in a class (yes, I have taught an intro programming course in college), I'm around to provide him with whatever he needs for his current project as he needs it.
I don't know whether that approach would work with other kids or not. I've got pretty much an ideal situation: he's in charge; I'm just a consultant. That may not be possible in the context of something that looks more like a course.
One thing I've observed is that it's really critical for him to come up with projects he cares about. Whatever his ability, attention span is still an issue. He likes multiperson games, so his projects have been either tools to help players with tasks like keeping track of their loot in an existing game, or his own game. It may be more important to come up with the right project than to use the right language. Then pick a good tool for it, just as you would for any programmer.
PILOT and LOGO:
RPILOT is a FOSS version of Pilot. Here is a list of LOGO resources find one that works for you. Berkely LOGO or Star LOGO or Net LOGO take your pick.
Grade Schools and Junior Highs used to teach PILOT or LOGO or both on the old 8 bit computers when I was that age. It was fun giving a virtual turtle commands to draw shapes and solve problems.
Remember, Slashdot does not have a -1 disagree moderation, and no, troll, flamebait, and overrated are not substitutes.
My introduction to programming was through BASIC in a Ti-83 and then Assembly for the Z80 processor in the Ti-83. Growing into Basic and Assembloy on the Ti-89. Its a VERY simple language with If, Then, Goto and lays the foundation for that. It wourked out quite well.
QBasic all the way. My current compsci teacher in high school still uses it, and it was the perfect first language to learn.
When I was 11 I read Computer Programming for Dummies and it was really fun. Then I forgot all about programming. Now I'm reading C for Dummies and highly recommend it for beginner kids and adults alike.
May I suggest Think Python, which originated as a book written for middle schoolers.
Originally it was called How to Think Like A Computer Scientist: Learning in Python, written by one high school teacher for Java, and translated to Python by another teacher. A collaborative project resulted in the present volume, which is being published in hard copy by Cambridge University Press, but the linked page has a free downloadable PDF.
Written for kids and partly by kids, I think this volume might fit the bill. It's also free, just like Python itself.
Did I mention the book is free? Free?!
I wrote a rather long post on my blog a few months ago on this exact issue. After doing some research, I couldn't really find a language or technology that would meet my needs, but I did come up with a better idea of what I would consider to be an ideal educational program. http://angrymen.org/uncategorized/towards-an-educational-programming-language-for-children/
Python with PyGTK or C++ with g++. Just for the name of all that is structural and logical, don't expose the kids to the horrid habits of Visual Basic -- Once you learn a way of doing things, it sticks with you.
Microsoft's XNA Gaming platform. It's free (if you use Visual Studio Express) and it's all about games.
My teen nephew is getting right into it (despite the fact that he still wants to be a policeman!)
Whatever you do, if these children are indeed gifted, don't treat them like children - treat them like adults.
As far as I can tell so far from the comments I've read, most of the posters - and the OP - are adults. I myself am sixteen, only a few years older than these kids you're teaching. As you get older, you have a tendency to lump ages far enough below yours into one huge category - DON'T! I could call myself gifted, and by the time I was 11, I would have been able to move out and live by myself and function just fine (if it weren't for those pesky child labor laws).
You will only earn these children's disdain and loathing if you patronize them or feed them dumbed-down 'child-targeted' crap. Give them a real language that they can actually use, not some specially made language for children that has no application in the real world. If you don't tell them that it's supposed to be a hard language, they'll pick up on it quickly and be just fine at it. Hell, when I was about ten, I was graphing parabolic functions - on paper, not those newfangled graphing calculators - simply because someone explained to me how to do it, and didn't tell me it was something I wouldn't be learning to do until high school.
These kids will be more engaged by a real, challenging, applicable language than they will be by a shiny, 'quick-results' language that is useless in the real world.
I don't know enough about either, but isn't Python the main scripting language in Blender and many (most?) other 3D animation packages? Couldn't it possibly be used to satisfy the desire for having graphics then?
I started about (11). I went from HTML (11) to mIRC scripting (11-12) to C++ (13-14) which I picked up in basically a camp environment in an at-your-own-pace project-driven teaching environment. The kids were allowed to use either Basic or C++, each came with a different set of projects.
The course was basically run as follows: There were pre-defined projects in escalating difficulty levels. You worked your way along each one until you got to the next one. Some collaboration was allowed, 'playing with' the projects was somewhat encouraged. It was a _great_ format for the gifted/talented crowd which tends to be fairly self-motivated. (This is not a way to force-feed your kids programming skills.)
Admittedly, the camp benefited from a pretty high teacher/assistant to student ratio (maybe 1 assistant for every 6 students) so I'm not sure how well it would work if a single teacher was trying to watch 20 odd kids.
Java really wasn't a serious option when I was doing this. Now, I'd really recommend it. For as much complaining as people love to do about the language it has a lot of really good functionality (like graphics) while still being very C-like. IMHO it's a good balance between seriousness and ease-of-use for this application, while at the same time giving kids a _real_ tool to play with. (Many kids in the "high ability" crowd will be much less interested in something they know to be a 'toy' then they will be if you can give them a real tool to play with).
That's just my $.02
Mindstorms is far from being a dead end toy and is used in many university programs too.
Robotics is an excellent way to learn about programming. You see real stuff happen, not just pixels on screens. You see the algorithm actually working. A bug is impressive ... crashing debricking robots make you really think. My kids (and I) have two Lego NXT sets and one RCX set. We build our own sensors too.
Engineering is the art of compromise.
When my "computer savvy but not programming" youngest was about that age he called me into his room with "Dad, do you know anything about a program called python? Look what I can do with it!" - and he showed me several small things he'd been able to create after reading the online tutorials. He found python intuitive, fun and useful - and that's what a first programming language should be all about.
"Straddling the sword of technology..."
I agree with not using basic. As for something to implement... Towers of Hanoii with 5 disks maximum. It can be solved by writing code for each move in a reasonable time(iirc 2^n moves), and as a special bonus by recursion. If none of the kids figure out it can be solved recursively, you can demonstrate it at the end of the course.
am I so old now that I'm the only one who thinks that PERL is cool? What better way to teach kids about loops than to make them infinite and print the result of each iteration out on the screen?
Ok, Lego mindstorms is cool, and maybe colors and stuff are exciting. But speaking as the kid who wrote a computer quiz game in apple BASIC in sixth grade, way back in 1988, with GOTO and GOSUB and incremental scorekeeping and system beep sound effects and the payoff screens coded by hand, with POKE, in 16 colors, as pictures of a confederate or a union soldier planting a flag to indicate the winner...
but seriously, here's my suggestion. Give them problems to solve. It doesn't matter what language you choose- the process is what matters, and programming is all about solving discrete problems. Start them out with something simple: "how can I print a number to the screen?" and then move up: "How can I make the computer count by one, and then print THAT number to the screen?" Those were the most satisfying programming moments of my larval stage as a nerd- look how fast it gets to 1000! and 10,000! and once it gets to 1,000,000 you can really see the time difference in how long it takes to add another order of magnitude...
The magic comes later, when the world presents you with a big complicated problem, and you realize you can solve it easily by breaking it down into N smaller simple problems.
Humpty Dumpty was pushed.
I believe all children deserve a well-rounded education. They need to think for themselves. Not have a book with all 'the answers'. Learn some new - perhaps- colorful expressions.
Brainfuck http://en.wikipedia.org/wiki/Brainfuck is the perfect language. It will take exceptionally bright students to figure it out. I'm sure there's a few wannabe gifted students in the class. As soon as they drop out, it'll be known they aren't that smart.
And, since they are gifted students, they probably don't know too many swear words. Even if they leave the class, at least they know a new word. It will be part of their cirriculum.
I recall playing "Widget Workshop" (Win 3.1? 95?) which allowed me to combine gears and levers to create my own "widget". This included logical switches (Not, And, Or, Xor) as well as counters and more. I'm not sure if it's been maintained, or if the company even exists, but I enjoyed it.
Use the python programming language and the text "How to think like a computer scientist. Learning with Python" Python is a great language that is simple to learn yet very powerful. In addition to being a good starter language it will also be useful to them to create serious programs with in the future since it is a very popular language. The text is very easy to read as well, and its free to download. I wish I had started out on python. Its my favorite language bar none.
I started at 11 with QBasic because it came with DOS 5 on my Tandy 1000. Most of my old code was crap, but it was functional, and I learned more as I went along.
I picked up VB pretty easily, mIRC Scripting, PHP, C, JavaScript, and a few other funny languages as well (bozol, lsl, etc)
Either way, do the functional programming before OO, and start with something simple... some say BASIC can cause brain damage. They're wrong.
Try this, start with BASIC (Not visual Basic or some funny variant... simple plain BASIC... and no shortcuts, Dimension and Declare every variable..keep strict data types for later understanding) here is where TYPES, FUNCTIONS and good programming practices should be stressed.
then move on to a more structured language that is still relatively simple... PHP or JavaScript... stress code structure and syntax.
from there C will be a relatively easy next step, and beyond that shouldn't be too tough to work with once the basic concepts are understood.
Make America grate again!
Start with structured programming logic. Teach them about logic, make sure they have core algebra concepts, and so forth. Don't teach them how to code, make sure they are thinking logically about what their code does. Think about intended results, unexpected results, and how to handle them. Also instill habits that have gone by the wayside like undefining your variables and so forth. You took memory, give it back. This can all be done without language.
Once they have core concepts, syntax is easy. Once you move on to that stage, get them used to something object oriented. C++ is a good start as most languages have similar syntax, and it's a good starting point.
I prefer the term "smart ass".
In the land of the blind, the one-eyed man is king.
http://www.youtube.com/watch?v=8mwKq7_JlS8 this guy is twelve, presenting at Google about coding in JavaScript. Seriously.
As someone already mentioned it, do not bother with languages of the past. JavaScript, Erlang, Haskell is what they should know. I myself was 15 when learned Prolog.
I taught an introductory computer programming course to 7th-10th graders in an intensive summer program for gifted students. The students had 7 hours of contact with me and my TA each weekday.
I used Python and it was the best choice I ever made. If you want to contact me I can give you some of the materials I and the TA created and explain in more detail my approach. You can email me (for a while) at phibsoumso@farifluset.mailexpire.com.
You will thank yourself forever for using a language that ENFORCES some correct indentation. Otherwise you will claw out your eyes with some of the code you will read.
I found it really useful to drill the students on tracing the behavior of code on paper and drawing stack frames for function calls (although they didn't really know what they were).
When I used to teach a technology class for a local catholic grade school. I found a great program that was developed by the folks at Carnagie Mellon. It's called Alice. The kids find it quite engaging, And its free. Now it has changed a little since I first used it about 7 years ago, but check it out. It may be worth looking into. go to: http://www.alice.org/ Hope this helps.
A "license plate" increment problem: Incrementing a sequence like AAA, AAB, ..., AAZ, ABA, etc that goes up to ZZY, ZZZ, AAA, AAB, ... Have the kids figure out how to get Z's to roll over to A's in the next higher place WITHOUT using if statements. Great for showing number representation, character sets and how they map to integers, integer division and/or modulo operators, concepts of overflow, talking about how jumps can be avoided sometimes, etc.
Saw it in a high school programming class. No idea where the teacher got it. Frustrating as all hell... :)
Assign them the task of writing "I will not throw paper airplanes in class" http://www.jeffpalm.com/fox/fox.jpg
Turing or Python
These are good safe languages that reduce frustration. Just easy to use and easy to teach.
These are kids who want to make something, not comp sci students (yet!) who need a real understanding of what they're doing.
When you think back to QBasic you can think how it could let you, as a child, figure out how to make something 50% as good as a commercial DOS application.
C# is *good enough* and it has by far the best IDE around, which is really what will help these kids go! Visual Studio C# Express Edition (free download) even corrects as you go. It lets you quickly cobble together something you can *finish* and show your mom in an hour (11 year olds don't have long attention spans and have trouble seeing the big picture).
Plus XNA is hugely exciting! Take a look at some of those game demos that can quickly be made. And they can simply re-target their app to the xbox 360 and have a cool console game to show their friends!!
Nothing else will let them have the joy of having a finished app that looks like a full on Vista ready app their mother can understand like .NET. Nothing else will let them get a game on a console their friends will be able to look at and then praise them for being able to build something for a 360 like XNA.
Nothing will make them think programming is cool like being able to show something *useful* for their work.
My 2nd choice would be php for being able to give that kind of positive feedback and 3rd would be python.
So I'd recommend something simple that isn't frustrating, but also allows easy access to things kids like (graphics stuff).
I learned programming at a very young age, bouncing between BASIC on an Apple IIe and QBasic on my dad's 286. The cool thing about the different forms of BASIC were that it made graphics stuff (my interest) easy to set up and use. One command to set the screen mode, and another to set pixels, draw circles, boxes, or whatever. Page flipping stuff was a little more advanced, but supported in QBasic too, IIRC.
Of course, BASIC teaches all kinds of terrible programming practices, but if the user ends up getting frustrated or bored and giving up early, your technically superior practices and language choice won't matter.
I doubt kids have interest in the code itself so much as what you can do with it. That is to say, they'll get bored with in-depth algorithm descriptions and things that are functionally cool, but don't show an interesting end result beyond "Hey look. It sorted the list. Whee!" I know that if I'd started with that instead of just naively coding whatever I wanted to, I probably wouldn't be as far along as I am now, graduating at a university with a com sci degree.
So, in short: Dazzle them with cool graphics/sound/whatever, not cool algorithms.
I haven't had more than a glance at it, but perhaps you might consider a modern version of BASIC that's designed for that kind of thing like Blitz Basic. Again, I haven't used this, but it might be just the thing to keep interest, which I believe is the most important part.
Algebra is relevant for the manipulation of expressions with variables, but is completely unnecessary for the *evaluation* of expressions with variables, which is what programming really is.
The evaluation of expressions in a formal system with variables is computation, not programming. Programming, at least as Edsger Dijkstra defined it twenty years ago, is the creation of such expressions by a human being.
haha! awesome terminology
For 11-14 year olds the most important thing is getting them interested, not the technical details of the language. You'll want a language that will let them do what they want to do with as little effort as possible, which means you want a high level language with relatively intuitive syntax. Ideally you want a scripting language so that there's as little delay as possible between writing the code and seeing the results. Finally, you want an actively supported language with many modules so that students won't feel that they're playing with a toy language, but with something that can be used to do anything they want to do.
From this point of view, I would go with Ruby or Python. I personally prefer Python, primarily for it's excellent documentation, though if you're thorough enough in preparing materials for the students, Ruby could be an excellent choice also. Python can also be used as a sort of 'gateway language' to programming C for the more enterprising students since if you program enough in python, you'll eventually run into something that is best done by writing a module.
It's easy as hell, comes with a simple to use IDE with intellisense, anybody could pick it up.
http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx
The OP asked how to introduce to programming, not what language to use. Making a basic robot do neat things is a great reason to learn programming. The Lego kits can work with a wide variety of languages from C to Logo.
Runtime Revolution lets people code in plain English... http://www.runrev.com/
I agree. Im a high school science teacher taking a year 7 Gifted and Talented (now refered to as GAT) class next year. Im planning to use Freebasic. Its purely awesome for this sort of stuff. A real gateway language that lets students use C libraries, OpenGL, DirectX but also allows them to line, pset, circle. Given our year 11 and 12 IT classes have to use Visual Basic, it gets them into the basic syntax with out clunky Visual stuff getting in the way. 11-14, Forget OOP and all that other crud. You want proceedural, you want simple, you want stuff kids can pick up and do something useful very quickly. And squeezing programming into a science lesson, thats what I want. I don't want kids to write up some pseudo code, get it approved, then write a nice neat anal C code. I want quick and dirty like in the real world cause I've got 45 minutes to get them to complete a task from bell to bell. Well that crosses that off my list, but I also have to teach them Databases! SQL as well then?... Somewhere after that I just have to fit in maths and maybe, just maybe a whole entire Science sylabus... Basic is no longer the programming poison is once was.
I know that there are a lot of people that will disagree but Pascal is a very good learning language. The good news is that it has been greatly enhanced to do more than the old "Hello World" type programs. Take a look at Free pascal at www.freepascal.org, the compiler costs nothing so you have nothing to lose. Pascal is no longer the weak pascal that you learned in the 80's.
So make them implement their own language to program in. I'm thinking a Malbolge compiler targeting a quantum Turing virtual machine.
Python
Try online courses for a semester, if your college offers them.
I had a similar experience: gifted/talented/whatever they're calling those programs these days in school. I didn't burn out in high school, but never really had to study to get through classes with flying colors. I burned out shortly into my sophomore year in college. I made it through my degree program, but my GPA was no great shakes. I couldn't understand why I didn't just "get it" they way I did in high school.
A few years ago, I decided to go for a second degree online. Best decision I ever made. When it's all on you, and you've got no alternative but to sit down with the material and decipher it on your own, you might be surprised at your ability to study.
FWIW, I graduated summa cum laude from that second program, 3.975 GPA (one stinking A- away from perfection. Sigh...) Certainly being older and in a different situation (married with a kid, as opposed to single on my own) helped, but I wish that online had been an option when I was first going to college...
Smell that? You smell that? Burning karma, son. Nothing in the world smells like that...
IIRC, LOGO has its roots in LISP, believe it or not!
If I mod you up, it doesn't necessarily mean I agree with what you've said, sorry.
Give them some Arduinos to mess around with. It utilizes a C-like programming language which is easy to get a handle on, but scales up in complexity to accomplish all sorts of things. They would also be learning about electronics, and microcontrollers. The Arduino can pretty much do anything from blinking an LED when you press a button, to interpreting gcode sent from a computer to control a 3-axis milling machine.
Seems like a good age to get them playing around with electronics anyway. And I always say that the wider range of things you can teach kids with a single activity, the better. They're more liable to retain it. Also, it's damn cool.
I'm 27 years old, and I had a lot of childhood experience with electronics, but no programming experience beyond some BASIC on the C64... I was *ecstatic* when I figured out how to use a 'navigation switch' (Single axis and a pushbutton center) to adjust the color mixture on an RGB LED. Sure, it had no practical use, but I learned a lot programming it. Currently, I'm turning the drive head carriages from two optical drives into a CNC laser engraver. (Though it will only have a 1.5x1.5" working area...)
Get these kids started on the road to evil genius!
Friend: "The NIC is misconfigured..." Me: "No prob, I'll just telnet in and fix it." *Silence*
I know it can be tricky but making a light turn on and off with assembly commands is a huge step toward understanding how a computer and all other languages work. As for real world applications assembly isn't going anywhere somebody has to write the compatibility layers for every other language. If you know assembly you will learn the basics, maybe even have them work as their own compilers so they understand the true power of computers.
Concept maps are a way to develop logical thinking and study skills, by revealing connections and helping students see how individual ideas form a larger whole.
That is probably a valuable skill to have for anything, and can easily be extended to programming.
<rant>Why is it that whenever these "What should I learn" questions come up, the crazies come out of the woodwork with their weird languages?
Python, smalltalk, Lua, Ruby, LOGO, QBasic? WTF?!
I just don't know why you'd what to handicap someone by starting them on such a niche language.
</rant>
JAVA should be an excellent starter language. It gives them an intro to OO programming, has the same structure as most of the other popular languages, is mature and well documented, works on pretty much any platform, has plenty of great and free IDEs, and is a good thing to know if they decide to become professional programmer.
You could even have them learn the syntax by playing a game like CeeBot
simple, straight forward
Python really makes programming fun. I think it would be the perfect language to teach beginners, although I've been programming for decades, in a dozen different languages.
Mainly because Python is interpreted, not compiled, there is an opportunity for immediate feedback, and a level of interactivity that is just not possible with most languages. Entering commands directly into the interpreter console allows for a kind of "conversation" between student and computer that is only possible with an interpreted language. Expressions, function calls, little one-time "experiments", or demonstrations of a particular concept are not just possible, but easy and natural in Python.
Combine Python with the PyGame library, and I think you have a real winning combination for kids of all ages. PyGame gives Python the kind of juicy graphics kids will probably want to play around with once they understand variables and functions.
Python eliminates most of the stuff that clutters up languages like C, Javascript, and PHP. Python reduces the language syntax to the minimum required to understand by the concepts involved, in the clearest, simplest form possible, with a minimum of arbitrary punctuation marks used in unfamiliar ways.
It's also worth mentioning that in addition to being a really great, easy to learn, yet powerful language, Python is also free, open-source software. Check it out.
I'd advocate for Python, gives you all the flexibility of allowing OO etc, and the same time has the wonderful interactive interpreter.
As a side not Python is starting to become common as an introductory language in universities (as stated by a professor who runs the introductory course at a local university and attends the same users group I attend).
Since it sounds like you want to focus on logic and basic concepts, I'd suggest something like perl or ruby. Something interpreted so you can have the kids follow along line by line and see output, change a line and see how it changes things, etc. Don't bother with anything compiled or anything where you have to learn a bunch of stuff very specific to that language. Also I'd avoid OOP...OOP is only rewarding when you've done it the wrong way before. ;)
Spend a week or so on basics in VB .NET. Then spend another week dong the same stuff in C#. Then let them choose. Some people find VB incredibly stifling, while others find C-based languages overwhelming. If you let them choose their language, they'll enjoy programming more. Because both languages use the same libraries, switching between them will be easy. And as an added bonus, Visual Studio Express is free.
Most human behaviour can be explained in terms of identity.
http://www.thefreecountry.com/compilers/lego-mindstorms-nxt.shtml
Use Linux so that they have all tools and doc available that they can explore on their own. Challenge them to think differently and give them an introduction into the languages and concepts that they can use. They should learn how to use "man" and learn how to Google tutorials on the web to discover how to do things on their own. They should also be encouraged to use tools that help them work together like DARCS, git, mercurial, or bzr.
I know I'm late to the thread, but I've used Try Ruby with some success on that age group.
I'm suggesting the tutorial more than the language -- it's easier to pick up a new language than it is to start programming in the first place.
There are reasons I'd suggest Ruby, of course -- if they find they want to write performance-critical apps, it's Algol-like enough that C won't be too hard to learn. But if they do stick with Ruby, unlike JavaScript, there's a gradual, natural progression to more and more advanced things. JavaScript mutates as you learn more about it.
Don't thank God, thank a doctor!
PHP!
BASIC - Beginners Allpurpose Symbolic Instruction Code - VB is an abortion that should've but didn't happen
C/C++ - lousy string handling
Pascal - nice language, hardly used anymore
C#/Java - poetry, but overhead OO model is too much to explain
Maybe you want something that will hold their interest more,like RobotBattle. http://www.robotbattle.com/
Given a tank with certain attributes, program it so it will beat everyone else. You can get a tank moving and shooting in 10 lines.
Winning? That's something else entirely.
Of course it gets old after a while, but it might be a cool thing to start out with, or to refer back to later on.
I was in a similar program when I was in my early teens. We picked up Java Tanks on our own, we heard about it after our PC Science teacher hooked us on Bolo after blowing through our typing and word processing classes.
You'd be surprised how fast a 12-14 year old kid could pick up on C, Java, TCL/TK (my first programming language), etc..
Of all the Universal Constants, here's one I know: Nice guys finish last
why nobody has mentioned ruby? it has an easy syntax, its very high level (c is easy as long as you don't need to do anything useful as increasing dynamically an array, an 11-14 year old would have a very frustrating evening doing things than seem trivial for seasoned programmers), its not bureaucratic as java is, is a modern multiparadigm language.
I use ruby for quick prototyping or things or things that are neither work or school (sometimes for school too), why do people dare to propose arcane programming languages and platforms (basic on a c64 emulator!?!) when there languages like ruby, python or even java, and if you don't like OO haskell, prolog, lisp or scheme seem to me as more rewarding first languages than C,C++,VisualBasic.
P.S.: fortran?!, come on!!!, where talking of gifted preteens not lab-rats getting a physics or chemistry degree.
Shoes! It's cross-platform, it uses the same powerful vector graphics engine that Firefox uses (Cairo), and it uses a simplified Ruby interpreter.
Shoes is to the modern computer what BASIC was to the Apple //e and Commodore 64. That is, it aims to be a way for hobbyists and young computer geeks to do creative stuff with their computer.
That means a modified Ruby interpreter with really nice graphics, web, network, and text layout APIs that hopefully a hobbyist would be comfortable using. Knowing that, the Shoes About Page should make more sense.
Compare 80's style BASIC and modern Shoes:
vs.
Programming for a young computer geek won't be fun unless they can make they computer do really cool things. In the 80's, that meant color graphics and sound, along with plain text output and input. Plain old BASIC (or Python or Ruby) won't cut it today. You need something that supports GUI development, web and network access, pictures and video, and text layout. I think Shoes fits the bill nicely.
ENDUT! HOCH HECH!
I remembered this free course:
Introduction to Computer Science and Programming
This subject is aimed at students with little or no programming experience. It aims to provide students with an understanding of the role computation can play in solving problems. It also aims to help students, regardless of their major, to feel justifiably confident of their ability to write small programs that allow them to accomplish useful goals. The class will use the Pythonâ programming language.
http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-00Fall-2007/LectureNotes/index.htm
[course info - more available at link]
http://www.greenteapress.com/thinkpython/thinkCSpy/
[textbook] How to Think Like a Computer Scientist... is an introduction to programming using Python, one of the best languages for beginners. How to Think... is a Free Book available under the GNU Free Documentation License. Readers are free to copy and distribute the text; they are also free to modify it, which allows them to adapt the book to different needs, and to help develop new material.
There's always Alice 3D programming environment.
The basic concepts of programming wrapped in a 3D animated simulation.
It's cross-platform and free too.
You should try Python - it is very intuitive, easy to learn. Although the students wouldn't be exposed to the structure of programming, it will e a good beginning and serve as an fun experience.
They are probably too young, but for older students, www.ProjectEuler.net is nice, with simple to complex math problems, etc..
Processing - Processing is nice for making graphics and is meant to be accessable. Graphics are hard to resist for the beginner. Processing has integrated examples, is portable, and comes with a tiny IDE.
Javascript - Javascript is actually a fine language and they can run their scripts on any modern browser. Interaction will be a breeze. You will need editors though.
Python - Python's syntax is as clean as you could want and can go from the simple tutorials all the way to large scale systems development. There are Python IDEs available for most major platforms. Of these 3, Python is the only one that won't give you a walled-garden experience.
As these are gifted students, they might already have ideas what they want to learn. I know I did when I was that age. It might be good to teach some topics in each language.
Hadn't even considered that, that's a good idea.
That's why most programming courses require Algebra as a prerequisite - they don't want to spend time explaining logic and representative symbols to students, they want to teach code.
FWIW, my experience was the reverse -- I was exposed to programming well before I hit pre-algebra in 7th grade, via periodic workshops at our elementary school, via Logo classes taught at the community level, and eventually, via the basic interpreter that came with the TI-99/4A computer my parents bought for the family when I was in 5th grade. And for me at least, not having had algebra beforehand wasn't much of a handicap, it simply meant that programming was my introduction to the concept of a variable... and it seemed an easier one than some of the definitions/introductions I later encountered in algebra books...
Tweet, tweet.
I think the first thing is to do something to adjust expectations. My own son is one of these computer superkids, and he still hasn't seriously learned programming - not because he can't understand it, but because the things he wants to do are far too advanced, like making a game. When I learned programming at about his age, it was because I wanted to calculate the relative positions of the planets and print a table of it, which is a bit tricky mathematically, but straight forward to program.
So perhaps the answer to your question is to first ensure that they first find a project that doesn't require a decade of experience to implement; after that it doesn't matter which language you choose, as long as it is conceptually fairly simple. Which of course rules out object orientation; my choice would be C for any number of reasons. The actual language part of C is very close to the smallest possible, so it easily remembered; but the biggest advantage is that it allows you to make all the mistakes, because it does not protect you against sloppyness. As frustrating as mistakes and problems can be, they are unsurpassable as a pedagogical tool. And if you arm yourself with the Jargon Dictionary, you will find that there is a whole ocean of cool and mysterious names for all of them - the only ones that spring to mind at this time (5 am) is Obiwan ("out by one") and the banana problem ("I know how to spell banana, I just don't know when to stop"). To a teenage nerd, that is pure goldplated latinum.
BASIC is a good introduction to the basic concepts of programming. PBASIC can be used to understand the concept of machine control with an inexpensive parralax BASIC stamp chip or kit. I used PBASIC to program my successful (Alabama Slammer) BattleBot.
Rick
RedneckRobots.com
Dr. Alan Kay designed Smalltalk so that even SMALL children could use it. Look at eToys and graphical programming interfaces.
Get these kids started with concepts such as "tell the ball to move to the left" and so on.
Or perhaps Scheme. Simple, and start with real things... like to make dinner, you get groceries, cook, serve. Cooking means turning on the stove, turning on the microwave... break down examples into functions.
For goodness sakes, don't show them C to code Fibonacci, give them something tangible! Something that's NOT abstract!
For the record, I have friends at college who HATED QBasic, and quite possibly could have understood programming, but QBasic was the tool they used.
Try python. One can do simple stuff to start with and also do complex stuff once one grows. The syntax is clear and there is a library to do almost anything.
-- Hemanth P.S.
Human readable syntax, support for just about any style of programming, a lot of useful gems, and let's not forget _why's Hackety Hack.
Otherwise, I say any language which at least allows declerative (preferably functional) programming is a good choice.
Teach them what they want the computer to do first, and then go more in-depth about how you want the computer to do it. The higher level of abstraction really makes it easier once you get used to it - the single thing making functional programming hard is past experience in imperative. It's always easier to learn something, and then expand on it, then learn a lot of stuff first, and then be forbidden to use half of it when using a more restrictive paradigm.
and have them learn traditional line numbered BASIC and maybe 6502 ASM. The machines were simple, easy to program and had hardware sprites (at least the Ataris did, not sure about C64), etc.
You didn't have to play nice with the OS or go through 10 layers of abstraction to get to the hardware. You didn't have to learn a complex API yet you could still do really neat things on the machine.
It also would emphasize code efficiency due to limited system resources. I was able to wrap my brain around the guts of an 800XL and master ATARI BASIC by age 10.
Then have them learn a more modern language like TCL, Python or even Common LISP.
Hell you could probably get them a real Atari 800XL on ebay for $10.
Just a thought.
Fortunately none of my kids want to be programmers. They've seen the horror and stress that is software development.
Designed and written exactly for this type of person! Powerful, Productive, self contained, and useful for real world apps.
see
http://shoooes.net/
Strive to make your client happy, not necessarly give them what they ask for
It's now reasonably mature.
It will give them skills they'll be able to actually apply in a few years.
The standard graphics library is good for simple stuff.
It runs on a whole stack of different platforms (even if you end up with write once test everywhere at least its write once)
They could progress to an internship
It'll teach them Object orientation
It's C like and opens up a whole world of C like languages
Once you get over a few bits of syntax like { = begin, } = end, good code is easy to read
These posts express my own personal views, not those of my employer
When I was at college we learnt oo programming with smalltalk - it is a language that runs in an interpreter environment - and is pretty easy to generate simple graphics quickly with relatively little effort - it is also one of the cleanest implementations of oo I can think of.
http://en.wikipedia.org/wiki/Smalltalk
Well... there were several games written to teach kids programming while they have fun.
Obviously, I'd recommend ChipWits (see my sig) - a 1984 Mac game, which I ported to Windoze (for free, so don't worry). Several other games like that were created (for example 'Mind Rover'), and they really are a nice introduction.
Strangely enough, board games would work, too: there is a great little game called "Robo Rally" (http://www.wizards.com/default.asp?x=ah/prod/roborally) where you actually program a robot in a race across a changing map. Very enjoyable.
After that, I'd strongly suggest a language which was created to teach students programming: Pascal. You can get Delphi (the continuation of Turbo Pascal, have a look at http://www.codegear.com/products/delphi/win32) pretty cheaply these days (eBay), and I believe you can download a free version somewhere, too.
Don't worry too much about the exact language to use, though (mind you, I do also STRONGYL advise against Visual Basic) - kids can pick up such things much faster than we think. Just set up a system, show him a good book and some good sample code, and bingo ;-)
Free PC version of ChipWits at http://www.breueronline.de/klaus/chipwits/
If the kids like abstraction (in the psychological sense of the words) try a statically typed functional language like Ocaml or Haskell.
If they're bright kids, they probably already love lego. The mindstorms NXT stuff is the logical next step.
As these kids are gifted, some may have already done some programming before. You'll need to cater to everyone. For those that are just beginning, I do suggest BASIC and LOGO. LOGO has an immediate and simple visual correlation between program entered and what is displayed as an output. BASIC teaches fundamental concepts, like variables, conditional statements, loops and subroutines without having to get into more complicated subjects like header files, linking and compiling.
For those a little more advanced, show them Java or C and be sure to explain their diffrences from BASIC. It may even be a good goal to get everyone to this level, so they can understand there are many different languages.
For those who are supremely gifted, show them some assembly demos, and teach them some assembler. Kids of that level may end up teaching you, but at least you can show them a challenge.
The problem with many gifted kids is that of you don't keep them challenged, you'll lose them. Your problem will be keeping them all challenged while catering to each of their levels of knowledge.
I was apprehensive at the beginning, but then I downloaded their guide (Download Guide) and I liked what I saw.
http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx/
Very easy, graphics based and fast ramp-up to programming concepts, which you can then take anywhere else.
They even have a Logo Turtle...
As someone who actually skipped a grade, I can agree there are no "negatives" whether socially or physically. I played sports, made lots of friends (voted friendliest in senior superlatives), and maintained good grades from 1-12th grade. I also found the access to more advanced material, such as taking the SAT in 6th grade, an advantage compared to my older peers.
Member of American Sarcasm Society - Motto: "Like we need your help!"
Why's (poignant) Guide to Ruby is a good introduction to programming. It is fun to read and the nature of the Ruby language gives the "instant gratification" that everyone (specially kids) needs.
ilex paraguariensis for all
I currently run an afterschool club teaching robotics at a local school. Although this would require getting in some kit, NQC is a good language for them to get to grips with. It is a well defined and documented cut down version of C ("Not Quite C"). The bonus here being that once they have coded something, it can be downloaded onto a simple robot and run.
I'm actually taking a year off soon; depending on how things work I may look at that. Thanks for the suggestion :^)
Technically I already have a college diploma (Computer Programming from the community college here), but it would be nice to actually have the degree.
It's better to vote for what you want and not get it than to vote for what you don't want and get it.
- E. Debs
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration." -Dijkstra
You can teach "very basic paradigms" in an hour or so without touching a computer. The details take longer but that's a different thing. The thing you need to get across - in this instance - is the algorithmic nature of programming.
Enjoy physical and immediate exercises such as: How can we arrange the members of the class in height order? How do we keep the room at a comfortable temperature? Get them to make a HEXAPAWN matchbox computer and find out why it works.
Kids want results but this group will probably also benefit from being given interesting ideas to take home and diddle with. For example show them how to play Nim, ask them if they can find out how to win, then in the class step through with them writing a player and a board - for which BASIC would be ideal - the simpler variant the better NB with line numbers and GOTOs as it makes it a lot easier to see what's going on at this level.
Finally : (Objective->Method) Find out what sort of things they want to do and pick a suitable language based on that. It could be robotics or graphics or web pages or games or ...
Following the Mona Lisa article two days ago I sat down with Python and pygame and did my own version in an afternoon.
It struck me how easy it is to do simple graphical stuff with the pygame library for Python, and I think it would make a nice beginners language too.
Give them an editor that helps with Pythons indentation quirks, some code examples and let them loose.
Hello world is a single line program, and they can do simple graphical stuff in ten. And it sort of looks like English when you read it.
You could use the a game engine that comes with a scripting language. There are a few out there Esperient Creator, Unity etc... I have played with Esperient Creator and it has a C like scripting language (angel script). I think it would get kids interested. Create some spheres, fly them around, give the game to their friends or publish it to a website for the world to see. A number of other schools in New Zealand have recently adopted it. I think if you hook in your teaching with making simple games it will get the kids hooked.
Two words: Carnage Heart
Ok, maybe a few more words: I have read of computer camp coaches using it for teaching classes, so maybe your kids could benefit, too. It's an old Playstation game, and in my opinion one of the most educational games ever made (sorry, Carmen Sandiego). Whenever I'm stumped on a project, I pop in Carnage Heart and loosen my mind a little with it's unique take on a visual programming language (think visual--like your eyes, not Visual--like Visual Basic). The language is simple to learn, yet surprisingly deep, offering opportunity for new thinking to beginners and code-fu veterans alike. There's even a tournament mode, allowing your little prodigies an chance to pit their coding skills against each other at the end of the class. Should be easy to pick up a copy on the cheap, and if you don't have an original Playstation, it even plays fine on the PCSX emulator (which I prefer so I don't have to fuss with memcards).
Personally, I can't stand it and try not to use it, in favor of the more straightforward and less loaded "high ability."
But that's a completely wrong terminology. "High ability" is something that can be acquired. If someone has killer ability in some field it doesn't mean that they're bright or gifted -- it just means they may have poured a lot of work into it. The whole point of "gifted" kids is that they don't need to pour effort into anything -- they're just better at stuff than those other kids (who may well have equally "high ability" in any one field, but only because they worked hard at it).
Let me pre-empt the retards by stating that there's nothing wrong with hard work, of course. Sometimes the job at hand requires it. But when you are in that situation and the next guy just breezes through the same stuff without even much thinking about it then you'll understand what "gifted" means.
We're all born with nothing.
If you die in debt, you're ahead.
LISP should win this hands down.
Some form of BASIC is, well, pretty basic and easy to pick up with no prior programming experience. I imagine gifted kids these days would only need a couple weeks with that to learn enough to graduate to something else.
Don't do Visual, though, or introduce any kind of IDE tools. Keep it plain and simple, text editor and compiler and executable. Focus on the concepts not the tools.
In high school, at 16, I took a programming course that taught in Pascal. Looking back I think it provided an exceptional foundation for learning basic programming constructs like procedures, functions, looping, input/output, and arrays. It was close enough to psuedocode that it was natural to start with comments and translate it to code.
As for exercises, I've always thought recursive functions were a real head-trip and exemplified the power of computing. Sorting of course is a must, at least a couple different classic variants, and network/graph traversing algorithms are quite educational (traveling salesman).
I was in one of those programs for the "gifted" kids, and they taught us logo.
The whole gifted program is for the bright poor folks who can't afford the better private schools, so teach them Open Source. Also make sure they get proper Martial Arts training because they'll need it due to lack of socialization with the normal mass heirarchy by the time they get in middle school and high school.
Seriosuly, don't forget the martial arts thing because they'll end up living with their parent's basements by the time they're 30 due to lack of confidence software programming brings to most people in the real world. (Especially if you're in the US).
Some conditions must be met : -simple -high-level -with good reference book I recommend Scheme with the textbook "How To Design Programs" (http://www.htdp.org) and environment DrScheme.
Basic worked for me when i was 11 and assembler worked for me when i was 14.
No kidding, this is the path I followed when I start to learn programming, around 11.
I used to be one of those, started at age 11 with Basic, was playing with assembly at age 13. IMHO at that age you need things to be fun - it might be true at any age but a young teenager will just ignore something too boring - so choose whatever language you want, but make sure the kids get to actually code something that *does* things. Writing abstract stuff on paper is no good when you're young, CS gives the amazing opportunity to actually build real world things through a simple keyboard, once you've got this, rare are those that can resist the appeal of being a local virtual God who can rule and command its own little world. A good example of working programs that *do* things are small casual games, any old-school cheap cellular phone game fits. Technology does not really matter, wether you hack in it JavaScript, Python+SDL, Java, C++, whatever, will not make any difference.
(And I'm not boasting here, I was in a gifted program in elementary and early high school, then shortly burned out midway through high school.)
I'm not good at studying and it's catching up with me now in university. Hmm... maybe this is an Ask Slashdot...
Let me answer that one right now: you're not the only one. I never did any homework in high school and graduated with very nice grades, but in university I discovered that meant I'd never learned to actually work. High school should have been a lot harder. Or more challenging, is perhaps a better way of putting it.
I am teaching to my 13yo cousing. He is using Ruby. It is good for several reasons:
* Free and multiplatform
* You can start with imperative programming and then move to more complicated things laters (OOP, Web App, etc.)
* it can be used professionally
You could alternatevely use Python.
One of the most interesting and not too complicated algorithm is MinMax and all simple IA for game (Genetic algorithms, Heuristics, Reinforcement learning...) . Make them making an IA for othello and they could compare to each other by making their program play together...
For the language... Java, OCaml, Scheme, one where you are more interested in the algorithm than in memory management.
Provide them with a basic framework so that they can implement the IA (the interesting part) without boring with the initial setup and graphical interface...
If they are really gifted...
They ALREADY know how to program. Better than us, probably.
First of all, keep it simple. Please, don't flood the youth with all sorts of things they wont understand... I mean, pointer arithmetics can fool even professional software developers every once in a while. My recommendation is to go with something that's made for young people - Ruby and Hackety Hack is a great example of that; Ruby because it's (usually) quite easy to understand what a program does simply by reading it out loud, and Hackety Hack because it's... well, made to solve your exact problem. Plus, Ruby makes a great platform to later demonstrate OO and what have we. But whatever you end up with, please, for the love of god, don't use a statically typed language - it just makes the learning curve unnecesarilly high for no particular reason.
Besides , OO is simply procedural programming with knobs on and if procedural programming can't handle multi core then multi core is stuffed because machine code is procedural and thats what your fancy functional language will be compiled down to.
Ironically I read this just this morning: http://www.trollope.org/scheme.html
I started learning to program with BASIC on an 8 bit micro. I now code professionally in C++. BASIC is a perfect language for children as its syntax is simple and it has all the main fundemental concepts of computer programming - ie variables, loops and flow of control statements.
"It was my first programming language, too, and it took almost ten years and a study of computer science to finally get all those bad habits you acquire in BASIC out of my system."
What bad habits? Programming is programming , you can either do it or you can't. A language doesn't force bad habits on anyone.
The audience at slashdot is a really bad place to ask this question. This is an audience that is generally positive about solving complex problems, the harder the problem the more they enjoy it. An attitude just right for convincing people that programming is just too hard.
I saw students vanish like the mist when a department decided to switch from pascal (designed for teaching) to C (not designed for teaching). It is very easy to scare people off programming, and the language is only part of the story. I was put off programming for years by the simple assignment of "write a program to create a fibonacci series". Writing the program is easy if you had the algorithm but to me a fibbonaci series might as well have been a pasta dish.
No, I'm totally for LOGO. If you use something modern like "microworlds" (see link below) then you get some OOP and audio/visual feedback as well. Think Lisp with 2D sprites and other cool stuff. My nephew was writing Lisp routines for his 2D scroller at 10 years old. Now he designs Quake levels. I'm trying to get him to push right on to C, C++ or (maybe) Java. Maybe I'll try Quake C. I want him into pointers and recursion as soon as possible. :)
It's all about graphics and games with the 'kids today', unfortunately. I had to content myself with writing a cheesy database (OPEN FOR INPUT) and sad 'games' (CALL CHAR) on my TI/994A.
One nice thing about microworlds (hate to plug something that costs $150) but it also interfaces with the LEGO NXT robot thing. You can definately engage a kid with writing LOGO for a LEGO turtle.
There are, of course, plenty of FOSS versions that do the same thing, or work with the cricket.
http://www.microworlds.com/solutions/mwex.html
http://www.microworlds.com/solutions/mwexrobotics.html
Using Java, I had great fun with RoboCode, by IBM. You get to implement the logic of a little tank, which has to navigate, locate targets and destroy them, while preventing getting destroyed themselves. Obviously, the opponents are other RoboCode robots.
Since you're actually using a Java API and providing compilable code, you get to deal with the actual programming (and algorithm implementation) while not having to to do any of the housekeeping you have to do with any app that wants to use IO unmanaged. Also, it's fun to see your drone autonomously kick butt (or get pasted, as the case may be)
Slightly more advanced than the single tank is the tank-with-drones. The main tank cannot fire, the drones cannot detect enemies, and you get to coordinate between them.
While I don't disagree with your suggestions of Logo, LISP, Scala, F#, Erlang, and Haskell, Hackity Hack is a kit that uses Ruby to teach kids to program. It looks kinda cool, and a nice place to start.
Rexx is an ideal beginner's language: * Simple but powerful syntax * Weakly typed * Readable code * Free * Platform independent * Interpreted script language, no compilation needed It has the best syntax rule ever: It's a syntax error if the first line of a program is not a comment. Not a warning, an error!
I say go with actionscript in flash.
The benefit being that it is highly motivating to be able to animate their own drawings and pictures.
Also there's a language called Turing that you could try.
I'd recommend AutoCAD with VLIDE and VLisp.
python ftw!
I started to program when I was 11. I start with Amstrad Basic, which as the name suggests was basic, it did come with a fantastic manual (you could use it to beat whales to death) that had great examples of each function, this is good if you're starting out as you can see an end result and opens you up to experiment. I moved onto Pascal that introduced me to a more structured method of coding which then led me on to C (which I found infinitely more powerful and useful) then C++ and now PHP. I do think it's essential to start with something simple where you can see results and can tinker to your hearts content. I'm glad I started where I did as it gave me a grounding to better understand what was happening as the languages changed. My great concern with very high level languages is that you are too removed from what's happening. Hope this is helpful.
I have used Runtime Revolution with 7-13 year olds who are extremely surprised to be making fully functional calculator programs in 30 minutes. Its visual; none of the endless, tedious cammandlines of my youth. www.runrev.com
Is that all the cool kids use LISP.
Not saying it to flame bait, but I would probably go with something multi-paradigm and that can support both weak and strong typing. I think there is a progression there; get the child used to the idea of algorithms and variables usign something weak and imperative, then move on to OO and strong typing. You could always go with the whole lot up front, but only if this isn't likely to be overwhelming.
Very easy to learn and easy to teach
Assembly. Once you can program in that, the rest is a piece of piss.
I started with Assembly and i can already write "Hello World" in Basic!
Seriously, once you really know what you are doing at the low level it gives all sorts of extra relevance to what you are really doing at the high level. A lot of programmers who have been factory produced by Universities have no real idea of what they are actually doing when they write printf, cout, >> or whatever....
Hell, at high level you dont even have to worry much about stacks, pointers, allocating memory, interrupts, its all happily abstracted away.
So you have not been able to use muliple threads in an OO-language? Is this what you mean by "OO's inability to handle multi-core processing properly"?
.NET and java class libraries). The advantage of this of course being that you would not need to have to recreate all those graphical widgets and other side effect stuff.
I might as well make the silly claim that "the inability of any true functional language to have any side effects whatsoever, makes FP utterly useless". You made it sound like OO can not be run in parallel and I made it sound like a fact that functional languages can never have any side effects. I do not doubt that OO languages could do with some new ideas, but there is no need for this type of FUD.
The linked to article suggest the use of F# or Scala. Don't get me wrong, both seem like fine languages to me, but they do allow you to reuse object oriented code in your new FP program (you can access
By redefining that all the "dirty" stuff resides in OO-land and then to continue to actually use those OO-components won't change anything. You might as well define a new block-type in OO-languages where you say:
stuff in here can be run in parallel and is not allowed to have side effects. Then you let the compiler/verifier ensure that this is the case and that you can really take advantage of muliple cores.
How is it with Monades? Are they blocks of the program that can have side effects?
FP has brought a lot of good ideas, but I can not help but feeling that a lot of FP FUD is going on right now.
She made the willows dance
The way I learned was HTML > CSS > JavaScript > PHP then desktop applications AutoHotkey > C#.
A few years ago i translated a book called "how to think like a computer scientist: learning with python" from english to german.
the book aims pretty much at your clientel, and gets through all the themes you mentioned (basic programming structures, fibonacci numbers & recursion etc.) and may be used under some open license (i forgot which one).
if it's still around i'd give it a go, even if you decide to use a different language - the way things are explained is a good primer.
Modern software is an organic soup of interacting components. To plant in your students the sense of perceiving complex system with many interacting components, I would start with the great StarLogo TNG software, which allows children to program 3D simulations & games, almost without any training. After that, I would recommend the best programming language out there (IMHO of course), Python, which is easy to learn, built on good OOP principles & powerful for any task at hand. For letting your students really use what they've learned, teach them also Web development, e.g., with Django, & teach them how to deploy Web applications to the Google AppEngine cloud. By experimenting with this & building useful stuff that is available for all, they'll truly learn what's programming all about.
Easy because theres no sense teaching him a more difficult heavy duty language if he's just going to dabble and give it up.
Multiparadigm because if he does stick with programming, he'll be able to learn a much wider variety of concepts and problem solving strategies from day one. Even if he ends up working in a single paradigm language later on, he'll benefit from the exposure to other techniques.
I'd probably look at either Ruby or Python. Both support multiple paradigms, both are fairly easy to use, both are capable of modern, real world work, and both are available on multiple platforms.
My approach is to start, not with computers, languages, but to give kids a feeling what is a program and what is programming like.
Start for example with 2 volunteers and blindfold the eyes of one. The other should in the first exercise interactively guide the blidfolded kid to the other side of the classroom, which is not that difficult.
The second exercise is but much harder. The instructing kid, has to prepare the instructions on how to cross the classroom upfront, write them down, to remember them. Then he can deliver his instructions to the blindfolded kid anyway he wants, but has to stick to instructions and give no additional information.
Third exercise is to brainstorm on how to formulate the instructions "that would work better". Things like events, loops, conditions could come up (i.e. go straight ahead until you hit the wall).
Fourth exercise is an analysis, what went wrong, why does it not work as we have initially thought it would.
etc.
When I was 11 years old, I had pretty much mastered m68k assembler. I was writing demoscene stuff with music, cracks for copy protected software, all on my little Amiga 500.
Change is certain; progress is not obligatory.
There is a very nice tutorial for a younger audience at http://www.lisperati.com/casting.html which you might find inspirative.
I think that Basic or similarly handicapped languages do produce fast short-term results, but are an impediment to expanding the thinking horizon. The language we use shapes the way we think.
MIT released scratch a while back
http://scratch.mit.edu/
It is a brilliant graphical environment that focusses on multimedia projects - but which introduces standard concepts like variables, loops, conditions, etc.
e.g. to do a loop, you drag a loop graphic from the side. It looks a bit like a clamp and graphically wraps round 'blocks' of code.
There is no possibility of syntax problems like semi-colons at end of line, mis typed commands, etc - so it is a great way to introduce the concepts without the pain of precise syntactical communication (obviously, the programming ideas have to be precise)
Another major plus is that kids can easily make fun and significant programs rather than having to go through hours of boring text output programs.
Start here, show the kids how much fun it is to play when programming and the joy of creating applications. Then when they understand (and have used/debugged) the structural concepts, show them how to do the same in a text based language.
There is more; The programs will always compile and run (though may not do what the user expects). You can change the program while it runs. The environment is built for sharing programs (upload your app, download someone else's and change it). It is simple enough for 7 yr old kids to play meaningfully and rich enough that a bright 14 year old has plenty of scope to challenge themselves.
Give it a try, it is aimed exactly at your group, and I think it hits the mark brilliantly.
VLC Remote for iPhone and Android
Euphoria and ABC are excellent introductory programming languages. Both are very simple, programs written in them are quite readable, and you can do useful things with them:
Squeak: Learn programming with Robots (http://www.amazon.com/Squeak-Programming-Robots-Technology-Action/dp/1590594916) is an excellent introduction to programming for novices.
... like cobol. And I'm not joking.
I wouldn't recommend bright young kids get into programming, or at the very least not pursue a career in it.
"Waste not one watt!" - CZ
Basic has been around forever, so to speak. It is easy to learn, relatively 'unstructured', and its principles are similar to all the other languages.
As a teacher who has taught religious school children I found out that schools everywhere are really hypocrites when it comes to software, keeping many copies of older DOS and window$ educational software without 'registration'. The writer is one of those that learned decades ago that software registration is most often the first step in the buyer's victimization by that software publisher and his 'friends and asociados' in the organized crime syndicates that our software industries have become. Schools, needing many copies and courted by software vendors, often bought a copy or two of software products and made hundreds of copies. Now our legal system calls this 'piracy', a term equivalent to murder and dismemberment and rape on the high seas. These same schools also use blantant lying propaganda on students in a continuing gestapolike campaign financed by the 'window$' industry to brainwash them into the 'windows frame of mind'. The fact that all that educational software was originally designed for window$ tends to lock school systems, public and private, into window$. QBasic was created by IBM when they were in an ill fated partnership with microsof$ just before microsof$ double crossed them. The generic basic used by clone makers was called GWBasic. Invented when IBM and microsof$ tried to take over the industry with the hardware/software combination of OS/2 and PS/2, clone makers responded by the then ill planned monopoly move by banding together and making their own hardware and software in a world not yet prepared to accept illegal monopolies, far different from today when republicans never met a monopolist they did'nt like no matter how evil. Having said that, the fact is that school systems, early converts to apple, however are now predominantly windows apologists, apostles, and shameless propagandists. So kids are in the main fed window$s as the 'only game in town' and all other software is 'illegal'. Because of this mindset it is difficult to even teach programming, as this is viewed by windies as 'burglar tools' that 'enable hacking of commercial (read monopolist closed software) software'. My school had as its 'principle' a gentleman whose wife whose job in the county educational system was to procure software, window$ software. All suggestions to use linux as being more cost effective were ignored. But the taking of the name of the suggester and forwarding it to a secret blacklist of teachers and students 'suspected of subversive activities' was taken very seriousely. Perfectly logical suggestions to go to linux were wasted on a corrupt hack who was willing to sacrifice his students and the parishioners who paid his salary, and waste the parish's money on endless window$ 'updates (DRM)' because the money and people that he threw away and betrayed were not his. The bribe, however small, WAS his and in his pocket. So for a few hundred dollars he was willing to betray his trust, 'discreetly', and waste hundreds of thousands of dollars and condemn his students to a lifetime of servitude. I'm not wasting words on a rant. This is a real life situation in many schools. When or if you meet such a person, you will know when your suggestion is never considered or just met with a quiet smirk from the administrator followed by nothing or worse, delivered later on by an underling you had never met or considered. The only answer in those situations is political. You go to the parishioners (easy in church schools) or the public to campaign to remove those administrators. And tell your public why. Do not be afraid of retribution, you are going recieve retaliation anyway. You 'earned' that the first time you mentioned the word 'linux' in the presence of a bought and paid for soulless crook. You already know how to locate BASIC and try to teach them to windies. It is amazing that your school system even allows programming in the present legal monopolistic environment.
I think that the question is not what is the best programming language, but the more educational for them to get introduced to concepts.
I think Logo is very good for developing analytical thinking and getting introduced to basic programming concepts.
I would also follow Alan Kay's steps in this direction and take advantage of Squeak, that has been specially designed for teaching Object Oriented Programming to kids.
It was only in recent years that I was introduced to Python, but at this point it seems like the logical "teaching language". :)
All the libraries make it very easy to use. The whitespace paradigm makes sure you'll learn to indent code, while the syntax and data structures are both widely used in other languages and still accessible even to novices. Also, very easy to make simple games in. If there is one way to make a twelve-year-old to program, it's games. Just give them a pack of cute sprites, pygame and red bull
Mihail Minkov
Wow, he already answered the question himself:
I will be teaching an enrichment programming course to 11-14 year old gifted children in the Spring
Spring it is!
I found that the most important is to choose a language which you know well. My son was 6 years old when his grandfather teached him C++ using the free Turbo C++. I regularly coded in C++ several years ago, but frequently it took me an hour to answer a simple question. This doesn't work in the long run.
The second important experience was that these children live in a different world, they are motivated by different things then we were interested decades ago. They see windowed applications and 3D games. Therefore my son is not interested in command line programs and old games. He likes to write a Notepad clone or a music recorder.
Disclaimer: the best way to help a 14 years old boy may and likely be completely different.
You are asking the wrong question. The programming language is really not important. You have to find a problem the kid wants to solve and you have to find an environment where it is easy to solve that problem.
I beginned programming by modifying existing games. And that was really the right way to begin. You can have quick overwhelming success with simple things but you can dig deeper to every level and do everything you want as your skill increases.
Find something the kid is interested in. Don't place it in front of a compiler and say "now program what you want". Give him/her tasks that are fun to solve and make sure he/she doesn't get frustrated because the goal is too far away.
The best advice I can give is find some game that allows modifications and that the kid enjoys. Show him/her how to modify it and ask what modification he/she wants to see and then help him/her to get there.
Language and paradigms are really to far away to care about. If you learn how to solve a problem algorithmically you can pick up any language. Paradigms are about modelling a solution. That is a quite high level of abstraction and I don't think a 14 year old should care about that. You have to be able to write small pieces of software before thinking about how to put this pieces together.
That is like math, you don't start by introducing the kids to algebraic theorems, you just show them how to add first.
Let them watch "war Games" and "Hackers" and "Sneakers". Subscribe to 2600 and leave it out on your desk. Then put parental controls on the computer and tell them not to go hacking around on it and to leave your O'Reilly books alone. Just wait--they'll do all the learning on their own.
Actionscript is very accessible, powerful and the skills almost directly transferable..
I started programming in Delphi when i was 11.
Delphi is based on old Pascal, which you bring up.
It's fairly easy and there are OpenSource IDEÂs which supports Object Oriented Pascal.
For instance Lazarus. Else i'd go with CodeGears Delphi 2007 or 2009.
The IDE is simple, and find the connection between object functions and the code you write in is really simple.
However, its kind of a dying "breed". They will without a doubt have use later in their life you teach them C# or C++. I know this for a fact starting out with Delphi and now more or less have been forced to swap to C.
Not to mention that if you learn C, you will have no problems understanding the rest of the languages out there, except Delphi.
I'd suggest you teach them C# with or without .net.
Oddly Perl might be a good choice if you run linux. I use perl almost exclusively for quick scripting and has enough "clutter" to help them bridge a gap between straight basic and a more comprehensive language like Java, C++, or C#. PHP is a great learning ground also for generating web pages and working with a database like mysql and learning how to pass information around.
I would like to state when I learned programming I went in this order:
LOGO -> BASIC -> x86 ASSEMBLY (yep) -> Pascal -> C -> C++ and then my hands gave out ending any ideas of becoming a programmer for a living.
Later on in life I picked up (in this order):
BASH -> PERL -> SQL (ok not so much a programming language per se but you get the idea) -> PHP -> Ruby -> Java -> Java Script -> C#.
I CANNOT STRESS HOW IMPORTANT LEARNING ASEMBLY IS! Yes it's verbose but the process of learning it really helps someone understand how the computer works and gives a solid foundation to understand the higher level languages. More importantly they can drop down to the assembly level when needed to really optimize certain sections of code. If it wasn't for my ASM classes I would never had known the difference between a COM and EXE file ;)
More importantly no network admin to date apparently has ever bothered to lock out DEBUG for writing quick and dirty ASM programs. Thanks MS for forgetting about that ;)
-=[ Who Is John Galt? ]=-
I'd suggest Ruby. Why? I think you should avoid frustrating these kids with too complicated languages at the start. Coding should be fun. So should be the books to learn it. Take a look at Why's poignant guide to ruby and the Hackety Hack Software. You may say, nobody uses Ruby, but the concepts in other languages are similar.
My first glimpse at programming was on my trusty TI-83 back in middle school.
We didn't have any formal class. Me and a few friends just started playing around with it and tried to build miniature RPG's and fun little animations insulting each other.
Nothing I learned from this was "directly useful" but the concepts were helpful when I really started getting into programming later. It's definitely an option to consider.
QuickBasic was good learning tool because it was fun and easy to use. It had a good on-line help (QBasic help is pathetic), graphics and sound were great. It only took two instructions to get something on screen. Where's DRAW "D20R20E5F5G5H5" or PLAY "O4C8C8C4D8E8" on anything else? I bet many programmers learned BASIC trying to recreate the color pics on the CoCo's Extended Basic book, following the sprite example on the C64, and modifying Bill Gate's "Donkey.bas" in BASICA/GWBASIC.
Kids won't have problems with modern languages, but most frameworks are boring. You could check Microsoft XNA, Silverlight, Actionscript (Flash), etc. You can easily run QBasic in DosBox, Virtual PC, and VMWare player. QuickBasic is a compiler, so, code can be written in windows-based editor. FreePascal is a good alternative if there's something similar to Borland's GDI.
I would heartily recommend Common Lisp, or Scheme, for you to teach your students. Although practically no-one really programs in it these days, that is hardly an excuse (I mean, let's be honest, Pascal is still being used).
It maintains several paradigms quite nicely (functional, and OOP - to name two), and in that the kids have - presumably - absolutely no prior programming experience, they will not be taken for such a steep learning curve when it comes to the syntax.
If you take a look at Common Lisp and/or Scheme and decide you would rather not teach either of those to your students, just stick with C for no other reason than should your kids decide to pursue programming (be it for hobby, or profession) they still have knowledge of a widely-used language at their disposal.
As for puzzles, one I really enjoyed was the "Sieve of Eratosthenes" - it's a super-inefficient prime number finder, but when done right, gets faster the longer it runs.
Why not use python?
It has very clear syntax, lots of interesting libraries for graphics or sound, which makes it possible to do something exciting with little knowledge or effort.
It is also multi-paradigm, so you can start with the one-line hello world:
print "Hello world"
and move up to drawing 2D-graphics, without having to introduce classes, linking, pointers or even functions.
I always thought that Robot Battle would be a cool way to learn how to program.
Its a programming game where you try to program the best robot to compete against other robots. Last one standing wins. The robot controls are simple so emphasis is based on the programmer's ability to create a winning strategy.
Anyway, I like it!
www.robotbattle.com
I have seen far far to many people doing "programming" who have not a clue about what is happening, much less why.
Programing is providing a sequence of instructions to a physical device. If you have no idea about what that device does and how it does it you will never be able to do anything except parrot what someone has shown you. Start off with logic basics. Teach them why a computer can count. Show them why a bunch of JK flip flops strung together can represent and count numbers. Illustrate on a chalkboard why and how TTL and DRL gates work. I am not talking a course in EE here, but this base knowledge is IMO important.
After they kind of get that, start off by using a DOS and debug in CUI mode, then move on to something a bit higher, build on a progression of simple blocks and move forward.
Hey KID! Yeah you, get the fuck off my lawn!
I'd vote for
Prolog & Assembler. Then the functional languages suggested by many other posts.
Teach them declarative problem solving first. Followed up with 'how processors work '(Assembler). Describe a hypothetical Prolog interpreter with a focus on the trees (this gives them pointers). Logo will start them thinking functionally - which is a nice transition from logic programming.
With an Assembly background pointers will be easy to understand if they need to grasp C, and linked-lists of pointers will be clear based upon prior exposure to the 'Prolog trees'. With a declarative background they won't be stuck in imperative lock-step. With the functional stuff they can get into some of the interesting Math. For fun throw in there dataflow so they are thinking in terms of Legion.
If they are *very* gifted - toss them Backus Turing Award Lecture about FP. After all that, give em Perl for 'integration crazy glue'.
Stand back a safe distance and observe.
Hi. The best programming language to start with is LOGO. http://en.wikipedia.org/wiki/Logo_(programming_language)
My kids (12 and 15 years old) have really enjoyed using "Phrogram". They have a nice IDE, a great web site ("http://phrogram.com/") and a forum with helpful people. My boys would have really preferred an MMORPG style game programming language, but they now realize that they have to learn to walk before they can run.
"...would be best for starting these kids off on?"
Are you sure you should be teaching gifted kids?
These all teach different things, and I've studied each of them with no formal training. I was shell-scripting in UNIX by 14 (minor stuff, and we didn't call it programming, but it was). I would suggest introducing them to Free Software, Emacs and all that without dumbing it down: nothing could be worse for you than telling a bunch of teenagers who very well may know more than you that you're going to take it easy on them. People take what they can get, so give it to them.
Unix (of any flavor) is also a much better platform for young people to learn on: I know that from experience. On Windows everything is far too disconnected from how the computer really works (by accident and by design).
The language that got me going was Perl (this was at 26, I should add), but I quickly moved on to Scheme.
Emacs is also a great way to learn because when using Emacs, people see how using a computer equals programming. If you teach them to make a distinction, they will have a well of powerlessness to draw from.
I remember an assignment that I had that had loops and case statements etc was to print out the 12 days of Christmas. It'd be in season too :)
Also, even though I learned on C++ first, I think learning a scripted language or something that can help generate HTML would go a long way. I wouldn't bother with truly compiled code at this point, it'd be an additional concept that you'd have to teach when you don't necessarily need to (the translation from txt to machine, etc).
I know when I program, I like to see results immediately, it doesn't get my quicker than to change a word here or there, then pull up your web browser again, or refresh it.
One can do it all with python and the resources available are vast.
http://firstlegoleague.org/community/fll/welcome.aspx
In the larger world, adults are encouraged to "fit in" and they generally do this by figuring out how to use their strengths to smooth over their weaknesses so they present a fairly balanced image to the outside world. Children have not yet figured this out so they try to avoid things they are not good at.
This effect is really amplified in "gifted" children, so by middle school they often end up with enormous gaps in their knowledge base.
The only solution is to specialize your teaching for the individual students and engage them as much as possible. (Of course, this just defines good teaching in general.)
Warnings aside, there is a particular kind of professional satisfaction that comes from seeing a young child light up with an understanding that you yourself did not get until you were much older. I got that a lot.
My direct answer to your question is that you should use a variety of programming "languages" and that you should focus on the process. My logic here is that the students are liable to have a lot of different learning styles and some will respond to specific languages and thought processes better than others. You need to give them several opportunities to "get it." QuickBasic will appeal to very verbal students, Perl will appeal to more mathematical students, LOGO will appeal to very visual students, etc. I suggest you try teaching at least 2 languages, possibly in parallel.
I know this is probably sacrilege in this forum of zealots, but I believe that the dialect one programs in is irrelevant. The question du jour is: Should functional programming replace OO? But next week, someone may wake up and realize that Fortran compilers have been optimized for parallelization on big iron for decades. If that "news" gets traction on slashdot, we may all flock there. I say: "who cares?" Programming is mostly a thought process verified by thorough testing. The very hardest part of programming in any language is deciding what the program should do and creating a language-independent flow chart.
I would certainly NOT suggest that you use C or java as a first language. Your students are going to need more positive feedback than a hard-to-read language and a persnickety compiler will allow.
My own opinion is that "sloppy" programming is OK in the early years. For most, their programs will be like a poor piece of student art that they learned a lot from. When they get a programming job or take a college class, then they can learn to format properly or die.
Some ideas for you
With a group of really young students (9-12 years old), I created a large human calculator in the hall. Each person only has to consider the past and present state of their neighbor(s). They do not individually see the big picture until the calculations are done.
When I taught a combined Physics/Calculus class (mixed ages), I required a High-School-Standard TI calculator, assigned subroutines to various students and then assembled the routines into a single program for testing. I could tailor the complexity to the ability of the particular student and they were all doing something different which was pivotal to the success of the overall classroom effort. If someone got stuck, we could discuss the individual problem as a class. That was very effective.
Addressing your PS question, whenever I pick up a new language, the first program I write is a Monte-Carlo simulation of Pi: Create a Vector with 2 Random numbers 0-1. (a box) Increment an overall counter. Is the length of this vector less than 1? (an inscribed circle) If so, Increment a test counter. Compute Pi from the ratio of the 2 counters. Loop until desired r
looks like you have a heck of a lot of responses. just thought i would add my own. i think the best to teach kids would be some simple C or work with visual basic. i always enjoyed object oriented programming when i was younger. it was easier to grasp.
"i stand on the edge of destruction" -shai hulud
http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx
It's been said here before, but I distinctly recall my c++ computer class to be one of the best middle school courses i ever had. The teacher was outstanding and provided all sort of fun programming puzzles for us not just to program, but to think about how to go about solving a problem. Of all the language choices, I'd highly recommend choosing one with a fair amount of reference material available. Kids will always be able to apply their c, c++, or java skills - should they want to pursue a career in computer programming.
One of the more interesting puzzles was "create a program that performs the natural log function, using only base mathematical operations (addition, subtraction, multiplication, division)". It's actually quite easy to do, one of my fondest memories is working with my math teacher trying to figure out a neat algorithm to perform the function.
http://en.wikipedia.org/wiki/Tower_of_Hanoi
This was presented to us as an exercise in an intro class. Great example of rules, stacks, and recursion.
Microsoft has a language out there now called "Small Basic". It is based off of VB.net and has a cute little GUI. If your teaching to kids you want them to be as comfortable as possible, and this would aid in your program.
I actually have experience teaching a 13-14 year old some programming (my daughter). We downloaded Netbeans to her Mac and I helped her create some simple Java programs - first just console programs then an Applet. Ok, Java is not the latest cool thing anymore, but NetBeans does syntax checking as you type so it's easy to get going with. She liked it. And if we want to move on to creating a web app (JSP for example) that's certainly possible. No, she doesn't understand the whole language or even all the concepts, but she learned something.
I disagree, and I'll tell you why.
An introductory course in programming does not have the purpose of teaching people how to program, or to learn good practices etc. It should help the students to decide whether or not programming is something they are interested in pursuing. Further, those students who decide not to go further, should walk away with some value that enriches their lives anyhow.
I've taught several introductory courses and I use VB as the vehicle. In only 3 hours of classroom work I can teach complete beginners how to create a rudimentary Pong game. The students squeal with delight when they see the results of their effort come alive.
Graphics and the motion are appealing to students. They are also the best way I know to teach students how something seemingly real can arise from such abstract things such as program statements. For this use, VB is the best tool I can imagine. Logo would be my second choice.
Using the Pong example, I've been able to teach many novices the central lesson of the course which is, "Programming is not magic. It is something that even I could understand and master if I so choose."
Students who choose not to go further lose much of their fear and incomprehension of things digital for the rest of their lives.
Students who do choose to go further can then go to a programming 101 course that picks a more appropriate language and concentrates on methods. Do not confuse programming 101 with introductory programming.
I skipped kindergarden and my parents and myself ended up regretting it later. I was almost always the youngest in the class, and some of my classmates resented me for having the "nerve" to be smart enough to start regular grade school early. I got so tired of getting picked on for making good grades, I stopped trying as hard and my grades suffered because of it. I also became lazy, but I'm not sure if that was a result of all of that, or just because I have a natural aversion to work.
I really enjoyed solving the "Towers of Hanoi" problem, with recursive functions (7 disks on one of three pegs; move them to another peg without stacking a large disk on top of a small one). I learned this in a high school Pascal class, but I really disliked Pascal (still do) because you had to define/declare every little detail. I think children would get and stay interested if you started with something like Alice. Or, if you want to avoid installing software (or if you're running older/slower machines), you could teach the basics with Java script or VB script, both of which run natively under Windows. On the other hand, if you're going to teach programming, you should be an experienced programmer yourself, in which case you probably wouldn't be asking what language to use.
Agreed. Also processing (aka proce55ing for Google searches) produces beautiful animations and advanced interfaces effortlessly while keeping the code spare and elegant. The Java cruft has been exorcised. No other language even comes close - this is the one kids will want to work with.
"Is life so dear, or peace so sweet, as to be purchased at the price of chains and slavery?" - Patrick Henry
Your isolated experience is absolute proof.
You may have been bright, but it seems the brightness is fading. Fast.
IANAL but write like a drunk one.
My son is in your demographic (mathematically gifted and 12 years old)... He has Lego Mindstorms. That's a good introduction to simple logic constructs with a physical response. He likes Scratch (MIT) and Alice (Carnegie-Mellon) which have the same drag and drop concept of programming. I've also introduced him to C++ via Visual Studio Express Edition and the DarkGDK, but that tends to get slow because his typing skills aren't all that good yet. It is all good. The important thing is to have a series of attainable goals on the way to a complete working *something*.
Why not try using Karel the Robot? It is a unbelievably watered down library in Java taught at Stanford University in their introductory programming courses. At first, Karel consists only of 4 commands. Move, turnleft, putbeeper, pickbeeper. The commands are then executed by a simulated robot that follows your commands on a generated window. An example of this is:
public void run() {
move();
pickBeeper();
move();
}
Want more information...check it out at: http://www.stanford.edu/class/cs106a/materials/karel-the-robot-learns-java.pdf
if they are bright enough, then they will not choose this profession.
In psychological/educational terms, there is a difference between ability and achievement. Ability refers to things like IQ that measure "what you bring to the table," so to speak, and can only be developed to a limited extent. Achievement refers to things like grades and end-of-year test scores - someone with lower ability can work hard and achieve the same as someone with higher ability.
Warning: Apple/Nintendo fangirl. Likes her electronics cute & cuddly. May be rabid.
Thank you for your anecdote. Sadly, it does not cancel out decades of research. Here, I will give my own anecdote to cancel yours: My husband skipped the third grade, and not only did he suffer no ill effects from it at any point, his fourth grade teacher wanted to skip him to fifth because she didn't realize he'd already been skipped.
You see, they have devised these things called "statistics" so that we don't have to play dueling anecdotes all day. And the statistics from many, many studies show that the vast majority of grade-skipped children have no negative social or emotional effects from it. Most of those who do had problems before the skipping and the problems just weren't fixed by the skipping.
Warning: Apple/Nintendo fangirl. Likes her electronics cute & cuddly. May be rabid.
Read this:
http://www.elkner.net/jeff/articles/caseStudy.html
I have actually taught 14 year olds when I worked as an IT manager at a school. We have about 5-6 who were interested in Linux. Once day one of them came to me and asked to be taught how to program. I took the decision to teach python, simply because it was so simple, and encouraged clean code writing, unlike most other languages ;)
The upshot, by about the 3rd lesson, being entirely theoretical, I had them understanding classes by using an analogy of an office block, with offices being class instances, functions the people in the offices, variables being paper with data on them, and blueprints for the offices being class declarations.
The next week, one of the guys came up to me and showed me a 200 line program. He's started writing a text-based adventure game. He had a few syntax errors. After sorting that the program had grown to 400 lines by lunchtime. I was both impressed and touched that I had been able to teach this young mind the basics. We did one practical lesson. All the rest was theoretical, which goes to prove you don't ALWAYS need practical lessons.
I'd recommend JavaScript. It's got all of the logic constructs you want to teach beginners (conditions, variables, loops, etc.), and it requires only a text editor and a browser to teach it. If you want to coddle them, there are many IDEs that support JavaScript as well.
People have already mentioned project euler, which is good, but most of those problems will be beyond the capacity of 12-year-olds, I think. Start really simple: write the absolute value function, the min and max functions, factorial, simple I/O interactions like "how old are you?". Build confidence in their ability to solve simple problems before you give them something more complex. A good one might be the "higher/lower" game. Write a program that picks a random number and then asks for a guess. It tells whether the guess is higher or lower than the true value. If you make them program an AI that can play the game, they may discover binary search all by themselves. I think problem solving is more important than being able to see pretty results.
When I read all the above and see a rehash of everybody saying the language they know is best, I just shake my head in disbelief.
Is there not a single Slashdotter that has embraced teaching as a profession that can actually enlighten us regarding this matter?
To the people mentioning Java, C and its ilk, Perl, Python and PHP, honestly, get a grip. I know seasoned programmers that are driven to despair when faced with the different idiosyncrasies of these languages, all created with very specific purposes, last of which is educational value.
So guess what, I typed "programming language for children" in this thingy called Google, and a linky thingy pointed me to a list of languages in a website called Wikipedia, several of these languages are *specifically designed as educational tools*
If you put your mouse pointer thingy on top of the highlighted text below you will be shown the information I am mentioning.
http://en.wikipedia.org/wiki/Educational_programming_language
Everybody that has gone through proper computing education knows about Logo, knows how it works, to whom it is aimed, and how easy to pick up is. But no, fucking Python is didactic, functional languages are making a comeback and the diahrreical nature of Perl is ideal to get fresh minds to embrace computing. Give me a fubaring brake.
What I would have expected in this thread is that people with experience with those languages (and others designed with educational aims in mind) would have shared their experiences.
What we have got so far is mostly useless, I don't call moderators to task in general, but in this occasion most comments on this thread should be buried in the -1 hell, their only rightful place, not to send them there is frankly a dereliction of duty.
IANAL but write like a drunk one.
I notice that no one seems to have mentioned LOGO, the programming language for children designed at MIT. It introduces basic concepts, etc. As well, there are other similar programs (i.e., SQUEAK) that might be more suitable for your age group.
One advantage of the LOGO language is that it can be combined with the Lego/LOGO robotics system. YOu could get your students to learn programming while actually building something that interests them.
Personally, I can't stand it and try not to use it, in favor of the more straightforward and less loaded "high ability." But it will be a very long time before "gifted" goes anywhere.
Why do we need a special term? Isn't the word "smart" good enough? I suppose one could use "unusually smart" for kids higher up the chain, if only to differentiate them from the reasonably bright kids who prefer to neglect intellectual development in favor of learning to burp the Pledge of Allegiance.
feldicus
I'm sure many agree on Logo. Particularly Brian Harvey. I think Logo is more likely to interest more types of kids, but there's actually nothing wrong with Lisp, if approached without a lot of jargon. Starting Lisp is amazingly easy, especially for those who've not learned procedural languages. Smalltalk... maybe not so many would recommend, and maybe there are better similar languages with better free support, but the idea here is to introduce oo concepts from the beginning so they don't seem foreign and weird later. Without looking, I'm guessing not many have recommended C. But here's the thing: plain old K&R C only looks strange to youngsters at first. Teaching it properly also teaches about architecture and efficiency and such, and the end result is the students have something they can build on instead of trying to forget later. Wait until much later to get into pointers and maybe don't bother with dynamic allocation at all. Do NOT use any sort of BASIC for beginners. Bad programmer. No Twinkies. Those guys at Dartmouth were trying to offer something besides FORTRAN, but we have better tools now. Heck, Algol isn't a bad learning language. Unfortunately, I haven't seen much platform support for it. Oh yeah, and Pascal... ugh. Standard Pascal is weak, and extensions never seem to have the conceptual integrity that can make programming somewhat intuitive once the foundations are laid.
I'd throw my hat in the ring for Purebasic.
http://www.purebasic.com/
It compiles, can handle three operating systems, does DirectX 9, can be used to make applications, 2d games, 3d games, or simple "hello world" style programs. There are two books available for it, both well written, made by members of the community.
You're not going to write the next Office suite with it, but IMO it is a good introduction to programming.
I've been teaching middle school kids programming for four years. I don't think the language is that important. What's important is to find good problems that they can work on. And by good I mean: (1) Students find them interesting, (2) early problems are easy so everyone can get a small victory under their belt, (3) the problems scale up so everyone has something that challenges them. The way I teach is I start everyone out on Scratch ( scratch.mit.edu ). Scratch uses drag-and-drop programming which lets you skip all the worries about syntax and jump immediately to logic, problem solving, etc. I.e. the interesting stuff. Most of the students will continue to find Scratch interesting and challenging for a long time (6-months to a year). Your top kids will get bored and then I'd move onto something like Processing ( http://processing.org/ ) or Python with some graphics library such as my MakeBot ( http://stratolab.com/misc/makebot/ ). If people are interested, I can post my Scratch worksheets.
how about LEGO Robototics (Mindstorm) Is this class voluntary or mandatory? If it's mandatory, you might want to lower the bar a little due to varied levels of interest.. what kid doesn't like LEGO? Mindstorm let's kids build a robot out of standard components and write a program that gives the robot instructions. the results are immediately tangible (make robot do stuff) and problems are easy to identify (robot didn't do it right) the LEGO site has teaching aids but here's more general info: http://en.wikipedia.org/wiki/Lego_Mindstorms bonus: teacher would have a blast creating they syllabus
There are only a couple of good first languages: Squeak (Smalltalk within its own learning universe), or Scheme (a solid basis for computational concepts).
The language doesn't matter nearly as much as the goal.
Designe a program where they make somthing they will think is cool.
It could be with Ruby (recommend http://hackety.org/)
It could be javascript, doing interesting browser things (greasemonkey allows doing "cool stuff" easily https://addons.mozilla.org/en-US/firefox/addon/748)
It could be python (Recommend pygame, or as a scripting language in another game.. see http://wiki.python.org/moin/PythonGames for ideas)
It could be Lua ( Used as a scripting language for a game)
It could be Alice. (http://www.alice.org/)
It could be Lego Mindstorm programming with NQC, Lua, RobotC, etc.
Consider centering the program around the First Lego League compition(http://www.usfirst.org/what/fll/default.aspx?id=390)
Your students will even learn assembly or C if they are convinced it will lead to doing REALLY COOL STUFF. At least I did around that age. Asking about the right language is missing the point.
Come up with really cool projects, and the language learning will happen. Trying to force kids to learn a language for the languages sake just ain't going to go well...
Blessed are the pessimists, for they have made backups.
My experience is that it will come down to random luck on who else is in their classes.
I skipped in a few subjects ( wouldn't let me skip a whole grade ) and while I got along ok with the people in the grade "above" me, there was no one I would have been as close friends with as in my class.
I would say that it would work better earlier, and before the child had formed too many attachments to their own peer group. Otherwise it should be no more damaging (within reason - it'd be tough having a girlfriend in high school when you're ten years old) than moving schools.
http://phrogram.com/kpl.aspx I've started teaching my son (8 years old) with Phrogram - it allows for all the needed pieces of programming, gives quick results, and has a nice little IDE (all free of course).
I can't say it enough. If you want to get kids involved in programming, take a look at Alice. I teach middle school students Alice and they love it. Best of all it's free!
www.alice.org
I have an IQ > 140 and skipped two grades in middle school (4th > 5th, 7th > 8th). While I did experience a far greater share of ridicule from some older (ie, big hormones, small minds) students at the time, I've never lacked for social grace, any more than my peers.
Nowadays, I do interesting research work for a living, have a hot wife (professional model) who holds a PhD, and appreciate the trolls on Slashdot. Maybe that last one qualifies me as a social misfit, but the first two certainly do not :).
Teach them the simple iconic scripting langauge built into every Macintosh and they will love you into adulthood !!!!!!
See http://ircamera.as.arizona.edu/NatSci102/images/extinstruct_files/image002.gif
Don't let them touch a keyboad. Use a pencil and paper. If you can't do it on paper you can't do it in a programming language. I'm not kidding. I'd recommend a whole lot less typing and a whole lot more writing for all technical training, which is what this is, even though you think "welding" when I use that term.
I love PHP, it's a cool language - but there is no way I would recommend it for learning programming. There's too much freedom in it and the problem with that is that it doesn't bite back when you do bad things.
It's fine if you want to learn PHP or even web based programming...
But if these are "bright kids" then they should be trained well from the ground up, the need to learn how to program, a skill that is language independent - and as a Java programmer, I have to say that there is only one language that can teach them this properly: C.
Genesis 1:32 And God typed
Please, please, please pick a language and teach them Multi-tasking and parrell programming.
Sometimes I swear, if I come across another programmer that can't at least muddle there way through that, I'm going to break their fingers.
Thiose will be THE most important programming skills to be a good programmer.
Use a compiled language. The must be familiar with one, and it opens more doors for them.
There 11-14 year old boys? let it slip that you have some porn lock away behind a password. Give them a C compiler and some articles about brute force techniques. They'll write something.
Or get them int FLL. You can probably get someone to sponsor for the Lego kit, and it gives them direct goals and all the tools.
I am a coach for the Lego Robotics at me kids grade school, so I may be biased about FLL.
The Kruger Dunning explains most post on
What's wrong with C? And what's wrong with the standard introductory book? ("The C Programming Language" by Dennis Ritchie and Brian Kernighan) http://en.wikipedia.org/wiki/The_C_Programming_Language_(book) It "has often been cited as a model for technical writing, due to the book's clear presentation and concise treatment". I'd hate to see them start off with "A function definition is like a teddy bear..." crap. Start them off on the right foot, and they'll be much better coders for it.
Anecdotally, research be damned. A fourth grader in an accelerated class was skipped ahead into my sixth grade accelerated class.
The results were predictably disastrous. He may have been smart but he was still two years younger than the other kids, and acted like it. At that age, two years is an eternity.
For teaching young students, python is the ideal language. http://python.org
1. It was designed to be easy to learn.
2. It's fun! Python's standard library even includes turtle graphics.
3. It's syntax allows you to write programs that eary to read and understand. Often they look like pseudocode used in textbooks.
4. Your students learn more, python offers a full complement of powerful language features: procedural, functional, classes/object-oriented features.
5. In addition to being a good language for learning about programming, python is also a practical language. It has a vast set of libraries for numerical computing, database interactions, graphics, graph manipulation, web applications, email, etc.
Google app engine uses python---so if they write the next great web 2.0 application (for 14-year olds?), they can deploy with ease and scale to a million hits per second.
# an example
from turtle import *
goto(0,0)
down()
color("blue")
for deg in range(24):
right(105)
forward(100)
for step in range(3):
right(90)
forward(100)
My kid is teaching himself by accident by hacking Warcraft and Oblivion maps.
Yeah, slashdot is all about damning research and relying on anecdotes. Any idea how many kids you've had over the years who were grade-skipped in the past but were so well-adjusted that you didn't even know it?
Warning: Apple/Nintendo fangirl. Likes her electronics cute & cuddly. May be rabid.
I recommend GNU Robots. It's a game/diversion where you construct a program for a little robot, then watch him explore a world. The world is filled with baddies that can hurt you, objects that you can bump into, and food that you can eat. The goal of the game is to collect as many prizes as possible before are killed by a baddie or you run out of energy.
The GNU Robots playing field is filled with food (increases energy), prizes (to increase your score), walls (which you can bump into), and baddies (which can inflict damage.)
The robot program is written in Scheme. Fairly simple for kids to pick up. Heck, I don't even know Scheme, and I wrote several successful robot programs. (I also wrote GNU Robots.)
Suffering an ignorance deficit?
"Smart" is less precise than "high ability," which can be easily modified to talk about "high intellectual ability," "high creative ability," "high spatial ability," "high verbal ability," etc when needed. I'm not just talking about teacher referring to kids in their classes here, I'm talking about a field of research and development that needs operationalized terms.
Warning: Apple/Nintendo fangirl. Likes her electronics cute & cuddly. May be rabid.
Except that, in the real world, it hasn't. As Googling the phrase "gifted and talented education" and perusing the results would demonstrate.
You know, your attempt to portray "the rest of us" as superior to the people actually in the field in question would be more successful if it wasn't entirely based on a completely false statement about the field being discussed.
How about Turing? Holt Softwareâ(TM)s Turing 4.1.1 IDE and compiler are available for download, âoefree of charge for personal, commercial, and educational useâ, from their website. When I played with Turing I was enlightened by the way my screen filled with colored lines and circles and whatnot, it felt very rewarding. Oh, and the syntax is hella easy.
One Word -> PYTHON
http://hacketyhack.net/
This is the best learning to program thing i have ever run across. Not only does it run through tutorials but your also editing and interacting, saving, loading, running, etc. all inside the same program.
Your students may have the key to beginner's programming right in their own kit-box.
For example, the TI-83 graphing calculator taught me a lot about simple program flow control. I was building math solvers and simple arcade games as far back as 8th grade.
World of Warcraft, anyone? My kids have learned more hacking and tweaking their WoW UI than any other computing endeavor. I even saw a book at Borders on how to program for WoW development.
Been there, done that.
But the question is, would it have been any different if you hadn't skipped the grade? In retrospect, I don't think so. Kids would still pick on you for "blowing the curve", etc. Most of them probably never knew you were younger than they were, and picked on you anyway.
Now being younger than everyone else in Jr. High school was just plain hideous; but Jr. High school is also hideous anyway.
And for me, at least, starting early got me off to college a year earlier, where the good folks at Undue Purversity put me in a classroom with 20 other kids who also tested out of 2 semesters of calculus, and I actually had to work and study to keep up.
- "History shows again and again how nature points out the folly of men" -- Blue Oyster Cult, 'Godzilla'
My first programming language was IBM 1620 machine code (not even assembly) in high school and I am forever grateful for it. Along with my electronics classes in high school, it left me understanding at least the basics of how things work under the hood, which I think many programmers never really grasp.
The 1620 instruction set is actually close to idea for this. It's decimal. Learning the "IDE" was easy - we punched instructions on punch cards, one instruction per card.
We quickly moved-on to Fortran II, but I think it's critical that we started with assembly.
Again, in college, they taught us Knuth's Mix assembly first, before moving on to PL/1.
Is this approach dead? I hope not.
I'd think kids would be fascinated with the concept of typing in what looks like random strings of numbers that can DO SOMETHING. Like a secret code. Kids are always fascinated with secret codes.
What about Excel VBA? All the data is transparent, there's some basic graphic output, it's easy to setup, and it's practically everywhere. Granted syntax and variable declarations are a bit loose, but kids can learn memory management in due time.
C is the ideal introductory programming language. It's very simple and the syntax is very consistent. Basic and pascal are clunky and have inconsistent syntax. K & R's "The C Programming Language" is a classic highly regarded for it's clarity and conciseness. It would make an excellent introductory book. And it would start the students off on the right foot.
I skipped a grade as well. I was a music nerd through all high school, but I'm not sure staying put would have helped. It's hard to tell. I do remember really hating being a year younger then everyone else, especially when the kids started driving. I probably would have been extra bored, but I was a good kid anyway, so I doubt I would have gotten into serious trouble.
I can tell you this: if I were to do it again, I would have rather skipped 12th grade and gone to college early. College was immediately fun and interesting, in a way high school never was. 12th grade was a boring waste anyway, even a year ahead.
I can explanate how to administrate your network. You must configurate and segmentate it, so it can computate.
Or a problem solver, or a computing scientists.
There are plenty of problems that can demonstrate to a young mind how to think like the machine, without the need of a "learner's language".
A good chunk of people who I've seen struggle at programming simply can't think like a programmer, and they would fail at any language that you give them.
Programming is a mind set, the language is just implementation detail.
"Ability" is not something that can be acquired, it is something that is inherent. Hands give a person the ability to grab things in a way that no person without hands has the ability to do.
"Gifted" is a very poor word because it carries with it a lot of baggage. It implies a giver, a god or parent. It implies an obligation to the giver, a lifetime servitude that can never be repaid.
"Ability" is the word used for someone with a promising future. "Gifted" is the word for a curiosity, a person with a burden, a person that can't make it without his "gift".
Contribute to civilization: ari.aynrand.org/donate
I've been teaching kids that age since 2002 in our summer camps and soon an online website. We see many gifted kids in our program and I have one myself. We use the Mindstorms, but for really teaching about programming we use GameMaker.
They can make games, which is something they want to do. They can learn about event programming, objects, loops, if statements and variables. And they don't need to type.
Then, when they are ready to go further, you can teach them the C-like language included with GameMaker (GMC, I believe) to expand their knowledge and teach them command line programming. And they can do all of this in the free version or they can pay $20 for the Pro version.
Languages aren't important in programming for this age, concepts are. If they understand the concepts, they can then learn the specifics of any language like C or Java. We have inspired many future programmers this way.
Tom Marx
Bits, Bytes & Bots
INTERCAL, naturally.
CORRECT SOURCE AND RESUBNIT
Seriously, though, I don't think the language matters so much as long as there are basic tools available to get started. Heck, even Excel could be a starting point to get a handle on building up equations and conditionals.
The main thing is to have some "getting started" type of documentation, maybe a couple of examples, and offer some encouragement to "see what you can make it do." At least, that's how I started. My folks didn't know a thing about computers. I had a manual that had examples and reference material, and I figured it out from there. The single greatest encouragement was "Don't worry, you can't break it just by typing at the keyboard." (Not quite so true today with viruses and malware and all, but still true of basic programming.)
Once you break the mindset of "the computer is an appliance", and start thinking in terms of "the computer is something I can shape and mold to do whatever I like", the rest flows from there. That's probably the most important part.
Program Intellivision!
I actually ended up having a really good senior year - probably the only particularly good one of my entire school. All of the best teachers teach upper class students in high school if at all possible. So it really does vary by individual situation. My senior year was hardest than my freshman year of college.
Microsoft Small Basic:
http://msdn.microsoft.com/en-us/devlabs/cc950524.aspx
and then, hopefully, your enthusiasm will rub off on them.
Open Source Drum Kit, LPLC deve board - mjhdesigns.com
Perl isn't for the beginner:
I like Perl, but I can't help but wonder if it won't make everyone but the budding geeks hate computer science. It's syntax full of subtle nuances; is difficult to debug; and allows such awful permutations of symbols that the average person is going to think of a computer as something ridiculously complicated and unapproachable.
The society for a thought-free internet welcomes you.
I'd really recommend using a variety (based on the amount of time you have to teach of course) of languages. I find the language I use at work changes with each project. I go through Java, C++, C#, Javascript and HTML, VBScript and InstallShield, etc.
I'd recommend presenting a problem, like picking words out of a string, then show a solution using a language, like Python to parse. Follow that up with a more open problem that builds on the solution. Then move on to a new problem and a new language. I think this approach would help with problem solving and thinking more than just a language. If you have time, present a final problem and let them choose a language.
I think another key to your success will be getting good environments set up for the students, so they don't have to waste days not doing the work. And make sure to show them debugging techniques.
Try to work in as much visual feedback as you can (go to C# and do Windows forms, find an easy graphics library for Python, pick one of the educational languages that does visual programming).
For problems, try some of the common stuff like parsing strings, some math functions like Fibonacci or plotting a curve, some user interface like having a form submission and parsing, and be sure to include some animation or basic game programming. You might look in a "cookbook" book for a chosen language for ideas of common problems. And try to give them something that they can take home at the end of the class to run and play with and expand on.
good luck.
I am 14 now, but I started programming at age 10, where I did QBasic. I would avoid QBasic a it teaches bad programming practice such as GOTO functions. I would teach python, or to the more able student c++ (or c# on a windows platform).
PHP + HTML. This way they learn about markup languages, and interpreted C style languages. The code to test cycle is very short, which allows them to play around and see what they are doing in a browser (which translates into real world value).
I rarely use PHP anymore, but it definitely got my attention when I was 14. That was about 10 years ago and I am still interested in software.
Algebra is required for complex manipulation of symbolic expressions.
Most programming is not complex manipulation of symbolic expressions.
What is refactoring if not the direct counterpart of algebra?
Qbasic would be an ok first choice just for showing how programming work, loops etc.. but it's applications today are limited. C is an excellent choice but many could be distracted by the tedium of includes and memory managment. PHP is syntactically similar to PHP and is very straight forward without all the "magic" of C/Java. I think PHP would be a good choice.
I was taught Visual Basic when I was around 12, and I liked it since it mixed code with GUI design... Nevertheless I never touched it again when I learned HTML, C, and other languages
Maybe it isn't something you can focus on for a whole course, but I messed around with TI89 programming at first. The biggest plus with it is that you can show your friends the results, and can even give them the programs. When you write a C or Java program, it typically exists solely as a learning exercise, and to make a product that is fun to share generally takes far too much experience to get such results in one course. TI basic doesn't require that you memorize syntax, as you pull all of the commands from menus.
My first programs were just animated text produced by long lists of print calls- with no real programming, I had something worth a laugh with my friends. I'm no CS major, so I've only taken two semesters of programming, but I've yet to even achieve that level of social appreciation with the programs I've spent countless hours on. Given a limited set of commands on the TI, instead of being flooded with Java's entire library of methods to muddle through, you can easily see all of your tools, and you are forced to creatively apply them. With no instruction, reading, or anything, I developed a rudimentary form of methods, classes and commenting to make a text-based RPG. Considering these students will have instruction, there is a lot of potential in the TI.
Recognizing that TI Basic is not something a young programmer should focus on, it may be worth just spending a week early in the course learning how to make TI programs, and then encourage them to apply what they learn in the rest of the class to make fun little TI programs so they can show their friends what they've learned to do. Heck, the most enthusiastic programmer I've known was a friend in high school that started a TI programming club and even used assembly to make very simple version of starcraft for the TI. Even if you don't go with TI programming, you need to give the students some form of creative outlet so they can appreciate programming as something that doesn't have to be viewed as work.
My webcomic
For children in that age range the Byte Brother books (A series along the lines of the Old Encyclopedia Brown books from the mid-80s) might actually be a good tool for such a class. The series follows a pair of brothers using Basic to solve various challenges in each book (from whether a train operator is lying to how many marbles are in a jar). In truth, you can solve the problems with just a calculator and some algebra, but the books show solving the problems in Basic. The first book in the series is "The Bytes Brothers Input an Investigation" and is apparently available on Amazon.
I started with python when i was 12. It's pretty straight forward and being built on c you can do a lot with it. You can teach your kids the basics of programing and then take them to more advanced stuff like gaming programing (pygame built on sdl), web programing(dejango), or full apps complete with gui's (wxpy). That is what I would start new students with. With that said C is a great language to learn. If you can learn C you can progress to almost any language and excel at it easily. C is probably one of the strictest languages i have used and forces you to learn good programing techniques, however it is harder to learn than python. Good Luck!
One of the best things about my high school programming classes was the competition between everyone, or at least those of us at the top of the class. So, I would certainly give them assignments and leave a lot of latitude on how to do it and challenge them to see who could best the others - in terms of features/functionality/coolness (to them)/etc - while still completing the assignment. It would be an automatic failure if they didn't complete the assignment, regardless of anything else; but perhaps get extra credit for what they compete on.
Hmm...may be even make your job a little easier by having the class evaluate everyone's programs - have them present the program, and everyone rates it, you judge the assignment against the assignment criteria, and everyone's input goes to who 'wins' and/or extra credit. (So they all become the judge of the 'coolness'/etc. factors.)
And you'll also help to give them better social skills for when they get out into the real world.
Also see another one of my posts on this topic.
Truth is like the sun. You can shut it out for a time, but it ain't goin' away. - Elvis Presley (source: imdb.com)
Ask Richard Buckland. If you're able to get through to him I think he'd have some great ideas for you, because this very subject is one of his greatest passions.
No thread on teaching programming to kids would be complete without a shout out to him. He has a freakish ability to make the most dry, technical, theoretical computer science topics highly entertaining, engaging and educational. I've been fortunate enough to see him in action a few times, the guy is a brilliantly talented teacher. There's a reason he's been given award after award for the quality of his teaching - he cares, and he's unbelievably good at it.
I was taught programming in Middle School (against my will, my mother made me take the class)
My teacher taught us in Visual Basic and taught us the basic building blocks to design and implement our own simple games.
A few years later he changed the class to using some game where you can program your own worlds to teach.
As an introduction to programming, it gave me a good foundation on difficult concepts for someone that age (functions aren't an easy concept when you don't know what programming is) and I enjoyed the class because we were making games.
I enjoyed it so much that I took all the computer classes my schools offered, then went to Virginia Tech and recently graduated as 1 of 5 women in Computer Science.
I always consider that class to be what gave me a goal in life. If it had been boring or too over my head I wouldn't have continued studying the subject, but because I had a taste for what *could* be done with programming languages, I wanted to keep working with it.
I hope that one day I can go back to school and learn how to teach so I can give back the same way that teacher gave to me!
I skipped a grade and don't have any friends, you insensitive clod!
This is so far down the list, it will probably be missed. I will say it anyway. I would suggest an interpreted language, such as MatLab. I have not used Octave, but it is free and mostly compatible with MatLab. You can easily set break points and watch the code as it executes. There is nothing that can be done in Basic that cannot be done in MatLab. Plus there is an extensive library of MatLab code available on Mathworks file exchange.
The cancel button is your friend. Do not hesitate to use it.
If they they still want to be a software engineer it maybe time for an intervention or mood altering drugs.
I think it's easier to learn a language by having things you want to talk about than by forced reading. You should pick a project, then a language that lends itself to the task. Something entertaining. Perhaps a video game? Something easy. Whack a mole?
You could take pictures of all the kids (Setup a web cam, form a line, and you've got ~25 jpegs of little faces at about the same size / resolution.) Make a 2 layer stage to create the illusion of coming out of a mole hole between the foreground and background layers. Assemble the script so that every few seconds a timer signals a function to pick a random hole, position a random kids face below it, and slide the image up and down. Add a script to position a hammer over the cursor. Add a mouse down script to change the image of a hammer to one striking. Add a mouse up script to increase the players scores and cue a sound effect if they hit someone.
I would suggest AS3 in Flex Builder.
Set aside a week...
http://www.adobe.com/devnet/flex/videotraining/
I kid not ... we had to write our programs in Hollerith code by marking cards in pencil. They were 40-column cards so there was a little more room, and a key to the code was printed on the cards in each column to make it, well, possible if not reasonable.
The idea was to get programs written offline and run by passing them through the optical card reader, lessening the demand on the handfull of terminals we had. (Maybe the teacher, who really was a good teacher, wanted to run the program himself sometimes to check the results?) In practice, we'd write and debug on the terminals, then transcribe a printout onto the cards to hand in. :-P
You were supposed to be learning concepts. Not syntax. I started with BASIC as well when I was 5 or so. I got a copy of a C compiler when I was about 12 and quickly gave up and went back to BASIC. By the time I was 18 I was ready for C++ and jumped right in. I've now worked with about a dozen languages. I translate between languages often. At every job I end up using at least 3 or four.
There's nothing I learned from BASIC that wasn't useful. You also have to be self motivated to make your code better.
If you're learning syntax when learning how to program then you're doing it wrong. If you ignore syntax and focus on learning concepts then it doesn't matter what language you use. Eventually the uglyness of BASIC will become apparent and you'll be happy to learn and embrace better ways of doing things.
In the mean time, kids are more interested in making games than pretty, easy to read code and BASIC is the easiest language to use to accomplish that goal.
Work Safe Porn
*ducks*
I know the folks here will hate it, but probably VB would be a good starter language. Its easy, fun, and an easy GUI and you can build pretty windows, and quickly make basic (heh no pun intended) windows programs.
I have done a large number of languages (probably not so many for this crowd) growing up and through university. Though I think I had that generational gap where all the stuff I learned was obsolete before I graduated. Not the theory of course. I grew up trying to get BASIC to run on a TRS80 (which sucked), or using tapes that never worked, in university, it was Pascal, which halfway through they switched standards to C (thx a bunch!, and later C++, did Assembly language which also sucked, but intriguing from a machine level perspective, also did the dead language (kinda) Cobol, which was surprisingly easy and interesting, and also did stints of various versions of VB, and a host of scripting languages. I never got into any of the Pearl or Python, or even Java which is too bad, but I have little use for now, so I can't be bothered to self learn it just for kicks. I did have a friend that basically taught himself Pearl over a weekend for a job.
Ideally, I think you would go from teaching a low generation language to a high one as they would get an appreciation of the complexity involved and how languages build on one another. However trying to teach a young one Base2 math, assembly, etc... might be a bit much.
VB is super easy (though not particularly powerful or efficient), fun, visual, and I know from personal experiance very useful later on just writing little scrips to automate little jobs in excel and access etc... also a bunch of big expensive software suites like those produced by ESRI (ArcMap, etc)... have dropped their proprietary scripting languages like Avenue (which I also learned... sigh)... and now use VB to do all their automation tasks (for good or ill). An edu copy is also cheap (or it was anyway).
Anyway that's my two cents. As a disclaimer, I obviously don't program much anymore as most of my languages seem to be antiquated now... however I still think VB would be the way to go initially.
When I was a third grader one of my teachers started to teach everyone in the grade various aspects of programing from Loops, Function Calls, Vectors, and other programming concepts with Logo. I am not sure if the language is still around, but I would say that it makes a great starting point, because it allows you to do some very simple things like draw a circle to extremely complex like write a program that will translate user input into Greek, was a lot of fun to do in 4th grade. I started creating my own basic games with Logo in 4th grade as well as used something called Lego TC Logo which allowed my class to write simple code that would move a car created with legos. What is funny is that I learned a lot of the procedural programming concepts that I use in my career now back when I was about 8 years old. I do know there are a few other young student friendly languages around, I just cannot think of what the names of the languages are.
Pew Pew
I would suggest Python. I have several years' experience of teaching computer programming to kids, and while it certainly is possible to use just any language for teaching, Python has three features that I see as essential for a good language for learners: The basic syntax is very straightforward and only a minimum of boilerplate code is required; There is an interactive execution environment so that expressions can be evaluated immediately; The language can be and is indeed used for serious "real world" programs.
Processing might be a good choice. It's a simplified Java dialect with a multimedia processing environment. It's really straight-forward, while allowing the more advanced kids to do amazing things, and they might enjoy the experience creating easy games or nice animations.
http://processing.org/
and by the way, some nice game demos from a Processing modding workshop:
http://www.trsp.net/teaching/gamemod/
its an open source compiler that will compile qbasic code and has support for advanced features like pointers and some OOP. also has a significant amount of c libraries ported to it. http://www.freebasic.net/ i program my games and graphics demos in freebasic. http://syn9.thingie.net/
Unfortunately, we are saddled with the term "gifted"
Who gives a fuck, except average people who are pissed because they aren't 'gifted' too?
You are really looking for 2 things:
1. How can I teach kids to start thinking about how to develop algorithms
2. What is a good programming language for beginners
The best solution I've found is Karel and pascal
Karels home page (with a C version of Karel shown) is here http://www.cs.mtsu.edu/~untch/karel/
The Pascal version is in the book. I think pascal is a better language for teaching good programming practices rather than C It's not that you can't in C but Pascal makes it easier to teach without having questions come up about idiosyncrasies about a program they may have found or other books they might have read about C.
I went to a high school that specialized in math, science and comp sci. We started on Pascal (and those of us who were more advanced, moved to C instead).
Python. I started programing with microsoft visual basic, and I got a lot of microsoft specific junk and I wasn't ever sure what I was doing. Then I did C++ when I was 11, and I actually learned what I was doing, but it was really hard. Python has easy syntax that is somewhat similar to C and stuff, and it has a ton of fun libraries like pygame that are very interusting and fun to work with.
I work for a gifted/enrichment department at elementary and middle schools, so I've taught programming to ten to thirteen year olds a few times. I've tried Logo, Scratch, Alice, MIPS, Java (via BlueJ), and now Processing. The best experiences I've had were using processing. Processing is great for this age group because 1.) you get visual feedback right away 2.) the processing language has stages; it begins declarative and becomes object oriented. I had one student who eventually ended up using the processing library in pure java. 3.) if you like, you can do relatively low-level stuff, such as bit-twiddling on images 4.) while it isn't as easy as Scratch to publish results and collaborate online, it's very close, because of the site "openprocessing.org" 5.) contrary to what you'd expect, a language that requires typing is easier for younger kids to manipulate than a language that requires you to mouse around a lot (Alice and Scratch). This year I used Daniel Shiffman's book "Learning Processing," and the kids really responded to it. I'd highly recommend it for teaching to this age group.
then python
I'm definitely in favor of introducing kids to programming via game-modding. Most of them play games, anyway, and showing them how to make their OWN games is even cooler. Making games was what first motivated me to learn to program, way back when I was a kid.
Lua is used by some games. Other games use python, or their own custom languages. I recommend checking around, and seeing what (youth-appropriate) games have good, active scripting scenes. An older game might be a good choice, both because you can get copies for cheap, and also because there might be a more extensive modding scene.
I don't know if you're still looking for advice, but when I started programming at age 12 I learned pascal. It taught me the appropriate structural concepts. As I have gone through college later in life that foundation has been an enormous help. Many of the people I work on school projects with don't understand structural programming, which makes it impossible to understand object oriented programming. Pascal also can introduce the basics of debugging and watches, both of which have stood me in good stead.
Hope that helps.
How is this http://phrogram.com/content//featurecomparison.aspx "free"?
As it comes from MS, it is not open and not portable either.
Bad choice.
I would suggest, Java for multiple reason.
1. It is free...so the kiddies can load it on their home computers.
2. It is well documented.
3. It is Object Oriented.
I'm a sparky by trade, so my intro to programming were always procedural, but before we started with any kind of IDE, we started on a whiteboard. It might be buying a can of soda from a machine. Start with the basic steps. Then introduce some conditional statements. Maybe some looping (for multiple cans) and finish with some error handling (machine is out of Fanta).
I like the way there are 50 different answers to a question like this. Just goes to show how different we all are.
But if it were me, for an adult it would be Python. For a child Alice or Scratch.
I came to this thread thinking to get some interesting ideas, but I think I'll offer some advice of my own, instead.
First of all, other than a lot of posters seem to think, I believe 11 to 14 year olds are probably developed enough to handle the same kind of languages that professionals use.
Secondly, I think it would be a bad idea to start them on an environment that you yourself don't know well. You want to be able to help them along and show them cool things that you've made, rather than go "Here's this thing for you to play with. I swear it's cool. Honest. But I myself won't touch it."
Thirdly, programming is not something you learn overnight, so it's important to keep learners motivated. I think one way to do that is to get them started on something that is easy to produce results with, and easy to get to something that looks like it could have been developed by a seasoned professional with.
So, without knowing what you yourself have expertise in (see the second point), what I would advise in general is: start with HTML. It's code. It's used by professionals. It's easy to learn. You can copy things you like from webpages. You can rapidly create something that looks solid, and you can rapidly get to the level that enables you to do so. Don't bother with IDEs or other tools: just a text editor to write the code in, and a browser (preferably a decent one) to view the results in. Add a few images and sprinkle in some CSS, and you can have a decent web page soon enough.
Of course, a web page by itself doesn't do anything. It's a nice way to communicate information or advertise oneself to the world (you can definitely impress your friends with it!), but we wanted programming, right? Well, the logical choice for that in the context of web pages is JavaScript. So teach them to make some nice interactive things: buttons that change the text color, a page that asks for a name to be entered and prints out a greeting with that name, maybe a tic-tac-toe game or something else that feels like an accomplishment, but isn't too much work. The most important thing here is: rewards must come quickly.
I've spent years and years just making web pages with JavaScript on them. Of course, all of that is browser side, so none of that actually had a lasting impact on the world. People thought it was impressive, I thought it was immensely cool, but, eventually, I did start to wonder how to do all the _other_ things that web sites do. That's where server-side programming comes in. When you submit an HTML form (or request a web page, for that matter), a request is made to the server. At a very fundamental level, the request is a bunch of parameters (key-value pairs and maybe some file data), and the server can do whatever the heck it wants with it. Nice servers send HTTP responses to clients, often including a page to be displayed by the browser. These pages can come from simple files, but they can also be generated by programs (CGI scripts). And that's where the fun starts. Because these programs can actually do anything you want. And you can write them in any language you want. And there are tons of libraries and frameworks that you can use to do so.
What I recommend, here, is keeping things simple. Start by picking a language, one that is simple to learn and doesn't come with a lot of unnecessary baggage. Use a language that is actually used out there. PHP, Perl, Python, and Ruby are probably good candidates. C and Java not so much - there are too many concepts involved in even a simple hello world program. Then start slowly. Don't introduce any frameworks. Just a program that outputs a simple HTML page (don't forget to output the headers, first, especially Content-Type). Then an HTML page that displays parameters that were submitted through a form. Then perhaps a simple game; a number or word guessing game or some such.
From there, the world is at your kids' feet. You can drag whatever you want into it: libraries that do interesting things, database access, perhaps an AJAX framework, the p
Please correct me if I got my facts wrong.
From my experience with kids especially in that age range, firstly whatever you do needs to be visual. If you can't get them to think it's cool, then you're sunk.
Also, while they're bright, don't pick a language like Java or something similiar. There's several keywords that have to go into every program and I feel that just hides what programming is all about. It clouds what each thing does. After all, hello world has public, static, void, main, class, String, System and an array. Pick something simple, also pick something you can code a GUI in without being a wizard. Preferably allowing for animation for non text based games and such. Pick something that keeps debugging simple. Python\ruby are pretty simple, but the lack of something that points out exactly where your syntax\semantic error is can be frustrating. On the flip side, they both offer an interactive interpreter which is really cool for trying things out as you think of them and seeing what the program is doing.
I'd suggest DrScheme (www.drscheme.org). I'm not affiliated with them in any way. It's designed for teaching, offers rich graphics functionality and thus "instant" gratification expected by today's kids.
use a PIC microcontroller. the nicest 8 bit microcontroller costs $4 and a programmer costs ~$40 (the software is free), have them wire up a circuit by example on a breadboard and then have buttons and switches correspond to leds(20mA sink/source, so don't need a output transistor). you could get to a point where you can run a dc motor in place of a led. teach them simple assembly and how to use it instead of a proprietary langauge they can't use at home with out a lot of money. Teach them something fun they don't have to be in front of a computer to play with. Assembly teaches good logic concepts that make every other language cake.
If you have to ask why are you teaching this class? Perhaps someone a little more up-to-date than Micro$oft basic would be better!!!!
http://scratch.mit.edu/
My 14-year-old son is taking C++ in high school now, and doing very well. I like C++ for the following reasons: 1) You can teach it as OO or structured 2) C++ compilers are free and easy to download 3) It is a real language, used in the industry for years. 4) There are a lot of good references and texts available. I DON'T like Ada and Pascal. I had to learn Pascal in college in the 1980's, and it is a dead end. I hated that language. It is not used in industry. Nothing like it is used in industry.
Do what you can do until you can figure out how to do what you can't do.
Absolutely, algorithms, logic, the thought process behind the programming is what you should be teaching. The language grammar is essential, of course, but minor.
Hell, give them perl and turn them loose :-)
Of course then you'll have to deal with perl's classic problem (?) of having a gazillion ways to do the same thing. BASIC and Pascal wouldn't be so bad about that.
None of your examples included regex, tch :-) Give us a _real_ taste of obfuscation (and a hint of the madness therein).
I started out at a young age with BASIC, which taught me nothing about actual programming. Functions? Return values? Closures? Memory management? Nope. A few years later, in my pre-teens, I moved onto C. This is what actually got me into programming. A solid language, a useful language, and a language that teaches one to appreciate what the machine is actually doing, though not quite as much so as ASM. Now that C had taught me the fundamentals, I went on to learn Java, Perl, and Scheme, among others. Though these may also be good introductory languages, every programmer will have to deal with a pointer at some point or another.
then start at least with C right away, programming logic is the same in all languages : conditions, iterations, jumps, values ... from basic to asm, C put's them close enough to machine level to learn something about the hardware while they're at it, time is money my friend, use it wisely
beware he who denies you access to information for in his mind, he already deems himself to be your master (SMAC-ish)
I enjoyed problem solving in general. One of my favorites is still Towers of Hanoi. Mostly because it seems really hard to find the algorithm until you understand recursion. Then you get something really eloquent.
I also recommend teaching in Scala for reasons that should be obvious.