Most software projects fail because they don't meet stakeholder's minimum requirements, come in significantly over budget, or delivered significantly late. What these reasons for failure have in common is miscommunication that occurs when business analysts transfer business requirements to programmers, and programmers define for quality assurance when the software will be ready for testing.
To foster better communication, programmers need to take responsibility for ensuring that business requirements are correctly interpreted into software. C3 programming addresses this issue by explicitly assigning responsibility to the programmer. On a macro level, this is analogous to a function call, input, operations, and output. The inputs are a contract of expectations by business, and the output is expected results. Coding is the operation.
As Figure 1 illustrates, the software development lifecycle (SDL) is broadly broken up into four rolesbusiness analysis, programming, quality assurance, and stakeholder acceptanceand every major SDL model (CMMI, Waterfall, TDD, Agile, and XP) encompasses these roles in this order:
- The stakeholder is the "boss" and the other roles implement the stakeholder's vision.
- The business analyst role is to make the vision practical and capture contradictions and gaps in the vision, as well as prioritizing the work.
- Programming is the design and writing of software code to accomplish the work.
- The quality assurance role validates that the software code meets specified minimum conditions.
C3 programming is a process for fostering better communications among these roles. As Figure 2 illustrates, C3 programming specifies how to successfully write software by defining programming in terms of three phases:
- Contract
- Code
- Close
Additionally, C3 programming defines two components in the programming role: Backward facing (that is, working with business analysis), and forward facing (working with quality assurance). These components focus on interfacing with other roles because better communication between roles results in fewer defects. The programmer reflects back to the business analyst the perceived business need as implemented with software, and before coding, the programmer defines for quality assurance the conditions under which the code is ready for testing. Interfacing with quality assurance is often implemented with Test-Driven Development (TDD). Ironically, the significantly more expensive errors are between the business analyst and programmer.