Affordances in Software Engineering

For: Intermediate — understands affordance theory from UX/design contexts (Gibson, Norman), has intuition about how it applies to software but hasn't formalized it. Practicing software engineer familiar with design patterns, distributed systems, and code review culture.

Estimated time: 4 hours 30 min

Learning Brief: Affordances in Software Engineering

Topic

Affordances applied to software engineering — specifically the relationship between engineers and the systems, code, and architectures they build and interact with. This covers how software artifacts (code, APIs, architectures, conventions) signal their intended use, constrain misuse, and shape what engineers perceive as possible.

Learner Profile

Scope

In Scope

Out of Scope

Concepts

  1. Affordance Theory for Engineers (affordance-theory-for-engineers): Gibson's ecological affordances vs Norman's perceived affordances and signifiers, reframed from user-product to engineer-system. The affordance landscape of a codebase. Real vs perceived vs hidden affordances in code.

  2. Code as Communication Medium (code-as-communication): How naming conventions, code structure, design patterns, module organization, and documentation afford comprehension, safe modification, and extension. Code that "explains itself" vs code that misleads. The role of conventions and idioms as shared affordance vocabularies.

  3. System & Architecture Affordances (system-architecture-affordances): How architectural patterns (microservices, event-driven, layered), service boundaries, API contracts, deployment topologies, and infrastructure-as-code signal correct integration patterns and constrain misuse. How distributed systems afford (or fail to afford) correct operational behavior.

  4. Anti-Affordances & Designed Friction (anti-affordances-designed-friction): The "pit of success" principle — deliberately making the wrong thing hard and the right thing easy. Defensive API design, immutability as constraint, permission systems, breaking changes as signals. When friction is a feature, not a bug.

  5. Affordance Analysis Framework (affordance-analysis-framework): A practical methodology for evaluating existing codebases, libraries, frameworks, and architectures through the affordance lens. Identifying: what does this system afford? What does it constrain? What affordances are hidden or misleading? How to structure affordance critiques in design reviews and ADRs.

  6. Affordance Decay & Evolution (affordance-decay-evolution): How affordances degrade as systems grow — leaky abstractions, convention drift, onboarding friction, documentation rot. Strategies for maintaining affordance quality: refactoring for clarity, affordance-aware code review, architectural fitness functions, and the relationship between technical debt and affordance debt.

Time Budget

Success Criteria

After completing this learning plan, you should be able to:

  1. Analyze any codebase, library, or system architecture and articulate its affordance landscape — what it makes easy, hard, hidden, and misleading
  2. Use precise vocabulary (affordance, signifier, constraint, anti-affordance, affordance decay) in code reviews, design discussions, and ADRs
  3. Apply the affordance analysis framework to evaluate a system and produce actionable improvement recommendations
  4. Identify affordance decay patterns in growing systems and propose mitigation strategies
  5. Design code and systems that consciously optimize their affordance properties for their intended audience of engineers

Modules

Begin →