Software Development

Practical engineering practices for building software predictably — from capturing requirements through shipping and iterating.

Software projects have a well-earned reputation for running late, costing more than expected, and delivering the wrong thing. The root cause is almost always the same: a breakdown in communication between the people who need the software and the people building it.

The practices in this section exist to prevent that breakdown. They are not bureaucratic overhead — each one is a communication tool that creates shared understanding, makes progress visible, and catches divergence before it becomes expensive to fix. Applied together, they make a software project predictable.

The work falls into three phases that repeat iteratively throughout a project’s life.

Design

Before writing code, establish what the software needs to do and why.

  • Software is Hard — why software projects go wrong and what separates the ones that don’t
  • Use Cases — capturing requirements through customer discovery and user stories
  • Use Cases to Tasks — slicing use cases into testable requirements and Kanban backlog items
  • Wireframes and Storyboards — visualizing the user experience before any code is written

Development

Build incrementally, with visibility and quality checks at every step.

  • Version Control Systems — git, branching, and the commit history as the project’s source of truth
  • Kanban — keeping work visible and tasks small
  • Test Driven Development — writing tests first to force clear requirements and build confidence
  • Peer Review — catching bugs before users do and spreading knowledge across the team

Delivery

Ship working software to users, get feedback, and iterate.

  • Release Process — versioning, CI/CD pipelines, deployment strategies, and rollback