Happy CS Ed Week!

Today kicks off the annual celebration of Computer Science known as Computer Science Education Week.  In honor of the week, I made cupcakes (in binary of course).


Tomorrow, we’re hosting an Hour of Code event.  Wednesday and Thursday, we’ll be having a guest speaker Skype in to my CS classes. Also on Thursday, I’ll be running a faculty workshop on coding, with a special surprise for them.  So there’s a lot going on!!

What are you doing to honor the week?

Robots in love (and other robotic truths)

My CS I students are finishing up their first big projects.  It’s a pretty open-ended project that’s intended to have students use the skills and concepts they’ve learned over the last few weeks in a larger and more complex context.  I’ve been thoroughly impressed with the things they’ve come up with so far.  I’ve got a robot tour guide, a robot hide and seek project, an art museum docent/aspiring artist, several varieties  of word games, and a robot musical.

A popular project is the robot dance.  One might think that would generate boring are all the same kinds of projects, but it doesn’t.  Some of my students, even, are a little worried that they haven’t done enough, but I’ve assured them that they’re just fine.  Here’s just one example of the kind of thing they’ve done.  It really is super fun. (And sorry to my Twitter followers who’ve seen this!)


What learning is supposed to look like

My teaching goal is always to eventually have students working fairly independently, creating things they’re inspired to create, figuring out what they need to figure out as they need to.   Especially in my Maker-oriented classes, where students are working on their own things, I really want them to find their own solutions.

There’s a lot that goes into getting to that point.  There’s laying enough foundation, so they’re not totally starting from scratch. There’s getting them used to exploring on their own, and not asking for help all the time or asking if something is right or good enough.  That second piece is harder than the first. And there’s getting them to work even when the reward is a long way away.

I was rewarded yesterday for all my hard work in building up the foundation (some of which continued today).  I walked around the room, checking on projects, asking if help was needed, and after one circuit, no one needed anything, so I sat and watched them.  It was weird, and honestly, the first time that’s happened in 5 years.  It only lasted for about 5 minutes, but hey, I’ll take it.

For context, here’s what my students are working on:

  • A cardboard dollhouse with lasercut pieces
  • A board game
  • A mini wooden townhouse with lights
  • An arc reactor a la Iron Man
  • A photography portfolio page
  • A robot that avoids walls

They all came up with these ideas and designed them themselves, and then had to execute the design themselves.  Each one involved learning new things: learning new software, learning to solder, learning to program.  Just by going through the process of figuring out what you need to know in a couple of smaller projects, they kind of had a handle on how to proceed for this bigger one.  I think they have had fun.  They’ll finish up on Monday.  Here’s some pictures that capture the essence of a) middle school and b) #makered.

Creative Computing


Board game

A great #makered week

Last week, things really started to gel for both my 8th grade Creative Computing class and my CS II class.  On Thursday’s #makered chat, I posted this:

This is an 8th grade student going to town with a Hummingbird Kit.  The assignment was to create something physical with a Halloween theme.  And while her robot probably will only loosely be Halloween-y, she’s ready to work on this for the next few weeks.

8th Grade Student and her 3Doodler success
8th Grade Student and her 3Doodler success

Another student wanted to make a Haunted House, so she laser cut the front of a house, and then used a drill to cut out the windows and then started using the 3Doodler to enhance some of the details on the front.  She asked if this house could be a prototype for a whole city.  Um, yeah, I said, That would be awesome.  She said, oh man, this is what I’ve always wanted, to be able to do stuff like this.

Meanwhile in CS II, I’ve been trying to corral what is a pretty feisty group of students.  There are only 7 of them.  They have been bonded through their experience in CS I, and they have a tendency to want to goof off; however, this week, they finally got to work on some object-oriented programming, again with a Halloween theme.  Below are two of the projects.  My CS II class is at the end of the day, and is followed by a free period for students. Many of my CS students just stay and keep working.  It’s pretty cool.  At the end of last week, I was feeling pretty darn good about my students.  And I have more good student news to share.  Stay tuned!


What all my CS students should read

This is an old post, but it popped up in my feed last week.  In it, the blogger describes how he went to a hackathon with a friend, a person he described as a programming god, and just felt totally inadequate.  He watched his friend and realized that his friend didn’t know everything either, that the friend just Googled the problems he ran into and then figured it out.  The next hackathon he went to, he was the programming god, because he followed his friend’s lead.

Both of these people are CS majors in college.  Going from CS major to work at Google (or any programming-oriented job) is a big leap.  You know the foundations, but you do not know exactly how web security works.  When I first started learning to program, I did a combination of things.  I used other people’s code and modified it to do what I wanted.  In order to do that, I had to understand the code.  I went through books, step by step.  And finally, I took some online classes.  I do wish, sometimes, I’d had some direct instruction from a real person in that process, but the reality is, the landscape of computing changes so rapidly that keeping up requires a chunk of just figuring stuff out on your own.  Often, you have a specific problem to solve in front of you, and you need answers.  You can’t wait until the 6-week mark of a course where they cover that topic to get the answer.

I know some faculty hate when students Google the answers to the problems they’re given.  Code for most basic CS exercises can be found anywhere on the web.  And some of those basic CS exercises are necessary foundations, but the solution to a lot of “cheating” is to have harder problems.  Have students design their own problems.  Partner with people in the school to solve real problems.

I have students who are planning to attend a hackathon in a couple of weeks.  I shared this article with them, and I also explained that what we’re doing in class is not what people in the “real world” do.  There are frameworks and tools that real developers use that we don’t, because just those tools themselves are hard to understand much less the coding.  And I want to focus on coding.  And, more importantly, I want to focus on learning.  I want to end with a section from the last paragraph of the post, where describes the hard work learning takes, and the understanding that there’s much to learn:

The barriers to becoming a software engineer are real. People born in technical families, or who were introduced to programming at an early age have this easy confidence that lets them tackle new things, to keep learning — and, in our eyes, they just keep getting further and further ahead. Last year, I saw this gap and gave up. But all we really need is the opportunity to see that it’s not hopeless. It’s not about what we already know, it’s about how we learn. It’s about the tenacity of sitting in front of a computer and googling until you find the right answer. It’s about staring at every line of code until you understand what’s going on, or googling until you do. It’s about googling how-to, examples, errors, until it all begins to make sense.(emphasis mine)

On Learning Something New

I’m a week in to learning to play the guitar.  My index and middle finger hurt and I can safely say that I pretty much suck.  But, I’m a week in.  I know I shouldn’t expect to be playing like Taylor Swift by now.  And that, in itself, is something to recognize, for both students and teachers.

I’ve observed a couple of things so far in my practice.  First, I recognize that it would probably be easier/better if I had a teacher, preferably someone who’s an expert at both playing the guitar and teaching.  I’m not getting the same kind of feedback from the app that I would get from a person.  I get no tips for finger placement or holding the guitar.  I’m getting no, “That was good. Try to keep doing it that way.”  So I’m probably a) learning slower and b) creating some not so great habits.

Second, I’ve noticed how foreign all of this is. Music is not foreign to me.  I can actually read music.  I sang in my church choir.  I played piano a little, and at one point I tried to learn to play the harmonica.  But I’ve never played a stringed instrument.  I’ve never had to tune my own instrument.  I don’t have a feel for how to move from one chord to another or even sometimes how to strum.

Someone posted to the SIGCSE mailing list reminding people of how much students have to learn in order to start learning to program.  So much of the inner workings of the computer are hidden now and we have to expose them and teach them.  Plus they’re learning a new language, new software, a new way of thinking.  It’s like approaching learning an instrument.  You have to learn how it works and its language (musical notes).  Try learning something entirely new sometime, and feel the discomfort and utter foreignness of that.  Then you’ll have a sense of how your students feel.

My Classes are Like a Safari

Or like being dropped in the wilderness.  Or like being thrown into the deep end. Or like going on an adventure.  These are all ways that my students have described what my CS I class is like.  When they describe it this way, they’re not frustrated or angry or anxious.  They’re excited.  At first, they were like “what? you’re not going to lecture or explain everything in detail?”  I did pause when everyone seemed confused by the same thing and do a brief mini-lecture, on functions, for example.  But generally, I have them read a bit about a concept, and then work through several examples and contexts for that concept.  It’s like solving puzzles or mysteries.  We’ve had a lot of aha moments where something finally sinks in.

It’s harder to teach this way, to let the students fumble their way through something, and I’ll admit I worry sometimes about how much they retain.  To counter that worry, I have tests and quizzes, but I can’t help but worry.  It’s also harder because I have to think through how an activity will go.  I can’t just lay out, this is a loop.  I have to work through how they’re going to use loops in meaningful ways.  Actually, Mike Z just posted something that is similar to how I approach things.  You lay out some instructions for something that seems simple and then discover why loops are cool and/or useful.

I also do a lot of running around.  I’m working on having students do more helping of each other, but we’ve only really been coding for a few days, so I’ll give them another couple of days before I truly let them wander the wilderness.

Lost in Translation

I often forget how embedded I am in the language of computing.  Even before I took up programming, I was quite familiar with how to use Unix commands and the difference between my computer and the server where my web site actually lived.  Having grown up in a GUI world, my students don’t see any of the underlying structure of the computers and servers they interact with.  I expose some of that but it takes a while before it becomes second nature to them.

For example, I gave this instruction verbally, “type /Users/Documents” and more than one student typed “slash Users slash Documents”.  Or conversely, when learning about types, I had the written instructions, “type type(6)”, and some students assumed I had typed type one too many times and just typed in 6.  Sometimes with the parentheses.  And then, when asked to define what hello is in either this context: type(hello) or this one: hello=”world”, they are baffled.  It’s a word, it’s a string, no, it’s a variable.  Their concept of variable in math is that a) you’re usually solving for it and b) it always has some value.  In CS, of course, variables sometimes don’t have values (giving you an error), or they can have values that are very different from a number: lists, functions, dictionaries, words, sentences, files, etc.  That’s more mind-blowing to students than one might think.

As Garth said in his comment to my last post: “Teaching programming is like teaching a foreign language but the student has to understand logic, major problem solving, technology and memorize the language, all at once.”  I’d say, too, that they’re having to learn new English words alongside their “foreign” translation.  It’s like having learned English, you find out there’s a whole dictionary full of words you never learned, and now you have learn them plus their translation in another language.  Painful.

But kind of fun.  I’ve said to both my CS I class and my 8th grade class that what they know right now, 6 weeks into school is more than any of their teachers know about computing (with maybe one exception besides me).  They makes them smile even as they struggle to learn this new context and language.

I have a tendency to throw my students into an activity without much explanation and then explain things after they’re done.  I know it can be unnerving.  I had a student ask a very good question after class yesterday.  She asked, “What is it that we’re doing exactly?  Is this a language?”  Once I explained, she then asked if there were other languages and how they worked.  The “throwing them in the deep end” approach leads to this kind of curiosity usually.  They often feel the need to figure it out.  That need to figure it out is what will keep them going when they feel a little lost.

Teaching, Programming, and Practice

Over the weekend, I read a couple of blog posts by programmers who were teaching workshops to either students or teachers, and who were quite amazed at how hard it was to teach. They didn’t come out and say that they thought teaching would be easy, but they implied that by talking about the challenges they faced.  They weren’t condescending at all, just clearly surprised.

And then there’s all the venture capitalist folks who think software is going to replace teachers any day now.

Education, teaching and learning are challenging.  People are often surprised by what happens in the classroom, of having to deal with different levels of students, of realizing that students don’t have some foundational information that you thought they would, of realizing that just telling them something doesn’t mean they actually learn it.  There is research out there that helps, but every day, you have different variables, so you try things.  And sometimes it works.

I don’t mean to be hard on the programmers trying to teach, or even the software developers trying to create something that will help people learn.  But the truth is, teaching is something we’re still trying to figure out.  If we had all the answers, then good teachers would be spitting out students who know everything they need to know and are equipped to continue learning all the time.  But we know that doesn’t happen.  And it’s not just that those good teachers miss a couple of students.  Sometimes they miss a lot.  Because there are other factors.  Learners learn in different ways.  Learners face challenges like poverty, drug addiction, lack of parental support that take up their cognitive capabilities, leaving little room for learning math or science.

And for the record, I find programming hard.  And I have much of the foundational knowledge to do some pretty complex programming, but I still struggle with it.  It takes me hours sometimes to do pretty simple things.  In part, that’s because my job is teaching, not programming, so I have less practice.  During the school year, I probably spend less than 2 hours actually programming things.  The things I do program are simple activities for my students.  They’re not complex, real-world problems.  I’ve tried to remedy this in a number of ways, trying to make time for some “real” programming (I did some this weekend, in fact), but I spend most of my off time, grading, giving feedback to students, planning ways to teach basic concepts, all that good stuff.  So I admire programmers, because I know they’ve had some practice and I admire them for wanting to share their knowledge with others, but like programming, teaching takes practice.  And I’m going to guess that programmers spend as much time teaching (at best) as I do programming.  We have a lot to learn from each other.

Food + Algorithms = Learning

IMG_20140924_084037452_HDRAs I’ve mentioned, I’m focused on making sure students understand underlying concepts without the need for code.  I really believe that if they know what a loop is conceptually, they can create a loop in any language.  Yesterday, I tackled both the concept of an algorithm and basic programming concepts by using food.  I broke the students into groups of 3 or 4 and gave each group a set of supplies.  For the morning class, we had bagels, cream cheese, and strawberries.  The afternoon class had crackers, cheese and pepperoni.  Each group got a plate, necessary utensils and napkins.  Then each group selected a person to be the robot.  I conferred with the robots and explained that they needed to be stupid.  They don’t know what cheese, bagels or crackers are.  They know basic directions and that’s it.

IMG_20140924_084335344As you can see from the pictures, the students had fun, especially when the directions went awry–as they did in every group.  In the morning class, we had time to test out the process using me as the robot.  That was instructive for many of the students as well.  In some groups, the robots helped out a little too much.  I didn’t.

In both classes, we discussed what was difficult about the process.  The fact that the robots could just be told to pick up a bagel or cracker was difficult.  They realized quickly how much humans know compared to computers.  I asked how they overcame their difficulties.  It was interesting how many different programming concepts they used to complete their tasks.  Some groups defined their objects.  They described what each item was and where it was located (object-oriented programming, ftw!).  Some defined functions, like spreading.  They all repeated actions in a loop.  Some simply said, “Repeat.”  Some used ctrl-c, ctrl-v, which I thought was hilarious and awesome.  They all used conditions, mostly in a “while” loop: “move hand down until you hit an object.”   And we talked about how to orient a robot using things like coordinate plans or just left and right, up and down.  I also suggested that their plate could serve as a clock, so they could say, put your hand at 3 o’clock.  I went through basic programming concepts after the activity, and I was able to connect each concept to something a group did during the activity.

IMG_20140924_134349079_HDRThe homework had been to read some material about algorithms and write what they think an algorithm is and how it relates to programming.  After the activity, I asked if they would revise their answer.  Most said yes.  Many said, just saying it’s a list of instructions isn’t enough.  They talked about figuring out how many steps to break the problem down into, that some of those steps need to be small and detailed.  Some even talked about having algorithms within algorithms, so that you might have an overarching set of instructions, but smaller sets within the larger one.  They also talked about what the robot knows and understands versus what humans understand, and that they needed to figure out how the robot is seeing things or understanding things, so that they know how best to give instructions.   In one class, that discussion led to questions about how real robots work.

What I’m now looking forward to is seeing how this plays out withIMG_20140924_134422706 actual programming.  One thing I’ve noticed this year, both because I’ve made some changes, and because I have more students, is that girls like to talk about what they’re learning.  Some of my students have even said as much, so I think I’m going to build in time after every concept to have a conversation about it.  I think it allows them to create their own ways of remembering and understanding the concept.  They use their own contexts and metaphors.  And I’m there, of course, to make sure it’s accurate.  I knew this intellectually before, but seeing it play out is really interesting.