Tag Archives: ap computer science

My CS classroom

Part of the impetus for my writing lately is reflecting on what kind of changes have happened to my teaching as I move to Distance Teaching. In order to better understand that, I want to begin with a look at what my teaching looked like before, when I was teaching in a standard classroom.

Then we can talk about what I’m doing now and then do a diff on those two descriptions to see what’s changed.

AP Computer Science students

My school is a Bring Your Own Device school, so all students bring their own laptops to school every day, to be used in all of their classes. The majority of students use Apple laptops, with 1-3 students using Windows machines in any given class. My class sizes for the CS classes range from 8 (very small even for my school) to 18 (the upper end for most classes). Class is held in a standard classroom, with students seated in rows of desks facing the front of the room. I teach from a long demonstration table at the front of the room, with my laptop on one side, and my screen projected (via LCD projector) onto the whiteboard at the front of the room.

Students whiteboarding an Object-oriented design project

What we do in the classroom varies. Some days I’m introducing a new topic. That typically includes me projecting something from our course website–the description of a new data structure, say, and an example of that structure in use. I’ll annotate that projected information using a whiteboard marker, and perhaps develop new examples to either side of the projected image, interactively with students. Once the new topic has been introduced, students are directed to the assignment for the day/evening, also available on the website. I’ll typically give them a few moments to get started, and wander around the room checking in with them individually before returning up to the front of the room to begin my own development of a solution to the problem. Informal interactions and conversations inform our progress, and anything that isn’t finished in class is typically assigned as homework.

Intro to CS students doing a paper-based Parsons problem

Upon completing an assignment, students upload the source code to our course server where I can collect it, run it, evaluate it, comment on it, assign points for completion, etc., depending on the assignment.

Other days I’ll spend more time developing a more complex idea, or spend a few moments describing our next project which might take a few days to complete. Some days are just work days, when students have the entire period to work on a project, on their own or with classmates.

Students competing in a Capture the Flag competition


One of the things I’ve done well in my teaching, I think, is to bring students into the Computer Science tent who might otherwise not have thought to join us. This year, for the first time, we have 50-50 gender parity in the AP Computer Science classes, and although that number is not something that I’ve specifically targeted, I have deliberately made specific efforts to be more inclusive in my teaching and my outreach to prospective students. We should talk about that sometime.

I’ve worked to include things in my CS courses that are a little outside the standard curriculum, perhaps, in the interest of giving students a deeper experience. All students learn to use the Terminal, and all students submit assignments to the course server, giving them an experience beyond that of simply writing code in a browser interface. The Intro class, most years, includes a quick unit on websites, HTML/CSS, and responsive design. I know, I know, it’s not “real” computer science, but it gives them insight into an aspect of our technology-mediated world that they wouldn’t otherwise see.

And they’re so proud of the websites they create!

I’ve got a few areas that I could really stand to improve on. Although I love some of the larger projects I give my students, I don’t have a really big end-of-year project that could act as a sort of capstone for them. I’ve got a pretty good excuse: our seniors are done with school immediately after AP exams in early May, so I don’t have any “free time” with them at the end of it all. Still, that’s a goal of mine, to set up a nice project for them to really dig into at some point during the school year.

A big weakness of mine is giving CS students feedback on their work. I’ll give myself good marks for giving them scores, both for their daily assignments and their projects, but I haven’t yet figured out a good way to give them feedback in the midst of it all.

For some programs I’ll provide testers, and that’s a great automated way of giving them some specific formative feedback as they’re working on an assignment. For larger projects I’ll sometimes carve out an evening when I can sit down, run each student’s code, and provide specific comments on their work. Those remarks are often included in their actual source code as comments, which I’ll then either copy into their directories on the server (where they’ll probably never look at it) or print out and hand back to them in class (where they deride me for wasting paper).

So I guess I have two questions for you.

  1. How do you give feedback to students on their programs?
  2. What efforts do you make to ensure “academic integrity” in your CS program? Are students allowed to work together? How do you catch “cheating” when students are working on relatively simple coding assignments? Does it matter?

Okay, I guess that’s more than two questions. Sorry.

My CS classes post-Distance Learning

Full marks to my school for giving great guidance going into distance-learning mode. I was part of a small committee in the Upper School that talked about some contingency plans, and a week before Spring Break was going to happen, our school site closed. Students had Monday of that week off while teachers met in the library, our last time in one room together, and the remainder of the week teachers worked from home, following our regular school schedule.

The biggest change for many of our teachers was an increased emphasis on providing clear, easy-to-follow, communication online that would be used by students and their parents to guide and manage student work. The website that I use for my own classes was already set up to do that, so the only adjustment I needed to make involved a lot of copy-pasting information from my website to the school’s.

Teachers were not required to meet synchronously with students on a daily basis–there’s only so much Zooming a person can stand, and the administration certainly had some sense of this. But daily check-ins of one sort or another were a must: a meeting, an email, a Google form that a student could fill out… whatever. That was left to teachers to manage, which I appreciated. The Monday of that week, teachers had also been given a brief introduction to Screencastify, so that those who wished could record video lessons for asynchronous lessons.

We coasted into Spring Break, had a couple of weeks off (my trips to Colorado and Mexico were both cancelled), and then picked things up again in early April. Our first day “back” was again a professional development day, with additional guidance from the admins on some modifications that they’d made to our plan, and then we were right back into it, providing a combination of synchronous and asynchronous lessons as teachers felt was appropriate for their courses.

I couldn’t have asked for a better response to this crisis from our administration.

What about my classes?

“How have your classes changed in the new distance-teaching environment?” The short answer to that question for my CS classes is, “not much.”

The biggest caveat to this response is the fact that we’re only a few weeks away from AP exams, so my AP Computer A classes are mostly in review mode. Those classes at my school have a surprisingly diverse collection of students, from your classic “computer geek” who loves everything we do, to students who have been academically successful in other areas and who thought it might be good to learn a little CS, to some students who mostly look to this class to be a relatively easy AP to add to their transcript. (It’s true, this curriculum is easier than AP US History or AP Bio, the two other junior AP electives that students can choose from.) I love working with all of these students, and with that diversity comes the need for extra support occasionally.

So coming back from Spring Break, students had a “Spring Decathlon” assignment, a series of assignments designed to review everything we’d covered up to that point in the year. In some cases they were required to write their own testers, but in most cases I provided testers that they could use to assess their own work.

And now we’re going over a variety of problems from years past, either together in a Zoom session (sometimes with breakout rooms so that students can work together), or sometimes in a prepared lesson that students can interact with online at their own pace. (See, for example, this lesson on the Gizmo problem, a practice problem from the Course Description.)

Even if students aren’t learning much new material at this point, in this online-version of my classes they are doing the same thing that we were doing before: engaging with me as I introduce new material, looking at a problem or project that has been posted on the website, and working–by themselves, with other students, or with me–to develop a solution to that problem. We check in with each other as work is being done, solutions are submitted to the course server for evaluation… and then we’re on to the next topic, the next project, the next conversation.

Two concerns

There are two things that bother me at this point. One is that Zoom, or Meet, or BlueJeans, or whatever live videoconference solution one employs, does not provide for a fully interactive experience, at least not the kind that most classroom teachers use. The spontaneous exchange between people is lost to a combination of poor sound, poor video, network lag, glitches, and software-based signal-switching as the platform desperately tries to identify whose voice should get priority in the channel. Conversation is stilted, so it’s a good thing that these students already know me. They still appreciate a solicitous “good morning” from me when we log on, and they still politely snicker at an occasional dad-joke from their instructor.

But it’s not the same as the classroom. As our Upper School director pointed out, acknowledging the challenges of distance-learning, “This is not why any of us chose to go into teaching.”

Related to that, then, is my other concern. What will it look like to begin a school year teaching like this? Nobody at my school has declared that we won’t be returning to classes on-site in the Fall, but of course, it’s not certain that we will, either. Some consideration of future contingency plans is warranted. Just ask San Jose State University. And so I wonder/worry what that might look like, for my students and for me.

It may very well be that there will be substantive changes to my course if that happens. I can envision, for example, a possible reduction in the amount of work assigned, an accommodation for the logistical challenges involved with distance-learning. It’s hard to tell at this point.

For my friends and colleagues who are working with a more sizable at-risk population, perhaps at a public school, things are much more serious. This spring, attendance has already dropped off in catastrophic ways for the very students who stand to benefit from school the most.

Summer plans

In the summer I work with a local public-private school program, Partnership for Success!, and it isn’t known at this time whether or not we’ll be meeting on-site this year. Teaching online, to students I haven’t met face-to-face before, many of them first-generation, will be an important test, both of my ability to develop new strategies for online teaching, and for them to develop new strategies in managing their own education.

As an example of how curriculum might change in a distance-learning context, last year PFS! students learned Computer Science using a text editor, locally installed Python3, and the Processing graphics platform, also locally installed.

This year, if the class meets at all, they’ll be learning CS using JavaScript, written and run in-browser using the repl.it platform.

Things change.

My CS classes before distance teaching happened

I want to talk a little about CS distance-teaching, and I realize that this is kind of a niche topic given that teaching CS at all is a niche endeavor. I teach other classes–I’ve been a high school science teacher for much of my career–but teaching CS is what makes up most of my day now, so I suppose this is a good place to start.

I’ll talk about teaching Physics classes online in another post soon.

Conflated with the question of “what are some great ways of distance-teaching computer science?” is the deeper, darker question that haunts each of us: “Can you just help me identify some great ways of teaching CS under any circumstances, even those not involving a pandemic?” Because I don’t think we’ve really got that figured out yet, either.

There is some great research being done out there, and a lot of it gets presented at the annual SIGCSE convention each year. You need to go. There are other conventions as well, but SIGCSE is arguably the best, and you’ll get some great ideas, meet some great people, and have the chance to reflect more deeply on what we do–teaching CS–and how we might go about doing it better.

For today, I’ll just tell you what I’ve been doing for the past few years in teaching my own CS classes, and after that, we can talk about what changed when I had to start distance-teaching.

For context, after a long career teaching in public schools, I have taught at an independent school in southern California for the last 15 years. I have an incredibly supportive administration that has supported the growth of the school’s CS “program” (three classes) even when that sometimes results in class sizes that are quite small. Just as importantly, I work with an amazing IT director who has provided so much for our program, from hardware to servers to off-campus network access for students. Some key elements of our program wouldn’t be possible without support from higher-ups at my school, and without that, my teaching strategies, and even parts of the curriculum, would look very different.

Another important factor in all of this is the students’ access to technology. The Upper School in which I teach is a Bring Your Own Device (BYOD) school that requires students to have their own Apple or Windows laptop on campus with them every day. Having students work on their own machines, and then take them home where they can continue working, goes a long way toward facilitating the work we’re able to do. Without a BYOD program, I’d be working with a roomful of computers and having students either carry data back and forth on flash drives or interact with data directly on our server. We’d make it work, but it would change some of what we can do.

Some notes on infrastructure

As classroom teachers we know very well that the curriculum for a course is supported by all sort of infrastructure, what a textbook publisher would call ancillary materials.

For my courses, I post the vast majority of the materials I present to materials on a website that is available to them throughout the course. New material is presented in class using an LCD projector displayed on a whiteboard at the front of the room, supplemented with comments and lots of drawing with whiteboard markers. Live-coding demonstrations of syntax and coding strategies, or public decoding of students’ programs, likewise happens using the LCD projector.

Speaking of textbooks, after struggles with availability of a seemingly endless series of editions of Horstmann’s excellent Java Concepts: Early Objects, I chose to move to a free, open-source textbook that seemed to satisfy most of the needs for that course… and subsequently shifted to free, open-source textbooks for the other classes as well.

I include appropriate sections for reading in the course calendar, but most students seem to rely more heavily on the online materials I’ve prepared for presentations anyway.

Intro to Computer Science, AP Computer Science A

These courses are both taught at the introductory level, and both cover approximately the same curriculum. The year-long AP course uses Java, and introduces objects near the beginning of the course and covers object-oriented design principles and algorithms in much greater depth than the Intro class, and students are formally tested along the way. The single-semester Intro to CS class uses Python and blitzes along quite quickly, with an occasional quiz to help keep students honest.

For both courses, programming problems are assigned on a daily basis, and students use the Terminal on their own computers to upload assignments to a server maintained by me. I can run auto-graders on their assignments and/or look at their code as desired.

An important preface to each course is an introductory unit that includes lessons on computational thinking, the filesystem on their computers (mostly Apple, some Windows, an occasional Linux), the and Terminal. As more students come into the course with little experience using local files (music and movies are streamed! Google Docs are in the cloud!), it’s critical for me to give them experience thinking about files and directories for them to be able to manage these courses.

Here then, are the topics covered in both courses, approximately in chronological order.

  1. Introduction
    1. Computer Science vs. Computer Programming
    2. Intro to Computational Thinking
    3. Encapsulation, Binary numbers
    4. The filesystem, using GUI to navigate the system, organizing files in directories
    5. The Terminal
      1. Navigating the local (client) computer
      2. Logging on to a server
      3. Navigating the server
    6. Text editors
    7. Integrated Development Environments (AP course)
  2. Computer Programming Principles
    1. Output
    2. Input
    3. Data Types
    4. Math operations
    5. Implementing classes (AP course only)
    6. Functions (Static methods for AP course)
    7. Conditionals
    8. Loops
      1. while
      2. for
    9. Graphics (using Processing.org)
    10. Object-oriented design principles (AP course only)
    11. String functions
    12. Lists (Arrays, ArrayLists)
    13. Algorithms
      1. Recursion
      2. Sorting
      3. Searching
    14. Objects (for Python course)
    15. Graphical programs (Graphics-based game)

Advanced Topics in Computer Science

This course picks up where either of the other two leaves off. After (re-)acquainting students with Python and object-oriented programming, it covers:

  1. Algorithm analysis; Big-O notation
  2. Recursion
  3. Linear Data Structures
    1. Stacks
    2. Queues
    3. Deques
    4. Linked lists
  4. Algorithms
    1. Sorting
    2. Searching
    3. Hashes (Map or Dictionary)
  5. Trees
    1. Binary Trees
    2. Heaps
    3. Binary Search Trees
  6. Graphs (introduced)

A note on providing a course website

I consider the website for each of my courses to be the logistical hub for what I do–it’s not uncommon for me to begin class by calling up the course calendar from the site and asking out loud, “So, what are we going to be doing today?”

I’m no genius in website design, and at least one of my students will attest to that: in a classroom presentation, he used one of my course websites as an example of “an okay site that could be so much better.”

Thanks for that, Ikenna. :)

And you may not be a rockstar at writing HTML/CSS/JavaScript code, but there are ways of making a website happen.

A course website will have a profound effect on how easily you can transition to distance-teaching.

If you don’t currently have a website that you use as a focal point for your teaching, you might not feel like now is the time to take that on. That makes sense. And yet…

We’ll talk about this more in the next post.