Sunday, February 27, 2011

Dave's Top 10 Films Of 2010

Yes, it's time for the long-awaited Dave's Top 10 Films Of 2010 list! This year, Virg and I saw pretty much everything. First, a few honorable mentions:

Most Over-Rated Movie of 2010: I Am Love. It sucked through and through. 2 hours of artsy fartsy sap and scenery, utterly devoid of characters or plot.

Favorite Fun Movies of 2010:
Kick-Ass
(great premise, with a hilariously lethal little girl)
Despicable Me (cute, clever, and great use of 3D)
The Other Guys (great opening hot-shot cop sequence spoof)
Easy A (very clever dialogue, and Emma Stone is great as the lead)

Dave's Top 10 Films Of 2010
Now for the real list. I've done my best to describe these movies without spoiling their endings. Which was difficult, because there were some great endings this year, and I loves me a good ending.

10. Buried
Ryan Reynolds trapped in a coffin for 90 minutes, with only his cell phone to save him. The entire movie takes place in the coffin. No flashbacks or fantasies. You never see anyone but Ryan Reynolds, and half the time you don't see anything at all. It was a lot like watching 127 Hours, except you didn't know how it would end. And like Black Swan, the movie really messes with you, finding the perfect ending in the final seconds.

9. A Solitary Man
Michael Douglas gives a good performance as a not-so-likeable guy, who you become increasingly sympathetic for. A smart movie with good dialogue, made more interesting by a small twist.

8. The Town
Ben Affleck was excellent as writer, director, and star of this intense bank-robber story set in Boston. I was on the edge of my seat the whole time, but disappointed by the cheesy ending.

7. Toy Story 3
Sadly, we only saw it in 2-D, as a rental. I wasn't crazy about Pixar's first Toy Story, and I thought the second one was pretty dumb. Last year's Up was 10 very moving minutes followed by 80 minutes of somewhat entertaining silliness. Toy Story 3 was similar, but saved the 10 good minutes for the end of the movie, delivering some surprisingly haunting footage.

6. 127 Hours
The true story of a guy whose arm gets trapped under a boulder in Canyonlands, and who escapes 127 hours later by amputating it with a dull knife. Before the movie had even started, Virg was cringing at a preview of a movie about people trapped in a cave, and I instantly regretted dragging her to this. When the hero first falls in the canyon, you realize just how absurd it would be for him to cut off his arm. The movie does a great job of walking you to the point where you understand his desperate act. James Franco is wonderful, and the script is fantastic. And yes, I covered my eyes for the amputation scene.

5. Animal Kingdom
If The Town was a glorified look at the life of bank robbers, Animal Kingdom seemed like the real thing. It's an Australian movie about a young guy who is taken in by his seemingly sweet grandmother, and 3 criminal uncles. The movie feels distant and spacy, as the main character is increasingly caught between the police's attempts to make him their star witness, and his loyalty to his increasingly mistrustful family. The final resolution makes for an excellent ending.

4. The King's Speech
The story of King George VI struggling to overcome a terrible stutter. Colin Firth is fantastic (and my pick for best actor), as is Geoffrey Rush, and the script is excellent.

3. Barney's Version
As soon as we left the theater, we were ready to see it again. Paul Giamatti stars in this very clever, very funny, and very touching film. Rosamund Pike is great as his love interest, Dustin Hoffman is very funny as his father, and Minnie Driver is hysterical as his cartoonishly awful wife.

2. Blue Valentine
Ryan Gosling and Michelle Williams are both phenomenal in this complex relationship study. The movie alternates between telling the story of a single day in their married life, and telling their back-story, with an absolutely heartbreaking ending. This great script and its very human characters leave much food for thought. Were they good for each other, and who was to blame for their troubles? Typically, Virg sides with the wife, whereas I found the husband more sympathetic.

1. Black Swan
Darren Aronofsky wrote and directed this brilliant psychological thriller--a surreal behind-the-scenes look at ballet that is part Wrestler and part Pi. Like Animal Kingdom, it's about a good but weak character needing to find strength. It put us on the edge of our seats from the very beginning, and the final 15 minutes of the film are absolutely chilling. It's one of those movies you continue to analyze for days afterward. And Natalie Portman is truly perfect in it. This is my pick for best picture, best director, best actress, and best screenplay.

Saturday, April 17, 2010

CMU: Year 2

Apparently, I haven't blogged about my life in a long time, so here's a summary of the past year.

Summer 2009
Graded AP exams for a week. Then spent a few weeks preparing for a one-week workshop on Principles of Computation for area high school math/science teachers. This meant putting together four 90-minute lectures for an audience that wasn't necessarily interested in computer science, so I stressed out quite a bit about how to make my talks relevant to them. The talks were on recursion (not my choice), how computers work (in which I ran over my audience), information and randomness, and cryptography (these last two went very well). In the middle of the workshop, it really felt like the teachers were "getting" that computer science is so much more than programming. Unfortunately, we muddied that message by also teaching programming later in the workshop, and so an overwhelming number of the teacher's presentations on the last day focused on programming.

Thankfully, I've been able to re-use pieces of those lectures quite a bit in the past year, starting with the CS4HS workshop, in which I gave a guest lecture on randomness and then cryptography to an audience of enthusiastic high school CS teachers. I then co-lead a one-week workshop for AP Computer Science teachers. This was a lot of fun, and much less stressful than the first workshop. I was a little nervous, given that some of the attendees had been teaching AP computer science for much longer than I have. But I think the workshop proved to be valuable, even for veteran teachers. I did feel bad for those teachers who had very little Java experience, because it takes far more than a week to learn enough Java to teach the AP course well. (I would love to see the AP exam back off on teaching so much Java, so that more schools could offer the course--especially in lower income areas.)

I spent the last weeks of the summer writing a paper about the high school network protocol course I created. The paper got very positive reviews, so I got to present it at the SIGCSE conference in March. I thought it was really cool to lecture about networking to a big room full of networking professors, when I've actually never even taken a networking course.

In the background of all this, there were a lot of very bad things going on in my department. The dept held a meeting to determine which teaching track jobs to eliminate, apparently putting me in the "maybe" category. Also, I tried to convince my group that we could better serve students who only take 1 semester of CS by teaching them about digital representations, the Internet, exponential growth, etc., instead of emphasizing Java-specific minutia and object-oriented programming. This discussion turned frustrating fairly quickly.

Meanwhile, the department appointed a committee to replace the introductory CS curriculum, and actively prevented the teaching track faculty from informing the process. By a fluke, I happened to be at work one day when my boss was unable to attend one of these committee meetings, and I happened to attend the meeting when the committee was beginning to discuss our CS1 course. I was asked to write a proposal for what I would do in CS1. But my proposal (less programming, more CS, use Python) was apparently not what the committee wanted to hear, and it was mocked mercilessly in the following meeting. In email, I spoke out strongly against the whole process, and was thankfully never invited back again. Nonetheless, sometime in the fall, the committee announced that, starting in the fall of 2010, CS1 will be taught in Python, and will introduce bigger CS ideas.

Fall 2009
I taught CS1 in the fall to four sections of 30 students. With so few computer labs in the Gates building, I was forced to teach in a lecture hall 3 days a week, and have students program on computers just once a week. I decided to use the extra lecture time to present bigger CS ideas on Fridays. These were mostly well received, but were seen as disconnected from the course.

It turns out that the fall semester CS1 students are very different from the spring. Two thirds of my fall semester students planned to take CS2, as opposed to just one third in the spring. This meant that my fall students were much stronger programmers, and much more engaged in the course. I gave large assignments, and my students ate up everything. Overall, I had a blast with that group, I received stellar scores on teaching evaluations, and my students earned the highest average on our common final exam.

And it was at about that moment when my department announced that 9 of my colleagues' contracts would not be renewed, that those of us that remained would soon be teaching 200+ students each semester, and that we would continue to be treated as second-class citizens. Thus, a great semester ended on a big downer.

Spring 2010
In light of the direction my department was moving, I decided to try out teaching larger CS1 sections: two groups of 60 students. I got a killer schedule, with my first class after 1pm. But on the day before classes, a visiting instructor quit. My boss picked up that section, and decided to use my course materials, which was a little stressful for me. Then, in the middle of the first day of classes, I suddenly felt very sick, went home immediately, and ended up going to the hospital, probably with some GI virus. I got sick again a couple weeks later, which luckily coincided with a few snow closings.

It turns out there's a huge difference between teaching 30 students at a time and teaching 60. I tried calling out all 60 names on the first day, but it took so long I never did it again. It took me weeks to learn the students' names, and I wouldn't have learned them at all if it weren't for attending the 30-student recitations and helping students in lab. I delivered lectures in long wide rooms, with the students sitting between me and the doors. My students clearly felt anonymous, and would often come to the first few minutes of class and then get up and leave--something that had never happened to me before. I frequently found students working on laptops, reading books, doing other homework, etc., during class. The students were sitting so far away from me, that they would start up conversations with each other during class, and I often had to stop and ask them to quiet down. I felt like I was just standing at the front of the room speaking as if from a textbook, while my students came and went and ignored me.

Then my boss offloaded his section onto me. So, suddenly I was teaching 180 students, with class every other hour, and managing 11 course assistants. And having barely learned the names of the first 120 students, I didn't even bother learning the next 60. Students would say hi to me in the hall, and I had no idea if they were even in my class. Students from the previous semester would say hi, and I couldn't remember their names.

Not surprisingly, more students meant many more cases of inappropriate collaboration. This drained all my time, and I felt like I was constantly meeting with the students who were blowing off the course, instead of working with the ones who were trying hard and needed help. I began to wish my assignments were more open-ended, so that it would be easier to identify cheating cases. Also, my colleagues kept reminding me of how soft my course was. So, in week 8, I decided to have students program an arcade game. I had done this sort of thing the previous semester, but this time I removed a lot of hand-holding from the assignment: no more examples of test code, no more telling them how to break down each task into simple methods, no more providing method signatures. For the first third of the course, very few students had come into lab for help. But on this assignment, the lab was absolutely packed. Stopping by lab, I felt like I was walking through an impoverished third world country, with 50 students in a 30-student lab, every seat filled and students sitting on the floor everywhere, every hand up and desperate, saying, "Dave, just one thing. Just one quick question ..." The lab was still packed even a couple days after the assignment was due, with so many students still struggling to finish it. And although the students scored very well on the following quiz, morale had sunk to the point where I lost my class, and I've never really won them back.

About 20 of 180 students have dropped the class. Those that remain are becoming very strong programmers. I still don't know names in one section, and they hate me. As usual, the sections that meet later in the day are going much better. At this point, we've got one more assignment to go, and then this bad semester will come to a close. I'm hoping for some better news on the final exam, but I expect very little from evaluations.

Annual Mix CDs

For a long time, I've wanted to create a mix CD at the end of each year with the music I got into that year, largely as a way to remember the music and events of my life. However, it's always seemed daunting to figure out if I got into a song this year, or was that 2 years ago, etc. So a few months ago, I made a big spreadsheet, went through all my CDs, tried to remember exactly where I was living and what I was doing when I got into an album, searched for receipts for music purchases, etc., and I worked out what I listened to in each of the past several years. I've now started making my annual mix CDs, working backward in time. I've avoided putting multiple songs by the same artist on a given CD, unless it was a slow year. The result so far is a lot of post rock and Batman music:

2009
1. Route 12 from the Revolutionary Road soundtrack
2. Malachite by Jakob
3. The Day Shift by Pg. Lost
4. Ybe 76 by Subheim
5. Taijin Kyofusho by Evpatoria Report
6. A Notion I Can't Shake ... Accidents Happen So Fast by September Malevolence
7. Incirculation by This Is Your Captain Speaking
8. White Seraphs Wild by Immanu El
9. Sapphire by Seabound
10. In Your Room by Depeche Mode
11. Hero by Regina Spektor
12. Enlightened False Consciousness by French Teen Idol

2008
1. Marching Bands Of Manhattan by Death Cab For Cutie
2. Cerda's Plan by Near The Parenthesis
3. Void by Red House Painters
4. Aggressive Expansion from the Dark Knight soundtrack
5. Psiu! Puxa! by Lights Out Asia
6. Define Dancing from the Wall-E soundtrack
7. The Second Nave by Near The Parenthesis
8. Denouement from the Atonement soundtrack
9. What Sarah Said by Death Cab For Cutie
10. The Cottage On The Beach from the Atonement soundtrack
11. Six Points Of Fire by Lights Out Asia
12. A Dark Knight from the Dark Knight soundtrack

2007
1. Analyse by Thom Yorke
2. Outlast By Rain by Readymade
3. Tepid Coat by Damiak
4. All I Need by Radiohead
5. Worst Taste In Music by Radio Dept.
6. Pace Is The Trick by Interpol
7. Soma by Smashing Pumpkins
8. I Remember It Differently by Near The Parenthesis
9. And Triage by Bitcrush
10. The Funeral from the Pan's Labyrinth soundtrack
11. Watching Over You by Seabound
12. Spiti Elfas by Lights Out Asia
13. Mortal City by Dar Williams

2006
1. Pulling Our Weight by Radio Dept.
2. Eptesicus from the Batman Begins soundtrack
3. Medicine Bottle by Red House Painters
4. 10,000 Days (Wings Part 2) by Tool
5. Fair by Remy Zero
6. Sometimes by My Bloody Valentine
7. Alone In Kyoto by Air
8. No Quarter by Tool (a Led Zeppelin cover)
9. Svo Hljott by Sigur Ros
10. Corynorhinus from the Batman Begins soundtrack
11. Let Go by Frou Frou
12. Love On A Real Train by Tangerine Dream
13. A Lack Of Color by Death Cab For Cutie

Due to lack of data, mix CDs before 2006 will probably have to span multiple years.

Tuesday, January 19, 2010

Actual Best Movies of 2009

Here are MY picks. These were definitely the best 10, but the order of the list is approximate.

10. Avatar - Yeah, it's kind of dumb. But the experience of watching it is amazing. And you don't realize it's dumb until you've seen the first 2 hours and 15 minutes.

9. Up - I was so moved after just 10 minutes of this movie. Admittedly, the rest was uneven, but it was always either loving told, or dopey but with funny talking dogs.

8. An Education - A very smart story, that pits school learning against life experience, without easy answers. Oh, and it turns out it's a true story--including the most implausible parts.

7. A Serious Man - A Coen Brothers movie that doesn't really have any point or ending, but it was very smart and very very funny.

6. District 9 - Realistic and smart Sci-Fi.

5. Precious - Impressively unmanipulative. Superb acting. You start to feel what it's like to be hopelessly uneducated.

4. Inglourious Basterds - Brilliant script. A real nail-biter, though. Has you cheering (uncomfortably) for vengeful Jews to inflict atrocities on the Nazis.

3. Up In The Air - Very smart script. Sort of romantic comedy. But sort of something deeper, in the spirit of American Beauty.

2. Hurt Locker - Masterfully crafted film about bombs defusing in the Iraq War. The script was written by a guy who was embedded with such a bomb defusing squad. The movie was shot just a few miles from the Iraq border, and the film crew was actually shot at during production. The whole thing is super intense, and incredibly real. One of the movies that tells you its message in the first 4 words of the film, and then makes you forget it completely until the last couple minutes.

1. (500) Days Of Summer - A very enjoyable, very funny, very heartbreaking, insightful look at a troubled relationship. I know it doesn't feel like a best picture, but it's definitely my favorite of the year.


Still haven't seen: A Single Man, Crazy Heart, Invictus, Moon, Good Hair.

Sunday, May 24, 2009

Recursive Artwork

I learned about recursive art at a brief talk at the March SIGCSE conference. After my classes ended, I finally had time to write code to generate my own recursive artwork. Here's a sampling of the pictures I've created.





















I think they'd make great CD covers. Or, it'd be cool to get them printed and framed, and then sell prints at art fairs for $30 each. Gotta love recursion...

Monday, May 18, 2009

CMU: Semester 2

This spring I was 1 of 7 instructors teaching our introductory programming CS1 course. None of the students are CS majors. The course is taken by about two-thirds of all CMU undergraduates. Nearly all are there because the course is required by their department. On the plus side, this means that students have low expectations, and there's a real opportunity to get them excited about programming. The vast majority of the students have never seen even the simplest program before (although, sadly, many think they have programming experience because they've used HTML).

I lost all my fall CAs (course assistants), so I hired 7 students from my fall course to help me teach in the spring. I wanted to be actively involved in the classroom all 4 days of the week, instead of leaving recitations to my CAs. And with a full teaching load this term, after teaching 9 classes a week in the fall, I was now teaching 16 in the spring, which cut into my preparation time. (I also sat in on a colleague's CS0 course 4 days a week.) On a typical week, I introduced new material on a Monday and had students work on the week's programming assignment during class on Wednesday, Thursday, and Friday, interrupting them only to give a 20-minute quiz each Wednesday. Assignments were due Monday nights, so I spent Monday evenings helping students in the lab.

I created most of my materials from scratch, so this was an exhausting but more rewarding semester. And with so much class time, and creating a new assignment, quiz, and lecture every week, it was almost as intense as teaching high school.


The Plan

In shaping the course, I set out to teach as little Java as possible, covering only the essentials and postponing any syntactic shortcuts. This way, students could master the fundamental concepts and focus on how to use them effectively, instead of getting lost in punctuation. I also tried to plan each week around some compelling programming project. There's no point in introducing a new construct unless it lets students build something new and meaningful. Plus, if students are going to have to program for several hours a week, they ought to have something cool to show for their efforts.

One of the great debates in CS education is when to teach object-oriented programming. I wasn't exposed to the object paradigm until my sophomore year of college, when I had already been programming for a long time. The order that I learned makes a lot of sense to me--starting with functions and data, and then learning how an object-oriented language lets you bundle functions and data together. But, since Java is, unfortunately, the language du jour for intro programming courses, and Java is deeply object-oriented, most Java teachers have their students using objects early in the course.

The U. Washington lecturers took a different approach. They wanted to use Java in their first few CS courses, but to keep objects out of CS1. So, they have their students declare everything as "static," essentially bypassing Java's object-oriented mechanism. This is what I decided to do in my course, and I'm very pleased with how it turned out. I'll definitely teach Java this way again, and I'm increasingly finding myself opposed to object-oriented programming in an introductory course.

In the past, I've begun my introductory Java courses using a rich object-oriented problem-solving framework called Karel J. Robot, in which students program a virtual robot to solve simple tasks. This means that students are writing interesting graphical programs on day 1, instead of writing boring programs to print "Hello World!", calculate sales tax, etc. Karel comes with a beautiful mini curriculum, that's designed so that, after each topic, students are almost begging to learn the next topic. For example, the robot can initially only move forward one step, or turn 90 degrees to the left. Students quickly discover they can make the robot turn right by turning left 3 times. But after a day of doing this, students can't wait to learn how to define the word "right" to mean "turn left 3 times." Unfortunately, Karel J. Robot is object-oriented, but luckily it was easy to build my own non-object-oriented framework based on it.


A screenshot of my robot framework. Yes, I spent hours trying to draw a robot before settling on this simple but endearing design, which I think is part Wall-E and part Fluffy.

Another beautiful thing about the Karel curriculum, is that it presents the language just a little at a time. Each time a new construct is introduced, the grammar is explicitly presented to students (much like MIT's extinct 6.001 SICP course). I did my best to stick with this plan, even testing students on both grammar and evaluation rules. Next semester I plan to do even more of this.

Finally, on the recommendation of one of my course assistants, I had my students use a development environment called DrJava. I like it because (a) you don't need to deal with all the nonsense of making projects/workspaces/etc., and (b) you can execute instructions, one at a time, in the interactions pane at the bottom of the screen.




Weeks 1 - 3: Traditional Robots

From the beginning of my course, students could immediately open my framework in DrJava, and start typing instructions like:

Robot.load("maze.txt");
Robot.move();
Robot.turnLeft();
Robot.makeDark();
Robot.makeLight();

After another day, they were defining their own instructions, like:

public static void turnRight()
{
Robot.turnLeft();
Robot.turnLeft();
Robot.turnLeft();
}

Students used my robot framework to write methods in week 1, use ifs in week 2, and implement loops in week 3.


Week 4: Towers of Hanoi

Transitioning from the Karel curriculum to the rest of Java, especially variables, is always pretty rocky. So, this time I developed some problems where we could use variables and integers in my robot framework, culminating in one of the most original assignments in the course. Without recursion, data structures, or even parameters, we implemented the classic "Towers of Hanoi."


The 3 pedestals on the right are the "Towers of Hanoi." The first pedestal is used for scratch work, and the second stores the list of work left to do, which in this case is to "move 7 girders from tower 1 to tower 2."

Unfortunately, only those students who made it through the extra credit got to see their robot solve the "Towers of Hanoi." The final program took about 5 minutes to run, but was absolutely mesmerizing to watch.


Week 5: Bait and Switch

The next week I used the robot to introduce parameters, and I think the assignment was very clever. First, students created a library called RoboPlot, with functions instructing the robot to set the color (light/dark) at a particular row and column, etc. Next, the students implemented 1-dimensional cellular automata, using only the functions from RoboPlot (and no references to the robot). This ran excruciatingly slow. Then, students downloaded a file I created called FastPlot, which had all the same function names as RoboPlot, but ran much faster. Slowly, it began to dawn on students that there wasn't a robot inside FastPlot, and by the time they realized, they'd already been programming without the robot for several exercises.


a cellular automata rule, which generates a seemingly random pattern



Week 6: Classes Are Hard. OOPs.

And that was the end of the robot and procedural programming. At this point, I introduced object-oriented programming, having the students create their own objects. This was not a good idea. There's so much syntax involved in creating and using objects, that it would definitely have been better if we spent a week or two using objects before we tried creating our own. Next time.


Week 7: Media Computation

When we did start using objects, I revealed that my framework could do a lot more than control a robot. I had the students use my framework objects to manipulate images, inspired by the media computation curriculum created at Georgia Tech. The students really came alive when we started manipulating photos, and they were full of ideas. Here are some examples of the effects we implemented in the assignment:





Week 8: Bejeweled

Halfway into the course, I flew down to the SIGCSE conference in Chattanooga, where I had a good time catching up with old friends and getting to know some of my CMU colleagues better. I spent the rest of my spring break putting together a programming assignment based on the classic (but copyrighted) game of Bejeweled.



Not only does my framework let you set the color of a cell, but you can also place little images in it. And you can call a method to determine if a cell has been clicked, or a key has been pressed (without having to implement a listener). It was a big win to use the same graphical user interface framework for many assignments, so that I didn't have to introduce a new set of objects each time.

I introduced this material in my favorite lecture of the semester. I started by placing a picture of a duck in an empty cell. In one section, a girl in the back row said, "Oh, I just love ducks!" to which I responded wryly, "Then you're going to love this lesson..." I showed students how to make the program print "Quack" when you click on the duck. Then I asked innocently, what else could the program do when you click on a duck? "Kill it!" students answered with enthusiasm, and we went on to program a simplified version of the classic Nintendo Duck Hunt game. We called ours "Ducky Slayer."


Week 9: Spelling Out Everything

Next we learned about strings, and implemented the same word games I used in my AP class. The experience really drove home the difference between teaching groups of 15 high school kids, where all coding is done in the classroom with me, vs. teaching 95 college kids who didn't want to take a programming course and who do most of their work at night, when I can't help them. As a high school teacher, I could cut up an assignment into fewer, larger parts, and if someone was stuck, I was there to give a hint. With 95 students working in their dorms, you can't be there to give a hint, or clarify a vague instruction. So, rather than leave lots of beginning programming students stuck and frustrated, I erred on the side of giving away too much in my assignments, and with this particular one, I probably didn't give away enough. With all the explanations and examples, the assignment was still many times longer than the one I had used with my AP students.


Week 10: Tetris

For the next week, I substantially modified my classic Tetris assignment. It was a big hit with the students, but I'm not sure how effective it was in teaching arrays.




Week 11: Golf Solitaire

Next I had to teach collections of objects, so I wanted to make a card game with lots of collections of cards. I like implementing solitaire games, since you can play them without a friend and without writing an AI player. I've used the classic Klondike solitaire game in my AP class before, and it's a pretty big assignment, because there are so many rules. I read through the rules of a bunch of other solitaire games, before settling on one called Golf Solitaire, which I later found to be quite addictive.


We used my framework again for this assignment, this time with pictures of cards.

CMU's CS1 is probably the only Java course in the world that insists on having students use fixed-size arrays to implement resizable lists of objects. (The rest of the world uses Java's built-in ArrayList object, which does everything you'd ever want to do with arrays, and with more consistent syntax.)


Our Pile object represented a collection of cards.


Week 12: Chars

The AP course brilliantly omitted Java's char data type, since anything you would ever want to do with characters can be done using strings. But our CS1 course insists on teaching students to use chars. Furthermore, since characters are stored internally as integers (e.g. 'A' is 65), Java lets directly perform integer arithmetic on characters. And unfortunately, our final exam tests this.

So, I had students write code to encrypt messages using a Vigenère cipher. At the end of the assignment, I told them I had used the word "char" itself to encrypt a message, and I showed them the encrypted message. Many of my students successfully decrypted it, to find it asked them to use another word to decrypt another message. When that message was decrypted, it told students they could win a prize if they were the first in their section to send me an email with a word meaning "to burn or scorch by incomplete combustion." So my inbox was full of emails with subject line "char," and a couple with subject line "singe," etc. And the prize? Magnetic chars for your fridge. Students got a real kick out of my clever ending to an otherwise dumb assignment.


Week 13: The Kevin Bacon Game

For the final assignment, I wanted to do something that involved searching through large amounts of data. I downloaded movie data from IMDB, and spent countless hours paring down hundreds of megs to the the 100 or 1000 most popular actors and movies. In the end, the assignment provided tons of practice with collections, but was a bit too long, and even with my step-by-step instructions for implementing a breadth-first search at the end of the assignment, it proved to be too abstract for most students.


one of many diagrams and examples I added to the assignment, as it became increasingly clear that students didn't understand the algorithm


Reflections

The common final exam given to students of all 7 instructors, reflects the bias of a more traditional curriculum, in which program execution begins from a "main" method (not from DrJava's interaction pane), and output is printed text (not graphics). So, in my last lesson of the term, I amused myself by teaching students to write the "Hello World!" program that would traditionally be introduced on day 1.

I gave surveys at the end of the class. Here's what I learned:
  • 82% thought the class was well paced (although I felt it moved too fast).
  • 87% liked having so much time to work in class.
  • Lectures sometimes went too quickly (a consequence of giving students time to work).
  • Weekly quizzes were a necessary evil, and preferable to occasional exams.
  • Favorite assignments were Tetris (89%), Media Computation (81%), Bejeweled (74%), and the first 3 weeks of robot tasks (63%).
  • Homework took about 4.5 hours per week (outside of class).
  • Help was very available, and my course assistants were great!
  • 34% plan to take a follow-on CS course.
That still left the question of whether I had adequately prepared my students for the final. Thankfully, my final exam average of 80.1% was quite respectable (especially with my low drop rate). Incidentally, there was a large range of final exam averages across instructors--a recurring phenomenon that isn't well understood.

Before I taught the course, a few instructors claimed that the entire course content could be taught with weeks to spare, and several instructors found at least some time to teach more advanced programming concepts, like inheritance, sorting, etc. I decided I would spend my extra time teaching big CS ideas, like: How do computers work? How does the Internet work? How is data represented by ones and zeroes?

Wisely, though, I decided to front-load my course with programming skills, and ultimately found there was no time leftover for the big ideas. Although the content can be "taught" in just 20 lectures, with 35 class days to spare, students can only learn the material so fast. And even with my pared down curriculum, I still felt I was pushing them to learn faster than they were comfortable.

What could we cut from the course to make room for big ideas? The language-specific stuff: characters, arrays (instead of ArrayLists), object-oriented programming, and declared types. Without all that, we might find a month to explore the big ideas. I'm pushing to make the course objectives flexible enough to let us move in this direction.

I'm teaching the course again next semester, but in the new Gates building (where my new office will be). We'll only have computers in the classroom 1 day a week instead of 4, so I need to change my course substantially. Also, we're now limited to half as much help from course assistants. All this means that students will have much less time to work in class, and much less help outside. It also means programming assignments will need to be a little shorter, giving students less practice. And with less support and greater anonymity, students are bound to cheat more. In the end, there's no question that students will be less prepared for the final.

Sunday, May 17, 2009

CMU: Semester 1

Somehow, I got buried by the second semester before I had a chance to blog about the first. So, we'll start with the fall...

In the fall, I was 1 of 4 instructors teaching CMU's CS2 course: an introduction to data structures. Compared to my experiences teaching high school, I found this to be less work, but less rewarding. Mostly, this is because I taught from another instructor's materials, to help me adjust to CMU culture. That means, I didn't need to write my own assignments or exams, and I had undergraduate CAs (course assistants) grading for me. I also followed my colleagues' lead, by having each week consist of 3 lectures, and 1 recitation (run by my CAs). Lecturing 3 days a week, I found I had plenty of time to cover the material at a comfortable pace. (However, I often felt I was babbling about data structures to myself, while my students sat silent, tired, and bored.)

Lectures were the one area of the course that I made my own. I left them somewhat open-ended, attempting to draw in the students to influence the direction of the lecture, while I tried to lead them to discover the day's topic. That meant using the whiteboard, instead of relying on canned PowerPoint slides. Unfortunately, the classrooms we use don't have whiteboards...

In my abundant free time, I found I could actually focus my efforts on projects of my own. That meant continued musings about physics. It also included implementing my own virtual whiteboard, which I've used for my lectures both semesters.


Don't tell the CS3 instructors I introduced graphs!

Another project I started work on concerns programming environments for beginners. CS educators are really excited about Alice and Scratch--programming languages that let you drag-and-drop instructions to form programs, thus removing the hurdles associated with typing and syntax errors. My theory is that teachers choose these languages solely for their easy user interfaces, and not based on the merits or drawbacks of the programming languages themselves.

When you want to create a new programming language, you feed its grammar into a tool called a parser generator, and out pops a parser for reading the syntax of your language. What I set out to create is the equivalent tool for drag-and-drop programming, where you feed a grammar into the tool, and out pops a user interface for drag-and-drop programming. My hope is that, if it's easy to make drag-and-drop Python, etc., then maybe teachers won't be locked into using Alice/Scratch for beginners. Anyway, I put together a first draft at such a tool. Hopefully, I'll have the time and motivation to build it in full some day.

Near the end of the semester, I found myself increasingly busy working on our common final exam. I was relieved when, on average, my students scored slightly better on the final exam than students in the other instructors' sections. The common final is one of two means for measuring our teaching success. The other is course evaluations. Although I never directly asked my high school students to rate me, I always had the sense that they really liked my teaching. However, my first batch of college students were much less enthusiastic about me, rating me somewhere between mediocre and good, and were fairly divided. It's not clear how much they were rating my small contributions to the course, or rating the other instructor's assignments and exams, or rating the awkward union of the two, or rating my obvious lack of involvement with the course. Depressingly, some students said that they relied on the other instructors' PowerPoint slides to get them through the course.

During my winter break, I created a couple stereograms, thinking this would be a simple project for students to implement in my spring course. But I scrapped the idea when everyone I know claimed not to be able to see them. :(


Click on the picture for the full size stereogram.


Guess what I watched over winter break.

Tuesday, December 23, 2008

The Omega Fontega

Virg insisted I blog about this. Our favorite sandwich place is Panera, where they consistently put together sandwiches with great combinations of ingredients. And whatever you order, they seem to be done making it before you can find a table.

Last week I stopped at our local Panera and ordered a Fontega Chicken Hot Panini sandwich. Ten minutes later, one of the people making sandwiches called out my name, and told me they were out of that sandwich. This confused me. I can understand being out of a particular ingredient, but how can you be out of an entire sandwich? So I asked, "Did you just say you were out of Fontega Chicken?" The woman replied, "Well, we only have half a sandwich left. But we can give you half of any other hot panini sandwich." From this, I learned two important facts about Panera:

1. The hot panini sandwiches aren't made fresh. They're pre-made.
2. The people at Panera are unable to assemble new hot panini sandwiches. (This is mysterious, because they clearly possess chicken, mozzarella, tomato, and focaccia.)

The implication is clear. Panera does not make hot panini sandwiches. A long time ago, Panera explorers came upon the remnants of an ancient society of super-intelligent aliens, who, deep within an intricate network of underground crystal caves, hid a stash of hot panini sandwiches. And since 1981, Panera has been mining those sandwiches and selling them to customers for $6.79. Except that now, I have eaten the last of the Fontega Chicken sandwiches, and it's only a matter of time before the world's supply of Smokehouse Turkey dries up, too!

Thursday, November 27, 2008

Book Report

Last spring my father started reading Then We Came To The End. However, he did not come anywhere near the end. And, since he had to get that book as far away from himself as he possibly could, he mailed the hated book to Virg and me. Then one day this summer Virg picked it up in desperation, and ended up loving it. She flew through it, laughing as she went. And so I started reading it, and it immediately became clear why Virg loved it so much. Virg's secret passion is to read random blogs about people complaining about their co-workers, which is exactly how this book reads. It takes place at a struggling advertising company that's laying off its people one by one, and yet everyone spends their days goofing off and gossiping. It begins as a blur of characters, but gradually you realize you don't really need to keep track of them, as the author keeps reminding you as needed. And you get sucked into the gossip, determined to find out what really happened to so-and-so's chair, etc.



In a way, the book reminded me of another book I enjoyed in the recent past: The Curious Incident Of The Dog In The Night. That story is narrated by a fictional autistic kid who is wrapped up in various details and misses all the serious emotional turmoil around him, just as the Then We Came To The End characters are too busy gossiping to recognize that their co-workers are coming to terms with divorce, unwanted pregnancy, loss of a child, etc. As the reader, you don't really stop to think about this stuff either, because somehow you just really want to know what's going to happen to that office chair. Part of this detached experience comes from the book's unusual narrative style: It's told in first person plural ("we"). Then halfway into the book, the voice changes, and for just one chapter, you're given an honest look at the boss's loneliness as she comes to terms with having cancer. And when you're thrust back into office gossip again, and the book's humorous events now take on an undertone of tragedy. And when I came to the end of the book, I found I had really enjoyed its entertaining and touching look at office life.



The other two books I enjoyed recently were authored by Barack Obama. I already wrote about how much I was enjoying Dreams From My Father during the run up to the presidential election. Well, it never disappointed. He tells his story so beautifully it feels like reading fiction. It reminded me a little of reading Sting's memoirs about his parents and beginnings, entitled Broken Music. If you read only one Obama book, read Dreams From My Father. Written shortly after he graduates from Harvard Law, the book traces his early life in Hawaii and Indonesia, his experiences as a community organizer in inner city Chicago, and his journey to Kenya to meet his father's family. The story focuses on the role that race plays in his life. It's a story about someone who is seen as a black man, but feels like an outsider in the black community, given his mixed and unusual background, and who, more than anything else, is just looking for somewhere he feels he belongs--a place he seems to find at last as he connects with his extended family and learns about his origin from them. It'd be impossible to read this book and not love Obama, for his honesty, insights, and genuine efforts to do good.



Obama wrote Audacity Of Hope in his first year as a U.S. senator, but it still feels honest. About half of the book provides the more detailed views behind the sound bites we heard in his presidential campaign. That half can be a little dry. But the other half, sprinkled throughout the book, consists of fascinating accounts of his time in politics. At its most personal, this is a book about a man contemplating the distance that his political life has put between himself and his family.

Sunday, November 23, 2008

Hallelujah!

Not yet president, and Obama has already healed the nation's wounds with lactose-free egg nog!!!


Tuesday, November 4, 2008

Our Attempt To Vote

On Sunday we got another door hanger for Obama, informing us of our polling place. Thankfully, Virg was smart enough to know it was actually the wrong location! We ran outside to catch the people posting false polling information, but they had already disappeared.

We've discovered that Pennsylvania doesn't mail sample ballots to voters, nor do they mail us information booklets to tell us what candidates are running or what measures are on the ballot. So, we picked up the Sunday newspaper, but even that had no information. We eventually found some info on a random web site, but now I can't even seem to find that anymore. I therefore gave up and decided just to vote for president.

This morning we woke up early to get to our correct polling place before it opened at 7am.
Everything we read said that a driver's license would be sufficient identification, but we each brought our voter registration card, not wanting to take any chances. When we arrived at the polling place, there were Obama and McCain campaign signs around the entrance, which seemed pretty suspect.

There were already two long lines. There were murmurs in the crowd as to whether it made any difference which line you were in. Virg snuck inside to ask one of the poll workers, and sure enough, there are two precincts at this location, and you need to know your district number in order to vote. Thankfully, the number was on our registration cards. Still the poll workers were too inept to post signs or make any announcement to identify which line corresponded to which district number, so Virg kindly shared her information with others in line. Most people didn't seem to know their district number anyway, so they waited to get to the front before knowing which line they should have been in.

There were four electronic voting machines for each precinct. Apparently all four machines for our precinct were broken. And so 100% of the people in our precinct were already being given paper Emergency Ballots. To obtain one, I needed to show ID, at which point they gave me a numbered card without explanation. Another person then took the card, tore it in half like a movie ticket, and gave me back my voting stub. Then another woman handed me a ballot. "How do I fill it out?" I asked. "On those tables." "With what?" The woman handed me a pen, saying "There are more pens on the table." There weren't.

Virg and I sat at a table together and tried to make sense of our Emergency Ballots. There was a bubble that let you vote "Democratic," letting you vote the entire democratic ticket in a single bubble. But marking this and leaving the Obama bubble unmarked made me very nervous. Plus, we didn't know if the ballot would be counted by machine or by hand--if at all. So Virg and I read through the directions at the top very carefully. The directions described two options for voting: (1) vote for a single party, or (2) vote for a single party, and then mark the exceptions. There was no indication of how you might just vote for individuals, or how you might vote for some offices but not others. I took the ballot over to the poll workers and asked one of them what I should mark if I just wanted to vote for president. She looked at it, and told me she had no idea.

And so Virg and I decided to hedge our bets by using different strategies to mark our ballots. I marked both the "Democratic" and "Obama" bubbles, and nothing else. Who did I vote for with those bubbles? Like the poll worker, I have no idea. Did I vote for all democrats, or just Obama? Did I vote for all democrats except Obama? Or did I invalidate my ballot by marking both?

We were told to seal each ballot inside an envelope. But in order to get them to fit, we had to fold the ballots in quarters. I can't imagine they'll be able to score folded and sealed ballots by machine.

At last, Virg and I left, with no confidence that our votes will be counted. I really hope Obama can win Pennsylvania without us...

Harold & Kumar Escape From Censorship

The writer/director team and lead actors kindly autographed this HK2 DVD for me. The four of them did an audio commentary track that's hysterical, in part because they're very funny people, and in part because it's the first time Kal Penn is seeing the unrated version, and his mortified reaction to it is priceless. Also, long-time Dave fans will be pleased to hear me cited during the library scene.


Saturday, November 1, 2008

Getting Out The Getting-Out-The-Vote

Last week I began reading a book that I'm enjoying immensely--an autobiographical coming-of-age story about a man coming to terms with his identity and with the role of race in America. But it reads more like a novel, and the writing is poetry, and I can't seem to put it down. And in the middle of my reading, I got the rare opportunity to see the author in person.

The experience reminds me of when you hear a good joke, and then later you hear someone else tell the same joke, but this time it ends "... and that man was Bill Clinton," or "... George Bush", or some other super-celebrity. And you think, but the original joke was funny in its own right. Why do people feel the need to cheapen it by dropping some big name at the end?

That's kind of how I feel about the author of this engrossing book growing up to be the famous Barack Obama. And yet, of course, I would never have started reading it, otherwise.

It's a fascinating book, because it's very honest, having been written before Obama's political career. And it was against the backdrop of my reading that I got to see Obama himself speak at a rally in Pittsburgh's Mellon Arena. Virg and I waited in an endless line outside the Arena (which ultimately still left half the seats empty). Every time we advanced a few more feet, another volunteer would remind us that we couldn't bring any banners, that we had to remove our Barack Obama pins in order to get through the metal detectors, and that we should turn our cell phones on (the implication being so that we could prove they weren't bombs). We were probably approached by 20 such volunteers, each concerned that it might take us a good 30 minutes to unfasten our Obama buttons.

And each volunteer asked if we were registered to vote. Did they really think we had the energy to make our way downtown and stand in line in the cold to see Obama, but that ultimately we couldn't be bothered to stop by to vote at the polling place near our house? Each volunteer also asked if we were interested in volunteering for the campaign, and were pleased to learn that Virg is already a volunteer. Do they really need more volunteers? They already have 20 people to tell us to take off a campaign button. And it seemed silly that the primary job of a volunteer was to recruit more volunteers.

Waiting for the rally to begin, we watched bemused as campaign workers passed out campaign-approved banners to the people nearest the podium. At long last, Obama came out to much applause, and his speech was well written and masterfully delivered as always. We were very glad we went to hear him. But the contrast to his book was striking. Here was the author who wanted to see himself as an American, but lived in a racially divided America that could only see him as a black American and continued to place him in black communities. I can just imagine Obama chuckling to himself after addressing the sea of white faces at the Mellon Arena.

Still it seemed to me that Obama was preeching to the choir, and it was hard to imagine what purpose the rally served. When I got home, I read about Obama's own experience in attending a rally event early in his career as a community organizer in Chicago. He wrote, "To my mind the whole thing came off a bit flat, like a political convention or a TV wrestling match. Still, the crowd seemed to be enjoying itself."

Virg has been phone-banking for the Obama campaign this week. On Thursday night, she spent a couple hours calling volunteers to remind them of when they needed to come in to phone-bank. At home, sitting by myself and finishing writing recommendation letters, the phone rang. It was a volunteer from the Obama campaign. She was calling to remind Virg to come in to phone-bank on Monday. It's as if Obama has too many people lining up to campaign for him, so he creates fake work for them. As if he's organized a community of people and tricked them into thinking they're community organizers.

Thursday, October 16, 2008

RSI Demystified

I know I haven't blogged in a while. It's not that I've been busy. Things just seem to be the same each week, so there hasn't been anything new to write about. But I promised myself I'd blog whenever I finished reading a book, and I actually finished reading two books recently.

Stress Book
Most recently, I finished a phenomenal book called "Why Zebras Don't Get Ulcers," by Robert Sapolsky.



It explains the science of stress, both physiological and psychological, which can be summed up like this: The body responds pretty much the same way to any kind of stressor. And it responds in the way that would most help you escape from being eaten by lions--directing your energy into short-term survival mechanisms, and diverting it from long-term repair. Which is great if you're being eaten by lions. Not that being eaten by lions is great. But if you spend enough of your life stressed out about finances, looming deadlines, etc., your body's natural response to these prolonged stressors is going to have serious consequences for your physical health.

Anyway, Sapolsky's book is a fascinating tour of the human body, as examined through the lens of stress and the body's response. And every page has the kind of gem that leaves you needing to stop and share some cool fact with whoever's nearby. (Poor Virg.)

Virg bought the book for me last winter, which I guess was her way of saying I was too stressed. Now that my job is far less demanding, she thinks I've been much happier and much less stressed. Maybe the book helped me focus my career plans on the kinds of jobs that wouldn't work me to death and stress me out so much.

RSI Books
Anyway, the other book I finished recently was called "Comfort At Your Computer" by Paul Linden. It was a rather unenjoyable read, but one that was necessary to get some genuinely helpful tips on ergonomics.



I've been suffering from computer-related (and piano-related?) RSI (repetitive strain injury) pains in my wrists since February, and it's been very frustrating experiencing these pains, unable to do the things I enjoy most, and unable to get any real help. I endured a few months of worthless appointments and treatments before I started researching RSI on my own. I've now read several books on the subject, including:
  • "It's Not Carpal Tunnel Syndrome" by Jack Bellis and Suparna Damany
  • "Dr. Pascarelli's Complete Guide to Repetitive Strain Injury" by Emil Pascarelli
  • "The Trigger Point Therapy Workbook" by Clair Davies
  • "Conquering Carpal Tunnel Syndrome And Other Repetitive Strain Injuries" by Sharon Butler
  • "Comfort At Your Computer" by Paul Linden
What is RSI?
If you had to start with one of these books, I'd go with "It's Not Carpal Tunnel Syndrome." The title reflects everyone's tendency (including several of my misinformed doctors) to diagnose you with carpal tunnel syndrome (CTS), no matter what your symptoms are. RSI is a very general term for the kind of pain I have, while CTS refers to a very specific medical condition. It turns out that the muscles that operate your fingers are located primarily in your forearm, and they pull on your fingers by means of long cables called tendons. Many of these tendons reach the hand through a narrow tunnel in the wrist called the carpal tunnel. The median nerve, which serves the thumb, index finger, and middle finger, also passes through the carpal tunnel. When the carpal tunnel is compressed, or full of fluid, it compresses those tendons and the median nerve, which prevents signals from the thumb-side of your hand from reaching your brain. So, if you regularly feel numbness or tingling in this part of your hand, then you may have CTS.

CTS occurs in people who have narrow carpal tunnels, people with overactive glands, pregnant women, etc. Its link to repetitive activity is unclear, but certainly many computer users have suffered from the symptoms of CTS. Surgery is often proposed as the solution for such people. The surgeon cuts the wall of the carpal tunnel (a ligament), which gives the tendons and median nerve more room. This immediately alleviates the symptoms for many people suffering from CTS, but it's not clear that it's a good long-term solution. At the least, surgery should probably be a last resort.

I don't suffer from CTS symptoms, but I do experience numbness at times, particularly in my pinky and ring finger--a sure sign that my ulnar nerve is being compressed somewhere. RSI pain is also caused in large part by compression. I'm still learning about RSI, but here's my current understanding of this condition.

Imagine a device that looks like a long tube.


picture of a device that looks like a long tube,
so you don't have to imagine too hard

When you turn on the device, the tube contracts, which is really cool, except that when it contracts, it's got all this disgusting goop that oozes out the sides. Thankfully, the device also comes equipped with hoses that suck up the goop and carry it away to some sort of appropriate goop waste receptacle.


contracted tube device
(de-gooping hoses not shown)

Now, suppose you've got two big heavy blocks, and you want to pull them together. You get a whole bunch of contracting tube devices, and you connect them to the blocks. Then you turn them all on at once, and the blocks are pulled toward each other.


a series of tubes,
pulling big heavy blocks together

What could go wrong? Well, suppose you turn on these contracting tube devices a whole lot. That will cause a lot of goop to ooze out the sides. But that's no problem, because the hoses will make sure the goop is properly removed. Ah, but what if something crushes one of those hoses, so that it can no longer remove as much goop? Well, that's no problem, as long as you don't turn on the contracting tube devices much, so that they don't generate too much goop.

But what if you turn on the devices a whole lot, when that hose is crushed? Then something very bad happens, because lots of goop oozes out of the tube with the crushed hose, and since it's got nowhere to go, the goop gooks up the contracting tube device. If the goop is allowed to accumulate like this for a while without being removed, that contracting tube device breaks down, getting stuck in a contracted setting. So now the broken tube is pulling unevenly on the block. Thankfully, this particular block is equipped with state-of-the-art sensors which detect this uneven stress and respond by illuminating a helpful warning light.


warning light comes on when block is pulled unevenly by gooked-up tube

Have you figured out what all this silliness has to do with RSI? Those contracting tubes are your muscle fibers. The goop is the metabolic waste generated when your body uses energy to contract its muscles. The hoses are the blood vessels and other channels that carry away that metabolic waste. The block those muscles are pulling on is your wrist. And the warning light is the pain you feel in your wrist.

Bad Advice
See a doctor for RSI pains and they'll immediately diagnose you with carpal tunnel syndrome, and then tell you to wear wrist splints and take Advil. But this is terrible advice, because the splints will compress your muscles and keep that goop in place, and will limit your range of motion so that you're using the same muscles repeatedly, and will deceive you into thinking you can continue working without changing your work habits. And that Advil won't help, because you're not suffering from an inflammation, and the quantities of Advil you'd need to consume in order to reduce the constant dull pain would destroy your stomach lining. The doctor will also advise you to stop using the computer--the equivalent of telling you to simply stop using that contracting tube system. This just avoids the problem instead of fixing it. And it isn't realistic advice if your life is in computers. I have seen nearly a dozen doctors, and not a single one of them had any understanding of RSI. But they were able to prescribe physical therapy.

Physical therapists are well meaning people, but many are equally misinformed. They push all sorts of silly remedies, including ice packs, hot packs, icy hot cream, and electrical stimulation--all of which temporarily relieve the pain (like covering the warning light with a blanket), but they do nothing to solve the underlying problem. They push other bad solutions, too, like strengthening your wrists (which is like making the tube devices pull even heavier blocks), stretching your wrists (stretching the blocks), and massaging your wrists (cleaning goop off the blocks).

Good Advice
But no one understood enough to go after the real problem: all that goop that's gunking up the contracting tube device. Cleaning that goop is relatively easy. It requires deliberate, targeted, deep-tissue massage. This is something you can even do by yourself, although finding that gunked up spot is tricky. Since the wrist is controlled by muscles in the upper half of the forearm, it's a good bet that you'll need to work on muscles in that region--an area that not one of the 20-or-so physical therapists and doctors I saw ever examined. And it turns out that you can relieve the pain quite effectively in this manner. The "Trigger Point Therapy Workbook" suggests using a lacrosse ball, and rolling your arm over the ball against a wall, and this has proven to be very helpful. Unfortunately, this only cleans out the goop temporarily. Go back to using a computer, and the goop returns, and you find yourself spending a lot of time with a lacrosse ball.

The real problem is that compressed hose--the blood vessel that isn't removing metabolic waste products from your muscles fast enough. What's compressing that hose? (Or if you've got numbness and tingling sensations, what's compressing that nerve?) Unfortunately, the answer is probably other tight knotted muscles. And those muscles are probably tight because their hoses are compressed by other tight muscles. So, to relieve pain in your wrist, you will almost certainly need to work on muscles in your upper arm, shoulders, neck, and upper back. And as you work on these muscles and relieve various tight spots, you'll almost certainly feel your pain move around.

Trigger Points
That "Trigger Point Therapy Workbook" does a good job at pointing out what muscles are likely to contribute to pains in other muscles. If your muscle fibers get gunked up enough, they develop trigger points--muscle knots that refer pain to other locations. That is, when you press on the trigger point, you actually feel the pain travel to some other part of your body. Trigger points are responsible for all kinds of pain, including some migraine headaches. Why? Most likely because if the muscles in your neck get really tight, they can pull unevenly on your skull, thereby causing your nerves to send warning messages to your brain, in the form of pain.

Virg suffers from frequent terrible migraines. I gradually convinced her to look into trigger points, and sure enough she can actually simulate a headache by pressing on certain spots in her neck muscles. So for the past month, she's been seeing a very wonderful and knowledgeable massage therapist just a minute from our home, and he is indeed finding lots of trigger points. What causes them? Most likely, holding your head in an awkward position to look at a computer screen, and whiplash--something both of us have suffered from in the not-too-distant past.

Virg convinced me to see her massage therapist, and he's been very effective in relieving my muscle tightness. These aren't your typical massages. They're not about relaxing. They're more like intense medical treatments, where I'm regularly communicating with the massage therapist, helping him find the tight spots, and learning what I can do to work on myself. He's a big fan of stretching to relieve muscle tightness, and he's been very helpful in identifying which particular areas require stretching.

So, what's being compressed? In my case, and in many other RSI cases, the answer is most likely the thoracic outlet--the region below the collarbone and above the ribs, where the brachial plexus (the bundle of nerves that serve your arm) and subclavian artery pass through various muscles on their way from your neck to your arm.


Thoracic Outlet
(image stolen from Wikipedia)

What could compress this region? Frequent chest-breathing. Tight scalene muscles in the side of the neck, pulling your rib up against your collarbone. Tight pect muscles. All of which cause and are caused by: working hunched over. In other words, bad posture. Stretching out this region and massaging tight spots in these muscles is critical to relieving the problem, but it's just going to come back unless you practice good posture.

Posture and Ergonomics
There is a lot of bad advice out there about posture and ergonomics. Any office HR manager with 15 minutes of ergonomics training will tell you to sit up straight with your chest out, and with your elbows, waist, and knees at right angles. And beware of any product that calls itself ergonomic: every curved keyboard, awkward mouse, and fancy chair. So what is good posture/ergonomics?

Sitting hunched over has two negative outcomes. It compresses areas like your thoracic outlet, and it puts great strain on your upper back and neck muscles, which have to hold your head up in that awkward forward position. Therefore, good posture is all about preventing this compression and keeping your head properly balanced on top of your spine. Nearly everything I've learned about good seated posture has come from the "Comfort At Your Computer" book, and I'm finding it really works.

Good posture begins with your legs. Sit on a flat, padded chair, so that your knees are level with, or slightly lower than, your waist. Your feet should be flat on the floor, shoulder width. Why do you care so much about your legs? Because the more weight you put on your legs and feet, the less work your back, shoulders, and neck will have to do. Most "ergonomic" chairs slope backward, encouraging you to recline. But reclining is bad, because it causes you to hunch forward to reach your keyboard and look at the screen. If anything, you want a chair that slopes slightly forward, allowing you to put more weight on your feet.

The real key to sitting comfortably is the pelvis. If you sit down and allow your pelvis to tip backward, you'll notice that your spine will curve so that your shoulders and neck slump forward. This is bad. Instead, tip your pelvis forward, and your spine straightens out, letting you move your shoulders and neck back into a more relaxed position. The author suggests you tip your pelvis forward by consciously "pointing your genitals downward." I know it's really icky to think about genitals when you're trying to work, but it's surprisingly effective in positioning your spine, shoulders, and neck. It's also difficult to maintain this position for long, and that's where a rolled-up towel comes in. Position it so that it helps tip your pelvis forward, and you can sit in this position quite comfortably.


one frood who really knows where his towel is
(image stolen from Amazon, who stole it from the "Comfort At Your Computer" book)

All of this is so that you can move your shoulders back, and let them relax so that your shoulders drop backward comfortably. It also lets you position your head so that it sits on top of your neck, pointing downward just a tiny bit. You also want to sit with your upper arms at your sides, and your hands positioned comfortably in your lap. If you've got a chair with armrests, you'll find they cause you to scrunch your arms inward and forward, leading to that compression again. Although every "ergonomic" chair comes with armrests, I am absolutely convinced they are the devil, and I will never work on a chair with armrests again.

Finally, your wrists. They should be straight but relaxed, with your palms angled a bit inward and toward each other, and your fingers gently curled. Ok, all that feels great, but where does the computer come in?

Working at a Computer
The key is to position your computer so that you deviate from this comfortable seated position as little as possible. That means you want your keyboard as close to your lap as possible. This requires a very adjustable keyboard tray or a very very low desk with a thin surface--all nearly impossible to come by. Ideally, the keyboard should be level, or even tilted slightly away from you. (Almost all keyboards insist on tilting toward you, but that's no good if you want to sit comfortably with your hands near your lap.) Keyboards that angle your palms slightly inward, instead of keeping them flat and pointed forward, are probably a good thing. If you're right-handed like me, I think the most important thing is to have a keyboard that lets you move the mouse without reaching over a numeric keypad. You can find good inexpensive keyboards without numeric keypads. Finally, you want to position the monitor so that you can look at it at a very slightly downward angle, without moving your head forward. That probably means raising your monitor by putting it on top of books or boxes.

Finally, you don't want to sit like this for long periods of time, no matter how comfortable your seated posture is. Take frequent breaks and stretch often. (I'm bad at remembering to do this.) For me, the most effective stretches have been the ones where I stretch my arms out to the sides with my palms forward, stretching them backward. You can also achieve this sort of stretch by holding your arms against a wall, or by lying on your back with your arms hanging over the sides of a couch/bed.

Getting Better
Perhaps most importantly, sitting properly requires the sort of strength you get from a good night's sleep. Massage and stretching can help your body begin its healing process, but deep sleep is when the real healing takes place. Getting a good night's sleep with regularity is critical. Drinking enough water is probably also a good thing, since this may help your body as it removes those metabolic wastes. And finally, you won't get better from RSI overnight. It took years to do the damage, it will certainly require many frustrating months to undo it.

Is all this working for me? Am I getting better? I sure hope so...