Tuesday, March 27, 2007

High school computer science education

I've read so a bunch of rants about why university-level computer science is terrible, but nothing about the high school level. As a high schooler (you read that right), I think this should be given more attention: high school computer science is terrible in at least 90% of schools. I know there's been research as to how to teach children, whether Scheme or Java should be used. But really, that's irrelevant. The relevant thing is, we need better teachers.

Brighton High School is known for being a great school academically. There are four different programs for getting college credit while in high school, including multivariable calculus and linear algebra courses. We ranked in the top 25 in that stupid arbitrary Newsweek survey of high schools, if that means anything. But our computer science is terrible.

It's not for a lack of interest. In 7th and 8th grade, when kids in advanced mathematics started to get graphing calculators (always TI-83s, of course), programming little games became very popular in the primitive BASIC included with the calculator. I wrote a centipede clone and a "racing game", which was more about not hitting the wall than going fast. When high school started, a lot of kids took a computer science elective as freshmen. I decided not to, thinking I wouldn't learn anything. From what I heard from other people, that assessment was accurate. In one semester, meeting every day for nearly an hour, the class learned how to define methods in Java, do simple arithmetic, and at the end, write a program called "bank account" which used two parallel arrays and a simple CLI to let users create a bank account with a name and an amount of money. Using text commands, you could make new bank accounts or deposit or withdraw money. They did this in around 200 lines of code.

Ignoring the fact that, in a more rational programming language, it would be less than 50 lines of code (if that), the real question is, how did they do so little with so much time? It's not that the kids were stupid. It's that the teacher doesn't know anything. The two teachers that have been assigned to teach computers science were both basic math teachers with no real training in software engineering. From what I've heard, they're terribly incompetent, and the only way to actually learn how to program is to learn form the textbook. Algorithms and computational complexity? Data structures more advanced than a primitive array? Those don't come until the "advanced" year-long AP computer science class, and they're only discussed, not implemented. The advanced course was cancelled this year and next year due to lack of demand. Last year, only a couple people did reasonably well on the AP, and these were people who spent class just learning by themselves out of the textbook.

Though it would be nice to use some more abstract language like Scheme or Haskell (or maybe even Factor), that's not really the issue. The issue is that the school doesn't really value computer science as a subject. If they did, there would be a computer science teacher and some thought would go into the curriculum (which is currently just Thinking in Java out of order, with lots and lots of repetition).

In the modern world, computer programming is very important for a large group of people to know. I think it is more important than physics or chemistry because it has a direct use behind it: creating software. I don't have any figures on it, but I'd be surprised if there were more physicists and chemists than there are software engineers. But the core curriculum for students in the United States is homogeneous, fixed and arbitrary: there's English and math (which are good), and then there's a rather nationalistic version of history, and a selection of sciences (physics, biology, chemistry) that is interesting but, for most students, very forgettable. In any case, sciences must be retaken from the beginning at the college level, so high school science study seems almost pointless. By contrast, computer science--like English and math--is often readily applicable if well-taught. I'm not saying it needs to be a mandatory subject, it should just have more attention.

But it's unlikely to get that attention anytime soon as long as it's considered just another elective. For now, I'm doing my best to help my CS-deprived learn more, helping them through SICP and explaining what, exactly, computational complexity is. This is something that is barely covered even in the AP class.

I talked with my principal today about the need for better computer science education in our school. She was nice about it and said she would look into getting more training courses for the computer science teacher, as I suggested. But honestly, I'm not sure if anything will happen.

Update: Hmm, maybe they will listen to me. Later that day, when I wrote this blog post, a different administrator came up to me and said (paraphrased), "The principal told me your ideas about to get classes for computer science through RIT, and I think that's good." So maybe something will happen, even if that's not really what I meant.

12 comments:

hs comp. sci. teacher said...

I was very interested to read your opinion on the state of computer science education in high school. I am a former software engineer and am teaching computer science at a technology magnet school. I want to take a serious look at how to make our computer science courses more about algorithms, thinking skills, problem solving and the attributes of a good computer program. I found your blog while searching for information on what is working (and not working) in computer science education at the high school level. I'd be very interested to read what you think the ideal freshman and sophomore computer science courses should include, given that the junior courses are AP A and AP AB.

Daniel Ehrenberg said...

Hi HSCST,

I'm kinda surprised that you're taking my post seriously. The biggest problem in my mind is that most high school teachers don't know what they're talking about. Obviously you do, since you're a former software engineer.

I would have loved to take a computer science course in high school that was totally mathy, but of course that's only maybe 1% of your student body. It's difficult to imagine what the ideal course would be for people just starting out, but it'd probably be something continuing the early experiences with programming that I and many of my classmates had on the TI-83. Using a simple BASIC dialect without easy-to-use subroutines or scoping, we made games using an 8x16 grid of letters. In a beginning programming class, students could work with a 64x64 grid of pixels, draw simple stuff and make simple games out of these things. Through this, you could demonstrate basic programming techniques pretty well, and make it interesting and relevant. If I had my choice, the language would be Scheme, but that's more of an opinion.

But the important thing is that you know what you're doing, and you're working seriously on a curriculum. Just that will avoid most of the problems.

HSCST said...

Whew - my German is non-existent, so I'm glad I clicked on the right button to post another comment. Parlez-vous francais?

I took your post very seriously. One of the reasons that I want to look at what our program has been doing and how to improve it is that students keep telling me that they "learned nothing" in freshman computer science last year. Even accounting for expected teenage hyperbole, that's not good. I'm using C++ to introduce programming in 10th grade, and still floundering a bit to find what the 9th graders need to learn to serve them best. We've been doing some binary-hex-decimal-ascii conversions and I've been showing them the math behind that. (One of my degrees is in math.) I'm actually toying with the idea of doing a unit on logic and proof, and using Excel to create truth tables, etc. I know that many of my kids won't go on to become programmers. But I also know that the ability to break down a problem and develop an algorithm to solve it is a life skill that will serve them in any future path they choose, and that programming is a great way to teach those skills. That's the approach I want to take. Now all I have to do is to figure out how to do it.

:-)

Alfred Thompson said...

There are many high school CS teachers who do know what they are doing. I talk a lot of them. But it is also true that there are a lot of them out there who could use some help. There is actually some curriculum resources at the beginner developer learning center http://msdn.microsoft.com/en-us/beginner/default.aspx and the Microsoft Faculty connection site. http://www.microsoft.com/education/facultyconnection/bz/default.aspx

Anonymous said...

As a Masters student in computer science, I must tell you that even though I agree with your comments regarding lack of proper teachers for HS computer science courses, I don't agree with your assessment of proper language to teach.

You should feel extremely lucky if they are teaching you Java in HS. They used to teach Turing to us in grade 11 and C in grade 12 and OAC.

Our computer science teacher at vaughan secondary school was an almost illiterate person who knew absolutely nothing about programming. He just came to classes talking about his HS baseball team and flirting with the girls. Funny that now he is actually the head of the comp sci debarment there, which speaks a lot about the quality of education there.

Anyway, in most public schools we have the gym teacher teaching algebra to students, so I wouldn't think this is limited to comp sci.

As for language to use, I believe basic/C/Turing/Visual Basic need to be removed and replaced by C++ and Java. The teacher needs to reduce the amount of boring bank account and student record assignments and labs and try to incorporate graphical assignment instead.

In Java this is easier to achieve while in C++ the teacher might have to include an extra library (written by himself or others) as a wrapper to opengl commands.

Current students are born gamers and if you like playing them you're very likely to love making them as well even if it's very simple. This is the single best way to keep students interested and allows them to be creative. I strongly oppose teaching computer science courses the same way as you would teach a math course. Comp sci needs to be thought in an interactive atmosphere.

Teaching the concept of pointers is interesting to avid programmers but not to the average student. If you show them why it's necessary to use a pointer (e.g. in a game) others will be interested as well and everyone learns rather than the hardcore programming geeks.

sbuck said...

As a self-taught programmer with a BA in Economics, Business and Accounting, I can tell you that there are essentially two learning tracks. One is teacher/professor led, and the other is self-teaching. I've hired both types of programmers. The typical MS in Computer Science major knows different things than a self-taught programmer, purely as a matter of course. There are certain thought disciplines that are reinforced in a lecture/classroom setting but those disciplines often come at a price of not knowing about other things, like familiarity with APIs. They may learn that some parts of programming are more important than others.

On the other side, a classroom taught person will generally find it hard in the real world when given a real world task to complete, because it requires so much research that they are not comfortable with. They expect to be "trained" for each new endeavor, and some feel resentment when that training is not provided.

It is inevitable that someone else will need to maintain your code and they will not be productive if your code is unreadable or unfamiliar, so I'd rather call coding disciplines style conventions instead, wherein with style there is no right or wrong, just consistency that matters.

The other problem with high school and college professors coming from the math world, is that most computing does not, in my opinion, involve math at all, and the mathematically trained person will likely, once again, fail to learn some computing skills while learning math skills. Math is painfully evidence-free, and math teachers love "elegance" when real world measurements are rarely elegant. This leads them to teach non-real-world examples to maintain that elegance....leading students out the door with useless skills.

If you are only taught how to compute triangles, then every problem will look like a triangle. ;)

That said, I do find the "institutionalism" associated with taught courses good in that they show that the person is capable of learning a prescribed set of skills. Rather than focus on the fact that what you learn might be useless, focus on the fact that you CAN learn, and exercise your brain according to the institutional prescriptions. When you can learn both what is needed AND what you want, and you are comfortable in a social environment discussing concepts and verbally reinforcing your newfound knowledge, you are well on your way to becoming a valuable asset to the field and to society, whether you are self-employed, or employed by others. Cheers!

auro said...

I just stumbled across your post and thought it was quite thought-provoking.

I teach CS at a girls school to Grade 11 and 12 girls. I am a relatively recent CS grad, from a well-respected university, and a qualified teacher. While I recognize that I don't have a lot of industry experience, I like to pull from my own experience of learning computer science.

When I was in high school, we learned bits of Visual Basic in essentially an applications course. Our teacher encouraged us to "go beyond" and while we didn't do a lot of serious analysis of algorithms or even a lot of coding of serious algorithms, I think that the logical work that I did playing around in VB was worth it. I couldn't compete in the programming competitions very well, because I didn't have any knowledge of standard algorithms or even proper input/output (everything had to go in or out of a text box on an interface). I was a bit annoyed that we received 50% of our marks for labeling all of the components correctly, but enjoyed the flexibility in our assignments.

When I got to university, at first I felt like I knew nothing. We learned Java in first year and I thought I was in over my head. However, I made it through and quite enjoyed learning about algorithms, data structures, and other CS topics. Personally, I don't know if my enjoyment of some of these more technical areas would have been has high, if I hadn't had the opportunity to "play" in high school. I currently teach Grade 11 and 12 CS using Flash (I know, many computer scientists cringe when I tell them that) and our girls have a good time. They are able to get programming quickly, but also write classes and all of the standard basic algorithms. We have the option of putting a pretty interface on the front end if desired. I use simple games (Hi/lo guessing, Hangman) to make it interesting and look for ways to bring in things that are interesting to them whenever possible.

The last comment that I'll make is that it is not always the case that the teacher doesn't know what they are doing, and that's why the course seems so slow. I have a lot of knowledge beyond what I give my students, but I try to judge what they are able to do. I try to push them to go beyond, but it's hard when there's only one of me and several of them. Often, the teacher is limited by the slowest student in the class, and in programming, the slowest student can be several magnitudes slower than the rest. I have students who get two lines of code written per class and others who never have to do anything outside of class, and have amazing programs to boot!

omar said...

I read this post looking for computer science summer programs and i found it interesting that others schools teach FLASH or teach through a text book. I go to Cy woods highschool in Cypress Texas and our Computer Science program is awesom imo. Our teacher Mr.Armstrong is a great lecturer and is really experieced in the Computer Science fields, he always pushes us to exceed our limit. If any of the teachers are in the dark of how to teach computer science or how to captivate the students please visit apluscompsci.com(it's my teacher's website Mr.Armstrong) and you will learn a thing or two. Anyways i believe that Highschools should teach mainly using JAVA, C++, XNA(can make xbox games with!), and blender. These programs are really ineractive and teach the fundamentals yet captivate the student. PS teachers dont give up on the slowest of the students!!

Anonymous said...

Interesting...I stumbled across your opinion while researching HS Computer Science lesson plans. I'm one of those unqualified HS Computer Science teachers. And, I will admit, I have zero knowledge of Computer Science. In fact, when I was called and asked if I would be interested in teaching Computer Science, I told the principal that she had the wrong applicant. I have a BA in Art History and an MA in Marketing. However, I was assured that my role in the CS department would be to focus on the "why" of student's projects. In other words, the CS teacher would teach the "how" of building websites, animations, etc., and I would teach students the marketing aspect. Awesome! Guess what? It's the 5th day of the school year, the other two CS teachers have quit, and I'm now the lucky recipient of 5 classes of Computer Science. I've never taken a CS course in my life. My students want to learn programming, and I'm not sure of what a Jump Drive is or how it works. As far as I'm aware, there are not any efforts to hire a more experienced CS teacher.

I have a feeling that a lot of HS Computer Science teacher fell into the position for a variety of factors, specifically a lack of understanding on the part of the administrators as to what Computer Science is. My understanding from our school curriculum is that the frosh/soph CS classes are basically to learn Word, Excel, and PowerPoint. In reality, the students have been using these programs for years, and, for the most part, they are quite proficient. They want to learn more complex concepts. This is such an important field of study, especially in this day and age, but our schools do not seem equipped to handle anything outside the classic topics of English, Math, History, etc.

As I contemplate whether to stay the entire school year and teach these poor students virtually nothing or give my notice and hope they find a more qualified applicant, are there any sources online that provide step by step lesson plans for the unqualified Computer Science instructor? I'd like to be able to challenge my students with something other than the MicroSoft suite.

DrJ said...

I am hopeful that my district will add computer science to the high school curriculum for the next fall. I have been investigating different languages, and at this point, I believe that using C to introduce structured programming techniques and then moving to C# to teach object oriented concepts would serve my students best. I believe C# has a broad appeal for applications, graphics programs (with WPF), server-side applications with ASP.NET. Of the modern languages in use, C# implements object oriented techniques with a cleaner approach.

Mark Hayes said...

a very interesting thread indeed. i am a computer science teacher in an international high school in hong kong. we use a tool called Greenfoot which I think may prove helpful for teachers from other disciplines thrown into CS classes. There is a very good text available from the creators of the Greenfoot framework. Greenfoot is Java-based and is a 2D microworld framework geared toward hs students. you do need to know Java, but the context is very visual and lends itself to creating games and simulations. as one post pointed out, students are natural gamers and this tool is written with this in mind. highly recommended.

Mark Hayes said...

have a look at Greenfoot. a Java-based 2D microworld framework for creating games and simulations in a very visual context. written with high school students in mind. the creator has written a text book for it as well. details at greenfoot.org - highly recommended.

video at the link below (see 26:00-31:00) mentions the author's ideas on why CS is not popular in HS, and how tools like Greenfoot can help turn it around.

http://omitsoft.blogspot.com/2008/03/teaching-kids-to-code.html