<p>If your kids are into making things they can see or hear, why not give <strong><em><a href="http://sonic-pi.net/" rel="nofollow noreferrer">SonicPi</a></em></strong> a try?</p>

<p>It will give immediate audible results and teach a fresh beginner the basics of assigning variables, looping, writing functions to group like events/actions, and teach a general sense of sequence (this before that) as well as simple troubleshooting (it doesn't sound right, but where is the mistake?)</p>

<p>One of the things that I did as part of an undergrad research (that unfortunately didn't get very far due to time) was to gather information on how to create a curriculum that would bridge the gap between computer science and music, as part of a joint collaborative of both departments at my university. Things I found while looking into Sonic Pi is that it is actually a very good "first" language and a good environment to break into the shell of programmable music.  It is also a good way, likewise, for a programmer to learn a bit about music and how it all works.</p>

<p>Much of today's music is synthesized, and is in a standard popular song format, meaning that there are sections that loop. If the end result is to create a standard 3-minute length song, for example, things that need to be learned first are a few key things about music theory (which, for the basis of "song-making" and not necessarily serious composition, are fairly simple and can be picked up along the way), but as for the technical/programming side of things, a newcomer would also have to pick up a few essential skills.</p>

<p>Day one would be preparing the environment. Installing the OS and the packages required to run the environment on which it runs.</p>

<p>Day two would be the first few standard expressions. Subsequently, learning about MIDI inputs and what each number represents (pitch, velocity, etc.). You assign an instrument to a variable and call the variable when you want to output the sound.</p>

<p>From then on begin the real fireworks. Programming variable instruments to play on a timebase. Looping sections of timed variable instruments (standard loops, such as do-while) to create riffs.</p>

<p>After that, creating functions that will group a section of riffs to make an audible passage. Passing parameters onto these functions to apply effects, volume/loudness, etc. Learning about constructors, getters and setters. Working with libraries (such as randomizers).</p>

<p>The end result is something that's engaging, fun to play with and discover, and imparts an essential understanding of underlying concepts, so that when they jump into a formal language, much of the foundation is already there and the daunt of the challenge of learning something that might as well be "in another language" is lessened.</p>

CC BY-SA 3.0
2018-01-26T22:14:23.707Z
2018-01-30T14:45:26.953Z
2018-01-30T14:45:26.953Z
psosuna
<p>Another possibility (if you have the money) would be something like Lego Mindstorms.</p>

<p>The advantage is:</p>

<ol>
<li>Unlike straight Python, your program actually "does" something. You can make your robot throw objects into a basket, or follow a line (self-driving car), or respond to light sensors.</li>
<li>You can start with a GUI programming language (<a href="https://en.wikipedia.org/wiki/Lego_Mindstorms_NXT#Programming" rel="nofollow noreferrer">NXT-g</a>) and when they get the basics, move them to a "real" language (such as C, Java, or even <a href="https://code.google.com/archive/p/pynxc/" rel="nofollow noreferrer">Python</a>).</li>
</ol>

<p>You can probably do much of the same with a Raspberry Pi, but you'll have to take care of the wiring, motors, and sensors yourself. You may also not find a good block programming language for the RasPi.</p>

CC BY-SA 3.0
2018-01-22T01:44:35.213Z
2018-01-22T01:44:35.213Z
cse
<p>Anything object oriented I would say. Such as java, C#, or Alice!. The reason is the high level concepts are hard to grasp such as threading, loopers, and ect. For example in Java create a object class called animal what can an animal do? eat and sleep, fight ect. Then grow it from there. Once you establish real world applications for the kids concepts such as inheritance(ex. lion inherits from animal because a lion is an animal) and polymorphism(ex. not all animals have the same growl such as a cow says mooo and an lion says rooaar, so like have a method called growl they have to override) are easy to grasp.</p>

CC BY-SA 3.0
2018-01-26T20:37:12.150Z
Unfortunately this view of OO needs work. If Animal is abstract or an interface then ok. But the sound an animal makes is not a good use of polymorphism (by inheritance anyway). Better it is a good use of programming by composition, which OO also supports in fantastic ways. An animal _has a_ sound which is another object type. You can find better descriptions of OO and polymorphism given in many answers on this site. Have a look around. (Note that I've taught OO since about 1985)
Buffy
CC BY-SA 3.0
2018-01-26T20:26:44.170Z
2018-01-26T20:26:44.170Z
Singleton
<h2>Tl;dr: use python. (Preferably python 3.)</h2>
<p>Well, I’m a teenager in your age group, so hopefully I’m some level of qualified to respond.</p>
<p>I have to say as a bit of a disclaimer that python is my favorite language but it is in that position for a reason. Scratch is, for me, annoying to write because I can touch type so python is just faster. Further, I actually have always found scratch a bit non intuitive while on the other hand I have always found python incredibly intuitive but also very powerful - it grows in capability along with you.</p>
<p>When I first started programming I used khan academy’s introduction to JavaScript, and then at some point I transitioned to python and have used it since. I have never felt either overwhelmed by or limited by python. My next thought would be that as 14/15 year olds, you’re going to have kids with a wider range of abilities and python can handle that better than scratch.</p>
<p>There are as has been mentioned many resources for teaching python out there. I’d recommend codecademy for learning and repl.it for personal projects - they can then access their work when the camp is over and it provides autocomplete and other useful features. Another thought - since python has so many packages, maybe let them split up by what they are interested in? Python can do websites, games, scientific programming (math fans can work on the Euler problems), or mod Minecraft. (Scratch, I might point out, is limited to games.)</p>
<p>Hope this helps, and I’d be glad to talk with you more about resources, etc.</p>

CC BY-SA 3.0
2018-01-22T12:53:24.780Z
Thanks for sharing your experience. Would you mind sharing as well how old you were when you started learning programming, and if it was completely self-taught?
diaa
CC BY-SA 3.0
2018-01-24T21:11:37.333Z
@diaa to be quite honest, I'm not sure at what age exactly I started - especially because, when I did start, it was pretty on and off. I guess I probably started programming more seriously at...12? 13? but I've been programming since at least several years before that. I used Khan Academy alone to teach myself when I started out, and then used codecademy to switch to python (and a little later found out about stack exchange/stack overflow, which was super helpful). So - if that counts as self-taught, yes? I never took a class to teach me.
auden
CC BY-SA 3.0
2018-01-21T19:03:19.380Z
2018-01-24T21:09:41.660Z
2020-06-18T08:36:57.023Z
auden
<p>I highly recommend checking out a language called <a href="https://processing.org/" rel="noreferrer">Processing</a>. Processing is designed for novices, and makes it easy to create visual and interactive programs without a ton of boilerplate.</p>

<p>Here's an example Processing sketch:</p>

<pre><code>void draw() {
  ellipse(mouseX, mouseY, 25, 25);
}
</code></pre>

<p>This is a full program that draws a circle wherever the mouse is, 60 times per second.</p>

<p><img src="https://i.sstatic.net/AMsW6.gif" alt="circle trail"></p>

<p>Related:</p>

<ul>
<li><a href="https://cseducators.stackexchange.com/q/19/2068">Using Processing as an entry point in an Introductory Course</a></li>
<li><a href="https://cseducators.stackexchange.com/a/173/2068">Programming languages specifically designed for beginners</a></li>
<li><a href="https://cseducators.stackexchange.com/a/2924/2068">The order of subjects in beginner's curriculum</a></li>
<li><a href="https://cseducators.stackexchange.com/a/2798/2068">Order to Teach Topics in an Intro Programming Class</a></li>
<li><a href="https://cseducators.stackexchange.com/a/3904/2068">Make it easier, and quicker to get to the start</a></li>
</ul>

<p>Shameless self-promotion: I wrote a series of tutorials for Processing available <a href="http://happycoding.io" rel="noreferrer">here</a>. I'd love to talk more about using these in a curriculum.</p>

CC BY-SA 3.0
2018-01-24T21:04:20.620Z
Processing is Java based. If that puts a knot in your stomach, the Processing Foundation has extended their library to work with Python and Javascript.
Soupy
CC BY-SA 3.0
2018-01-27T15:05:25.230Z
I'm happy to see Processing mentioned here. I teach students in the same age range as OP's, and I this year I had to replace a teacher that had been using Pascal as an introductory language, which the students hated. I finished the main topics in Pascal and used Processing as a pain reliever.

I'm planning on using Processing (python) as the introductory language this year, and the links you shared are going to help me decide and convince my partners.
AntonioJunior
CC BY-SA 3.0
2018-01-30T14:46:08.327Z
@AntonioJunior  and Kevin Workman I've created [a Stack Exchange chat room](http://chat.stackexchange.com/rooms/72445/discussion-on-answer-by-kevin-workman-programming-language-for-teenagers), in case y'all want to move over there. All the existing comments have been migrated over there, so I've deleted them.
thesecretmaster
CC BY-SA 3.0
2018-01-17T19:12:44.267Z
2018-01-17T20:19:16.110Z
2018-01-17T20:19:16.110Z
Kevin Workman
<p>Here's an unlikely answer: <strong>Teach them C.</strong></p>

<p>You're correct, Scratch will be a turn-off to an average 14 year old.</p>

<p>Mid-teens dislike things that seem fake and/or useless, and have a strong aversions to things seemingly geared toward younger children.</p>

<p>Python is probably an OK option... but I believe Python is a little too high level, using concepts that may seem very abstract to a beginner.
A small line of python can contain a lot of abstract concepts that aren't easily met by the early-teen brain.</p>

<p>Don't get me wrong, I love Python.<br>
But I already know what a pointer is, I know what variables are, arrays, classes, etc.<br>
If I did not, I would appreciate a language that didn't gloss over <em>everything</em>.</p>

<p>When teaching fundamentals, the number of lines of code is secondary to the ability to understand and illustrate concepts core to your curriculum.</p>

<p><strong>C is one of the most fundamental languages, and learning C will give you a solid understanding of the basics.</strong></p>

<p>I prefer to begin with something real, but simple. Not simple in the sense that we are constructing programs with colorful shapes, stacks of cards, or a friendly caterpillar, but simple in the sense that on the surface we have 32 keywords, and everything is built on that.</p>

<p>When teaching a young teen, here are some key factors I found helpful:
1. Teach them something that is real, clearly not just a toy.<br>
2. Keep concepts granular.<br>
3. Allow them to stretch and delve deeper than the standard lesson (often giving a student the ability to leap a distance ahead will keep them engaged while other students maintain standard progress)<br>
4. Give them a simple, light-weight, environment to work in. Easy to set up, and easy to get going.<br>
<br>
Back in the stone age, when I was learning programming. I took my floppy disk with QBasic everywhere I went. Portability was a big reason I stayed plugged in. QBasic allowed me to get going quickly, learning at a pace that my appetite set.</p>

<p>Today, I would recommend something like <a href="http://www.codeblocks.org/" rel="nofollow noreferrer">Code::Blocks</a>. Lightweight, easy to get started and installed, and you can start with C.<br>
Don't want to install anything? Try <a href="http://www.learn-c.org/" rel="nofollow noreferrer">Learn-C.org</a>.<br></p>

<p>C is a great language to start learning with.<br>
You can begin with simple concepts, simple operators, simple variables, types.<br>
Then dive into arrays, and you'll quickly find that the topic of arrays is a big concept for a 14 year old mind.<br>
Loops and functions, function recursion, etc.<br></p>

<p>C is an excellent first language for teens, and perfect for an introductory programming course.</p>

CC BY-SA 3.0
2018-01-22T22:34:49.093Z
And then you can show them all the footguns, giving them an appreciation for memory-safe languages!!
cse
CC BY-SA 3.0
2018-01-22T23:19:59.983Z
But don't you agree that C usually requires higher overhead from the programmer to produce something interesting compared the Python? I think teens like to see the fruit of the efforts quickly. Even as an adult who used C for years, I wouldn't consider solving a problem in C over python unless the performance was an issue.
diaa
CC BY-SA 3.0
2018-01-23T02:26:33.033Z
@diaa Of course C usually requires higher overhead to produce something interesting, but this is a beginners programming course for teens. The concept of arrays and pointers are complicated for teens. C is a great teaching tool for learning programming. It's the same as when teaching basic math, the concept of "showing your work" rather than jumping straight to an answer. C is showing your work, Python is jumping to the answer.
Gorchestopher H
CC BY-SA 3.0
2018-02-23T00:13:34.770Z
I think maybe it's time for __me__ to learn __C__. Even if I don't move from there to __C++__. Good answer and good resources.
Gypsy Spellweaver
CC BY-SA 4.0
2019-08-27T06:19:11.987Z
Forgive me, but you should check out modern C++ it has proved over and over again to be the best first language and unlike many misunderstandings it is not an object-oriented language only to explain why let's say that modern cplusplus does not use pointers anymore which is the greatest complaints about teaching C for beginners yet it keeps the understanding of how the machine works there are many papers published about the advantage of using C plus plus as a first language
Elkady
CC BY-SA 4.0
2019-08-27T18:37:09.900Z
@Elkady I'm not sure if you're making a joke. Pointers have not been removed from "modern C++". No one thinks C++ is object oriented. In a beginners course, there should be negligible differences between C and C++.
Gorchestopher H
CC BY-SA 4.0
2019-09-17T01:56:54.263Z
@Gorchestopher H I will say again then that you should check out modern C++. I did not say pointers were removed, I said they are no longer used. C++ is a general language and thus it keeps all the options including C-like syntax but it provides modern ways for programming. For example, you under normal circumstances, how would you justify using C-stings instead of modern string class? or still building & using using linked-lists instead of a vector (which by the way if far more efficient) ...etc.   Modern C++ code look a good deal like Javascript or even Java code. No pointers whatsoever.
Elkady
CC BY-SA 4.0
2019-09-17T02:05:52.560Z
to clarify: when I say "normal circumstances" I refer to a problem that you  can code without pointers whichever other high-level language you choose yet you would use pointers in C++. this no longer exist.
Elkady
CC BY-SA 4.0
2019-11-06T14:38:11.767Z
@Elkady To clarify myself, at the entry level I'm not opposed to teaching C++ or old-school C to essentially the same effect. Pointers are very handy for teaching the concept of "reference vs value". Even if they're not used, or not recommended to be used, it's a great teaching tool.
Gorchestopher H
CC BY-SA 4.0
2019-11-07T16:39:11.147Z
I understand, But this is no more in modern C++. We use references instead.  The beauty of it is that you don't have to change the function call if you switched your function from pass-by-value to pass-by-reference.  And there is no more "loosing your address".
Elkady
CC BY-SA 4.0
2019-11-07T16:39:37.013Z
Example: I can write my function as :
Elkady
CC BY-SA 4.0
2019-11-07T16:42:05.800Z
Void myfunc (int param). //pass by value.  Or.  Void myfunc (int &param) // pass by reference.  In bother cases the function is called using an int variable. The the parameter param is used inside the function as an int not a pointer
Elkady
CC BY-SA 4.0
2019-11-07T16:45:51.483Z
Finally in modern programming, even if we want to use pointers we should use "smart pointers" not the old c style pointers. Smart pointers ensure there we don't get memory leaks
Elkady
CC BY-SA 3.0
2018-01-22T22:28:10.247Z
2018-01-30T12:40:35.260Z
2018-01-30T12:40:35.260Z
Gorchestopher H
<p>I think it largely depends on the kids. If you are proficient in both you might even want to give them a choice (as a class, not individually). Show them a bit of each in the first session and let them discuss the options. It might make them more connected to the course, in fact. </p>

<p>Either is appropriate in general, but the background of the students might also be relevant. Is it a random selection or self-selected interested kids or a captive audience? Knowing that might push you toward the more or less "sophisticated" option. </p>

<p>Even Java with a tool like Greenfoot might work for you since it is very visual and has quite a lot of support through greenroom.greenfoot.org. The greenfoot folks are working on a scratch-like environment at this time, but its introduction may be a ways off. It does, however, include a language simpler than Java (Stride) with nearly the capabilities of Java (and translations between it and the full language). </p>

<p>Note that there are quite a number of books for teaching Python to kids. A search at Amazon, for "Python for Kids" will turn up several, including a book with that title. I don't find that particular book especially inspiring, however. </p>

<p>If you choose Python, I'd suggest also finding a suitable environment (i.e. something richer than <em>idle</em>) to provide support, with code management, code completion and the like. Scratch will provide much of that, but you might not want to have the choice Scratch v. "Naked Python". </p>

CC BY-SA 3.0
2018-01-17T14:03:59.013Z
I am familiar with both languages. However, giving the kids a choice might not be the best idea because I don't think they have a good tech background besides the smartphone-using experience. I updated the question with more details about that.
diaa
CC BY-SA 3.0
2018-01-17T14:06:27.070Z
Actually, their choice needn't be strictly rational. If you were to see brighter faces for one and scornful looks for the other it might sway your choice. You want them excited, not just accepting.
Buffy
CC BY-SA 3.0
2018-01-17T14:22:56.297Z
Actually, even for Python I would base my course on this Coursera course from Rice University: https://www.coursera.org/learn/interactive-python-1
They make a simple game in every lesson. So I'm not completely dismissing the idea.
diaa
CC BY-SA 3.0
2018-01-17T13:08:40.537Z
2018-01-17T13:08:40.537Z
Buffy
<p>I have been asked to give an introductory programming course for kids between 14-15 years old. Scratch seems like a good option for young children, maybe up to 12 years old. Python, is also a good language for beginners.</p>

<p>I need help from educators to choose between the two options for the mentioned age group. I'm afraid that Scratch might be too childish for them, while Python might be too complicated.</p>

<p><strong>Update</strong></p>

<p>Basically, the course will meet once a week. However, I have relative liberty in deciding how long the session is and how many weeks the course will be. Actually feedback in this regard is also appreciated. I want the session to be long enough to be productive, but not boring long. My initial thought is meeting for 1.5 hours each week for 6 weeks, and then deciding whether follow up course is a good idea.</p>

<p>I can't say much about the background of the kids. This is part of an extra-curricular school that meets every weekend, and I volunteered to give a programming course to the children to make them more interested in technology.</p>

<p><strong>Update2</strong></p>

<p>The age range was a bit different from expected. The kids were between 10-15 years old.</p>

<p>I started the course with Python and used <code>Turtle</code> library to have a visual output. The kids had some progress, but I felt it was slow and it was a bit hard for some of them to grasp some basic concepts.</p>

<p>After five or six weeks, I decided to switch to Scratch. The progress rate improved significantly. However, a few of the kids who were good with Python complained that Scratch is a language for little children that you can't do 'real' things with. It's definitely hard to please everyone.</p>

CC BY-SA 3.0
2018-01-17T12:57:08.510Z
Welcome to [cseducators.se]!  You've come to the right place :) Can you give a few more details?  How often will the course meet?  Are there any additional goals beyond "introductory programming"?
Ben I.
CC BY-SA 3.0
2018-01-17T13:58:58.630Z
Thanks Ben :)
I updated the post with more information
diaa
CC BY-SA 3.0
2018-01-17T14:55:10.503Z
For refrence, we've [already discussed the issue of how some kids will see block-based programming as "not real programming"](https://cseducators.stackexchange.com/q/860/58)
thesecretmaster
CC BY-SA 3.0
2018-01-23T03:11:29.813Z
Python is used for AI and machine learning research, and I have interfaced with enterprise systems written in python. It is not to be laughed at.
pojo-guy
CC BY-SA 4.0
2019-02-12T01:10:06.653Z
Commenting on update 2. That is expected as the kids were in different stages of development 10-15 crosses the boundary a bit. If you do it again, you could try to split the group at around 12, but give each kid the option of the Scratch group or the Python group. You can be a bit deeper with the latter. But you can do "real" things in Scratch, actually.
Buffy
CC BY-SA 4.0
2019-02-13T22:46:43.133Z
@Buffy Thanks for your suggestion. I actually managed to get enough funding to start a robotics course for the same age group using Lego Mindstorm. I'll make sure to post an update on how that goes.
diaa
<language-choice><scratch>
Programming language for teenagers
# Programming language for teenagers

(Asked by: username_0 on 2018-01-17)

I have been asked to give an introductory programming course for kids between 14-15 years old. Scratch seems like a good option for young children, maybe up to 12 years old. Python, is also a good language for beginners.

I need help from educators to choose between the two options for the mentioned age group. I'm afraid that Scratch might be too childish for them, while Python might be too complicated.

**Update**

Basically, the course will meet once a week. However, I have relative liberty in deciding how long the session is and how many weeks the course will be. Actually feedback in this regard is also appreciated. I want the session to be long enough to be productive, but not boring long. My initial thought is meeting for 1.5 hours each week for 6 weeks, and then deciding whether follow up course is a good idea.

I can't say much about the background of the kids. This is part of an extra-curricular school that meets every weekend, and I volunteered to give a programming course to the children to make them more interested in technology.

**Update2**

The age range was a bit different from expected. The kids were between 10-15 years old.

I started the course with Python and used `Turtle` library to have a visual output. The kids had some progress, but I felt it was slow and it was a bit hard for some of them to grasp some basic concepts.

After five or six weeks, I decided to switch to Scratch. The progress rate improved significantly. However, a few of the kids who were good with Python complained that Scratch is a language for little children that you can't do 'real' things with. It's definitely hard to please everyone.

**Tags:** language-choice, scratch

> **Comments:**
> **username_1**: Welcome to [username_6ducators.se]!  You've come to the right place :) Can you give a few more details?  How often will the course meet?  Are there any additional goals beyond "introductory programming"?  
> **username_0**: Thanks Ben :) I updated the post with more information  
> **username_2**: For refrence, we've [already discussed the issue of how some kids will see block-based programming as "not real programming"](https://username_6ducators.stackexchange.com/q/860/58)  
> **username_3**: Python is used for AI and machine learning research, and I have interfaced with enterprise systems written in python. It is not to be laughed at.  
> **username_4**: Commenting on update 2. That is expected as the kids were in different stages of development 10-15 crosses the boundary a bit. If you do it again, you could try to split the group at around 12, but give each kid the option of the Scratch group or the Python group. You can be a bit deeper with the latter. But you can do "real" things in Scratch, actually.  
> **username_0**: @username_4 Thanks for your suggestion. I actually managed to get enough funding to start a robotics course for the same age group using Lego Mindstorm. I'll make sure to post an update on how that goes.  

---

## 7 answers

### Answer by username_9 on 2018-01-17. Score: 12

I highly recommend checking out a language called Processing. Processing is designed for novices, and makes it easy to create visual and interactive programs without a ton of boilerplate.
Here's an example Processing sketch:
void draw() {
  ellipse(mouseX, mouseY, 25, 25);
}

This is a full program that draws a circle wherever the mouse is, 60 times per second.

Related:

Using Processing as an entry point in an Introductory Course
Programming languages specifically designed for beginners
The order of subjects in beginner's curriculum
Order to Teach Topics in an Intro Programming Class
Make it easier, and quicker to get to the start

Shameless self-promotion: I wrote a series of tutorials for Processing available here. I'd love to talk more about using these in a curriculum.

> **Comments:**
> **username_10**: Processing is Java based. If that puts a knot in your stomach, the Processing Foundation has extended their library to work with Python and Javascript.  
> **username_11**: I'm happy to see Processing mentioned here. I teach students in the same age range as OP's, and I this year I had to replace a teacher that had been using Pascal as an introductory language, which the students hated. I finished the main topics in Pascal and used Processing as a pain reliever.  I'm planning on using Processing (python) as the introductory language this year, and the links you shared are going to help me decide and convince my partners.  
> **username_2**: @username_11  and username_9 I've created [a Stack Exchange chat room](http://chat.stackexchange.com/rooms/72445/discussion-on-answer-by-kevin-workman-programming-language-for-teenagers), in case y'all want to move over there. All the existing comments have been migrated over there, so I've deleted them.  

---

### Answer by username_8 on 2018-01-21. Score: 9

## Tl;dr: use python. (Preferably python 3.)

Well, I’m a teenager in your age group, so hopefully I’m some level of qualified to respond.

I have to say as a bit of a disclaimer that python is my favorite language but it is in that position for a reason. Scratch is, for me, annoying to write because I can touch type so python is just faster. Further, I actually have always found scratch a bit non intuitive while on the other hand I have always found python incredibly intuitive but also very powerful - it grows in capability along with you.

When I first started programming I used khan academy’s introduction to JavaScript, and then at some point I transitioned to python and have used it since. I have never felt either overwhelmed by or limited by python. My next thought would be that as 14/15 year olds, you’re going to have kids with a wider range of abilities and python can handle that better than scratch.

There are as has been mentioned many resources for teaching python out there. I’d recommend codecademy for learning and repl.it for personal projects - they can then access their work when the camp is over and it provides autocomplete and other useful features. Another thought - since python has so many packages, maybe let them split up by what they are interested in? Python can do websites, games, scientific programming (math fans can work on the Euler problems), or mod Minecraft. (Scratch, I might point out, is limited to games.)

Hope this helps, and I’d be glad to talk with you more about resources, etc.

> **Comments:**
> **username_0**: Thanks for sharing your experience. Would you mind sharing as well how old you were when you started learning programming, and if it was completely self-taught?  
> **username_8**: @username_0 to be quite honest, I'm not sure at what age exactly I started - especially because, when I did start, it was pretty on and off. I guess I probably started programming more seriously at...12? 13? but I've been programming since at least several years before that. I used Khan Academy alone to teach myself when I started out, and then used codecademy to switch to python (and a little later found out about stack exchange/stack overflow, which was super helpful). So - if that counts as self-taught, yes? I never took a class to teach me.  

---

### Answer by username_12 on 2018-01-22. Score: 4

Here's an unlikely answer: **Teach them C.**

You're correct, Scratch will be a turn-off to an average 14 year old.

Mid-teens dislike things that seem fake and/or useless, and have a strong aversions to things seemingly geared toward younger children.

Python is probably an OK option... but I believe Python is a little too high level, using concepts that may seem very abstract to a beginner.
A small line of python can contain a lot of abstract concepts that aren't easily met by the early-teen brain.

Don't get me wrong, I love Python.  
But I already know what a pointer is, I know what variables are, arrays, classes, etc.  
If I did not, I would appreciate a language that didn't gloss over *everything*.

When teaching fundamentals, the number of lines of code is secondary to the ability to understand and illustrate concepts core to your curriculum.

**C is one of the most fundamental languages, and learning C will give you a solid understanding of the basics.**

I prefer to begin with something real, but simple. Not simple in the sense that we are constructing programs with colorful shapes, stacks of cards, or a friendly caterpillar, but simple in the sense that on the surface we have 32 keywords, and everything is built on that.

When teaching a young teen, here are some key factors I found helpful:
1. Teach them something that is real, clearly not just a toy.  
2. Keep concepts granular.  
3. Allow them to stretch and delve deeper than the standard lesson (often giving a student the ability to leap a distance ahead will keep them engaged while other students maintain standard progress)  
4. Give them a simple, light-weight, environment to work in. Easy to set up, and easy to get going.  
  
Back in the stone age, when I was learning programming. I took my floppy disk with QBasic everywhere I went. Portability was a big reason I stayed plugged in. QBasic allowed me to get going quickly, learning at a pace that my appetite set.

Today, I would recommend something like [Code::Blocks](http://www.codeblocks.org/). Lightweight, easy to get started and installed, and you can start with C.  
Don't want to install anything? Try [Learn-C.org](http://www.learn-c.org/).

C is a great language to start learning with.  
You can begin with simple concepts, simple operators, simple variables, types.  
Then dive into arrays, and you'll quickly find that the topic of arrays is a big concept for a 14 year old mind.  
Loops and functions, function recursion, etc.

C is an excellent first language for teens, and perfect for an introductory programming course.

> **Comments:**
> **username_6**: And then you can show them all the footguns, giving them an appreciation for memory-safe languages!!  
> **username_0**: But don't you agree that C usually requires higher overhead from the programmer to produce something interesting compared the Python? I think teens like to see the fruit of the efforts quickly. Even as an adult who used C for years, I wouldn't consider solving a problem in C over python unless the performance was an issue.  
> **username_12**: @username_0 Of course C usually requires higher overhead to produce something interesting, but this is a beginners programming course for teens. The concept of arrays and pointers are complicated for teens. C is a great teaching tool for learning programming. It's the same as when teaching basic math, the concept of "showing your work" rather than jumping straight to an answer. C is showing your work, Python is jumping to the answer.  
> **username_13**: I think maybe it's time for __me__ to learn __C__. Even if I don't move from there to __C++__. Good answer and good resources.  
> **username_14**: Forgive me, but you should check out modern C++ it has proved over and over again to be the best first language and unlike many misunderstandings it is not an object-oriented language only to explain why let's say that modern cplusplus does not use pointers anymore which is the greatest complaints about teaching C for beginners yet it keeps the understanding of how the machine works there are many papers published about the advantage of using C plus plus as a first language  
> **username_12**: @username_14 I'm not sure if you're making a joke. Pointers have not been removed from "modern C++". No one thinks C++ is object oriented. In a beginners course, there should be negligible differences between C and C++.  
> **username_14**: @username_12 I will say again then that you should check out modern C++. I did not say pointers were removed, I said they are no longer used. C++ is a general language and thus it keeps all the options including C-like syntax but it provides modern ways for programming. For example, you under normal circumstances, how would you justify using C-stings instead of modern string class? or still building & using using linked-lists instead of a vector (which by the way if far more efficient) ...etc.   Modern C++ code look a good deal like Javascript or even Java code. No pointers whatsoever.  
> **username_14**: to clarify: when I say "normal circumstances" I refer to a problem that you  can code without pointers whichever other high-level language you choose yet you would use pointers in C++. this no longer exist.  
> **username_12**: @username_14 To clarify myself, at the entry level I'm not opposed to teaching C++ or old-school C to essentially the same effect. Pointers are very handy for teaching the concept of "reference vs value". Even if they're not used, or not recommended to be used, it's a great teaching tool.  
> **username_14**: I understand, But this is no more in modern C++. We use references instead.  The beauty of it is that you don't have to change the function call if you switched your function from pass-by-value to pass-by-reference.  And there is no more "loosing your address".  
> **username_14**: Example: I can write my function as :  
> **username_14**: Void myfunc (int param). //pass by value.  Or.  Void myfunc (int &param) // pass by reference.  In bother cases the function is called using an int variable. The the parameter param is used inside the function as an int not a pointer  
> **username_14**: Finally in modern programming, even if we want to use pointers we should use "smart pointers" not the old c style pointers. Smart pointers ensure there we don't get memory leaks  

---

### Answer by username_4 on 2018-01-17. Score: 3

I think it largely depends on the kids. If you are proficient in both you might even want to give them a choice (as a class, not individually). Show them a bit of each in the first session and let them discuss the options. It might make them more connected to the course, in fact.

Either is appropriate in general, but the background of the students might also be relevant. Is it a random selection or self-selected interested kids or a captive audience? Knowing that might push you toward the more or less "sophisticated" option.

Even Java with a tool like Greenfoot might work for you since it is very visual and has quite a lot of support through greenroom.greenfoot.org. The greenfoot folks are working on a scratch-like environment at this time, but its introduction may be a ways off. It does, however, include a language simpler than Java (Stride) with nearly the capabilities of Java (and translations between it and the full language).

Note that there are quite a number of books for teaching Python to kids. A search at Amazon, for "Python for Kids" will turn up several, including a book with that title. I don't find that particular book especially inspiring, however.

If you choose Python, I'd suggest also finding a suitable environment (i.e. something richer than *idle*) to provide support, with code management, code completion and the like. Scratch will provide much of that, but you might not want to have the choice Scratch v. "Naked Python".

> **Comments:**
> **username_0**: I am familiar with both languages. However, giving the kids a choice might not be the best idea because I don't think they have a good tech background besides the smartphone-using experience. I updated the question with more details about that.  
> **username_4**: Actually, their choice needn't be strictly rational. If you were to see brighter faces for one and scornful looks for the other it might sway your choice. You want them excited, not just accepting.  
> **username_0**: Actually, even for Python I would base my course on this Coursera course from Rice University: https://www.coursera.org/learn/interactive-python-1 They make a simple game in every lesson. So I'm not completely dismissing the idea.  

---

### Answer by username_5 on 2018-01-26. Score: 1

If your kids are into making things they can see or hear, why not give ***[SonicPi](http://sonic-pi.net/)*** a try?

It will give immediate audible results and teach a fresh beginner the basics of assigning variables, looping, writing functions to group like events/actions, and teach a general sense of sequence (this before that) as well as simple troubleshooting (it doesn't sound right, but where is the mistake?)

One of the things that I did as part of an undergrad research (that unfortunately didn't get very far due to time) was to gather information on how to create a curriculum that would bridge the gap between computer science and music, as part of a joint collaborative of both departments at my university. Things I found while looking into Sonic Pi is that it is actually a very good "first" language and a good environment to break into the shell of programmable music. It is also a good way, likewise, for a programmer to learn a bit about music and how it all works.

Much of today's music is synthesized, and is in a standard popular song format, meaning that there are sections that loop. If the end result is to create a standard 3-minute length song, for example, things that need to be learned first are a few key things about music theory (which, for the basis of "song-making" and not necessarily serious composition, are fairly simple and can be picked up along the way), but as for the technical/programming side of things, a newcomer would also have to pick up a few essential skills.

Day one would be preparing the environment. Installing the OS and the packages required to run the environment on which it runs.

Day two would be the first few standard expressions. Subsequently, learning about MIDI inputs and what each number represents (pitch, velocity, etc.). You assign an instrument to a variable and call the variable when you want to output the sound.

From then on begin the real fireworks. Programming variable instruments to play on a timebase. Looping sections of timed variable instruments (standard loops, such as do-while) to create riffs.

After that, creating functions that will group a section of riffs to make an audible passage. Passing parameters onto these functions to apply effects, volume/loudness, etc. Learning about constructors, getters and setters. Working with libraries (such as randomizers).

The end result is something that's engaging, fun to play with and discover, and imparts an essential understanding of underlying concepts, so that when they jump into a formal language, much of the foundation is already there and the daunt of the challenge of learning something that might as well be "in another language" is lessened.


---

### Answer by username_6 on 2018-01-22. Score: 0

Another possibility (if you have the money) would be something like Lego Mindstorms.

The advantage is:

1. Unlike straight Python, your program actually "does" something. You can make your robot throw objects into a basket, or follow a line (self-driving car), or respond to light sensors.
2. You can start with a GUI programming language ([NXT-g](https://en.wikipedia.org/wiki/Lego_Mindstorms_NXT#Programming)) and when they get the basics, move them to a "real" language (such as C, Java, or even [Python](https://code.google.com/archive/p/pynxc/)).

You can probably do much of the same with a Raspberry Pi, but you'll have to take care of the wiring, motors, and sensors yourself. You may also not find a good block programming language for the RasPi.


---

### Answer by username_7 on 2018-01-26. Score: -3

Anything object oriented I would say. Such as java, C#, or Alice!. The reason is the high level concepts are hard to grasp such as threading, loopers, and ect. For example in Java create a object class called animal what can an animal do? eat and sleep, fight ect. Then grow it from there. Once you establish real world applications for the kids concepts such as inheritance(ex. lion inherits from animal because a lion is an animal) and polymorphism(ex. not all animals have the same growl such as a cow says mooo and an lion says rooaar, so like have a method called growl they have to override) are easy to grasp.

> **Comments:**
> **username_4**: Unfortunately this view of OO needs work. If Animal is abstract or an interface then ok. But the sound an animal makes is not a good use of polymorphism (by inheritance anyway). Better it is a good use of programming by composition, which OO also supports in fantastic ways. An animal _has a_ sound which is another object type. You can find better descriptions of OO and polymorphism given in many answers on this site. Have a look around. (Note that I've taught OO since about 1985)  

---

