# 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. ## 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?