What are the skills that a public school Computer Science teacher should possess?

Louis Frankel May 15, 2017

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?

markdown cheatsheet

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!

One basic example would be to create a basic HTML+CSS website

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!

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:

  • You can do better than these platforms and I'm glad you're trying to, but a combination of your own system and use of these good tools seems like the goldilocks zone if possible.
  • CS is different from coding and if possible, provide a quick path to making something fun that kids can show off to each other. To this end, I think a curriculum centered around an achievable project that can be extended and built upon if kids want to hustle is ideal.
  • With that in mind, I would center the curriculum around JavaScript because every browser is also a JavaScript editor. It will speed things up and limit dependency frustration.

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.


  • This is how Google became so big and magnificent... with computer science!
  • This is how Alan Turing won the war... with computer science! (Bonus, you could show that wonderful movie)
  • This is how we put a man on the moon... with computer science (Same bonus of movies!)

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!!

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 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:

  • Being overly specific. During the first few weeks of classes, I find myself repeating a lot of different things like, "Open your server, which is in your Terminal, and look for the params hash", "What do you think no method for nil:Nil class means?", or "In your Sublime text editor, you can find the controller folder under the app folder."
  • Also being overly specific when trying to understand their questions. I'll make them ask the question again but with more detail to make sure they understand what the problem is. While it helps me answer their question, I'd say 70% of the time they answer their own question.
  • Over-explaining a concept to make sure all gaps of knowledge are covered. I've had some questions where a student told me they understood xyz concept, but if I explained it anyway they would have an 'aha' moment like: "Oh! So ProductsController#index was pointing to the index 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:

Our design of this introductory computer-science subject reflects two major concerns. First, we want to establish the idea that a computer language 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. Second, we believe that the essential material to be addressed by a subject at this level [1st year university - mp] is not the syntax of particular programming-language constructs, nor clever algorithms for computing particular functions efficiently, nor even the mathematical analysis of algorithms and the foundations of computing, but rather the techniques used to control the intellectual complexity of large software systems.

-- from Structure and Interpretation of Computer Programs

And this.

Programming should be from the beginning a creative and literate endeavor. Our goal is to expose the reader to the exhilaration of reading and creating beautiful programs. These programs should be concise in their expression, general in their application, and easily understood. These goals are achieved through creative use of abstraction techniques that capture recurrent patterns of computation and allow them to be simply used.

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

Not a teacher, but I know Apple has some resources (and free I believe too) to learn coding basics.

For iPad:

There's also these teaching manuals toward the bottom of this site, and other resources as well:

Hope it helps && I love your initiative! Good luck!

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 sent this to my high school computer science teacher, Josh Paley, and he sent this:

There is a big difference between teaching CS and being a professional programmer. There is also a difference between teaching CS at the high school level and teaching it at the university level. Some issues include:

  • Bottom line: The job of the high school CS teacher is all about getting students to learn big ideas and to generate enthusiasm.

  • A fun classroom environment cures many ills. (I don't think any of the commenters addressed that.)

  • Building relationships with students so they like the teacher is enormous at the high school level. If they like you at least a little bit, odds are they will try hard. (This can be more difficult to do with larger class sizes.)

  • Minimize take-home homework. Students can do plenty in class.

  • Things like testing and debugging methodologies are critically important to learn, but I worry that they are a fantastic way to get high school students to fall asleep. There is no reason that I can see for such things to be dwelled upon in detail in high school. Much better to delegate that to the university level or industry.

  • There is a difference between choosing a language for learning purposes and choosing a language for professional work. Teachers need the former. What are the big ideas that high school students should be taught? What barriers are there to learning big ideas?

After all these years, we still use Scheme for a first language at Gunn. Given the feedback I've received, I wouldn't change that at all.



PS: We now have about 330 students taking CS classes and next week there will be a presentation to the PAUSD Board to make CS mandatory for graduation. Times have changed. :-)

"What do you think teachers should be teaching, and what do you think children should be learning?" As we approach the emergence of artificial intelligence, students ought to be taught basic programming techniques already couched in the necessities of coding Strong AI. For example, teach the kids not just to create an array of, say, customers, but of concepts and of AI memory channels. In some ways I am a Cassandra and will not be believed here, but please check out strongai.quora.com/AI-Mind-Maintainer or ai.neocities.org/maintainer.html to see how kids can learn not just coding in general, but coding artificial intelligence.

Wow, this seems like a really broad question, though I only posses opinions on the matter, I feel strongly about people acquiring the skills for the next steps and/or rather the future blossoming industries in programming development. For me is about O2O, machine learning and API interconnectivity.

Before I start explaining myself let me just say, even though I studied engineering, it was rather difficult to find how to implement my programming skills into real world applications(practical), since I was taught in from a theory perspective. I dont know if I've ever gone through a day without going into StackOverflow. We all need answers, and for programmers this is where we get them, instead of reaching for a book on all the theory behind a specific Programming Language.

So back to the reasons on focusing to the new and upcoming tech industries, O2O, Machine Learning(AI), and blazingly fast frameworks and databases are all the rage now a days inside and around dev's communities. So tying to grasp the ideas behind it would be a plus for upcoming young people. One of the fastest and easiest ways to enter into this realm I feel is Python(programming language), Redis(database), django or flask(web frameworks) and swift for programming simple apps in iOS. This are really simple to use and the latest in web apps developments which O2O is all about. For machine learning theres a lot of videos weekly coming up in youtube, with all its info, but python seems the way to go.

One project that may cover much of this things has been published and is well documented, is only 30 hours, but "maybe" it can be reduce a little bit more. It's called UberEats and you can find it at code4startup.com/

Leo Trieu is really cool explaining lots of the in and outs for this project, not trying to publish his work, but I feel strongly that lots of info from that project of UberEats, may be a good and interesting start for new and upcoming youngsters trying to understand and get into code.

This question even though is broad, still is a really good question not only for teachers but for everyone, since we are starting to get into a new generation for life that depends completely in the understanding of programming languages. Sadly the programming language literate is a really small bunch out of the whole continents with access to good computer resources. More and more the separation of people who code and people who don't grow steadily which at this point is worrisome, since we don't even know how life is going to be in 5 years from now. If society is worried about how robots are going to take over simple task jobs, then they should be more worried about how O2O is going to take over all transactional services and retail services, which of today is the biggest industry yet, e.g. Walmart. For me I did gave my opinion of the matter, but the reality is that ALL people no matter what age, NEED to learn to code. That simple.

In addition to the basics, I'd love it if teachers included source control. It's an essential skill, yet you'd be surprised how many "professionals" still aren't using a source control system. I'd recommend Git, but introduce it through one of the many free GUI wrappers for it. The reason I recommend Git is because it gives you an opportunity to introduce trees & graphs to your students at the same time.