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.
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
- Level: Intermediate — understands affordance theory from UX/design contexts (Gibson, Norman), has intuition about how it applies to software but hasn't formalized it
- Background: Practicing software engineer familiar with design patterns, distributed systems, and code review culture
- Primary Goal: Develop the ability to evaluate and critique existing codebases, tools, frameworks, and architectures through a rigorous affordance lens — identifying friction points and improvement opportunities
- Secondary Goals: Deepen theoretical grounding; build vocabulary for discussing affordance quality in code reviews, architecture decisions, and system design
Scope
In Scope
- Affordance theory foundations (Gibson/Norman) reframed for engineer-system relationships
- Code-level affordances: naming, structure, patterns, organization as communication
- System and distributed architecture affordances: service boundaries, contracts, deployment topologies
- Anti-affordances and designed friction: pit of success, defensive design, constraints as features
- Practical evaluation framework for affordance analysis
- Affordance decay over time: leaky abstractions, convention drift, scaling challenges
Out of Scope
- End-user UX affordances (button design, UI patterns) — except as analogies
- Deep dives into specific type system features (though types will be mentioned as affordance mechanisms)
- Tooling/IDE-specific affordances (mentioned in passing but not a dedicated module)
- Formal HCI research methodology
Concepts
-
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. -
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. -
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. -
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. -
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. -
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
- Total: 4–8 hours
- Modules: 6 modules, estimated 40–80 minutes each
- Structure: Theory → concrete domains → practical tools → sustainability
Success Criteria
After completing this learning plan, you should be able to:
- Analyze any codebase, library, or system architecture and articulate its affordance landscape — what it makes easy, hard, hidden, and misleading
- Use precise vocabulary (affordance, signifier, constraint, anti-affordance, affordance decay) in code reviews, design discussions, and ADRs
- Apply the affordance analysis framework to evaluate a system and produce actionable improvement recommendations
- Identify affordance decay patterns in growing systems and propose mitigation strategies
- Design code and systems that consciously optimize their affordance properties for their intended audience of engineers