Sunday, May 22, 2022

My experience as a Unit-18 Berkeley Lecturer

From spring 2021 through spring 2022, I was a Unit-18 Lecturer for UC Berkeley in the EECS department. A Unit-18 lecturer is what is often called "adjunct"; it's not on a tenure track, isn't part of the "Academic Senate", and it's represented by a union. Since I don't have a PhD, I am not eligible for tenure-track lecturer roles at UC Berkeley.

Here's a high level overview of my 1.5 years at Cal, both in terms of courseload and "lifeload":



I include my lifeload above as I imagine my experience may have been different if I didn't have a young child to support financially and to care for in the evenings/weekends.


Here are my reflections on the various aspects of being a Unit-18 lecturer. I am grateful for the experience, as I've learned a lot, but alas, there were more negatives than positives in the end. I will be going back to industry, but perhaps one day will return to academia when it's a better fit.


Compensation: Too Low


My salary as a Unit-18 lecturer with a 100% appointment was about 100K annual compensation until our union's strike and new contract brought it to be about 107K. That compensation is technically for 9 months (since we "only work 9 months") but spread over 12 months.


That is the lowest salary I've had in quite a few years, especially since there is certainly work to be done over the summer/winter. There are also quite a few expenses to this job that I haven't had in tech jobs: parking fees ($118/month), meals ($15/day), A/V equipment for at-home Zoom instruction and in-campus hybrid instruction, snacks for staff events, etc. It's possible to ask for reimbursement for some of the latter costs, but I've had mixed success and have mostly stopped asking.


For comparison, if I were to take a software engineering job right now, I would earn a minimum of 160K (like at a startup with high equity) but more like 220K+. Plus sign-on bonus ($20-120K), stock options, annual performance bonus (10-40%), etc.


Courseload: Too High


Sp21: I actually found the courseload of my first semester at Berkeley quite reasonable. I co-taught CS61A along with Paul Hilfinger and co-taught CS302 with Dan Garcia. I had fortunately spent the month before starting at Berkeley going through the entire CS61A materials, so I felt prepared topic-wise. Hilfinger wanted to teach most of the lectures, so I instead focused my time on exam writing and other course improvements. That semester was also entirely over Zoom, which meant no commute time plus more compatibility with taking care of a 1.5 year old in the evenings. I was even able to attend staff meetings with my daughter napping on me.


Fa21: That semester was brutal. I co-taught CS61A with John Denero and CS169A with Michael Ball. This time, I gave all the 61A lectures, so I had quite a lot of lecture prep to do, ~6 hours per lecture. Fortunately, John wrote the exams so that was off my plate. I found it really difficult to balance CS61A (a massive class of 2000) with CS169A (still a fairly large class of 350), since 169A required a fair bit of work in writing quizzes/exams (5 quizzes, 1 exam), grading open-ended homework assignments, and staff management. I was also new to CS169A, so I was trying to go through the assignments before giving them to students, and that takes a lot of time.


On top of it all, I was also in my first trimester of pregnancy, experiencing the most fatigue and nausea I've ever had in my life, so it was difficult to force myself to stay up late to get everything done.


Sp22: Somehow still a pretty rough semester. I solo taught CS61A, co-taught CS169L (30 students) and co taught CS302 (30 students). I fortunately had the majority of my lectures prepped for CS61A, but I was admittedly eager to try out some course changes, especially since we'd received funding for a particular change that we'd been working on since the summer. Implementing changes in a course significantly increases the time required for new lectures, new assignments, TA training, support, etc. I found it hard to balance CS61A with CS169L and CS302, plus all the random other committees and commitments I'd picked up in the last year, especially on days where all of them suddenly had urgent things that needed doing. There were many nights where I thought to myself "I don't know how everything's going to get done by tomorrow, but somehow it will, please please I hope."


Generally, I think the workload formulas at UC Berkeley don't account for the many aspects of running a course. They consider the time required for lecture and office hours, but that is such a small aspect of everything involved. Many hours are required for staff management (given how large they can be!) and dealing with the increased number of edge cases that occur with large number of students (academic misconduct, Incompletes, extensions, incidents, etc). I think that teaching a massive course like CS61A, with perhaps 1 small course like CS302, should count as a 100% appointment. Otherwise, when faculty members are forced to take on too many courses, we often have to skimp on aspects, such as staff management or assignment refinement, and that skimping can have significant negative effects.



But You Get Winter/Summer Off!


Hahaha, no.


First of all, there is actually work that needs to be done during the summer. CS61A needs to hire 100 staff members for each fall semester, and it takes a long time to go through all the applications and determine which 100 people to hire, conduct interviews, contact references, etc. In theory, we were supposed to finish hiring by early June, but it just wasn't possible to hire that many people so quickly. 


Besides hiring, there's also preparatory work to do for the next semester, like if you're teaching a new course, since there's often no time allocated for that during the semester.


There's also grading that happens in the winter. Sadly, for CS169A, grading took so much time that we had to request an extension and then we stayed up til 1am on New Years Eve calculating the final grades and submitting them. Happy New Years! Resolution: Never do that again! 


But the real issue with the summer/winters is that my compensation as a Unit-18 lecturer was so low that I could not afford to not work at all during them. My bank account actually nearly went to $0 last summer, which hadn't happened to me since… college? I ended up taking on various curriculum/teaching gigs during the summer which paid some, but the payment came months later. I perhaps should have taken on software engineering consulting instead, which likely would have paid higher and sooner.


In the winter, I developed an online course for a company that would pay me based on the number of students that took the course each offering. The first cohort turned out to be small, so that didn't work out great for this year, but future cohorts may be larger, so the time investment may eventually be worth it.


If I was earning a higher base salary, then I perhaps could fully relax during the summer, as is rumored to be possible as a professor, but Unit-18 salaries put that dream farther out of reach.


Also, notably: I really couldn't take any vacation at all during the fall/spring semesters, whereas I could take a vacation every few months if I worked in tech. So I'm not sure how much it's really worth it if you have to go so hard for 9 months with no breaks in order to get those few months off. I think I'd prefer more breaks scattered throughout the year.


*Yes, there's a spring break, but I had to use that to prep lectures for the rest of the semester, due to a lot of overlapping deadlines in the post-spring-break weeks.


Benefits?: Health Insurance


My first lecturer appointment was only for a single semester (which may be standard practice?), and it meant I was only eligible for catastrophic insurance during that time. The HR officer advised me to get other insurance if I could, but my COBRA would have been $1500 per month, and I’m not married to my partner, so I stuck with the catastrophic insurance and just tried very hard to not get sick/injured. 


Unfortunately, I did have a medical issue at the very end of those 6 months, and ended up in a limbo for a few weeks between catastrophic insurance ending and comprehensive insurance kicking in, and I just constantly called an emergency nurse line for reassurance that I wasn’t dying. Finally, Kaiser kicked in and I was able to recover.


The Kaiser insurance plan is similar to what I've had in the past at tech companies, which I think is a good level of health insurance. I would have just appreciated it earlier :)


Benefits?: Maternity Leave


The maternity leave benefits for Unit-18 lecturers are not great. When I had my first baby while working in the tech industry, I got 4 months fully paid leave, no questions asked. At Berkeley, when I realized I was pregnant with a second baby due June 3rd, I had to do a lot of asking around to see how much leave I would be eligible for. I think it turned out to be  around 10 weeks, but since it would have been during the summer months anyway (during which Unit-18 lecturers receive payment already), HR suggested not going through the effort to formally go on leave. 


I also discovered I was eligible for "Active Service Modified Duty", which meant I could request a modification to my typical lecturing duties in the fall semester, as long as the department approved. I ended up requesting a semester where my only course would be solo instruction of 61A, but I would also do preparatory work for next semester's first time teaching CS160, plus writing the spring 61A exams and working on a few new 61A projects. Such a semester certainly would have been a lower workload than a semester teaching 3 courses, so I appreciate the chairs for approving it, but would still have been rough to balance with having a nursing 3 month old. 


Okay, But Teaching Is Fun?!


There are indeed many aspects of teaching that are very interesting intellectually and quite fun. What I love:


  • Lecturing. I like trying to figure out how to present something in a way that makes sense. Granted, I don't always succeed, but it's interesting to see when an attempt fails, too. I also love the questions that students ask, since it prompts me to learn something more deeply.

  • Assignments. Similarly, it's interesting to figure out assignments that will help students learn a particular topic. TAs often do a lot of assignment creation, at least in 61A, but I like working with them on that.

  • Autonomy. Probably the greatest park of academia is that we do get a fair bit of free rein as lecturers. If I want to experiment with a slightly different topic ordering or even a new topic, then I don't need to request permission from anyone above me. I do need to get staff on board and make sure they're comfortable with it, since they'll need to teach that in their sections, but that feels very different from the top-down decision making that often happens in tech.


However, there are also aspects of university teaching that are not that fun (to me), such as:


  • Academic Misconduct. I'm so sad when we discover students cheat. But we do need to look out for cheating, since it's unfair to students that aren't cheating if other students are freely allowed to cheat. 

  • Grading. Unfortunately, grades really do mean a lot at Berkeley, especially for CS61A, since L&S students must get a 3.3 average GPA in 61A/61B/70 in order to declare CS. Even a few points out of 300 can make a difference to someone's final grade and thus their ability to declare, so we get a lot of regrade requests throughout the semester. I've had some 20-email-long threads entirely about just 2 points. I totally get why students care about 2 points, since there's that dang GPA cap, but I still find it exhausting to reason about why one student should get 2 points and not another student. My best approach has to just been as consistent as possible, which often means erring on the side of being less generous.

  • Staff management. It's hard. I've done people management at various times in my life, but it's difficult to do it well while also trying to do many other aspects of teaching. I don't think I've done it particularly well in my time here. Part of that is never having managed undergraduate TAs, part of that is lack of time in being able to do mentoring, check-ins, etc. 

  • Service. There's this thing in academia called "service" referring to things like serving on committees. I believe it's viewed favorably for tenure-track faculty members when tenure is being decided, but for Unit-18 lectures, it mostly feels like unpaid labor. Some of the committees do discuss interesting topics and make important decisions, but I think Unit-18 lecturers should be paid more if that is going to be a part of our job, since we already have higher teaching loads than normal faculty.

  • Faculty Hierarchy. Unit-18 lecturers are very low down on the totem pole in terms of the classes of faculty members at the university. My first semester, I wasn't allowed on any of the faculty mailing lists. I'm still only a few of them, and I'll hear every so often about discussions that happen on the "real" faculty lists. There are also some faculty meetings we aren't allowed to join, like particular hiring discussions. It's not even that I want to be involved with all of these things; but it does start to feel bad when you realize increasingly how much you're excuded from.


I want to thank those at Berkeley who helped me get the lecturer position, as I've always been very eager to try out university lecturing. I hope that one day I may return as a lecturer at Berkeley or elsewhere, once it's a better fit for my financial and caretaking needs. In the meantime, I've decided to share my experience for others who are considering pursuing the same or similar roles.


Wednesday, January 26, 2022

New online class: Python Crash Course on Co:rise

I've always been excited by the possibility of online education. Years ago, I was an early engineer at Coursera helping university professors make their courses available in a MOOC form. I then joined Khan Academy to put my own courses online, putting together computer programming courses in JS, HTML/CSS, and SQL

The Coursera and Khan Academy courses are similar in that the content is largely self-paced, and you don't often have a strong sense of being in a class with classmates. That's okay for many learners, but there are also quite a few learners who like the feeling of a community and the social accountability of a cohort. 

Co:rise is a new platform for online learning that's attempting to offer the best of both worlds: easily accessible online content (articles, quizzes, projects) plus live weekly sessions (with instructors, TAs, and guest speakers). I'm really intrigued by the combination and its potential for better online learning, so when they asked me to put together a course for it, I immediately signed up.

I spent winter break putting together Python Crash Course, a 4-week course with about 6-10 hours of work per week. It's an introductory course, targeted at folks new to programming or just new to Python. Each Monday will start off with a Zoom lecture with me, where I'll lightly introduce the week's topics. Then you'll dive into the articles and coding challenges from Monday-Wednesday. We'll have another Zoom session on Thursdays to kick off the weekly project that uses all the skills you've been practicing in the challenges. Our TAs will have office hours Friday and Saturday to help with project questions, as well as answering them in our class Slack.

Here's an example early coding challenge from the functions topic:



And here's an example of what you'll do in one of the projects - write code to invert the pixels in a photo:
  

I'm very excited to try out this model of online learning, and would love help in spreading awareness of the first cohort of the class, starting March 21st. The whole 4-week class costs $400, which seems like a reasonable price point based on similar offerings. As much as I'd love for all education to be free, charging is necessary for us to be able to offer the live sessions and TA help. For a 5% discount, use code PAMELA10PY.

We hope to offer the class 3-4 times per year, if there's enough interest, so stay tuned to corise.com for future offerings. If you're already an experienced Python programmer, check out their many other classes in Python/ML topics, like NLP and MLOps. 

Friday, December 25, 2020

How and why I co-sleep with my baby

The sleeping strategy for every baby depends on the combined needs of the baby and the parents. So, let’s start with my sleep needs:

  • I have a very hard time falling asleep; it can take me up to an hour.
  • If I sleep less than a full cycle (~3 hours), I’m more sleepy and grumpy than if I haven’t slept at all. Hence, I rarely take naps, since I’d need an hour to get to sleep and 3 hours to make it worth while.
  • If I wake up after a single sleep cycle, my mind is energized and thoughts start racing. Of course, despite what my brain thinks, I need to sleep more than 3 hours a night, so I try to not become fully awake in the middle of the night, else I might not get through a second cycle.

With that in mind, let’s go through our baby's sleep journey:

Phase 1: Our initial pre-birth plan was to have our baby sleep in a Halo Bassinest swivel sleeper. I liked that the bassinet would be right next to my bed so that I could watch her; I never had any interest in being in a separate room from her. Alas, this plan did not work for us:

  • She didn’t seem particularly happy in the bassinet. She would often roll over, resulting in a face-in-mesh situation, and she never slept that fitfully. (Correlation != causation, her inability to sleep could have just been due to being a newborn.)
  • Plus, whenever she needed to nurse, I’d have to wake up fully. I couldn’t be half awake, since then I’d risk falling asleep and letting her fall off the bed. I was miserable during those nursing sessions.

Phase 2: Seeing how sleep deprived I was, we tried an approach where I could hopefully get at least one sleep cycle in. At 10 pm, I would pump milk and give a hopefully sleepy baby over to my partner. After feeding her, she would sleep in his lap (on good nights). I would be off in the bedroom trying to get a sleep cycle in. Then at 1am, we would switch off, and I would be in charge of baby care. We got a very cheap portable bassinet that I put on top of our futon and I would snuggle up next to that. This strategy worked some nights, but I didn’t like having to pump so much and I often couldn’t fall asleep anyway since I felt too anxious from knowing my sleep time was time-limited.

Phase 3: In our next iteration, we went for full futon, full mommy care. Baby and I would both go to sleep on the futon early in the night, her in the little bassinet and me curled up next to her. When I needed to nurse, I would sit up, nurse her, then put her back in the bassinet and try to get back to sleep. I wasn’t as nervous about her falling off the bed, since the futon was lower to the ground and surrounded on most sides, so I didn’t have to be as fully awake as before. This strategy was working out better, but I was experiencing intense back pain from trying to sleep on that too-short too-firm mattress.

Phase 4: So I finally went for it: the floor mattress. I bought a mattress that would be big enough for the both of us (queen), not too high off the ground (6 inches), and not so soft that she’d suffocate (firm memory foam). No more worrying about her falling off the bed, no more needing to slap myself awake. This was a massive improvement.

Phase 5: At some point, my baby was both too large for the bassinet and too squirrely for it, so she just slept directly on the floor mattress next to me. I used my own blanket and put a separate small blanket over her. I no longer had to sit up to nurse; I could just use the side-lying nursing technique. I no longer had to be awake to nurse!

My “baby” is now 18 months old, and we still are co-sleeping on the floor mattress. I think that I actually sleep better with her now than I used to sleep on my own, so I have no particular desire to sleep train her and get her sleeping on her own. She’s also still nursing, so this is a way for her to get milk that she doesn’t get so much during the day while I’m working. I imagine one day I’ll have to move back into an adult bed, but for now, I’m loving the floor mattress!

Of course, you should consult your doctor and/or scientific research when deciding to co-sleep. There are definitely associated risks, especially with mothers who smoke or drink. (I do neither). There’s a nice write-up in Emily Oster’s Crib Sheet with some statistics.

I just wanted to share our approach since I see so little online about co-sleeping strategies. Let me know if you’ve tried something similar!

Thursday, December 17, 2020

What is “creative” coding, anyway?

At this point, I am wary whenever I hear the term “creativity” used in the domain of computer science and computer programming. Since there are so many ways to create in this world, creativity can mean different things to different people.

For example, I might look at a HackerRank coding problem to manipulate a graph structure in some way and think “I don’t want to do that, it’s not creative enough!” But to another coder, they might look at that problem and think, “Oo, interesting, what creative approaches can I use here?”

Why don’t we agree? Well, for me, my favorite way to create is to put something completely new into the world. For another coder, their favorite way may be to figure out ways to solve a problem they haven’t seen before (even if other folks have solved that problem). I might personally value novel output more than problem solving, but that is not an absolute ranking; just a personal preference.

So I suggest that we instead use specific language when attempting to describe the creativity of a particular project or curriculum:
  • Novel output: When I complete this project, will it be something that has never existed before in the world? Or will it be the same as what other learners have come up with?
  • Self expression: When I work on this project, will I have a way to express my personal values and interests? Oftentimes, self-expression goes hand-in-hand with novel output, but projects range in the spectrum of self-expression. For example, a project to come up with elevator logic likely involves less self expression than a project to design a website that rallies people around a cause dear to you.
  • Problem solving: Is it already clear how to solve the problem, or will I need to think through various approaches before I figure it out? Some coding projects may involve little problem solving, like projects to implement pseudo-code in a particular language, as they’re more about syntax memorization. Other projects involve a massive amount of problem solving, like those on Project Euler.

My hope is that thinking of creativity in terms of these aspects will help me design better coding projects, since I can actively identify what forms of creativity are over or under represented and come up with ways to make the projects more holistically creative.

I’d love to know what you think of this categorization and way of thinking.

Tuesday, December 15, 2020

The harms of assuming cultural knowledge in coding assignments

I love using computers to re-create real world objects, like coding a simulation of a plant growing or making a 3d animation of a lava lamp. I can rarely capture the beautiful complexity of a non-digital object, but I sure can have a good time trying! So when I come up with assignments for programming courses, many of them ask learners to program a simplified version of some IRL object, game, or situation. My hope is that the programming assignment is more interesting to learners because of its connection with the world around them.

For example, in the Khan Academy Intro to JS course, one of the projects asks learners to create a Magic 8-Ball to practice their understanding of randomness and conditionals. I have fond memories of Magic 8-balls from my youth, asking them seemingly very important questions and shaking them to gain insight into the machinations of the universe.

But then I got feedback that many learners had no idea what a Magic 8-ball was. That’s when it dawned on me: those toys were popular in my youth in upstate New York, but they never became popular in most non-US countries, and they’re not particularly popular these days even in the US.

So I was asking learners to re-create something they had never seen, and I wasn’t even explaining very well what it was! So I quickly modified the project to start off with a description of the toy and that reduced the number of confused help requests from learners.

Ideally, I would even replace the project with one that felt culturally relevant to more people. However, it is hard to come up with projects that are culturally relevant to everyone, since we all come from so many different cultures.

In a course that serves a global audience, one approach is to always offer a variety of projects, allowing learners to work on the project that most appeals to them. Our Hour of Drawing with Code on Khan Academy ends with three different projects- creating a wild animal, a super snowman, or a self-portrait. When I analyzed the data a few years ago, I found that learners were roughly equally picking each of the projects, so I’ve left all the projects in instead of trying to force the most popular project on everyone.

Another risk of culturally dependent assignments is that they can cause a learner to question whether they belong. For example, I’m currently working my way through a programming course where the biggest project is a violent tower defense game. I do find it fun to make some kinds of games, but I hated working on that project as it reminded me of my least favorite use of coding and made me wonder if I was the only one that wasn’t into implementing death matches in code. Fortunately, I’ve been in coding long enough to know that indeed, programming is used for many non-violent applications as well.

But if that was my very first intro to programming, I would have many questions as to what industry I was entering and whether I would find folks with similar hobbies and values as me.

So when I create new assignments in the future, these are my goals:
  • If I reference a particular cultural object, I will not assume the learner has prior experience with the object and will provide background knowledge. For example, if an assignment asks learners to implement a game of Poker, I would need to fully explain the rules of Poker. A programming assignment already requires the cognitive load of the programming techniques; it shouldn’t also require the cognitive load of understanding someone else’s culture.
  • The assignments should reflect the varied cultures of the learners as much as possible. It follows from that goal that I need to learn about the cultures of the learners (as they may be increasingly different from me, as I get older) and that the assignments are subject to change over time (as cultures change).
  • If an assignment relies heavily on a particular cultural interest, such as card games or Disney movies, there should be an alternate assignment available as well. If one set of learners gets to program something that’s highly interesting to them, then the remaining learners should have that opportunity as well.

Those are my current thoughts. I’d love to hear yours!

Friday, January 10, 2020

My hands-free setup for nursing and computer work

I’m writing this as my 6 month old daughter naps, nestled cozily under my typing hands. She’s conked out thanks to an exciting story time and a nourishing nursing session.

Before I had a baby, I really had no idea how much time it takes to breastfeed a baby. The prenatal classes gave us numbers like “8–12 times a day”, but I didn’t realize that a single session could take up to an hour.

Once I realized that I could potentially be spending 50% of my time on breastfeeding, I became obsessed with finding ways to feel productive during that time. And yes, nursing is highly productive itself (I’m making a gosh darn baby over here!), but I was eager to put my hands and head to work as well.

The first part of my quest: figuring out how to free my hands while nursing. At the beginning, I would always use one of my arms to position my baby’s head, so that arm would be out of commission. I was determined to find a pillow, gadget, or magical spell that would take the place of my arm.

After much experimentation, I found the winning combination:

Photo of glider chair with a Boppy pillow and owl on top
  • A glider chair (a used Dutalier)
  • A standard Boppy pillow
  • A stuffed owl that I bought for fun years ago. This was just one of many pillow-like objects that I tried out in combination with the Boppy.

The key aspect of the owl is that it is fairly hard; it retains its shape. That means I can place it underneath the Boppy, on whichever side my baby is nursing, and it will elevate her head to the correct height. Sadly, the owl is no longer being sold, but anything of similar shape and hardness would work.

At this point, I could use my hands to read my Kindle, use my phone, and eat. But I had a dream of using my hands to code while I nursed.

Thus, the next part of my quest: being able to use my hands with a laptop. I found a swivel laptop stand that can position my laptop close to me when it’s safe to do so and can be easily pushed away when the baby wakes up.

Photo of glider chair with swivel stand in front and laptop on top

I’m quite happy with the setup. While I was still on leave, I managed to learn an entirely new programming language while my baby was nursing and napping. Now that I’m back at work(ing from home), she’s in the care of an amazing nanny most of the day. However, I still use the nursing station to get a few more hours of work done during her final nap of the day.

I’m sharing my setup in case it helps other mothers with similar needs. I’d love to hear about how other mothers accomplish similar goals in the comments.

Also: if any inventors are reading this, please invent new nursing pillows! 🙏

Tuesday, June 19, 2018

My spring in a high school CS classroom

(This is cross-posted from Medium, where it's better formatted)

Computer Science isn’t yet a requirement at the K-12 level, but fortunately, there are a growing number of CS classrooms across the US. Many of those CS classes are taught by teachers that are relatively new to CS, like former math or science teachers, so they have a lot to learn quickly.
That’s where the TEALS program comes in: its a program that matches teachers up with volunteers from the software engineering industry. In the co-teaching model, the volunteers actually teach much of the first year (with the goal of serving as an example for the teacher for the next year). In the TA model, volunteers help students with their questions and debugging.
For those who don’t know me: I’m a software engineer half the time and a teacher the other half. I created all the programming courses for Khan Academy, and most of those were based on in-person workshops for GirlDevelopIt SF. I recently took a break from teaching to do the startup thing, and when I got over the startup thing, I realized how much I missed being in a classroom, so I signed up to be a TEALS volunteer.

The AP CS A Class

I got matched up with Berkeley High School’s AP CS A, a class which uses Java to teach programming concepts, particularly of the object-oriented variety. My very first language was Java (back when Applets were cool), but I hadn’t done any in years, so I binge coded CodingBat problems to prep.
I showed up, and discovered the class was basically as a 100% lab class. The teacher assigned Runestone chapters and CodingBat problems on Google Classroom, and the students worked independently through them, asking for help or helping each other when needed.
I’d walk around with my mini whiteboards, ready to diagram a coding problem at a moment’s notice. I found that always having a whiteboard on hand made me much more likely to guide the student to the answer than just provide the answer immediately.
Helping the students was very fun, and I liked getting deeper into the intricacies of Java. However, I’m a very project-oriented person when it comes to coding, so I was eager to introduce these students to projects: longer assignments with less structure and more creative coding. Thankfully, the teacher welcomed my ideas and was happy to try them out.
We started with a simple Valentine’s Day project, ASCII Candy Hearts —as it turns out, that was their first introduction to ASCII art, and it quickly became a mainstay in every project after that. ♥♥♥
Then we introduced Pair Programming starting with the WordGuesser Game project, and the energy of the room shot up. It was so fun seeing them working together and checking out their takes on each project.


Bringing in chocolate bars for each pair sure motivated them on the ChocolateBar project…🍫

We still needed to prep the students for the AP exam, so we spent the month before the exam on more individual work, like paper programming and multiple choice exams. Ok, and we squeezed in some Binary Bingo…



After the AP, we spent the final month learning the Processing library, and everyone went to work on making visualizations and games. It was a great way for them to use all the Java concepts they’d learnt (like classes for game objects, arrays and ArrayLists of multiple objects, conditionals for collision detection), while also producing a really fun output.



In case it’s useful to anyone else teaching or helping out in an AP CS A class, I’ve written up our sequence of materials in this document.

Intro to Programming

Many CS teachers teach more than one CS course. That means that not only do those teachers need to learn programming, they often need to learn programming in multiple environments and languages, plus CS concepts like algorithms and logic. That’s part of why the TEALS program is so needed — there’s just so much to learn in CS land, let’s give teachers a helping hand!
At Berkeley High School, I soon found out that the teacher taught two sections of an “Intro to Programming” class right after the AP CS A class. Those students started off in Python and Turtle Graphics for the first half of the year, following the Runestone tutorials. Then around the time I started volunteering, it was time for them to switch over to HTML/CSS, and what do you know, their teacher decided to assign them my Khan Academy course.
Of course, I started volunteering in the Intro classes as well. I wasn’t doing the job thing at the time, so I couldn’t resist helping out a classroom of budding web developers. 😄
Once the students learned JavaScript, we started on projects like TicTacToe and MadLibs. We quickly discovered these students weren’t as into pairing as the AP class, likely due to being younger/shyer and not feeling as comfortable with each other. BHS is a high school of 3100 students, aggregated from multiple middle schools, so sadly, many of them just don’t know each other.
As I was helping the students, I noticed they were frequently distracting themselves on GeoGuessr.com, a game where you see a random streetview and have to guess where it is in the world. I became determined to prove to them that they too could build GeoGuessr. Five projects later, they’d learnt about iframes, query parameters, APIs, and geocoding, and they all made their very own GeoGuesser game.



Now what if they shared their GeoGuesser project with friends and wondered how well how they scored? They wouldn’t be able to see that yet, because they didn’t know about databases yet. To me, the magical part of the web is being able to see how people all over the world can use what you’ve made, which means you need to store their data somehow. So I showed them AJAXSQL, and a simple Express+SQLite server. There wasn’t enough time for them to deeply understand Node, but I could at least put the idea in their head, and a number of them used Node to store results for their final.
Students made a big range of final projects, like games in Canvas/Processing, charts using Plotly/CanvasJS, personality quizzes, Jeopardy games, encryption puzzles, and custom maps of fantasy worlds. My favorite was Flickr Feud, a game that pulls random photos from Flickr, asks Watson to identify them, and scores based on your ability to guess what Watson said.



If any of you are teaching a web development class and are looking for more project ideas, I’ve written up the Intro materials in this document.

Reflections on the high school classroom

In the past, my classroom teaching experience was mostly workshops, where the attendees were very eager to be there and to learn. That’s not always the case with high school students — sure, CS classes are electives, so they did choose to be in them at some point, but they’re also busy with other classes and just growing up. And hey, maybe they’re not as into CS as they thought they’d be, or maybe their parents picked their electives.
The point is: high school students aren’t always that into you (me), and not always that into what I’m teaching or how I’m teaching it. That can feel like a downer, but it’s also refreshingly humbling. I tried teaching with a slide deck once, looked out upon a sea of bored faces, and from then on, I only taught via whiteboarding and live coding, and no more than 15 minutes of that.
I feel like I improved my teaching skills thanks to the honesty of high schoolers, so I am thankful for that. 🙏

Thinking of being a CS classroom volunteer?

I’m hoping that a few of you reading this post are software engineers and considering volunteering in a local classroom. I went every day and came up with project ideas, because I had the luxury of being funemployed at the time.
However, TEALS volunteers can come in as little as 1–2 days a week and simply be a TA and answer student’s questions about the tech industry. Plus, TEALS partner schools often schedule the classes as the first period of the day, so that you can wake up, volunteer, and still get to work on time.
You can learn much more on the TEALS website here: https://www.tealsk12.org/volunteers/
Another way to volunteer in classrooms is to email the local schools, like if you’re keen to help out in a middle school or elementary school. I spent every Thursday afternoon this spring at the local middle school coding club, helping with SCRATCH and WoofJS, and I found that opportunity by emailing the local school system.
Classrooms are fascinating. If you have the time, go find one and see! 😊