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...
For further actions, you may consider blocking this person and/or reporting abuse
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).
This is and interesting topic. Teaching teachers, huh? Well, in my opinion, someone who's already teaching has to be good at it and obviously always improve and stay updated on new tecniques. And children what school offers now is good program and I wouldn't touch it. I would get more oral tests because writing is not relevant anymore since you can order it on this page.
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.
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.
Regards,
Josh
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. :-)
There's a ton of great comments here, so I'll be short.
First, like many said, apart from just programming you need to get your students to solve problems by writing algorithms (even on a piece of paper). This will introduce them to a different way of thinking - step by step. (There's a cool video on YouTube where a father asked his kids to write him an algorithm on making a pb sandwich)
Second, JavaScript and Python are great languages but kids need something that will show them results, which I guess JS kinda does. My first language was Visual Basic which has a very nice "English" syntax and it's mostly about setting up a form, drag'n'droping controls onto it and setting their behavior. Then in middle school we had Logo and where giving commands to a little turtle that drew on the screen.
"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.
I used to teach adults web development. I prefer using projects and leveraging collaboration among students. Having a problem to solve and collaborating of design and solutions is more like how it is applied in the real world.
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.
I think that something that helped a lot of my friends was an understanding in discrete math, actually. I personally learned without taking a discrete math course, but I know a lot of my friends understood a lot of their coursework after taking one.
It teaches some important concepts, like expressions and simplification, and how they apply to programming. There are also languages based entirely on discrete math (functional programming)
From what I've seen, people who are pretty good at math, but are a bit lacking in programming would benefit greatly from a discrete math course.
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.
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'd suggest two things:
So, Software Engineering and Computer Science are overlapping, yet separate domains. The objective of the domain informs the things to which you expose your students.
I take Computer Science to literally mean the science of computational hardware. Knowledge of transistors, bits, bytes, registers, buses, CPUs, FPUs, etc etc. Programming could be useful to introduce students to the inner workings of computers, but not with any of the tools that have been mentioned. Browsers, scripting languages, and markup languages communicate absolutely nothing about the inner workings of a computer.
I teach my son C because he can do it. I'm not sure that's a good fit for a class. If it isn't fit for you it isn't going to work anyway.
But there is a better option. Something like BASIC running on a MOS 6502 CPU (which you can simulate in a Commodore 64 emulator). BASIC was specifically designed to be super simple while exposing the most minimal micro-processing environment that you don't just control with programs, but also configure by directly accessing memory addresses that control its features.
"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.
Here is how it works at 42: you learn to learn. We start with a low level language (C) and are only allowed to use syscalls like 'write' or 'read' for our projects. That way we understand what truely happens when we compare two strings, or how does printf works.
Then, as our assignements get more and more complicated (reading a line from a file, recoding a shell, recoding malloc, coding a kernel, etc...) we found ourselves understanding higher level concepts a lot more easily.
But the main thing is that the language or whatever algorithm is not important. What truely matters is the ability to understand what is going on under the hood and to be able to teach yourself how does it work.
I can resume it in 2 points :
-Don't do tests, give projects
-As much Examples as you can
I taught a single semester intro class at a high school and we used PLTW (pltw.org) as the curriculum. There's some things I might do differently, but all in all I think they were pretty good.
Debugging, autodidactic learning skills like "how to google", version control, internet and personal computing security, password security.
invisibility. infinite patience. the ability to recognize the fact that much like not every student who studies literature will be Milton, not every child will be torvalds.