Teaching Critical Comparative Data Structures and Algorithms

What do we have so far?

I was recently invited to give a short talk at the Embedded Ethics Conference: Strategies for Teaching Responsible Computing Within the Computer Science Curriculum. Here are the most relevant materials that I shared at the event.

Much of the most recent ideas have been inspired by the concept of Iterative Design: a design methodology where iterating upon concepts improves the quality of a final design. I’ve been working closely with Alannah Oleson whose recent work on Building Inclusive Design Skills with the CIDER Technique uses the concept of iteration to “broaden learners’ understandings of inclusion issues and design exclusion.” I’ve expanded the use of iteration as a motif throughout the class: the goal of my Data Structures and Algorithms course is to teach students methods to answer the question, ‘Why did we choose to write the specification that way?’

By addressing this question in the broadest of terms, we not only engage students to learn the implementation details of data structures and algorithms, but also to consider how the choice of abstract data types can influence the outcomes of a design. Iterative design provides a methodology to integrate these two skills and understand them as both integral to the software design process: software requires modeling complex phenomena in terms of abstractions, which are then implemented using data structures and algorithms. But the ease, efficiency, and quality of implementations can go back and influence how we define our abstractions. By considering iterative design as a way to bridge these software design skills, we can build more inclusive abstractions and implement them more efficiently too.

By engaging in inclusive design practices, students learn how to design more just technologies and (potentially) become more critical computing professionals. In Design Justice, Sasha Costanza-Chock poses the question: “Following Du Bois, we might ask of the recent emphasis on learning to code: Is the ultimate object to make people good coders, or to make coders good people?” But the argument for justice in the largest social terms aren’t always convincing to all my students. Computing cultures that glorify prestigious, high-paying tech jobs may view time spent learning about ethics and identity as time that could otherwise be spent further developing their “technical” skills.

Iterative design provides a sociotechnical approach to address the hierarchy of value in computing culture. In doing so, we provide another potential political vision for doing this work. I aim to empower students to understand how they might redesign technologies to address assumptions about users. But this process is not only about the skills or content knowledge that students attain. I also believe that discussion of sociotechnical aspects provides students an opportunity to pause and reflect not only on how they might design their software to address ethical questions, but also how they might design their lives to reflect those questions too.