# Shallow, broad and general introduction to programming

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 classes which have properties etc.

1. Using JavaScript:
• Intro to functional programming. Again, just at the concept level
• "Things" are described with functions.

and finally:

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

• 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. Jun 12 '19 at 12:03
• @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. Jun 12 '19 at 12:06
• 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. Jun 12 '19 at 14:09
• @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. Jun 12 '19 at 20:14
• 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. Jun 13 '19 at 8:53

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.

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.

• Hm... I hadn't thought about Unity. Jun 13 '19 at 9:57
• 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. Jun 14 '19 at 13:53

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.

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.