现代软件工程:如何高效构建软件_【美】戴维·法利_AZW3_MOBI_EPUB_PDF_电子书(无页码)_【美】戴维·法利

内容节选

第4章迭代式工作资料来源:《韦氏词典》(The Merriam-Webster Dictionary)。 迭代被定义为“一种过程,在这种过程中,一系列重复性操作产生的结果逐渐接近所期望的结果” 。 迭代从根本上是一个推动学习的过程。迭代使我们学习、反应和适应我们所学到的东西。没有迭代,没有与收集反馈密切相关的活动,我们就没有机会让学习长期持续下去。从根本上说,迭代允许我们犯错再改正错误,或者取得进步再提高进步。 这个定义还提醒我们,迭代让我们能够逐步接近某个目标。它真正的力量在于,它使我们在不知道如何接近目标的情况下,也能够接近目标。只要我们有办法判断我们是更接近还是更远离目标,我们甚至可以随意迭代,而且仍然能够实现目标。我们可以丢弃那些让我们远离目标的步骤,而选择那些让我们接近目标的步骤。这就是进化的本质,也是现代机器学习(machine learning,ML)工作原理的核心。 敏捷运动 至少从20世纪60年代起,团队就开始实践更加迭代的、反馈驱动的开发方法。而在美国科罗拉多州的一个滑雪胜地举行的一次著名的思想家和实践者会议之后,《敏捷宣言》(Agile Manifesto)就拟定出了一个通用的宗旨,它支持那些更灵活的、以学习为中心的策略,而不是当时常见的更为繁重的流程。全称为《敏捷软件开发宣言》,参见“敏捷软件开发宣言”网站首页。 《敏捷宣言》 是一个简单的文档。它只有9行文字和12条原则,但是它产生了巨大的影响。 在此之前,少许沉默的反对者的传统观点认为,如果你打算在软件领域“认真”地做一些事情,那么你就需要以生产为中心的瀑布式开发技术。 虽然敏捷思维花了一段时间才得以突破,但是现在它是占主导地位的方法,而不是瀑布式方法,至少在思维方面是这样的。 然而,大多数组织在文化上仍然由瀑布式思维主导,即便不是在组织层面上,也是在技术层面上。 尽管如此,比起以前的理念,敏捷思维明显建立在更加稳固的基础之上。在其核心,最能体现敏捷社区思想(也许是理想)的词是“检查和适应”。 这种认知上的改变是有重大意义的,但还不够。为什么这一改变意义重大?因为它代表了人们朝着将软件开发视为学习活动而不是生产问题的方向迈出了一步。瀑布式流程对某些类型的生产问题来说是有效的,但是却极不适合需要探索的问题。 这一步很重要,因为尽管弗雷德·布鲁克斯的10倍进步在技术、工具或过程方面没有出现可以达到的迹象,但是有些方法的效率非常低,因此完全有可能将其提高一个数量级。当应用于软件开发时,瀑布式方法就是这样一个候选者。 瀑布式思维始于这样的假设:“只要我们足够努力,我们就能在一开始把事情做好。” 敏捷思维颠覆了这一点。它也始于一个假设,假设我们不可避免地会出错。“我们不理解用户想要什么”“我们不会马上得到对的设计”“我们不知道我们是否已经捕获了我们编写的代码中所有的bug”等等。因为他们从一开始就假设自己会犯错,所以敏捷团队以一种非常有意识地降低错误成本的方式工作。 敏捷思维与科学共有这一思想。从怀疑的角度看待各种想法,并试图证明这些想法是错误的,而不是证明它们是正确的(“可证伪性”),这是更科学的思维方式所固有的。 这两种思想流派,可预测性与探索性,向项目组织和团队实践推广了截然不同、互不兼容的方法。 基于敏捷思维的假设,我们着手组织我们的团队、过程和技术,使之允许我们安全地出错,很容易地观察到错误,做出更改,并在理想的情况下,下次做得更好。 关于Scrum与极限编程、持续集成与功能分支(feature branching,FB)、测试驱动开发与熟练的开发人员努力思考或其他任何技术之间的争论,都是无关紧要的。本质上,任何真正的敏捷过程都是“经验性过程控制”(empirical process control)活动。 这明显比之前的以生产为中心的、基于预测的瀑布式方法更适合软件开发——任何类型的软件开发。 在一些基本工作方式上,迭代式工作不同于更有计划的、顺序的工作方式。不过,它明显是一种更加有效的策略。 对许多读者来说,这似乎是显而易见的,但事实并非如此。软件开发的大部分历史都假定迭代是不必要的,所有步骤的详细计划是软件开发早期阶段的目标。 迭代是所有探索性学习的核心,也是任何真正知识获取的基础。 4.1 迭代式工作的实际优势 如果我们把软件工程视为一项发现和学习的活动,那么迭代就必须是其核心。然而,迭代式工作的其他各种优势在一开始可能并不明显。 也许最重要的思想是,如果我们开始改变我们的工作实践,以更加迭代的方式工作,它会自动缩小我们的关注范围,鼓励我们以更小的批量进行思考,并更认真地对待模块化和关注点分离。这些思想一开始是更加迭代式工作的自然结果,但最终却成为提高我们工作质量的良性循环的一部分。 Scrum和极限编程的共同思想之一是,我们应该致力于完成小......

  1. 信息
  2. 内容提要
  3. 关于作者
  4. 对本书的赞誉
  5. 前言
  6. 致谢
  7. 服务与支持
  8. 第1部分 什么是软件工程?
  9. 第1章 简单介绍
  10. 第2章 什么是工程?
  11. 第3章 工程方法的基本原理
  12. 第2部分 优化学习
  13. 第4章 迭代式工作
  14. 第5章 反馈
  15. 第6章 增量主义
  16. 第7章 经验主义
  17. 第8章 实验性
  18. 第3部分 优化管理复杂性
  19. 第9章 模块化
  20. 第10章 内聚力
  21. 第11章 关注点分离
  22. 第12章 信息隐藏和抽象
  23. 第13章 管理耦合
  24. 第4部分 支持软件工程的工具
  25. 第14章 工程学科的工具
  26. 第15章 现代软件工程师