I'm teaching computer science - help!

Here’s something similar: Kano, although it is targeted to a younger audience. I gave one of these to a fourth grade class once, but I never found out how it was used.

Another language you may want to consider is Java. It’s good for teaching about object and is the language used in AP Computer Science. You may want to look at the curriculum for AP Computer Science: Principles as well to get some ideas.

I’m a software engineer who’s taught classes (albeit college level). I think the advice on using Python is good; it’s an easy language to start with and since it’s open source you should be able to install it yourself on any computer you need.

Something else you might want to check out is code.org; they are a non-profit that’s getting some push in the industry. They have pages dedicated to teaching code: Teach Computer Science - Code.org

That’s a great idea. Thanks.

To the three of you who posted messages like this. You’re right and you’re wrong. I was given senior philosophy a few years ago and knew nothing about it. I spent the summer listening to lectures and reading. I did a great job and loved every second of it. I will do the same with this. There is no need to delay anything or throw up my arms in protest or complain about the system. I love to learn new things. That’s what I like best about teaching.
Anyway, that’s not what my post is about.

Some interesting options here. I teach an “Introduction to Programming” college-level course, reconfigured last year for the first time, and I had the same questions. I inherited the course where Visual Basic was taught, which wasn’t bad, but too many students just didn’t “get” it. There was also a Python version of the course, which seemed better but there still was a lot of gnashing of teeth. One year we even tried to use Java, focusing on procedural programming, versus the object-first style of most text books. All of those variations of the class had the same problem: students were frustrated by having to focus on syntax and spelling that they couldn’t see the big picture.

I think I have this solved by using Scratch from MIT. Scratch was designed for middle- and high-schoolers, but there’s enough “there” for an introductory college class. It is graphical, drag-and-drop and snap in the pieces, which reduced typing problems. Plus it is web-based (requires a gmail account) so easy to run anywhere. We did the simple graphics, shapes etc. but also got into making blocks (functions), loops, and conditionals, with lots of focus on event-handling (like on-click). Scratch was a bit less intimidating and the concepts seemed to stick better.

I also had an optional lab using MIT App Inventor 2, which is very much like Scratch to develop quite fully-functional Android apps. That drove some students wild: that they could use a simple language to build full-feature apps.

However, some students vocalized that they can’t see where Scratch would ever be useful, something I agree with (beyond AppInv2). So we spent the second half of the semester with Python. We had already covered loops, conditionals and functions using Scratch, so we just had to convert the concepts into Python syntax.

I used the Zelle Python book last year, but next year I’m going with Automate the Boring Stuff with Python, which has a print version but is also available totally online. I’m using this book’s projects as an example of real-life use of scripting, since half of my class are network administration students. I’d love to add some Raspberry Pi Python projects if we can fit that in.

This is so vague as to be almost useless. Which should be a plus for you, since you can teach something that makes sense and still meet the guidelines.
For instance, there are many software development models. For 16 year-olds you should choose one that is more rigid than we actually use, but will teach about writing specs and requirements, and about testing as well as coding, and, it seems, about working in teams. That will be useful.
As for the language, I see lots of resumes and Python seems to be pretty prevalent these days, and my professor friends say it is the most popular language. And it can be downloaded for free, and the on-line tutorials are pretty good. Free should meet your budget, if barely.
Someone mentioned assembler. Don’t do that. I taught assembler at the university level, and we didn’t lot the students near it until we gave them an assignment that forced them to code in a structured way. We marked all deviations from this quite harshly (and then threw away that grade.) Without this assembly level code can and will be a mess. You don’t want to deal with it.
I’ve not heard of some of the languages mentioned. I’m sure they are good pedagogically, but it is better to teach something that will be of use in a few years.
You are not the first going down this route. When I took programming in high school my teacher was taking a class and was a few weeks ahead of us. We learned Fortran but couldn’t run programs in it, but could on the computer we had which could only be programmed in machine language. This was 1968, so you have it much easier.

To expand a bit on my thinking (and I suspect my fellow CS wonks here will agree), computer science isn’t really about programming. It’s about how to make a computer solve problems/do what you want it to do. This means that there are really 2 aspects to it- the theoretical “how” and the practical “how”.

The theoretical “how” centers around mathematics and logic- how do you decompose the problem? How do you most effectively solve that problem? What is the logical order of solving the steps? Does the order of the steps matter? How much data are you looking at?

For example, finding a value in a sorted list is sort of a classic problem to be solved. How do you do that? You can just power through them, which takes as many checks as there are data elements. Or you can do it in a more efficient fashion. The hows and whys of which algorithm you choose are in a sense, what computer science is about.

The practical “how” is programming. It’s how you actually go from deciding that you’re going to insert your data elements into a sorted array and do a binary search, to actually implementing that sorted array (and how you keep it sorted), as well as making that binary search work.

In my mind, computer science is more like being an architect or engineer, and programming is more like being the carpenter or fabricator. So centering it around programming is kind of short-sighted, in that computer science != programming. Programming is useful for sure, but it’s entirely possible for someone to be a bad-ass theoretical computer scientist without being a particularly good programmer and vice-versa. I myself am a pretty solid programmer, but only an indifferent theoretical computer scientist. And I knew people who were the exact flip side of me in college.

Since the OP is looking for advice, let’s move this to IMHO.

Colibri
General Questions Moderator

Having been a high school student who took programming classes with teachers who weren’t programmers, I can tell you that as a non-programmer you will only frustrate your students. You can’t learn to be a programmer by September. At best you’ll be able to write simple programs. To help people in a programming class you need to be able to read programs and understand what they do (not what they were intended to do, but what they actually do - this is how you debug programs). How will you grade the students’ programs? You can’t just run them to see whether they give the desired output. A program can give the desired output for a given set of input data yet still be wrong. Also, there isn’t just one correct way to solve a problem, but some are much better than others. How will you be able to tell a program which deserves an A from one which deserves a C?

A programming teacher at this basic level needs to be able to look at a program and know what’s wrong with it and how to fix it. You don’t want to have to spend a whole class helping just one student because you’re nearly as inexperienced as he is. Worse, you don’t want to be a teacher who appears to be incompetent.

In a practical sense, yes, it is about programming; CS as a field wouldn’t exist without programming, as programming gives meaning to all of the theory we use. It’s like aerodynamics and aircraft: The theory would exist without planes, but it wouldn’t be as large or as interesting.

This distinction is far from universal.

You clearly don’t understand what is involved in teaching Computer Science with a significant programming component. You are not assigning students books to read and essays. You are mostly assigning them programs to write.

If you goof up placing a semicolon in a Philosophy essay, not much of a deal. In a Computer Program it will go badly. You may not even be able to test the program at all to find out what’s wrong.

To be able to teach this well means you have to be a good programmer. In case you hadn’t notice, such people are in short supply. Why? Because it isn’t something that everybody can learn! (There are an immense number of bad programmers out there. Just because someone calls themselves a programmer does it mean they actually are.)

To be able to teach people the language, the tools, etc., requires really knowing this stuff.

If you don’t know programming and understand this, how about comparing it to a Chemistry class? Being able to teach a Chem lab while making sure the students don’t get hurt isn’t something that you can pick up from a book. It takes a lot of training from an experienced person.

How about another field with specialized skills such as a Music class. And imagine the teacher is tone deaf with no sense of timing. Again, you can’t un-tone deaf yourself from a book.

Your post is just waaaay off. These fields are not at all comparable.

You seem like a nice guy but this notion of yours is naïve at best and gibberingly insane at worst and reflects the cheery optimism of someone who does not have a clue what they are getting into. Teaching philosophy to kids and teaching programming to kids are very different things. Programming is not like teaching math or science or philosophy it’s more akin to a complex craft.

Teaching someone how to safely and professionally wire or plumb a house or building would be a closer analogy. You really, really need to know what you are doing and have some depth of knowledge before you can step into this and do an effective job.

Sure, you can easily do all the non-programming stuff in the course without breaking a sweat, but you are going to be doing everyone disservice because you will be forced to stick to the most rudimentary baby steps when it comes to actual programming to avoid looking like a fool and you will not be able to help the kids with a talent for programming who could progress under the eye of an experienced programming teacher. I’ve been in classes where it was obvious the teacher barely knew the material and it was embarrassing across the board and huge waste of everyone’s time. Don’t be that guy.

You’re not being a superhero by tackling a subject for which you are not currently qualified and do not have the time to become usefully qualified in before the class starts. You need to put your ego aside and think about how this is going to play out. This is not philosophy.

To add on to what astro is saying, even at its most abstract and theoretical, Computer Science is mathematics. The most abstract part of CS is a very focused, very specialized sub-field of math.* And you learn math by doing it. It’s a different kind of technical skill than programming, but it’s a technical skill nonetheless and you can’t approach it the same way you approach philosophy or English literature.

*(Which, again, only exists because of the context and applications provided by the needs of actual programmers. You can’t disentangle theory from practice; they’re sterile and anemic without each other.)

Why are you being assigned to teach a subject you know nothing about - and one where the kids probably won’t be fooled about the fact that you’re BSing your way through it?

I’ve been writing code for 25 years. GIS. I now work in VB.net, SQL, JavaScript, HTML, CSS, Python. Older stuff related to UNIX like AWK and god knows what else I’ve had to deal with. It comes and goes. AML left, Avenue left, and half a dozen others that I have needed at one point.

As another said, you will likely have students that already code. And I suspect others that use tools to code but don’t know what’s under the hood. Although they will THINK that they do.

You say that logic is a strong point for you. I would stick to that. Make it fun and interesting with using Python or something and flow charts to arrive at a goal.

I am not an academic teacher, but have taught many to use existing systems. I enjoy teaching and always get singled out for it.

For a class? Of 16 year olds? Wow. I think I would teach some basic Hello World stuff, break the students into groups and then assign each group a task (or let them pick or make it random). Then, do a switch where about a quarter of the way into it, change the task, and let them all collaborate. That’s sort of the way it works in the real world.

Disclaimer: I haven’t read the entire thread. But I second the Python suggestion. Syntactically it’s much less abrasive than languages like C or Java can be (missed a semicolon? oops your program won’t run). Python also has the plus of being easy to script with, you can much more easily write small snippets of code without having to worry about a lot of the aforementioned syntax.

Granted these days I prefer writing Java, but that’s also with much more experience.

This is a real problem, and to solve it the OP should allow collaboration among students for debugging. In the average classroom the teacher knows more about the subject, and can thus answer questions, but not here.
The OP should listen in to this help. When I TAed the Assembly Language class we’d stay up all night the day before an assignment to do and help. We could debug impossible problems in a minute. The students thought we were geniuses - the real reason was that lots of students made the same mistake, and it became easy to recognize.

One issue that we might as well get in the open for the OP (because most of us responding know this already) is there is a difference between programming and coding. Programming is language independent (for the most part) and for me as a computer science teacher was the hardest for students to do correctly. For example, let’s say you want to check if a number inputed was prime. The programming is
Check the input (n), make sure it is an integer
Check to make sure it greater than or equal to 2
Loop: divide the input by the integers 2 to sqrt(n) and see if it divides evenly
If not, it is prime
Print outcome of test.
So teaching your students to do that is the utmost concern. Then pick a language (python, java, LISP, brainfuck, etc.) that you think would be easy for your students to code in but would also be practical for them to know.

I’ve taught. And I’ve programmed.

My opinion about a lot of the posters here saying “you can’t do it properly” is that they seem to know more about programming than they do about teaching. I’ve done both. I don’t have a problem with a good high-school teacher learning a new subject.

If the teacher is good, the learning will be good. If the teacher is poor, a PhD in comp-sci wouldn’t help.

90 percent of computer programming is User Interface. 5% is persistent storage. 5% is domain knowledge and technical programming. It follows that if you want to train with anything useful, you have to train User Interface programming. But UI training isn’t fundamental. So there is always a dilemma: Fundamental stuff you teach won’t be immediately useful, useful stuff you train won’t be fundamental.

You’ll have to go with the materials you find, but it’s worth recognising that dilemma up front, so that it doesn’t cause continuing cognitive dissonance. Of course the OP will be used to that as a teacher, but sometimes students expect to find that a “technical” subject is different to English or Math.

Personally, if I had a bunch of raw 16 yo students, I’d see if I could give them Dev Ops instead of Comp Sci. I just think it would be more interesting for a typical 16 yo. But that’s just me --I don’t have to teach your students.