Good and Fast
Software development is fundamentally a knowledge-building exercise that operates across multiple domains. This knowledge-building nature is often underappreciated, leading to tensions between immediate delivery and sustainable development.
Teams must develop shared understanding and vocabulary around:
- The project's purpose (the "why")
- Required functionality (the "what")
- Implementation approach (the "how")
- Technical stack (architecture, languages, frameworks)
- Operational concerns (deployment, maintenance)
The Knowledge Building Challenge
When domain understanding is solid, feature implementation flows naturally and predictably. However, new feature requests frequently expose gaps in domain knowledge, requiring deeper analysis and domain model refinement. This exploration process has uncertain outcomes and timeframes, potential significant impact on the existing codebase and ripple effects across the whole ecosystem. This creates two fundamental opposing forces:
Business Pressure
- Immediate feature delivery demands
- Focus on visible results and quick wins
- Short-term thinking driven by market needs and customer requests
- Pressure to "just make it work"
Logical Coherence
- Need for consistent domain modeling and clear abstractions
- Architectural integrity
- Long-term maintainability
Project Evolution
As projects mature, they develop a natural knowledge hierarchy:
- Core Concepts
- Foundation models crystallized after a few iterations
- Domain Branches
- Large functional blocks representing specific business areas
- Leaf Features
- User-facing functionality built on top of the core concepts and domain branches
And the magnitude of changes for each feature naturally decreases. Which is also a good indication of the project state and shape.
Links
- https://olano.dev/blog/software-design-is-knowledge-building/
- Software Design is Knowledge Building
- https://dl.acm.org/doi/pdf/10.5555/257734.257788
- Software Aging
- https://pages.cs.wisc.edu/~remzi/Naur.pdf
- Programming as Theory Building
- https://explaining.software/archive/a-brief-introduction/
- Explaining Software Design