# Software development life cycles (SDLC)

Here are several popular SDLC models:

## Waterfall
The waterfall model is best suited for well-defined complex projects, where problems can be spotted early and complexity is dealt with in an orderly way.  Key distadvantages include low customer visibility and low flexibility to mid-project changes.

## Incremental development
"Incremental" here refers to adding to the work products (requirements, source code, etc.) in stages.  In each stage, more functionality is added (core functionality first).

## Iterative development
In iterative development one iterates through the whole process (requirements →  ... → deployment) multiple times.  Iterative and incremental development often go together.

## Spiral
Spiral is a type of incremental and iterative development where risk assessment occurs at the start of each cycle.

## Agile
Agile is a form of incremental and iterative development with emphasis on frequent face-to-face communication, high customer visibility, adaptability to change, and minimizing non-software work products.  For example, Extreme Programming (XP) is an agile methodology based on the principles of communication, simplicity, feedback, courage, and respect.

## Evolutionary
In an evolutionary model, deliverables are given to the customer frequently and incrementally.  The focus is on high-value features first and getting customer feedback early and often.

## Code & Fix
This is a kind of incremental development where life cycle phases other than coding and debugging (requirements analysis, software design,  testing, etc.) are skipped, and code refactoring is often neglected.

## Prototyping
This isn't really a life cycle on its own (although it can be adapted as such, as with "evolutionary prototyping").  Rather, it's a technique that is good for dealing with unclear requirements, assisting in communication, or in developing initial user interface design.

# Questions guiding the choice of SDLC model
This list is adapted from *Rapid Development* by Steve McConnell.
- How well do the customer and development team understand the requirements?
- How likely are requirements to change?
- Are major archiectural changes likely?
- Are there hard schedule constraints?
- Are the relevant tools and technologies well-understood by the development team?
- Is high visibility important to customers and/or management?
- How will human factors affect the project (discipline, skills, training, and intellectual limits)?
- What opportunities are there to parallelize work phases?

