Starting back this past winter I started hearing about a National Science Foundation (NSF) project to create or perhaps promote might be a better way of putting it a new three course computer science curriculum for high schools. This is part of the Broadening Participation in Computing (BPC) program at NSF. I heard some of it at TCEA and more still at SIGCSE. It sounds pretty interesting. Clearly, in my opinion and in that of many others, we need to expand computer science education. We especially need more diversity in the field. Only some 20,000 high school students take the APCS A exam these days. That compares pretty poorly with over 80,000 in statistics which is a fairly new and still small (in AP terms) exam. Would a good course before the APCS course help matters?
What I have been specifically thinking about lately is this so-called first course. Some people refer to it as a pre-AP course but others see this as a course for far more students than just those who are headed for the Advanced Placement Computer Science course. I tend to agree. While it might be nice to have a lot more kids take the AP course – ok yeah it would be nice – I keep coming to the idea that what we need to do most in high school is:
a) get students interested in computer science and
b) give them some basics so that when they get to college/university they are ready to start if they have the interest
I’ve seen a number of my own students over the years take just one computer science course in high school and then do just fine as CS majors in college. Not taking APCS did not stop them because they had interest and some basics. So the question is – what should that first computer science course be like?
Should it have some programming in it? I’d have to say yes. But it doesn’t have to be boring or especially difficult programming. Start with Alice, Scratch, squeak/eToys or something along those lines. Then move to something a little more “real” like Small Basic, Visual Basic or perhaps Python or a functional language like F# or Scheme. Personally I’d avoid curly bracket and semi-colon languages but for some people C#, Java or even C++ will work out just fine. The important thing I think is to give teachers some choices. Let people teach with what they are comfortable with. If they like the tools teachers are much more likely to spread enthusiasm to their students. That to me is a key piece.
I think you also have to be concepts focused more than tool focused. I think that the activities at Computer Science Unplugged are great for that. its not just that they are fun and interesting it is that they move some of the focus from the physical computer and to the concepts themselves. That’s a big plus.
I’d like to see some computer history covered as well. I know. Everyone tells me history is boring. But maybe that just means we are teaching it wrong. We’ve got some real characters in the history of computers and we should play that up. There were some out of the box inspiring people like Grace Hopper for example. Let’s get some creative people to tell those stories in the best way possible. And stories are the way to do it – no dry recitation of facts and dates. That would be boring. But talk about the things that made change and innovation necessary. World War II and everything from code breaking to simple cannon trajectory calculations. Why was computing necessary for just in time inventory? And there are lots more we could come up with after a little brainstorming.
What else do we need? What concepts are key? Remember that in a single semester or even year course we can’t cover it all. Loops and decision structures? Absolutely! Right? What about object oriented design/programming? Is the first course too soon? Or should we use objects even if we don’t teach how to create them? Is recursion in or out? Can we use games as projects? Why or why not? What are good projects that build interest while teaching concepts?
Do you have or know of a scope and sequence document (or more complete package) for a first computer science course? Please send me a link at alfredth (at) microsoft.com or add it to the comments? Strong opinions about what this course should look like? Let me know in the comments, by email or write about it in your own blog and let me know about it. This is something I think needs a broad background of ideas and support.
Define Computer Science is the question I would ask.
I kind of look at CS as made of three major topics at the high school level:
1. Computer Apps - how to use popular software to its fullest.
2. Computer Technology - the basics of hardware, networking and how to fix things when they go haywire.
Of the three the first is by far the most critical to a HS student. If they do not understand Office, job opportunities just go away. Is that technically CS though? It has the computer part but I am not sure about the science part.
Computer Tech is kind of handy. To be able to walk in to a store to buy a computer and understand what the salesperson is saying is a useful skill. To be able to hook up a wireless network in your house is kind of nice. I have had several of my students get jobs at college computer help desks because of their knowledge from just those two classes.
Programming, on the other hand, I consider more of a specialty or industrial art like auto shop or wood shop. It teaches a skill as opposed to knowledge that is useful day to day. I teach programming to 8 – 11grade kids. I like the argument that it teaches logical thought processes, etc, etc. Of course, after having taught it off and on for 25 years, I am beginning to suspect that sophomores are not capable to logical thought. I think Computer Science should be more on how to make a movie using a video camera and software than programming. If we are going to attract kids to CS I do not care what language you are going to use, programming is not the way to do it.
A first course in CS should be a combination of software applications and a watered down A+ course. This would be the most useful to all students.
If you want to attract kids to programming, that is a completely different topic than attracting kids to Computer Science. Promise to teach them how to write games and they will be lined up at the door. After they figure out writing games involves work and logical thought (so much for sophomores) they will jump ship. Then teach programming to the students that are left. They may go somewhere with it.
Wow. Garth. Do not know where you teach those 8 kids but if one of them was mine they would be looking for another school. Programming is the core to Computer Science. Through it you give them -logical thought (sophomores might have more work to get there then the upperclassman, but they all started as sophomores), problem solving, math skills - Algebra 1 on up to Cal. BC, Physic skills, good writing skills covering say pseudocode - bet you knew it as flowcharting. Then there are the subtopics like networking, AI, GUI design and development, Database, class design, security, cryptography, game design, as well as the societal issues facebook hacking, phishing, and all the other bad items that the skills we teach can be used on.
There will be those that say Computer Science has no impact on my life, I am going into.. insert career here.. Funny thing about that.. I have two senior girls that plan on getting a EE so that they can have better control and understanding of how their medical equipment works after they finish Med. school. And the guy in charge of the stage crew at the Dallas Theater Center told us all about using his programming skills to help him and his crew design and set up each stage for all the wonderful shows they have done these past 8 years.
Oh just so no one can say I have no back ground to speak on these issues, this is my 14th year teaching Computer Science at the High School level where sophomores make up over 50% of my students. My program has around 120+/- every year with around 23 going into EE/CS or some other flavor of CS in colleges all over the country.
As to work.. LOL.. Give them a solid education in CS and even seniors will bust their butts with just three weeks left to design and build software projects. Something most senior teachers would love to hear/see this time of year.
I'm a computer science professor at a university and one of the reasons that students switch away from computer science once they get here is that their high school experience has given them an incorrect view of what computer science is. First, it isn't computer applications. Yes, those are critically important, but please don't call them computer science. Second, basics are hardware, networking, etc. is knowledge computer scientists use, but it is not computer science. As an analogy, grammar is something that writers need to know about, but is not the main focus of a writer's day.
The point I like in this blog post is that we should be thinking about how we teach novice programmers (in either high school or in college). The traditional, syntax topic focused, method is dry and tedious and causes us to lose lots of strong students. I think Alice and your other options for high school students are great ways to teach the logic and problem solving skills that are key to computer science.
In our curriculum, we don't have room to teach one more language, so we are looking at other ways to teach the "curly bracket and semi-colon" langauges. We have found some success by teaching students to read code before we teach them to write it. This lets us present much more interesting applications, helps the students focus on learning one thing at a time, and matches the growth of their cognitive maturity.
I see the relationship between learning applications and computer science as being a lot like the relationship between drinking beer and brewing beer. :-)
I do believe that students need to learn applications but word processing, spreadsheets and presentation software are things they should really know before high school. Learning how to fix computers and understand how they work is also a great skill but it is not computer science. Programming is a tool, perhaps the primary tool, to understand and learn computer science but it is like math in that is us useful for more than just a trade skill.
I sure poked that ant hill with a big stick. Let me clarify some of my argument. In a small school (my first CS teaching experience had 13 kids in the HS, my present school has 200) Computer Apps is part of the CS curriculum simply because there is no place else to put it and no else qualified to teach it. So by default it is part of CS. Hopefully by the time kids hit HS they are very familiar with the usual apps but then hope springs eternal. Experience is proving this is not true. I get kids from the local public schools every year that have no experience with any app other than Word and most of them can only do the very basics. So, using a very distorted Socratic argument, Applications is part of the CS department (maybe not by choice but by reality), HS students have to know Office (or equivalent) to survive HS, so the first course many HS students take in “CS” is Apps. My school is a K – 12 Catholics school and by the time our kids hit the 7th grade they can make Office walk, talk and chew gum. Picture editing, sound and video are all pretty much old hat by the time the HS gets them so Apps would not have to be part of the CS curriculum except for the 80% of the kids that come from the public schools. Let me make this very clear, I do not believe Apps should be part of a HS CS curriculum. It should be in Business, Accounting, English, Physics, Art, Media Arts, Math departments, but it isn’t.
For the same reason Apps is part of the CS department, Computer Technology is there also. The only other HS in the area that teaches a Computer Tech class has it listed in the same category as the shop classes. Probably a better place for it but most small schools have it listed in the CS department. Is Computer Tech a required skill? No, but it sure is handy to know why and how to put more RAM in a computer, how to recover and replace a sick hard drive, why you want to pop the cover every now and then to suck the dust bunnies out of the cooling fins on the CPU and how to get Mom’s laptop to talk to the wireless printer at home.
My definition of what CS is has been defined by the fact I have taught mostly in small schools where Apps and Tech are part of the CS department (if there are departments at all). So if you look at it from that perspective the First CS Course has to be the Apps course.
Perhaps we need to define “Computer Science” before we look at a first course in Computer Science. Bryan claims “Programming is the core to Computer Science”. My definition would be much broader than that. Wellington mentions that high schools can give students an incorrect view of what computer science is. I agree. Many high schools give students the view the CS is all about programming. To about 99% of the HS kids out there programming is comparable to watching grass grow. The local public school district has about 3000 kids in three high schools. Of those 3000 students, 13 are taking programming. (No, that is not a typo.) My school is 200 kids, and 15 are taking programming. Percentage wise my CS curriculum of Apps, Tech and Programming is working pretty well. In my opinion “Computer Science” needs to be “The Study of Things Dealing with Computers”. Maybe we should let the kids define “Computer Science”. If their definition includes making and editing videos which makes them want to work in the film industry - SCORE! If it includes the knowledge to make a professional presentation through the use of PowerPoint – SCORE! If it includes the knowledge that that the signal lights on the NIC were not on so something must be unplugged – SCORE! If it includes writing a TicTacToe game in Visual Basic – SCORE! (Sorry, went to a soccer ref clinic last night.)
I really like Wellington’s comment on syntax topic focus programming classes, especially the dry and tedious part. Languages like Alice, Scratch and Small Basic are trying to liven up programming because as it is it is for the uber-geeks (like most of us reading this blog). We need to tempt students into “Computer Science” by showing them that “Computer Science” is not just programming. Once they are in we can then show them what doors programming can open for them.
I like poking ant hills. I learn more from people’s comments on blogs like this than I can anywhere else. Besides, where else would you see computer science compared to brewing beer. Yummie.
I don't disagree that all of the things you want to teach are important. I just disagree that we should call them "computer science." If the students are excited by editing videos - SCORE, but call it film making. If they are excited by designing graphics in photoshop - SCORE, but call it graphic design. If they are excited by playing with the hardware - SCORE, but call it information technology. My concerns are grounded in the fact that when students major in "computer science," a lot of them are quite disappointed by the fact that we program. Being in a programming course when you expected something else is a very hard way to start college. Like it or not, programming the foundation of computer science. Interest in technology and the things it can do is great - it just isn't computer science.
I do think that all students need some basic understanding of how programs work because most will have to deal with technology as it changes and that thought process is going to be a key skill. Carnegie Melon's work in "computational thinking" is really interesting. As we look at the general education (non-major) courses in our department, we are moving toward that and away from hard-core programming.
I'm not sure why we try to hide the programming. It is a key skill for a computer scientist, so why try to lure kids into computer science if that doesn't interest them? While I think we can teach it in a way that is less intimidating, less tedious, and more interesting, I don't think we should apologize for the fact that it's important. Mathematicians don't hide calculus and physicists don't hide thermodynamics, why should we hide programming. If you don't like programming, but you do like the other things you "SCORE"-ed, then don't be a computer scientist - be what you want to do!
My core question in all this is: why is programming the core of Computer Science? Who decided that other aspects of computer use are not Computer Science? This is all just for the sake of argument of course. There is nothing wrong with programming being the core of CS, I just think that idea might be getting a bit dated. I have a degree in Math Ed and, although I a pretty much out of the field, was big into Math Ed curriculum and futures. In those years the primary goal of a high school and undergrad mathematics education was calculus. It was the pinnacle of courses and, for most, the end of the line. But then I had an epiphany. I looked around at the real world and realized that calculus was only being used by an extremely small number of people in the real world. In the real world statistics is the real driving force. Statistics controls the economy, statistics controls business and government, statistics is the basis for science. Calculus is only needed as an accessory to statistics. A statistics course should be the pinnacle goal of high school and undergrad mathematics. I have not done well in that argument either but I seriously believe it is true. I think I can slide this same argument in to the Computer Science realm. Programming is presently the “core of computer science”, but should it be? I think we, the people that teach it, need to broaden that foot print. I believe if we continue to think of computer science as being focused around programming we are going to continue to get the rather disappointing enrolment numbers at the upper level. Do I think “Film Editing Software 100” should be offered in the Computer Science part of the catalog? No way. Do I think someone studying in the field of Computer Science should have a fundamental understanding of film editing software in general? For sure. I think we, Computer Science educators, need to ensure that this kind of course work gets squeezed under the Computer Science foot print. Programming should be one of the core elements of Computer Science but should be no more important than general application use, hardware, networking, MCSE/MCSA/A+ type knowledge. Programming has to be a required element of any CS degree, after all, a program controls that fancy new Cisco router on my shelf, but a CS guy should also know how to get that router up and running in a reasonable amount of time. Speaking of Cisco routers and reasonable amounts of time, I really do have a new router on the shelf I need to get working.
Keep trying to enlighten me. I like the ideas we pass around.
I think programming is core because computer scientists design and build software systems and they can't do that without programming. I agree that not all mathematicians use calculus, but all software developers program in one way or another.
I agree completely that computer science students should have a fundamental understanding of the current state of software applications in their area of interest. Our graphics students definitely know about film editing software, but our real-time/embedded students may not. They know a lot about controllers and the software that controls your anti-lock brakes.
I don't have to teach my students about applications. They are fully able to click around in an application and follow tutorials on their own, so I don't need (or want) those applications in my curriculum. Similarly, given a router, most of my students could figure out how to get it up and running without me teaching that particular topic. Computer scientists learn a way of thinking that allows them to pick up new things and figure out how to make them work. That comes from experience (we make them use a lot of stuff without directly teaching it to them) and I'd never argue against providing those kinds of experiences. However, I still believe that using applications isn't computer science and we mislead high school students when we say it is.
What a fun discussion!!!!!
“Computer scientists learn a way of thinking that allows them to pick up new things and figure out how to make them work.” That is what I think should be the core of Computer Science. Let’s make it so. It covers all situations and is open ended enough to change with technology and teaching methods. Now if we can just convince the rest of the world to agree with our definition we will be good to go.
Just to provide more information for the discussion you may want to look at this post by Mark Guzdial http://www.amazon.com/gp/blog/post/PLNK16UEGTT64A94V and this one from Ian Bogost http://www.bogost.com/blog/teaching_computing_with_comput.shtml Both men are at Georgia Tech.
You are very good at this! I was looking at the quote you took a very different way than the way you took it. To me, that is a side effect of all of the time my students spend doing traditional computer science things. In other words, their core understanding of how software works (because they have had to build a LOT of it) allows them to achieve that goal. However, I never thought of that as the primary goal of computer science - to me, it's a happy side effect.
I still think that computer scientists build software and that requires an ability to program. But, I'm willing to be open minded for the moment. If we aren't teaching them programming, what are we teaching them?
I had one other thought about your math (calculus vs. stats) analogy. Maybe programming is to computer science what arithmetic is to math. The only problem is that we don't teach computer science in elementary school! Logo/Alice/excel/powerpoint/video editing/web page creation/etc in elementary school could set our kids on a much stronger course and would help them really understand what computer science is.
I think it's interesting that we teach every other science in elementary school, but we're surprised when their first exposure to computer science is a challenge. Maybe the problem isn't with teaching programming in high school/college - maybe the problem is the lack of preparation we have given them for that activity.
Computer Science is being taught in some elementary and middle schools. Both in the broader definition I like and in the traditional programming definition. My school has excellent Apps courses for 6 - 8 and Office in the 2 - 5 grades. I have taught Alice to 7-8 but had major time conflict issues, I am the school's one and only computer fix-it guy. My daughter is in one of the local public middle schools. The amount of computer experience she has had is criminal. The local public schools are the reason we have to offer a freshman apps course. There so much good stuff in programming that could be pushed down to the middle schools. Scratch, Alice, Small Basic, and even some simple VB.net stuff would be well within the middle school ability. Programming is like drugs, get them started young and we can maybe get them hooked for life. A real ugly analogy but it is getting late and I am brain fried. The biggest problem with programming in middle school I have encountered (other than a teacher) is time. The kids simply do not have a slot in their traditional schedule for a pure programming course. Math, science, social studies, language arts, health/gym, music and art, these fill up the day. My school uses an A/B schedule so theology and computer apps can get squeezed in. The kids are busy. Trying to get a CS course into the schedule requires an act of God. It is truly amazing how unimportant the elementary system treats computer education. It is like the most important development in human society since the invention of beer.
Another major stumbling block is finding a middle school teacher that knows programming or almost anything in the CS field. It is definitely not part of an Elementary Ed degree. Don’t even get me started on the state of Computer Science for high school teachers.
Speaking of beer, I had better go make sure one of those in the fridge does not go stale. I will retire this essay before I drink that beer. After the beer I tend to get really excited about the state of computer education but less understandable than my normal gibberish.
Alas, I put responding to this on the todo list and... well, here I am a month later! But I think it's an incredibly important question so I'm going to address it nonetheless.
I agree that it's important to define 'computer science' and the conversation here has been interesting.
What I'd like to see, though, are more concrete resources available online. For example, I wanted to teach Scratch to some high schoolers recently and couldn't find any compelling materials to reuse. I'm talking lecture notes and more importantly, assignments. Attempts at broad curriculum definition such as CSTA's are interesting, but they're one step too abstract to really be useful, I feel.
One thing is clear to me, intro courses need to be highly structured with clear expectations. I'd love a pointer to some non-AP materials (Scratch, Alice, Python etc) that are specifically focused on teaching CS topics (not tutorials). Knowing what's available and tested would be very helpful for educators to better address the question of what to teach in an introductory course.
Here's some of what I ended up doing with my high school students: http://www.helenemartin.com/?page_id=6
Thanks for the reply and the link Hélène. I beleive that the Scratch people are concerned about the lack of curriculum resources and are working on that problem. I look forward to seeing what they develop.