I am a middle school English Language Arts and Computer Science teacher in Brooklyn. The New York City Department Of Education has been trying to transition some of its teachers into teaching CS, as the official pathways into the classroom for industry professionals are scant. There are lots of teachers who want to take this opportunity, but the training options are often limited to companies who simply explain how to use their platforms (Code.org, Codesters, etc). It's not a bad deal, but I think I can do better.
I want to teach other teachers how to teach children how to code. What do you think teachers should be teaching, and what do you think children should be learning?
Oldest comments (41)
Not a teacher, but I know Apple has some resources (and free I believe too) to learn coding basics.
For iPad:
apple.com/swift/playgrounds/
There's also these teaching manuals toward the bottom of this site, and other resources as well:
apple.com/education/everyone-can-c...
Hope it helps && I love your initiative! Good luck!
This is such a tough issue and I hope others pipe in with more insight. It is awesome that you are in a position to make a difference and that you want to.
Here are my thoughts:
That doesn't really explain how to teach the teachers though. I'd come up with a simple project-based curriculum, teach the teachers how to get kids from a to b in that defined project structure and provide them with an instruction to, themselves, work through a JavaScript-based tutorial that goes a bit deeper into the fundamentals and environment.
CS is great, but getting kids excited about code is the key IMO. From there I'd go into some of the deeper concepts through story telling.
e.g.
As far as the goldilocks zone goes, do you know any code editors for chromebooks? We only have access to those.
There are some online IDE's that I've used before and are pretty nice like Cloud9!!
While I was first introduced to Computer Science by my father, I truly learned how to program and develop projects in a classroom setting in my high school. I have quite a lot of experience mentoring and teaching people CS. I've worked as a TA for a summer AP CS course and worked in a local non-profit that taught CS to middle school kids. From my previous experiences, some important things to implement so that CS is fun and not a chore:
Work towards easily achievable, "brag"-able, and customizable goals
I've found that students tend to enjoy CS in the earlier stages a lot more when they can see the products of their work. Even better yet when they can put their own spin on it and show it to all of their friends. One basic example would be to create a basic HTML+CSS website, throw in a PHP file that directs to the main.html site, and deploy it to heroku. Sure, they don't need to know how all of the parts work together, but the fact that they have a website accessible on the internet!!! will instantly inspire them to do more
Work in a language with understandable syntax
Python is my personal favorite when it comes to this, primarily because of keywords such as "in", "with" etc. Python requires little to no setup to create your first program, and the easy syntax makes coding intuitive (nevermind much easier to debug)
Always explain concepts by getting up and moving around
One of the hardest new concepts for programmers is recursion: I always like to teach this along with other OOP ideas (Inheritance, Casting, etc.) by getting students on their feet and doing some activity. For example, for recursion, you could have them find the length from one wall to the other by each student taking one step and then moving another student in front of them. The original is then instructed to tell the person behind them the number of steps they took (1) plus the number of students the student in front of them took. Small games like this go a long way in cementing concepts in students' minds.
Stay away from tests, and stick with projects
Coding is one of the few sciences which is powered by creativity. The beauty behind programming is that at its core it's a means of problem solving, and people approach problem solving in their own way. Thus, for grading purposes, if you grade projects rather than tests, the students tend to enjoy the class much more than they would have. Rather than cramming concepts, they're applying them while googling new ones to learn how to implement features they'd want (a rather important skill for a programmer too) Plus, grading for the teacher is a lot more fun.
As for teaching teachers themselves, my only advice, once again from personal experience, is that you should use the same techniques. Programming is something that doesn't become more intuitive with age but rather with practice and application. These ideas for teaching children will be just as effective if not more with adults. If the teachers are exposed to CS in an intuitive and memorable manner, they will be that much more likely to teach students in the same fashion.
Hope this helps!
When I was in fourth grade, we took a "Computer Applications" course in which we were basically hand-held through the process of making a website.
At one point, our teacher had us start copying JavaScript games onto our sites. Some of my classmates had put one or two games up before I had found my perfect one. Not to be outdone, I quickly threw together a couple games on a hideous page and presented it to the teacher. He liked it so much that he put it on the board to display to the class.
He then decides to try out one of the games. I hadn't had a chance to tinker with it, but the name seemed cool so "Ask Mustafa" was my premiere game. It was basically an input field to ask a question and a cheesy output.
It was after the second question that my, and every kid's, worst fear was realized: one of the copy-pasted responses was something to the tune of "kiss my ass, bitch!" The teacher looked at me for a second and I, not having seen the response, held his gaze. And then the class burst out laughing. Still not knowing what had happened, I looked around wildly to see if I could figure out what had happened.
That teacher couldn't look me in the eyes again. He retired a few years ago.
It absolutely helps. I love the idea of project based learning for CS as it mimics closely the process of creating an actual process. Thanks for the input!
I'm truly agreed with you about tests, cause most of the students just taking photos of their sheets and mail them to writing services, that re-send correct answers back. Projects instead of tests are more effective in education, as for me, because cheating on them it's too complicated)
I'm teaching my 8 year old son how to program in Bash shell, Lisp, and C. He's written his Emacs Lisp configuration, his own build script, and a minimal program in C that opens a Window, initializes a buffer of pixels, and paints a color pattern on the screen.
"Talking" to computers aka coding is just part of CS. This involves learning programming languages and tools. For this as others have suggested, stick to simple, intuitive, and batteries-included languages like Python or Groovy. This is easier to do with loads of online resources.
The other harder bits of CS are 1) figuring out how to solve a problem and 2) describing it with enough precision that a computer can solve the problem for you. I don't know of any easy and good resources for these except solving/reasoning about problems/puzzles and then expressing the solution steps in a precise and systematic way that another human or a computer can reproduce the solution. This does not need computers. Instead, it involves logical, creative, and critical thinking to identify arguments to construct and support/refute solution steps and solutions. Equipped with this, expressing solutions in a language that a computer can understand is easy.
HTML+CSS. It's middle school. You get a syntax error, JavaScript breaks. Beginners hate syntax errors, won't read/understand the error messages. If any JavaScript, just inline onclick handlers or one-liners. HTML and CSS are very forgiving and browser tools make instant changes. Make the advanced kids do stuff with keyframes, responsive design. Although, I've seen a lot of people fail miserably at teaching HTML because they get into stuff that doesn't apply to the experience of coding, like HTML5 element categorization. Skip over that nonsense and go 100% hands on. For an IDE, notepad++ would work, nothing more than syntax highlighting.
Don't make them carry around a USB key, they just lose/forget them. Too bad there aren't any geocities/angelfire sites around.
JavaScript in the followup course, big focus on reading error messages, Googling. A good IDE would be the key, so identifies errors before they "go to all the trouble" of opening it in a browser tab.
I'd suggest two things:
Teach the kids to debug. I just can't emphasise this enough. Programming has a steep learning curve, and its rare that some code works perfectly first time, no matter how carefully you've architected it into simple units and so on. Something, somewhere, will be broken - and that's depressing when you're starting out, because you tend to lack the skills to fix it.
Moreover, if something doesn't work, and you don't know how to fix it, you're stuck. Kids who're stuck - actually, adults too - get disheartened quickly. Kids who can turn a dead end into a bump in the road can move faster, build things quicker, and keep motivated as a result.
I don't mean learning how to use debugging tools - those are great, of course - but I mean the actual process of locating the error and finding the correct fix. Usually it's a matter of applying the good old scientific method, of making a guess and looking for evidence to back that up. It doesn't matter if you use a classical debugger, or just a bucketload of print statements - that pattern to find out what's going wrong and fix it is just the most important thing one can ever learn.
I absolutely agree with the statement above. I would add to that by saying that documentation is also extremely important. I'm not suggesting full on code blocks with standardization and a bunch of rules to follow. That will come in time. When the kids run into a problem and find a solution, they should be encouraged to document the experience.
They should ask themselves what and why something went wrong. This kind of documentation doesn't have to be rigorous. Something as simply as an inline-comment, a post it note, or a sentence in a text file.
They will encounter lots of problems, and they should be encouraged to treat each one as a learning experience. Keeping track of those experiences will solidify them.
Encourage kids to wonder and ask why towards the root of a task or problem. Also challenge them to think about how they like to learn. Does a student like to hear, see, move, touch to better retain core concepts? If they can feel confident in how they like to learn growing as curious young devs will be much easier. Build their confidence!
I took CS in high school all the way to AP CS my senior year. My advice when it comes to teaching kids CS comes from my own biased experience.
I'd say it's important to focus on the fundamentals of CS. Things like problem solving by splitting up a task in smaller chunks. My last year of CS in HS we learned C++ but we didn't start using computers until we all had a firm grasp on algorithms by feeding our teacher instructions like putting on a shirt or making a PBJ sandwich. We had to present the steps while he stood at the front of the classroom acting them out. We spent about a month going to exercises like that. Eventually we translated those learnings into algorithms we wrote in C++.
During my first years learning CS, we developed both typing skills and copying and pasting code pieces from different sources. We didn't work much with web tech because Flash and ActionScript 1 ruled the world. But we took Visual Basic code and learned how to use if/else control statements to control the flow of our applications.
I wish we had learned more about Linux/Unix while in school. I really wish I had more exposure to the history of CS. I predominately work with Linux-flavored operating systems today. Although the skills of problem solving and taking source code apart and recompiling it into something original was I think the launch pad for my career in tech today.
I'll echo the sentiments of others when they say, having something they can show off will help. But I would also suggest that it's important to keep in mind that that is more of a personality trait than anything else. I think it's also a good idea for students to try to solve their own problems either with code directly or indirectly. For instance, an algorithm for them to use outside of class to possibly solve a problem without code or a computer.