Skip to content

Affordance Analysis

Kevin Lin edited this page Sep 25, 2025 · 6 revisions

Note

Objectives

  1. Describe how abstractions can embody values and structure social relations.
  2. Identify the affordances of a program abstraction such as a class or interface.
  3. Evaluate affordances by applying the 3 value-sensitive design principles.

Asymptotic analysis can evaluate the efficiency of a data type by producing a (1) predictive and (2) easy-to-compare description of the running time. But the study of graph data structures and graph algorithms (up next) will require us to engage with questions of how we represent real-world data and problems. Runtime analysis will remain an important tool, but we also need analytical methods and design methods that are attuned to the complexity of the real world.

Affordance analysis is an analytical method that emphasizes the actions and outcomes that an abstraction makes more likely (affordances), and then evaluates the effects of these affordances on people and social relations. Affordances are properties of objects that make specific outcomes more likely through the possible actions that it presents to users. In the context of designed physical objects, for example, a screwdriver affords turning screws (what it was designed for) but also affords other uses like digging narrow holes for planting seeds. Likewise, disaffordances are properties that make certain outcomes less likely through the possible actions that it presents to users. A screwdriver disaffords ladling soup.

Affordance analysis is a process composed of two steps. First, identify affordances for the specific outcomes that they make more likely. Then, evaluate affordances according to how they shape social relations in particular applications.

Identify affordances

In Java, a class or interface defines public methods that afford certain actions. Many of these actions will seem quite value-neutral when defined in isolation from potential applications. For example:

  • We can add, remove, or check for an item at a given index in a list.
  • We can add, removeMin, or peekMin from a priority queue according to their priority values.
  • In Autocomplete, the allMatches method returns a list of all terms that match the given prefix.

In "The Limits of Correctness" (1985), Brian Cantwell Smith observes that a "correct" program is really only correct with respect to the programmer's model of the problem:

When you design and build a computer system, you first formulate a model of the problem you want it to solve, and then construct the computer program in its terms. For example, if you were to design a medical system to administer drug therapy, you would need to model a variety of things: the patient, the drug, the absorption rate, the desired balance between therapy and toxicity, and so on and so forth. The absorption rate might be modelled as a number proportional to the patient's weight, or proportional to body surface area, or as some more complex function of weight, age, and sex.

Here, Brian proposes three different models to use: (1) patient weight, (2) body surface area, or (3) weight + age + sex. Programming is the manipulation of this model by using calculation to change the rules and representations at some particular level of abstraction, "So the drug model mentioned above would probably pay attention to the patients' weight, but ignore their tastes in music." When we choose to use certain data structures or algorithms, we are choosing to the model the problem in a certain way at a particular level of abstraction. We decide what is relevant or irrelevant in the model.

What are the affordances of comparison sorting?

Elements are rearranged according to an ordering relation defined by the compareTo method. It is assumed that these pairwise comparisons can be used to order all the elements on a line from least to greatest.

Note

A Science and Technology Studies (STS) perspective might even suggest that sorting in and of itself—before any specific examples are introduced—is value-laden because sorting implies a way to order items on a line. Implementing compareTo is like assigning student grades: it takes all the complex dimensions of a human being and reduces them to a number that can be compared against other peoples' numbers. Using a sorting algorithm requires a programmer to select the aspects of an object that are most desirable for the task. This raises questions about the role of programmers as people who decide what matters in the world through their modeling decisions.

Evaluate affordances

Data is a key part of affordance analysis. But you might have noticed that your computing education rarely actually considers data on its own merit:

  • When verifying the correctness of your programs, we write code that generates random data or reads an example dataset without explanation about the data, who or what it aims to represent, and why the data was chosen.
  • When analyzing the running time of your programs, data matters to the extent that it helps us in case analysis, asymptotic analysis, or experimental analysis. Data is reduced to variables like $N$ or abstract inputs.

To evaluate affordances, consider how each affordance interacts with the world in data and problems. One framework for evaluating affordances is value-sensitive design (VSD), a "theory and method that accounts for human values in a principled and structured manner throughout the design process." For example, we can consider:

  1. foregrounding human values, or what is important to people in their lives;
  2. the impacts of pervasive uptake of a technology;
  3. identifying direct and indirect stakeholders: people with concern or interest in the technology.

What kinds of human values could we consider? As a starting point, consider privacy, trust, security, safety, community, freedom from bias, autonomy, identity, ownership, freedom of expression, dignity, calmness, compassion, respect, peace, wildness, sustainability, healing.

Assembling an affordance analysis

In the Autocomplete interface, we might identify the affordances of the allMatches method: it returns a list of all terms that exactly match the given prefix. The method does not guarantee any particular order of results.

List<CharSequence> allMatches(CharSequence prefix)
Evaluate the affordances of this Autocomplete.allMatches method.

Consider human values. The list of results produced by autocomplete provides users with everything that matches their search query. But the Autocomplete interface does not personalize these results at all: given a search query, everyone sees the same results. There is no parameter or field for storing the personalization information. Results could be more helpful if they were tuned to your profile.

Consider pervasive uptake. When everyone sees the same results, there can be material impacts if money and attention is directed in ways that reinforce existing social inequities. If everyone follows the same first-few suggestions, then we drive money and attention to those few places. This can also have downstream effects on public policy if it changes our perceptions of what we think of as important or valuable places. For example, public spaces like parks might lose our attention (and, therefore, public funding) if our app never recommended them.

Consider direct and indirect stakeholders. Where does our data come from? Which places (including businesses) are more represented in the data? Who does the work of managing or inputting the data? Is the data on places provided by the government, by individual owners of each place, by volunteers gathering data from the world? How might people want to change how places are represented or named in the app? Who is given the right to make these decisions?

Tip

A key idea in this framework is the concept of value tensions: that human values do not exist in isolation and instead involve a balance between values that can come into tension when considering different individuals, groups, or societies. For example, personalization is not always a win. Personalization requires personal data that, in some cases, people may not actually want to disclose even if they "Agree" to the terms and conditions of using an app. And the convenience and helpfulness of personalization to the individual user can conflict with the goal of everyone receiving the same information. Hyper-personalized content feeds can lead to two people receiving drastically different information about the world.

Beyond value-sensitive design

Value-sensitive design, however, is just one theory or method for evaluating a technology. In Design Justice, Sasha Costanza-Chock critiques VSD:

VSD is descriptive rather than normative: it urges designers to be intentional about encoding values in designed systems but does not propose any particular set of values at all, let alone an intersectional understanding of racial, gender, disability, economic, environmental, and decolonial justice. VSD never questions the standpoint of the professional designer, doesn't call for community inclusion in the design process (let alone community accountability or control), and doesn't require an impact analysis of the distribution of material and symbolic benefits that are generated through design. Values are treated as disembodied abstractions, to be codified in libraries from which designers might draw to inform project requirements. In other words, in VSD we are meant to imagine that incorporating values into design can be accomplished largely by well-meaning expert designers.

VSD helped us think about data and problems on their own merit rather than as abstract concepts. But, in presenting evaluation as a process for designers to just think-through and analyze on their own—without consulting real people—values are treated as abstract concepts rather than situated in real human experiences. If you'd like to learn more approaches to evaluating affordances, consider taking courses in human–computer interaction, qualitative research methods, or community-engaged research.

Clone this wiki locally