Tag: teaching

  • Teaching Chaos

    Teaching Chaos

    Chaos Theory
    Credit: flickr / Steve Jurvetson

    My friend Linda teaches drawing at University (amongst a wide assortment of things), and she was explaining a fascinating exercise to me.

    Requirements: white paper, charcoal, eraser, glue stick & tolerance for dirt.

    This is all about developing lots of strategies for recovering from errors and changes, and stumbling upon expressive, aggressive marks and effects that you can integrate into your safe, well-observed drawing.

    1.

    Start drawing the model, large, over the whole page

    Once everyone has a drawing well under way, committing to using the whole page, ask the model to change one thing about the pose, and ask the students to smudge out or erase the drawing as needed to incorporate the changed pose. Then ask the model to change again, and again. Eventually the students learn to use the smudges, ghosts and erasures as constructive marks in a drawing that combines observation and expression

    Give them a couple of tries at that. First time, they will learn what can happen. Second time, they can start to leverage the effects, not just recover from them.

    2.

    Like that, but after a couple of changes to the pose, stop the students and tell them “Tear your drawing into two pieces and keep the one you like better. Crumple the other piece up and throw it away. Look at the piece you kept. If you like it all, keep it. Otherwise, tear that in two and keep the one you like better. Lather/rinse/repeat until you have a fragment of the original drawing, a fragment you like. Glue it onto a new page and keep drawing.”

    3.

    Like that, but then put a splodge of white tempera paint or gesso into the palm of everyone’s (non-working) hand. Have them use that as hand-painted “white-out” to make changes to the drawing. Students gradually discover that they can not just erase but blend in charcoal and apply paint as highlights and other constructive marks. Erasure, tearing and patching fragments together are all still in play.

    4.

    Now play with equally messy colour – water-soluble crayola markers. Draw for a while in colourful crayola markers, then spray with water until they bleed. Integrate white tempera paint (which never perfectly covers the marker, and often blends into it) as you go. Keep brush and black ink, and all the strategies above.

    5.

    One of the hardest, weirdest experiences is working on a drawing for longer than an hour. Of working on something, and stopping, and coming back to it the next day… and holy shit it’s like it was made by a whole other person, and you need to look it over and figure out what today’s artist wants to do with it next.

    So let’s approximate that effect, fast-forward, in the classroom, with tag-team drawing

    Arrange students in a circle around a subject (still life or model), start drawing in your choice of material. One they get something established on the whole page… stop. Have them leave the drawing, pick up supplies and move to the next drawing over. Tell them to “Look at it as if it were your own. What does it need next? Do that”. Next drawing, next drawing.

    After adopting several drawings, have them come home to “their” drawing and look over the many marks and styles and changes that classmates have applied. Students then work over the whole drawing, including any of the strategies used above, to emphasise and reiterate the properties they like, downplay the things they don’t like, make some corrections and integrate the whole thing into one image

    6.

    If students are really risk-tolerant and energised by this approach, ask the very best ones to send the drawings one direction while the artists travel the other. The drawing no longer aligns with the viewpoint on the still life (or model) and students have more extreme changes to cope with, change or embrace.

    7.

    Then you give them long sustained poses with complete free will and let them apply what they’ve learned when they want to.

    How Could We Increase The Tolerance for Chaos in Software Engineering?

    1. Shifting Priorities. Assignment is a choose your own adventure – you have a list of features to add, and some discussion about priorities of each. There are a series of deadlines, and at each deadline you have to hand in a feature, but it’s up to you which. The catch – each new round of deadlines, the features and the priorities change. The worse the choices you make early on (most interesting feature instead of most important? Added bells and whistles instead of infrastructure?) the harder things will get.
    2. Shifting People. Assignment is a series of features. After each deadline, you get someone else’s code. You lose marks for re-writing it unnecessarily. Added  chaos – the features are not ordered.

    Group work is supposed to teach this – or the experience of working with other people in a team, at least, and sometimes it works, but too often one person takes on the task of writing everything. Other students can then feel alienated and inadequate, view it as their failure to be the person doing all the work. It’s actually a failure of the exercise.

  • Come the Revolution

    I was talking to a – male – programmer the other day, and he was telling me how much his high school CS teacher sucked. This is not an uncommon story. I know some good high school teachers. I’ve heard about a lot of bad ones.

    This particular bad one taught Visual Basic, and gave this guy a book on Java and told him he couldn’t expect any help.

    I think this guy expected me to be, I don’t know, surprised? Horrified? Worried?

    Actually, I said,

    “I don’t worry about people like you. You know you’re interested, your parents are supportive, you find ways to learn, now you’re doing fine. But – how many people could have been interested, but never got the opportunity to find out what computer science and programming really are? This is why I worry about women, because I think women often fall into that group of people, and if we help those women, we help everyone in that group.”

    I’m very cynical about the education system. I think (hope?), that eventually we will get rid of “teachers” and instead have TAs whose job is to keep order, whilst students get their personalized learning from educators via a computer and the internet – the use of instantly graded quizzes, live-chat, and forums etc.

    That would give more scope for following the things you’re interested in, you have some minimum requirements (say X number of core modules to be completed within some time frame) but students can progress at their own pace (one of the most depressing things I found at school was having to learn things at the speed of the slowest person in the class). There is then less need for the term system, a strict timetable, or a certain number of hours a day. Home school becomes more feasible (and a curriculum can be mandated, so no skipping actual science in favor of creationism), and extra-curricula activities more important for socialization. It would be easier to do intense weeks of science with actual scientists (apparently high school teachers who are anxious about science are passing that anxiety on to their students, similar to the way that happens with math and girls).

    In this utopia, quality would be higher, the job of keeping order and educating would be separate, students would have more freedom, and you could pay educators more because they would scale. It wouldn’t be 1 to 30 students, it could be quite reasonably 1 to 100, more even, because bureaucratic overhead would be removed – no attendance, no discipline, no grading quizzes. Just creating great curricula, and moderating forums and responding to questions, and some marking of long-answer questions.

    Maybe society will keep educating children in human-capital factories. Hopefully not. Meanwhile, I’m not worrying about people being put off their dreams, I’m worrying about people who never realize they have them.

  • Friends Don’t Let Friends… Become PMs

    Friends Don’t Let Friends… Become PMs

    Careful
    Credit: flickr / Tom T

    Recently, I heard about a school that has a mandatory “technology” class that students have to take in order to take CS classes in later years. It features: wood-working, circuit building, and Excel.

    This is horrifying. I want to go there with picket signs and stage a protest. Dress up as robots and chant things. If someone deliberately set out to design a course that would put kids off CS without them ever getting an inkling as to what CS is, they couldn’t do better than this.

    Wood work? WOOD WORK?

    And then, I’m in “training” for something (external) where old white men are telling me how to talk to high-schoolers, and describing what I do – software engineer, programmer – as “builder”. Apparently I have an “isolated” job and it’s the kind of thing that can be out-sourced… really not that high-potential a career. They seem to be saying that students should be blending a little bit of the technical with business and voila they’ll have a great career and let’s all enourage girls to do this, shall we.

    And I think, it’ll be a cold day in the hell I don’t believe in before I encourage anyone to study business period, let alone for a technology career.

    I cry a little inside because I thought I’d signed up to encourage women to go into tech, not near tech.

    Wood work starts to seem sensible by comparison.

    Thankfully after that I go back to my team of 50% woman and we keep working on creating something extraordinary. We’re trying to build something that can’t just be in the head of one person, so we have to communicate. We’re trying to build something well, so every piece of code gets looked at by 2-3 others. And later I’m stuck on something and one of them steps through it with me and I realize what I’ve done wrong and fix it. We get creative trying to do things that we haven’t done before. We have so much fun together that our visitor goes back to his office raving about how lovely we were to him and how close we are as a team.

    My isolated job, is not so isolated.

    Things I worry about with respect to girls and technology. I worry about terrible math teachers and gender-stereotyping convincing them that math is not for them, that girls aren’t good at math. Regularly I have conversations with women not in tech careers and they tell me they were good at math in school, and yet somehow didn’t consider taking it further – it just didn’t seem like an option.

    I suspect wood-working classes won’t change that.

    Then I worry about girls in university who think “I’m ok technically, but where I really differentiate myself is that I have good communication skills… I could be a great bridge between the technical and the non-technical…” who then go and become product managers. And they never find out that they were just as good as many of the guys in the class, that a technical career was an option. I know, because this happened to a friend of mine – thankfully she rethought it before she took that path and now she’s an engineer. And because it was nearly me, too.

    And so my friend and colleague complements me on my communication skills, and I quip that they would be distinctly average compared to people in any other profession, it’s just compared to engineers that they seem good.

    My point – being able to communicate doesn’t mean that a technical career isn’t a great fit, just like I don’t think there is much correlation between wood-working and software engineering skills. I’m on a mission to urge university girls – think about being an engineer before you decide being a PM is for you. It’s been four years since I finished my undergrad, and in that time I’ve come to realize – those guys who thought they were great and I figured they must be if they could be that confident? No-one is as good as those guys thought they were. Under-confident does not mean under-qualified. Really.

  • Getting Started With App Inventor

    Getting Started With App Inventor

    app inventor

    A colleague and I are running a workshop for high school teachers this week, and we plan to use App Inventor (which will now live at the MIT Media lab).

    So I had a play around with app inventor and it is so easy to get started. The beginner app is one where the kitty purrs when you pet it. Useless. Yet given the popularity of cats on the web… genius.

    I followed the setup instructions here. It took maybe 30 minutes to get everything installed and have the app done and running on the emulator. Downloading things and waiting for things to start was the bulk of that (it’s slower first time, apparently).

    It’s annoying to have so many windows – I feel like this was designed with a big monitor rather than a small (I was using my 15″ pro) laptop screen in mind, but at least they are all different programs so switching between them (via the dock or cmd+tab on the mac) is not too bad.

    I didn’t package the application for a phone (I don’t have an Android device) but that looks to be pretty simple too.

    Overall, I’m really looking forward to playing more around with it. It’s a bit like Multimedia Fusion for app-development. I’m not a huge fan of teaching “programming” via visual means, but teaching “game development” or “app development” and sneaking in some programming and making kids want to take it to the next level is something else. I’ve found that to be a pretty successful strategy!

  • Experimenting with a Visual, Activity-Based Curriculum

    Experimenting with a Visual, Activity-Based Curriculum

    When I left Ottawa, I had to find the new me to run my Processing Workshop. His name is Ali and he’s awesome. He’s had the idea to write up the ideas into a paper, so we’re working on that at the moment, but it occurred to me that I didn’t write much about it here.

    I will definitely post more as this project progresses, but for now I’m going to write up some of the design decisions that I think make this different. Comments welcome – it’ll help us write a better paper – or decide it’s not worth the effort!

    web

    Entirely Visual

    This started when I was teaching programming in the US. Kids taking the other courses were taking home video games, even 3D ones, and so my little programmers weren’t overly excited by the idea of taking home a text-based hangman – and, well, who can blame them?

    So we came to an agreement – we designed something together and I coded the GUI and each of them coded their own back-end. I developed more such frameworks the following summer and eventually got asked to develop the curriculum for all of the US.

    There, I introduced early concepts using Processing (a language and editor for teaching and artists – makes it really easy to create visual applets) as a library within Eclipse. Some students would code their final projects in Processing, but they had the option of a (Swing) framework. I negotiated my contract such that whilst they owned what I wrote, I licensed them the code I wrote (and retained the IP).

    The latest curriculum is designed for one day workshops. Eclipse is an extremely complex and powerful program and has a steep learning curve. The Processing editor is very simple and easy to use and removes some of the syntax necessary to create an applet, so we use that instead.

    Every exercise has a visual outcome. Students can compare what they have produced to the one in the instructions. This provides visual honesty that is lacking in text-based programming applications. By working visually, we turn the program from a “black-box” where the student often does not understand the relationship between the input and output… into a colourful one.

    Activity-Based

    I remember learning to program, and I noticed this pattern:

    1. Introduce concept
    2. Provide contrived example.

    I’ve taught like this too. But – why? That’s not how I code. That looks more like:

    1. Evaluate problem.
    2. Apply solution, that I know/look up/invent (for more complex problem).

    Contrived examples are 1) boring, and 2) patronizing. Instead, we present things that the student might want to do, for example – repeat things, or sometimes do one thing, sometimes do another, and provide code with an explanation.

    For a one-day workshop, we cannot expect the students to memorize concepts and it seems unreasonable to expect them to be interested in doing so. Our focus is on showing them how we can solve problems using code and why that is fun.

    Open Source

    Everything about our workshop is Open Sourced. The content is licensed under a Creative Commons Attribution-NonCommercial license. Similarly, the Processing library is licensed under the LGPL. So students and teachers can distribute their code without concern, but more importantly – students and their teachers can download the software at home or at school free of charge, and continue to explore the modules in their own time.

    TAs

    A low ratio of students to TAs (4 students to each TA) was a key part of the strategy for the workshop. Being stuck, and having to wait, is extremely frustrating to a student. Also, more one-on-one help from a TA makes it possible for students to tackle more challenging projects.

    I was extremely picky about TAs and interviewed them with technical questions, not just experience questions. I was looking for fast problem solving, and good clear communication of their solution (and in general).

    With the short time available for the workshop it was really important that the TAs could fix problems quickly. The key was to keep students moving through the content and feeling like they were progressing – the number one purpose of the workshop was to inspire them to take computer science, rather than to memorize concepts.

    Communication was really important – firstly, because a more effective communicator will teach students concepts faster. Secondly, to break the stereotype of CompSci students as socially inept and not fun to hang out with. I was really looking for people who I felt would be good role models for the students. This included not restricting TAing to graduate students, who often code infrequently anyway. For the first workshop, I hired 4 graduate students and two talented undergraduate students as TAs. They were all fantastic. Our second workshop was organized with less notice, but rather than compromise on the quality of TAs we had a slightly higher ratio (5-6 students per TA). Ideally, we will go with the lower ratio but this ratio was workable.

    Self-Directed

    Related to the low ratio of students to TAs, was the self-directed nature of the workshop. Because the curriculum is available online, there is no need to share printed copies, or wait for the instructor to explain things. Whilst the first couple of modules were necessary to give students familiarity with Processing, students with prior programming experience could quickly skip ahead to more advanced examples. Where possible the modules were written to be stand-alone, so no specific path was necessary. Having a good selection of modules meant that students didn’t have to work on the same “final” thing as their friends, if they didn’t want to.

    Inclusive of Interests and Levels

    Processing is designed as a tool for artists, and there are several modules involving creating fractals and showing students how to create patterns. Creating games is often used to engage kids and teenagers in wanting to learn to code, but by allowing this alternative, artistic track, we hope to broaden the reach of our workshop. But, if they want, there’s a framework for a simplified game of Pacman. We plan to add more games, such as BrickBreaker, over the next few months (subject to funding).

    Some students come with prior programming knowledge, and others do not. We will sometimes run a workshop for multiple schools simultaneously, and we don’t know what background knowledge the students have. This is in addition to the usual issues of different abilities! We have a mix of modules of varying challenges; for example, the most tricky parts of the fractals and patterns is the math, so students less comfortable writing code can work on those. An open-ended attitude means that there is always additional challenges, for example – animation! Students with prior knowledge of programming will often define their own challenge, or even look elsewhere on the internet and explore the 3D capabilities of Processing.

    Overall

    Honestly, I think computer science tends to be really appallingly taught. I don’t pretend to know how we should do it, but we need to do better. It’s great if people want to use, or critique what I’ve created, but the big thing is – I think it’s important that we have a conversation about how to make CS more engaging, whilst still teaching the skills that students need. They need to be able to code, not just write Java with the help of Eclipse.

    You can find the workshop here

  • Processing Workshop

    Pretty Web

    I’ve been a little quieter than usual for a number of reasons, one of which is that I’ve been working on a workshop for the University. It’s aimed at getting 17-18 year olds interested in taking Computer Science, and I’m using Processing for that.

    I’m experimenting with what I’m calling an Activity Based Curriculum. I.e. rather than deciding to teach a concept like types, or conditional logic, or loops, I work with an example of something that you might actually want to do, and the concept is a side-effect. As I’m using Processing, it’s completely visual. The workshop is just 3 hours long, so I’m aiming to send the students away with an understanding of why it’s cool to be able to program, rather than with the basics of doing so.

    As part of my contract, I specified that the course content be licensed under Creative Commons and the code will be released under GPL.

    If you’re interested, you can find it here. As ever – let me know what you think.

  • What Makes a Programmer Great?

    This is a post I co-wrote with Douglas Gresham. Douglas is a software engineer at Google, who blogs at www.douglasgresham.co.uk (less often than he should, go bug him for updates).

    Credit: flickr / stevehdc

    I’m a graduate student, though I firmly believe that great programmers are not the result of university courses in programming. But university courses take us in, with no idea of what we’re doing and eventually spit us out, mediocre or – hopefully – competent, programmers. And then we’ll go out into the world, where we really master our art. Hopefully.

    Going in to university knowing a little bit of C, I came out knowing a moderate amount of Java, some Python, some Haskell, some more C, a little of ML, Prolog and javascript, and very little (though more than I think anyone should have to know) of Tcl. Coming out of grad school, I think I’m a better programmer. Not because I’ve learnt more languages, or because anyone’s sat me down and taught me anything new, although reading Effective Java definitely helped, but because I’m more confident.

    For some reason, I’ve ended up doing a lot of teaching over the past 4 years or so. And I’ve come to think that the difference between the mediocre and the competent programmer is confidence. When we take an assignment, a clearly defined task with a definite solution, believing that we can work out the answer is the most crucial thing to succeeding. I wonder if this is related to there being fewer women in computer science, as women are often less confident (also this article).

    I’ve seen this not just with my students, who sometimes email me checking their correct answer because they are shocked they happened upon it, but with my own experience. If there was one thing that stopped me achieving my potential during the first years of my undergrad, it was my lack of confidence in my own abilities. I felt that I was at the bottom of the pack, but since I’ve come to realize that that was mostly in terms of arrogance.

    Not that I advocate being arrogant – but having a little more faith in yourself might make a big difference, it has for me at least. If it takes 10 years to learn to program, by my calculations I’m less than half way there. Now, I can’t wait to go out into the real world so that I can make the progression from competant to good, and I hope eventually – great.

    My friend Dig makes me believe this is possible, and his thoughts on what makes programmers great are below.

    Credit: flickr / Don Solo

    Having been living in the Real World(tm) for a couple of years now, I’m acutely aware that the rules are somewhat different than at university.  You’re not working on self-contained projects for your own grades any more, and you’re almost certainly working with people who are smarter and more experienced than you are (at least to start with).  Out here, confidence still matters, but you have to ground it in something – it’s not for nothing that the Dunning-Kruger Effect is reflected in new grad CVs more than those of seasoned vets (you are not a Java expert if your name isn’t Josh Bloch, I’m afraid!).

    I’m firmly of the opinion that programming confidence should come only from working with great programmers. The reason for this is pretty simple: programming – or more accurately, software engineering – is about putting together complex interactions based on a whole heap of assumptions you have, be they about users, the type of input you’re going to get, the systems you’re interacting with, the performance of the hardware you’re running on, and so forth.  Assumptions have a nasty habit of being completely wrong, but non-obviously such that they come back to bite you much later on.

    Working with other programmers means having to justify your assumptions or revise them in light of others’ opinions.  Working with great programmers means you have to do a damn good job of that justification, and that the revisions you make are going to be of a higher quality and frequency.  As you do this, with any luck the ratio of justification to revision improves, and with it comes deserved confidence.  It should never go to 1:0 though, that would be terrible both for personal development and humility.  If it does, seek out more great programmers to disagree with pronto!

    I say ‘working’ with other programmers, although I should really say ‘interacting’.  Manipulating the same codebase, having to use each others’ designs and – if you get the chance – pair programming are definitely the best ways to achieve this, but the discussion over a mailing list or around a table (coffee in hand, naturally) are equally worthy, especially since you can balance the daily make-it-work hackery with the conceptual ‘ideal world’ solution.  One of the best programmers I know is completely addicted to Stack Overflow – I’m sure the two factors feed into each other hugely.

    I’d also qualify ‘programmers’ as being explicitly plural.  One other opinion is never enough, particularly given the predisposition of compscis to get over-enthusiastic about the One True Path to code nirvana.  It’s the same with design patterns, IDEs, languages and so on (every object-oriented coder should be made to write some functional code), but vital with others’ opinions.  Many inputs makes it easier to spot the zealots and avoid becoming one yourself – or at least being able to justify it more competently!

    Finally, there’s the bootstrap – you can’t sit anyone next to a great programmer and expect greatness to transmit via osmosis.  This is probably worth a whole book in itself, but I’d say solid core computer science (especially algorithms and data structures, but I would say that as it’s my thing), a flair for design and an ability to break down your assumptions, both technically and psychologically, are all key (try Test Driven Development, even if you don’t stick with it long-term as it teaches you those).

    Of course, this is all one opinion from someone a long way off of greatness, so by my own logic you should ignore me.  Ah well.

  • First Day as a Ski Instructor

    Credit: flickr / Hidden Eloise

    Although I’ve given a lot of free ski lessons since I qualified, to people displaying various degrees of talent and attention to instruction… yesterday was the first time people paid for my advice.

    I’m still kind of shocked that it’s worth anything, given that I couldn’t ski until I was 21.

    But, now I have my level 2. And that feeling gradually went away. First the little English girl, who was very sweet and whose dad was watching the whole time. He started off a little annoyed (there had been a mix-up and her lesson had started late) but by the end of the hour he was thanking me saying her improvement had been amazing.

    Yay!

    Next up, I ended up with two little girls, sisters. They were pretty good skiers already so we went up the mountain. Apart from an incident at the chairlift (next time we’re going slower and all getting on together) and one of them getting stuck in a hole and having to be lifted out… it was all good.

    Finally, I had a little French girl, first time on skis. She was super cute, but a little scared so at first what we did was she’d slide down a little and I’d catch her. And I was allowed progressively further away, as she learned to slow down and eventually stop by herself. But even as I’m holding her up, and my lower back is howling with pain, she’s pointing to the big lifts and asking if we can go up, and if she can go up with daddy!

    Credit: flickr / Damon Duncan
    By the end of the day, 3pm, I was exhausted. But all in? A pretty good day and a great break from doing what I normally do.

    It didn’t start off that well though. I was supposed to have a group in the morning, and the woman in charge told me to be there at 10:20. I was, but I should have been there for 10, so they were gone. I felt terrible, and horribly embarrassed that I’d screwed up and got the time wrong – honestly I wanted to burst into tears and go home… until she later apologized  and said she’d realized it was her who’d mixed things up. Oh the relief!

    First days – really hard. First days somewhere completely different? Even harder. No computer to hide behind! But so worth it. Teaching a child in French – big hurdle for me. Made it!

    How was your weekend?

  • Thinking Like a Programmer

    I see this problem continually in the first years I TA – they’re so overwhelmed by syntax they don’t know how to start to write the program. VB (in Excel) is especially mean about this, as if a line of code won’t compile it won’t let you go to the next one.

    So, having given the same explanation 10+ times I’ve made it into a presentation – I hope if you’re a beginner programmer you’ll find it useful. Let me know what you think!