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?
Top comments (41)
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.
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)
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!
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.
tldr; Javascript, but also everything else!
I teach in the CS department of a relatively large private university; one of my courses is Computing for Non-CS Majors. Enrollment is around 200 students each semester, and I see a lot of freshmen, so they are just a year out from their high school experience.
Many, maybe most, non-CS folks think that CS is coding. It isn't. CS is a science degree, and most of our college majors are not being taught programming languages except as they relate to some other theoretical CS topic. I think that most local and state school boards incorrectly equate computer science with programming. The result is that grade school curriculums emphasize programming, usually in a completely useless language (Scratch comes to mind) because 'real' programming languages are considered 'too hard'. So much time is spent on this that there's no room for actual CS topics.
I see the result of this in my classroom at the college level. My students arrive from high school with essentially zero useful knowledge in the CS field.
I spend about a quarter of the semester walking my students through the basics of HTML, CSS, and Javascript as used in web pages. The rest of the semester is used to look at networks, internet privacy, doing business on the internet, how compression works in audio and video, basic logical operations, how operating systems function, and so on. It's essentially an introduction to the digital world, with enough web skills thrown in that they get a taste of what the broad range of computer technologies look like.
This notion that 'everyone should code' makes me crazy...it's like saying 'everyone should cook French pastry' and then forcing every single student to learn how to bake a croissant. Both are specialized skills. Some kids are interested in coding and will start to explore it on their own; you should provide those kids resources for learning, but not force it on everyone.
I'm assuming (perhaps incorrectly) that the 'other teachers' you mention are non-technical. Your question really is not what they should be teaching, but rather what they are capable of teaching. If programming is to be taught, the teacher should be at a high proficiency level in the language, and the language itself should be non-trivial (Python, Javascript, and so on). If the teachers are not at that level, avoid programming and instead focus on things like simple logic, how networks work at a high level, and so on. Only a very tiny percentage of your students will use a programming language after middle school, but they all will use a browser, buy a computer, stream music, and so on. It's much more useful and interesting to them to find out how those things work.
Sorry for a bit of a rant...I have to deal with the result of our eduction system every semester.
You are correct in that the direction the DOE seems to be going in is CS via coding. Do you have any resources on hand for teaching the other stuff? I hadn't really considered that but I completely agree that it is important.
I can't agree with the sciences taught at a theoretical level, certainly in middle school but even at university level. I believe STEM is much better served with a competency-based learning approach.
I'm not sure you're understanding STEM properly; it applies to scientific and engineering studies, not any sort of skill-based education. I've always thought that investment in STEM education in early levels is a good idea, but sadly it's become a checkbox for school districts who try to force their entire student population through a set of poorly understood guidelines. Does your district 'use STEM'? Yes, all students are required to take two computer science courses (which aren't science courses at all but 'programming' in a language no student will ever use).
Computer science, the field, has very little to do with computer programming, which is really more of a trade skill. While we certainly write programs to solve problems, the programs themselves aren't the focus of the study.
Ditto engineering fields...there's a big difference between an electrical engineer (theory) and an electrician (practical). I'd much rather see middle and high schools teaching practical skills like plumbing and electrical work than jamming a one-size-fits-all 'STEM' curriculum down everyone's throat.
I've always thought the recent emphasis on STEM (and whatever came before it, and whatever will come after it) was nothing but a way to ignore the underlying problem of subpar primary education in our country.
I refer to STEM as subjects that aren't liberal arts. Each teacher has their own approach in my district, some overhead projector with reading/comprehension, others a less passive approach. I only know of competency-based approach in elective classes, but they fail to have an extended curriculum for high-achievers.
I think that a foundation of practice allows the theory a greater ability to be assimilable by the student.
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.
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!
I can't say much for the code/CS part of the "what to teach/what students should learn," but for soft skills there are some things I am always trying to improve. I'm a teacher assistant for a coding bootcamp, and primarily work with adults who are transitioning from a totally different career (usually) to a CS career. That being said, maybe my advice isn't too relevant.
My main focus is to aid the learning process, and with that in mind, here are the main things I work on during class:
params
hash", "What do you thinkno method for nil:Nil class
means?", or "In your Sublime text editor, you can find the controller folder under the app folder."xyz concept
, but if I explained it anyway they would have an 'aha' moment like: "Oh! SoProductsController#index
was pointing to theindex
method in the Products Controller!"Those are some things I work on, and while I don't have that much experience teaching, I would hope that other teachers do simiar things.
Creativity is definitely key for learning. The more inspired students are to be creative, the more likely they will reach a solution to a problem or take ownership of their projects.
Also, definitely agree with project-oriented curriculum as opposed to testing.
Not sure how you currently manage the classroom and curriculum, but repl.it has a classroom management tool for students: repl.it/site/classrooms I'm always thinking about learning + CS and their tool caught my eye when I first saw it.
Anyway, hope you didn't mind reading this long comment. Thanks for doing the good work of furthering education!
This looks great; thank you!
I'll offer this.
A Scheme Story is one student's account of her experience in high school programming classes. It's old, and times have changed, but the core issues of how these classes are taught, remain.
And this:
-- from Structure and Interpretation of Computer Programs
And this.
-- from Scheme and the Art of Programming
Whatever programming language you choose to teach, if you're guided by the ideas of these great instructors, your students will leave your classroom enriched, glad they took your class, even if they don't take up careers in software development.
I'd just like to point out that Structure and Interpretation uses Lisp as its base language. It takes two or three passes just to parse the quoted paragraph, and I've never fully agreed with the notion that a program "is not just a way of getting a computer to perform operations but rather that it is a novel formal medium for expressing ideas about methodology. Thus, programs must be written for people to read, and only incidentally for machines to execute." Tell that to the poor devop who is working through the weekend trying to fix a bug in production.
Scheme and the Art implies that in order to program successfully we need to first understand the science behind the machine.
I mentioned it in an earlier reply and will rephrase it here. Programming is a trade, like plumbing. Computer science is a professional occupation. It's the difference between an architect and a builder. For some reason we've conflated CS and programming, and now when we tach a middle-schooler a handful of Scheme commands, the district declares that they are literate in computer science. If we'd just acknowledge that the two are different we could effectively teach programming the same way we teach wood shop (they still do that, right?).
It's a shame you didn't read the first article, as it completely demolishes your argument.
I suspect you don't know much about plumbing or carpentry, or you'd know that tradesmen are also craftsmen, and take pride in what they do. They know their materials, and how to select the best and avoid the worst. It's a way of thinking and seeing. I watched the guy tiling our shower carefully align each tile and grout it into place, so that at the end of the project, the grout lines were straight in every direction and you wouldn't have known that each tile had been individually put into place. That's pride in his work.
For you, perhaps, programming is nothing but pounding out classes, and picking up a check. "Learning to program" is just learning the syntax of whatever language gets you a job, or pays the best. But that's just your choice of approach. And that rather negative attitude toward programming is exactly what provoked Natasha Chen to write her article, because that's the kind of "programming" was taught in her high school. Boring, no fun, and useless.
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!!
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 personally favor the language agnostic point of view in favor of someone who can teach what really goes on in side of a computer. Basically, a first principles approach to computer science. We have an overabundance of programmers in this country that ride the wave of hot technology/languages, and a severe underabundance of programmers that first and foremost understand how computers work and choose the best technology/language to fit the requirements of the job. The former will also struggle to find meaningful and continuous work. Get kids excited about computers, not hot technology and languages. The rest will fall into place.
Putting the grand plan aside, if I had to pick a few simple languages to teach beginners, I'd favor Scheme for functional programming and Python for OOP (there's only one way to do it).