Algorithm analysis played an important role in legitimizing computing as a science that could be measured, explained, and standardized at a time when computer programs written by humans could be evaluated by inspecting the written code i.e. literate programming. But as data science, machine learning, and quantum computing transform computer programming, so too should we transform our definitions of algorithm analysis. Algorithm analysis seen only through the lens of space or time complexity insists that the effects of algorithms will only ever be contained within the machine. It has now become increasingly important to recognize the wide-reaching effects of our computing: that our artifacts have politics (Langdon Winner)—that our data and algorithms are Weapons of Math Destruction.
The goal of an introductory computing course (even one ostensibly about programming) should not be to produce better software engineers. Better software engineers are exactly what they sound like: “better software engineers.” Designing education as a pipeline is an incorrect metaphor on many levels, but it’s perhaps most saliently realized in how it reproduces the bias and inequity of the status quo.
We should instead strive to construct a new ethos for computer science education: designed in collaboration with students, integrating intentional teamwork, empowering students as creators of technologies, exploring the equally technical and social boundaries of computing, situating computing as explicitly antiracist, and acknowledging that learning takes time—that students bring to the classroom diverse and differently valuable human experiences.
Some of this work happens in the classroom through evidence-based pedagogy and educational alignment. Research shows that active learning significantly improves performance for all students, no matter what amount of prior preparation they bring into the course. Furthermore, active learning is particularly effective at closing opportunity gaps across gender, ethnicity, and first-generation status.
Beginning Autumn 2019, 15 minutes of peer instruction were introduced per 50-minute lesson in CSE 373. Case studies show that the greatest gains come from greater amounts of active learning: course transformations that increased active learning to 50% or more per time period were correlated with the most significant reduction of opportunity gaps. Based on this insight, we developed a new active learning protocol for CSE 332 Winter 2020 based on Process-Oriented Guided Inquiry Learning (POGIL), published as a lightning talk at SIGCSE 2020.
Programming can be motivating because computers can bring mathematical ideas to life. But programming is not an efficient way to learn data structures. (Programming is not necessarily the most efficient way to learn programming, either.) Programming makes process explicit but obscures it behind syntax. Data structures represent one of infinitely many possible states; programming represent generalized algorithms that operate on any such state. Data structures change; programming is static. The kinds of concepts and thinking taught through programming data structures are orthogonal to using data structures.
This course inherits the approach of exploring data structures via case study, but we emphasize learning primarily through problem solving and analysis. Data structures ideas are introduced before class via short readings. Each class session is spent discussing guided questions in class that move from superficial application towards deeper reasoning about the fundamental properties of data structures and algorithms. Every class session is worksheet-centered, moving the focus away from the screen and back to the seats.
Lessons learned from these two courses inspired the design of a new flipped classroom pedagogy for CSE 143, mirroring best practice on “Incorporating Active Learning Strategies and Instructor Presence into an Online Discrete Mathematics Class.” But the study of computer programming is about more than just coding.
The study of programming should involve exploring different forms of expression.
If programming in and of itself is a form of self-expression, then it is necessarily shaped by computing culture. Programming languages themselves are artifacts of this culture: features, functionality, and semantics change over time in response to programmer preferences. Organizations create their own subcultures and dialects in the form of project management processes, style guidelines, and common best practices. Programming and software engineering at large is a community of practice whose participants determine the norms of firstly what is and is not programming.
But computing culture concerns more than just programming. Computing culture is situated in a broader of context of the problems that it solves. Computational teamwork—intentional, integrative teamwork between both people and machines—is a critical component. How can we help students learn to “work effectively, efficiently, and ethically together” in hybrid teams of people and machines?
Coding is just one (algorithmic) way of communicating mathematical ideas. But just as important is the ability to communicate these ideas across a variety of media and to a variety of stakeholders: not only in the form of code reviews or technical papers, but also in the form of presentations, emails, tweets, blog posts, and videos. Communication occurs across various media for various recipients with various objectives. Computer programming is not only about coding, but also about reading, writing, and translating between languages and modalities to learn effective representations for programs.
We’re currently realizing a new ethos for computer programming over the 2020–2021 academic year. Why precedes what: programming approaches are introduced in the context of the web app that students will ultimately build. Grading supports learning: assessments always allow for revision, with rate limiting to keep TA workload reasonable. Coding is just one art of computer programming: in addition to weekly coding quizzes, students are also assessed on their problem solving and communication processes by submitting a video portfolio teaching viewers how to solve problems. Programming is about people: 5 new assessments span a broader spectrum of humanistic applications. Data determine algorithms: these assessments emphasize the significance of data and the way algorithms acting on code impact the end-user. Programming is not just emulative, but creative: scaffolded with 6 lessons, the final project introduces idea selection, computational teamwork, and plan execution. Learning requires deliberate practice: to help students learn programming, students spend time in class programming and explaining their problem solving process with each other.
All of these ideas, however, could not have been implemented without an incredible course staff. Over 40 undergraduates were interviewed for TA positions in CSE 373 and CSE 332. While an effective course staff can come about by picking the right people, it doesn’t end there. My management style focuses on making the most of this talent. In addition to documented core responsibilities spanning 12 hours per week, all TAs were given the opportunity to work with other TAs as part of a team. TAs in each teams tackled concrete or abstract problems related to course development, including quiz section logistics, active learning activities, and student support. To help TAs develop as individual contributors, each TA was also assigned to a “family” that met each week to prepare for section, share pedagogy, and provide feedback on each other’s sections.
The biggest question for the undergraduate teaching community, however, is the same question that undergraduates ask themselves about research: “How do I get involved when I don’t have much prior experience?” The upcoming CS Pedagogy course will better position us to help students answer this question. The expansion of peer learning and, in particular, structured approaches such as POGIL can also serve to provide students more experience collaborating with their peers in ways that prepare them for teaching specifically and also technical communication broadly.