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

简介:

无论大小项目,大型团队还是我个人,陈腐的联邦机构还是牛逼的硅谷公司,我都工作过。我学习并使用过至少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]

相关文章
|
定位技术
在阿里云上搭建的幻兽帕鲁服务器,如何替换服务器存档?能否把别的服务器存档导入?
在阿里云上搭建的幻兽帕鲁服务器,如何替换服务器存档?能否把别的服务器存档导入?
|
Oracle JavaScript Java
JDK的版本迭代特性(JDK9 - JDK20)
JDK的版本迭代特性(JDK9 - JDK20)
|
10月前
|
存储 编译器 C语言
深入理解GCC 和 G++ 编译器
GCC 和 G++ 是 GNU 工具链中的核心编译器,支持 C 和 C++ 程序开发。本文详细介绍其编译流程、常用选项及动态链接与静态链接的区别。编译过程分为预处理、编译、汇编和链接四个阶段,每个阶段有特定任务和命令选项。常用选项如 `-E`、`-S`、`-c` 和 `-o` 分别用于预处理、生成汇编代码、生成目标文件和指定输出文件。动态链接节省空间且易于更新,但依赖运行时库;静态链接独立高效,但文件较大且更新困难。合理选择优化选项(如 `-O0` 至 `-O3`)可提升程序性能。掌握这些知识有助于开发者更高效地编写、调试和优化代码。
526 23
深入理解GCC 和 G++ 编译器
|
域名解析 存储 缓存
域名解析 DNS:连接数字世界的关键枢纽
在数字世界中,DNS(域名解析系统)如同一位至关重要的引路人,将我们输入的域名与对应的IP地址相连,使我们可以轻松访问各种网站和服务。它通过多级服务器查询,将易于记忆的域名转换为复杂的IP地址,极大提升了互联网的易用性和普及度。尽管面临网络延迟和域名数量激增等挑战,通过分布式系统和缓存技术等创新方案,DNS 系统将持续发展,为用户提供更安全、高效的网络体验。
263 2
|
SQL Oracle 关系型数据库
Oracle|内置函数之INSTR
【7月更文挑战第5天】
|
JavaScript Java 测试技术
基于SpringBoot+Vue的知识管理系统附带文章和源代码
基于SpringBoot+Vue的知识管理系统附带文章和源代码
187 1
|
数据可视化 Python
Python中绘制3D曲面图的艺术
【7月更文挑战第4天】使用Python的Matplotlib和mpl_toolkits.mplot3d库,可以轻松绘制3D曲面图。首先安装matplotlib,然后导入numpy和相关模块。通过定义函数和使用numpy的meshgrid生成数据,接着用`plot_surface`绘制曲面,可定制色彩映射、添加标签、标题、色标、透明度和阴影。通过自定义颜色映射和添加网格线,能进一步增强图形的解读性。这些技巧使3D数据可视化更具洞察力和吸引力。
|
机器学习/深度学习 人工智能 搜索推荐
未来智能家居中的人工智能应用探索
在未来智能家居领域,人工智能技术将扮演越来越重要的角色。本文探讨了人工智能在智能家居中的应用现状和未来发展趋势,分析了人工智能技术对提升家居生活便利性、安全性和舒适度的潜力。通过结合物联网、大数据和机器学习等技术,未来智能家居将实现更智能化、个性化的用户体验,成为人们生活中不可或缺的一部分。
|
SQL 运维 大数据
如何获取大数据平台 CDH 中 hive metastore db 的用户名和密码?
如何获取大数据平台 CDH 中 hive metastore db 的用户名和密码?
如何获取大数据平台 CDH 中 hive metastore db 的用户名和密码?
身份证号码的编排规则
作者:知乎用户链接:https://www.zhihu.com/question/19823489/answer/13074347来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
3638 0