Answers.Body: <p>You need to pique their interest. That means doing some sort of GUI work, perhaps creating a little game, store and retrieve some data. I'd recommend using Python: simple syntax, has all sorts of bells and whistles (OOP! Lots of libraries for all sort of stuff, even symbolic math).</p>
  
  <p>Please don't try to show them several languages! Somebody said "learning the first language takes a year" (traditionally, "Programming" and Data Structures"), "the second six months, then you learn a language in a month". That coincides with my experience (as long as the languages aren't too different!). But that first year is required, and it is hopefully the same language. Different ways of expressing, e.g. a loop, just confuse newbies for no purpose.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-08-08T21:24:42.197Z
Answers.LastActivityDate: 2019-08-08T21:24:42.197Z
Answers.UserDisplayName: vonbrand
Answers.Body: <p>I agree with several of the replies.  You are biting off more than you can chew.  Have fun with one or two languages instead of dabbling in several.  What you are planning for in 2 weeks is more than I would take on for a semester no matter how sharp the kids are.  I have been teaching high school programming and CS for 30 years so I know kids.  For beginner programmers at the high school level I would go with Small Basic and do a bunch of turtle graphics.  Draw castles, houses and tesselations.  Great for teaching fundamentals of programming in a fun way for kids.  Then I would go to Python with Visual Studio Code.  If you have any budget buy some Lego EV3 robot kits and use the VSC extension for the EV3.  The Unity/C# is another thing that is fun.  Coding would not be an emphasis, the C# used in Unity is pretty high level, so the kids would be doing a lot of cut and paste coding but there is nothing wrong with that.  The idea of a summer camp is to have fun, not be buried in tedious.  Nine to five is going to be bad enough.  Forget the C/C++/OOP.  They can do that when they hit college.  </p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-06-27T20:29:15.817Z
Answers.LastActivityDate: 2019-06-27T20:29:15.817Z
Answers.UserDisplayName: Garth Flint
Answers.Body: <blockquote>
    <p>The purpose is to interest them in learning programming. More specifically, to give them a taste of some aspects of various languages, hoping that each will find something they like and, being naturally curious, they might pursue the subjects they liked a bit more.</p>
  </blockquote>
  
  <p>Comparison of programming languages doesn't make sense until they've first mastered the basic concepts, so two weeks doesn't seem like enough time to get onto this. I think you'd be better off taking one language which supports functional and OOP styles, covering both, and then maybe doing a small Rosetta Code presentation in the last day or two, with a handout which they can refer to after the course has finished.</p>
  
  <p>I'm also not convinced that the students' curiosity will work that way ("This idea of first class functions is fun: what can I do with it?"). I think that the hook should be that programming lets you do things which are fun and/or useful. The difficulty with coming up with examples is that no two students will agree 100% on what things are fun and/or useful. Games are a good bet for fun, although graphics tend to be complicated and you risk needing to dedicate lots of time to teaching/revising trigonometry and quadrature. I'm not sure whether today's youth would find text adventures fun. The concept of databases as useful is another reasonable bet: most people will collect something or follow a sport, and you can build and query structured data to enhance both of those. Pick a language which has easy serialisation and you don't need to bother with "real" databases (although maybe mention them in the handout).</p>
  
  <p>Although I've never used it myself, Swift looks like a reasonable teaching language if you want compile-time typing. From looking at examples on Rosetta Code it seems to have clean syntax and support imperative, functional, or OOP styles.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-06-13T10:36:37.210Z
Answers.LastActivityDate: 2019-06-13T10:36:37.210Z
Answers.UserDisplayName: Peter Taylor
Answers.Body: <p>With two weeks, you'd be better off focusing on a bit. If you are teaching C++/Java, why Python?  I would choose only one of those three languages, as they are all fairly similar.</p>
  
  <p>Alternatively, if you wanted to do some OOP, have you considered using C#/Unity? It results in some quite fun projects right out of the gate, and they are working in a fully professional environment as they begin.</p>
  
  <p>I suppose with only 10 days, I would think about either doing web development or Unity, and I would spend a bit of time working with GitHub in either case.  Two weeks just isn't a huge amount of time, and students appreciate coming out with a few firm skills that they can comfortably use.  Both web dev and game development lend themselves towards extensible projects so that advanced students can zoom ahead and learn more, while slower students can actually master some basics.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-06-13T09:57:53.797Z
Answers.Text: Hm... I hadn't thought about Unity.
Answers.UserDisplayName: ItamarG3
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-06-14T13:53:20.717Z
Answers.Text: I think C#/Unity is a good place to start.  Another good place to start would be Scratch.  Yes it something that people usually think of as being only for very young folks but there's depth there and it could be a great learning exercise.
Answers.UserDisplayName: Onorio Catenacci
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2019-06-12T16:52:48.433Z
Answers.LastActivityDate: 2019-06-12T16:52:48.433Z
Answers.UserDisplayName: Ben I.
Body: <p>I've planned a shallow and broad curriculum for a summer program (5 days a week for 2 weeks, 9:00 to 17:00) or sorts, and the flow of the subjects seems flawed.</p>
  
  <p>The students are gifted (not a prerequisite, but most of them are) highschoolers with either no background in programming, or very little background. </p>
  
  <p>The purpose is to interest them in learning programming. More specifically, to give them a taste of some aspects of various languages, hoping that each will find something they like and, being naturally curious, they might pursue the subjects they liked a bit more.</p>
  
  <p>The curriculum I have in mind is more or less:</p>
  
  <ol>
  <li>Using <code>C</code>: 
  
  <ul>
  <li>Intro to the simplest of things</li>
  <li><code>printf("Hello World!\n");</code> and the like</li>
  <li>most importantly, <strong>introduction to types</strong>.</li>
  </ul></li>
  <li>Using <code>C++</code>/<code>Java</code>:
  
  <ul>
  <li>very brief overview of OOP, just at the concept level</li>
  <li>"Things" are described in <code>class</code>es which have properties etc.</li>
  </ul></li>
  </ol>
  
  <hr>
  
  <ol start="3">
  <li>Using <code>JavaScript</code>:
  
  <ul>
  <li>Intro to functional programming. Again, just at the concept level</li>
  <li>"Things" are described with functions.  </li>
  </ul></li>
  </ol>
  
  <p>and finally:</p>
  
  <ol start="4">
  <li>Using <code>python</code>:
  
  <ul>
  <li>finish with small tasks for them to get some hands on experience and things to show their friends</li>
  </ul></li>
  </ol>
  
  <p>As I see it, the main issue is, for lack of a better word, <em>synergy</em>. Subjects 2 and 3 seem highly disconnected. Moreover, I fear that for the students, the things they learnt in <code>C</code> and <code>C++</code> will seem "pointless", since most of them will think that they don't use those concepts and ideas in the tasks in part 4. </p>
  
  <p>How might I bridge between OOP in Java or C++, with functional programming in JavaScript? Personally, I thought using Java's functional interfaces could work, but that would require teaching about interfaces, making the course far less "shallow" than it should be. </p>
  
  <p>Might there be a simple or neat "trick" to connect the two subjects?</p>
  
  <hr>
  
  <p>PS: Any other suggestions regarding the partial curriculum I outlined are also welcome. <sub>It's the first I've built from nothing</sub></p>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T12:03:48.360Z
Comments.Text: I question the concept, actually. Being able to write "hello world" in 25 different languages isn't really anything at all. You seem focused on programming rather than CS, which is fine at the level, given the time, but programming is about creating abstractions of one form or another. In some languages it is only possible to create a very few kinds of abstraction (C - function abstraction). In other languages more is possible. But Java and Python, while rich, have about the same ability. And the difference, at the abstraction level, between C++ and Java is extremely subtle. Teach abstraction.
Comments.UserDisplayName: Buffy
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T12:06:06.603Z
Comments.Text: @Buffy quite true. I should remove "CS" from the question. It's more a "how to interest them in learning programming" question... They are smart kids, and inquisitive. Some will definitely want to learn CS in the future, if I can get them interested in programming.
Comments.UserDisplayName: ItamarG3
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T12:16:49.070Z
Comments.Text: If your scale is small (say 10 or fewer) you could just create an agile programming "firm" and build something fun in a language like Java or Python. You are the customer, feeding into the product backlog. They do one day sprints. You get to set the difficulty of each task, increasing them as the students learn more. They learn enough of the language to carry out the current task. They work together (pairing) teaching one another, etc. If the "day" (sprint) ends at 15:00 you have time for retrospectives or even giving them "goodies": interesting facts about CS or other languages or ...
Comments.UserDisplayName: Buffy
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T12:28:30.680Z
Comments.Text: As for the "something fun" part, I've had some success with building a computerized version of some physical board game. Students have an obvious metaphor to guide what they are doing. And such a project can be treated as a "success" even if little is actually built.
Comments.UserDisplayName: Buffy
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T14:08:22.373Z
Comments.Text: "Interest them in learning programming" is a very vague outcome.  Perhaps a better outcome may be to have them able to encode some trivial algorithm in a programming language.  Even building simple sort algorithms is non-trivial when you get into questions of character sets etc.
Comments.UserDisplayName: Onorio Catenacci
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T14:09:39.243Z
Comments.Text: By the way, if you're going to show students OOP for God's sake don't show them C++ or Java!  Those two are among the _worst_ implementations of OOP that I can name.
Comments.UserDisplayName: Onorio Catenacci
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T17:13:07.760Z
Comments.Text: @OnorioCatenacci, a strong opinion about Java. I have an equally strong, but opposite opinion. It is quite a good vehicle if used correctly.
Comments.UserDisplayName: Buffy
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T20:09:45.493Z
Comments.Text: @Buffy, that's not exactly _my_ opinion of Java.   I feel confident in saying that probably Alan Kay (the gent who actually invented OOP) would agree with my statement. See [here](https://ivanovivan.wordpress.com/2010/09/13/alan-kay-quotes/) for more details but this is the money quote: *and actually I made up the term object-oriented, and I can tell you I did not have C++ in mind.*  Java is in a lot of ways just C++ with manual memory management removed.  It's certainly not the message-passing, late-binding that Kay envisioned.
Comments.UserDisplayName: Onorio Catenacci
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T20:14:04.320Z
Comments.Text: @OnorioCatenacci, Yes, I can believe Kay talking about C++ that way, but note that Stroustrup doesn't take Smalltalk as a predecessor of C++, but Simula instead, which predates Smalltalk and has a different model. You are misrepresenting Java rather badly. It does have a Smalltalk-like object model. It does have both message passing and late binding, though not everything is an object. For primitive data it is like C (more or less). Perhaps you confuse late binding and static type checking. They are not the same.
Comments.UserDisplayName: Buffy
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-12T20:19:23.837Z
Comments.Text: Let us [continue this discussion in chat](https://chat.stackexchange.com/rooms/94825/discussion-between-onorio-catenacci-and-buffy).
Comments.UserDisplayName: Onorio Catenacci
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-13T08:46:03.727Z
Comments.Text: Have you seed this very important video? https://www.ted.com/talks/carol_dweck_the_power_of_believing_that_you_can_improve?language=en
Comments.UserDisplayName: ctrl-alt-delor
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-06-13T08:53:27.170Z
Comments.Text: Do you hate them?: C — nice and small (lisp is smaller), but archaic low-level; Java — to much boiler plate; Javascript — to many dark corners, and sharp edges; C++ — how many years did you say you have; python — acceptable, until we find something better.
Comments.UserDisplayName: ctrl-alt-delor
Tags: <curriculum-design><secondary-education>
Title: Shallow, broad and general introduction to programming
ThreadText: # Shallow, broad and general introduction to programming
  
  (Asked by: username_0 on 2019-06-12)
  
  I've planned a shallow and broad curriculum for a summer program (5 days a week for 2 weeks, 9:00 to 17:00) or sorts, and the flow of the subjects seems flawed.
  
  The students are gifted (not a prerequisite, but most of them are) highschoolers with either no background in programming, or very little background.
  
  The purpose is to interest them in learning programming. More specifically, to give them a taste of some aspects of various languages, hoping that each will find something they like and, being naturally curious, they might pursue the subjects they liked a bit more.
  
  The curriculum I have in mind is more or less:
  
  1. Using `C`:
     * Intro to the simplest of things
     * `printf("Hello World!\n");` and the like
     * most importantly, **introduction to types**.
  2. Using `C++`/`Java`:
     * very brief overview of OOP, just at the concept level
     * "Things" are described in `class`es which have properties etc.
  
  ---
  
  3. Using `JavaScript`:
     * Intro to functional programming. Again, just at the concept level
     * "Things" are described with functions.
  
  and finally:
  
  4. Using `python`:
     * finish with small tasks for them to get some hands on experience and things to show their friends
  
  As I see it, the main issue is, for lack of a better word, *synergy*. Subjects 2 and 3 seem highly disconnected. Moreover, I fear that for the students, the things they learnt in `C` and `C++` will seem "pointless", since most of them will think that they don't use those concepts and ideas in the tasks in part 4.
  
  How might I bridge between OOP in Java or C++, with functional programming in JavaScript? Personally, I thought using Java's functional interfaces could work, but that would require teaching about interfaces, making the course far less "shallow" than it should be.
  
  Might there be a simple or neat "trick" to connect the two subjects?
  
  ---
  
  PS: Any other suggestions regarding the partial curriculum I outlined are also welcome. It's the first I've built from nothing
  
  **Tags:** curriculum-design, secondary-education
  
  > **Comments:**
  > **username_1**: I question the concept, actually. Being able to write "hello world" in 25 different languages isn't really anything at all. You seem focused on programming rather than CS, which is fine at the level, given the time, but programming is about creating abstractions of one form or another. In some languages it is only possible to create a very few kinds of abstraction (C - function abstraction). In other languages more is possible. But Java and Python, while rich, have about the same ability. And the difference, at the abstraction level, between C++ and Java is extremely subtle. Teach abstraction.  
  > **username_0**: @username_1 quite true. I should remove "CS" from the question. It's more a "how to interest them in learning programming" question... They are smart kids, and inquisitive. Some will definitely want to learn CS in the future, if I can get them interested in programming.  
  > **username_1**: If your scale is small (say 10 or fewer) you could just create an agile programming "firm" and build something fun in a language like Java or Python. You are the customer, feeding into the product backlog. They do one day sprints. You get to set the difficulty of each task, increasing them as the students learn more. They learn enough of the language to carry out the current task. They work together (pairing) teaching one another, etc. If the "day" (sprint) ends at 15:00 you have time for retrospectives or even giving them "goodies": interesting facts about CS or other languages or ...  
  > **username_1**: As for the "something fun" part, I've had some success with building a computerized version of some physical board game. Students have an obvious metaphor to guide what they are doing. And such a project can be treated as a "success" even if little is actually built.  
  > **username_2**: "Interest them in learning programming" is a very vague outcome.  Perhaps a better outcome may be to have them able to encode some trivial algorithm in a programming language.  Even building simple sort algorithms is non-trivial when you get into questions of character sets etc.  
  > **username_2**: By the way, if you're going to show students OOP for God's sake don't show them C++ or Java!  Those two are among the _worst_ implementations of OOP that I can name.  
  > **username_1**: @username_2, a strong opinion about Java. I have an equally strong, but opposite opinion. It is quite a good vehicle if used correctly.  
  > **username_2**: @username_1, that's not exactly _my_ opinion of Java.   I feel confident in saying that probably Alan Kay (the gent who actually invented OOP) would agree with my statement. See [here](https://ivanovivan.wordpress.com/2010/09/13/alan-kay-quotes/) for more details but this is the money quote: *and actually I made up the term object-oriented, and I can tell you I did not have C++ in mind.*  Java is in a lot of ways just C++ with manual memory management removed.  It's certainly not the message-passing, late-binding that Kay envisioned.  
  > **username_1**: @username_2, Yes, I can believe Kay talking about C++ that way, but note that Stroustrup doesn't take Smalltalk as a predecessor of C++, but Simula instead, which predates Smalltalk and has a different model. You are misrepresenting Java rather badly. It does have a Smalltalk-like object model. It does have both message passing and late binding, though not everything is an object. For primitive data it is like C (more or less). Perhaps you confuse late binding and static type checking. They are not the same.  
  > **username_2**: Let us [continue this discussion in chat](https://chat.stackexchange.com/rooms/94825/discussion-between-username_2-and-username_1).  
  > **username_3**: Have you seed this very important video? https://www.ted.com/talks/carol_dweck_the_power_of_believing_that_you_can_improve?language=en  
  > **username_3**: Do you hate them?: C — nice and small (lisp is smaller), but archaic low-level; Java — to much boiler plate; Javascript — to many dark corners, and sharp edges; C++ — how many years did you say you have; python — acceptable, until we find something better.  
  
  ---
  
  ## 4 answers
  
  ### Answer by username_6 on 2019-06-13. Score: 5 | Accepted answer
  
  > The purpose is to interest them in learning programming. More specifically, to give them a taste of some aspects of various languages, hoping that each will find something they like and, being naturally curious, they might pursue the subjects they liked a bit more.
  
  Comparison of programming languages doesn't make sense until they've first mastered the basic concepts, so two weeks doesn't seem like enough time to get onto this. I think you'd be better off taking one language which supports functional and OOP styles, covering both, and then maybe doing a small Rosetta Code presentation in the last day or two, with a handout which they can refer to after the course has finished.
  
  I'm also not convinced that the students' curiosity will work that way ("This idea of first class functions is fun: what can I do with it?"). I think that the hook should be that programming lets you do things which are fun and/or useful. The difficulty with coming up with examples is that no two students will agree 100% on what things are fun and/or useful. Games are a good bet for fun, although graphics tend to be complicated and you risk needing to dedicate lots of time to teaching/revising trigonometry and quadrature. I'm not sure whether today's youth would find text adventures fun. The concept of databases as useful is another reasonable bet: most people will collect something or follow a sport, and you can build and query structured data to enhance both of those. Pick a language which has easy serialisation and you don't need to bother with "real" databases (although maybe mention them in the handout).
  
  Although I've never used it myself, Swift looks like a reasonable teaching language if you want compile-time typing. From looking at examples on Rosetta Code it seems to have clean syntax and support imperative, functional, or OOP styles.
  
  
  ---
  
  ### Answer by username_7 on 2019-06-12. Score: 3
  
  With two weeks, you'd be better off focusing on a bit. If you are teaching C++/Java, why Python? I would choose only one of those three languages, as they are all fairly similar.
  
  Alternatively, if you wanted to do some OOP, have you considered using C#/Unity? It results in some quite fun projects right out of the gate, and they are working in a fully professional environment as they begin.
  
  I suppose with only 10 days, I would think about either doing web development or Unity, and I would spend a bit of time working with GitHub in either case. Two weeks just isn't a huge amount of time, and students appreciate coming out with a few firm skills that they can comfortably use. Both web dev and game development lend themselves towards extensible projects so that advanced students can zoom ahead and learn more, while slower students can actually master some basics.
  
  > **Comments:**
  > **username_0**: Hm... I hadn't thought about Unity.  
  > **username_2**: I think C#/Unity is a good place to start.  Another good place to start would be Scratch.  Yes it something that people usually think of as being only for very young folks but there's depth there and it could be a great learning exercise.  
  
  ---
  
  ### Answer by username_4 on 2019-08-08. Score: 1
  
  You need to pique their interest. That means doing some sort of GUI work, perhaps creating a little game, store and retrieve some data. I'd recommend using Python: simple syntax, has all sorts of bells and whistles (OOP! Lots of libraries for all sort of stuff, even symbolic math).
  
  Please don't try to show them several languages! Somebody said "learning the first language takes a year" (traditionally, "Programming" and Data Structures"), "the second six months, then you learn a language in a month". That coincides with my experience (as long as the languages aren't too different!). But that first year is required, and it is hopefully the same language. Different ways of expressing, e.g. a loop, just confuse newbies for no purpose.
  
  
  ---
  
  ### Answer by username_5 on 2019-06-27. Score: 1
  
  I agree with several of the replies. You are biting off more than you can chew. Have fun with one or two languages instead of dabbling in several. What you are planning for in 2 weeks is more than I would take on for a semester no matter how sharp the kids are. I have been teaching high school programming and CS for 30 years so I know kids. For beginner programmers at the high school level I would go with Small Basic and do a bunch of turtle graphics. Draw castles, houses and tesselations. Great for teaching fundamentals of programming in a fun way for kids. Then I would go to Python with Visual Studio Code. If you have any budget buy some Lego EV3 robot kits and use the VSC extension for the EV3. The Unity/C# is another thing that is fun. Coding would not be an emphasis, the C# used in Unity is pretty high level, so the kids would be doing a lot of cut and paste coding but there is nothing wrong with that. The idea of a summer camp is to have fun, not be buried in tedious. Nine to five is going to be bad enough. Forget the C/C++/OOP. They can do that when they hit college.
  
  
  ---
  
  