精益软件开发

起源

精益软件开发一词源于Mary Poppendieck和Tom Poppendieck的同名书籍。这本书将传统的精益原则重新阐释，提供了22种开发实践“工具”，并与敏捷开发的实践做了比较。
通过Poppendieck夫妇在敏捷软件开发社区中的努力，包括在敏捷开发会议上的几次演讲，精益软件开发已经被敏捷开发社区广泛接受。

增强学习

面对开发团队以及最终的产品大小的额外挑战，可以说软件开发是个持续学习的过程。最佳的改善软件开发环境的做法就是增强学习。在代码完成后马上进行测试可以避免缺陷的累积。不是去做成更多的文档或详细设计，而是对各种各样的想法进行实际的编码尝试。用户需求的收集过程可以简单地通过给最终客户演示，并听取他们的反馈来完成。
使用短周期的迭代（每个迭代都应包括重构和集成测试）可以加速学习过程。在决定当前阶段的开发内容并对未来改善的努力方向进行调整时，在客户端帮助下通过简短的反馈会议来增强反馈。通过这些简短的反馈会议，客户代表和开发团队会更多地发现在进一步开发时会遇到的主要问题及可能的解决方案。从而，基于已开发出的原型，客户可以更好地理解自己的需求，开发者也能了解到如何才能更好地满足客户的需求。另一个关于和客户沟通、学习的想法是“基于组的开发”，这种方法聚焦于未来解决方案的约束限定而不是各种可能的解决方案，因此通过和客户的对话加速了解决方案的产生。

尽量延迟决定

因为软件开发通常具有一定的不确定性，基于多种选择的方法能够达成更好的结果，尽可能的延迟决定，直到能够基于事实而不是不确定的假定和预测来做出决定。系统越复杂，那么这个系统容纳变化的能力就应该越强，使其能够具备推迟重要以及关键的决定的能力。

尽快发布

在一个技术发展非常迅速的时代，尽早的发布产品有助于更快的获得用户的反馈来改善当前产品的质量，从而更快的完成下一次迭代。如果每一次快速的发布都能满足用户的需求，那么这个产品就可以视为成功的。每一次迭代的时间越短，团队内部的学习和交流就会变得更好。拥有了速度，决策会被延迟。拥有了速度，就可以更好的满足客户当前而非昨天的需求。

下放权力

传统的团队里都是由团队的领导者来决定和分配每个人所要完成的任务。但是精益开发主张将这种权利下放到团队的每个人手里，从而使开发人员有权利来阐述自己观点并提出建议。

嵌入质量

质量的管理在精益软件开发中尤其重要。在这里，质量的保证一开始便被贯穿在开发过程中的每一个阶段，而不只是在测试阶段来发现质量问题。

全局优化

全局优化使得每个部门之间的联系更紧密。相对于努力降低每个部门内的成本，消除部门之间的隔阂和浪费会产生更显著的效果。在DevOps成为一大趋势的今天，开发部门，质量管理部门和运行维护部门之间的协同变得越来越重要了。