为什么软件开发方法论不管用?

简介:

无论大小项目,大型团队还是我个人,陈腐的联邦机构还是牛逼的硅谷公司,我都工作过。我学习并使用过至少20种编程语言。我还经历过瀑布模型/预先设计模型(BDUF:big design up front),结构化编程,自顶向下,自下向顶,模块化设计,组件,敏捷,Scrum,极限,TDD,OOP,快速原型,RAD,还有我可能想不起来的其它方法。我不敢肯定它们都管用。

【EDIT:让我解释一下本文的目的。我认为它们本身不能提供一个可预期的或可复制的软件开发过程。我不认为使用一种方法论会使项目失败。大多数软件开发方法论试图使编程成为类似工程的过程,在那方面它们是不足的。】

你该如何识别方法论管用?

一种方法论是否管用取决于条件:团队生产力,快乐,保持,遵从,可预言,有责任,沟通,每天代码行数,人月,代码质量,工件等。如果你用对了地方,每个方法论都管用。但是依照唯一的衡量方法就会出现问题,那就是按时、不超过预算地满足需求,我还没有看到任何方法论能够取得一致的结果。

我自己的经历有些轶事,但是它们也被我认识的每个程序员分享。这表明轶事是每个人都有的:软件开发方法论的严格学习并不管用,因为控制所有变数是不可能的。

做个思想上的实验:假定两组程序员小组,相同的需求、日程规划和预算,同样的环境,相同的语言和开发工具。一个小组使用瀑布模型/BDUF,另一个使用敏捷技巧。很明显这不是一个好的实验:个人技能和团队成员性格,彼此如何沟通,都将对方法论产生非常大的影响。

Alistair Cockburn 2003年的论文《软件开发中的人和方法论》指出,“人们的状态,因人不同,一个时刻与另一个时刻也不同,形成了团队行为和结果的第一位的驱动力。他们彼此相处如何,性格与工作分工是否匹配等因素,都对方法论产生着巨大的、与项目相关的约束。结果表明了通常人们的性格特点对方法论有一定影响。”

我们自己最大的敌人

当我在1970年开始编程时,软件开发稍稍通过项目经理、业务分析员和高级程序员等层级管理。我们没有选择语言和工具。我在公司里的一些大型的、复杂的项目就是这样做的。一些成功了,一些没有成功。现在让程序员选择方法论和工作方式,还有语言和工具比较普遍了。分析员不再出现在大多数程序员的经历里,项目经理已经被演变成“team lead”和“Scrum master”,没有管理授权,除了团队一直通过的仪式,并不真正控制什么。

严格的管理,像甘特图、日程规划和文档,被精简为“利益相关者”和“用户”,再被抽象为“用户故事(user stories,也有叫用例的。译者注)”。对于我来说,参与没有成熟监督机制的项目变得普遍了。令人惊奇的是,留下程序员自己,他们不会回归到冒失鬼的编程方式——他们采用或创造更为严格的方法论,被 比我在1980年经历的要多得多的仪式 所包围。事实上,今天的程序员对他们的方法论比他们认为的70年代COBOL shop更为教条和宗教徒式。现在我常常老一套地陷入1-2个开发人员的项目中,背负着太多的过程和“最佳实践”,而它们并没有产生多大价值。

一旦编程小组采用了一套方法论,不可避免地一些小组成员,或许只有一个人专横,就会要求严格地遵守,并转化成宗教徒。被动侵害的后果扼杀了比任何方法论或技术决定更快的效率。

有管用的吗?

我的个人经验,被Cockburn的论文和Frederick Brooks的《没有银弹》验证过,当团队关键人物分享共同愿景,Brooks称之为“概念完整性(conceptual integrity)”。这不会催生任何特定的方法论,就算缺乏类似于一个过程也会出现。团队每个人情投意合,事情就搞定了,我懂这种感受。我不理解的是,为什么 我在过去有BDUF和业务分析员的日子里 比 现在 感觉更强烈。

我认为程序员应该在倾听和协同工作上 比 仪式和工具上 投入更多的关心,我们应当对 过多的、号称能够使每个人神奇地提高效率的过程或方法论 保持怀疑。与其他人相比,或许社交技能对程序员太难了(我不确定这是真的),但是培养这些技能一定比尝试另一种开发方法论取得更多的回报。

文章转载自 开源中国社区 [http://www.oschina.net]

相关文章
|
7月前
|
测试技术 监控 程序员
软件体系结构 - 净室软件工程
软件体系结构 - 净室软件工程
161 1
|
7月前
|
敏捷开发 开发框架 测试技术
软件体系结构 - 软件工程(1)
【4月更文挑战第1天】软件体系结构 - 软件工程(1)
99 0
|
7月前
|
敏捷开发 持续交付 项目管理
【软件工程】走近演化过程模型:软件开发的不断进化之路
【软件工程】走近演化过程模型:软件开发的不断进化之路
|
7月前
|
敏捷开发 监控 算法
软件开发方法
软件开发方法
|
7月前
|
项目管理
软件体系结构 - 软件工程(2)
【4月更文挑战第2天】软件体系结构 - 软件工程(2)
44 0
|
7月前
|
敏捷开发
软件设计中常用的开发模型
软件设计中常用的开发模型
134 1
|
存储 人工智能
软件工程——面向对象技术
软件工程——面向对象技术
211 0
软件工程——面向对象技术
|
敏捷开发 架构师
「敏捷开发」企业架构和敏捷开发:对立吸引?
「敏捷开发」企业架构和敏捷开发:对立吸引?
|
程序员 测试技术 数据处理
浅谈《软件工程》常用的几种软件开发方法
浅谈《软件工程》常用的几种软件开发方法
|
设计模式 安全 Java
没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚有其表
  与过去 70 年间大多数程序员的做法相比,本章描述的实践有着根本的区别。它们强 制进行大量的分钟级甚至秒级、深刻的、充满仪式感的行为,以至于大多数程序员初次接 触时都会觉得荒唐。于是许多程序员做敏捷时尝试去掉这些实践。然而他们失败了,因为 这些实践才是敏捷的核心。没有测试驱动开发、重构、简单设计及结对编程的敏捷只是虚 有其表,起不到作用。   测试驱动开发是一个足够复杂的话题,需要一整本书才能讲完。本章仅仅是一个概览, 主要讨论使用该实践的理由和动机,而不会在技术方面进行深入的讨论。特别说一下,本 章不会出现任何代码。   程序员是一个独特的职业。我们制造了大量文档,其中包含深奥的技术
162 0