英文原文:11 Laws of The System Thinking in Software Development
“我会更加努力地工作” —— 一匹名叫Boxer的马(出自乔治·奥威尔的《动物农庄》)
彼得·圣吉在其著作《第五项修炼》中提到的系统思维定律同样适用于软件开发。
1. 今日的问题源于昨日的解决方案(Today’s problems come from yesterday’s solutions)
当解决问题时,我们会感到很高兴。我们经常不考虑后果。令人感到意外的是,我们提出的解决方案可能会产生反作用,并带来新问题。
- 作为对取得巨大成功的团队的奖励,公司决定为团队中的少数骨干成员发放奖金并晋升职位。团队中的其他成员会感到不公平,并且会丧失积极性。最终使团队成员之间的关系更加紧张,后续项目也就很难再取得成功。
- 项目经理频繁要求开发者修复一个新的软件Bug,或者处理客户的紧急需求,而开发者尽力满足这些要求。但是,过于频繁地分散精力会妨碍他们完成迭代过程中的主要任务。因此,项目进展很慢。
2. 用力越大,系统的反作用力也越大(The harder you push, the harder the system pushes back)
当事情的进展结果并非如我们所愿时,我们会固执地坚持自己的方法。我们没有时间来停下来思维并寻找更好的替代方案,而是“义无反顾”地向前冲。有时候虽然解决了问题,但往往又发现深陷于其他问题之中。
- 当一个系统远未完成时,经理通常会不断催促员工加班加点地工作,并且要求按时完成。系统bug数量的持续增加及整体质量的急剧下降,导致更多的延误。因此,需要做更多的工作来部署软件系统。
- 为了满足新系统的要求,开发者勇敢的对原有的系统架构进行扩展,但死板陈旧的方法已经不能满足这些新需求。他们忙于做这件事,以至于没有时间停下来仔细分析并且改变方法,从而导致系统质量下降。
3. 福兮祸之所伏(Behavior grows better before it grows worse)
短期的解决方案,会给我们带来短暂的休息和状况的暂时改善,但是不会从根本上解决问题。这些问题终究会使情况变得更糟。
- 公司为顾客提供丰厚的优惠并投入巨资宣传,让很多人购买软件 。但是,顾客购买之后很不满意,因为软件无法使用也不可靠。
- 管理层承诺,如果开发团队能够按时完成系统开发,公司会提供巨额的奖金。一个团队开始努力的工作,但很快他们就意识到这是不可能实现的。于是开发者变得悲观并丧失动力。
4. 最容易出去的方法往往会导致返回来(The easy way out usually leads back in)
在生活中学到的一些解决方案能够帮助我们轻易地并且更早的地获得成功。我们总是试图把它们强加到任何情形上,而忽略了特殊的背景以及相关人员。
- 开发者还没有准备好接受结对编程或者测试驱动开发这样的实践时,敏捷教练强行实现完全的极限编程。这会给任何敏捷方法带来压力、冲突以及负面影响。
- 开发者把设计模式应用到任何地方,这是徒劳的,而且这会让系统变得复杂。
5. 治疗带来的结果可能会比疾病导致后果更严重(The cure can be worse than the disease)
有些熟知的方法可能会更危险,比如在编程的时候喝啤酒,来减轻不切实际的任务期限带来的压力。
- 由于不信任全职开发者,一家公司雇佣了大量的承包商来开发核心功能。结果,系统不具有概念完整性,自己公司的开发者看不懂,并且无法做出修改。所以,公司员工也不了解相关领域的知识、解释以及概念。
- 开发者会走捷径,拷贝相似功能的代码来赶进度,并且争取尽快发行第一个版本。他们一开始进展迅速,但是代码最终会变成大泥球(比喻系统结构不清晰)。
6. 欲速则不达(Faster is slower)
当我们看到成功的曙光,我们会全力以赴,不再小心谨慎。然而,最优增长速率通常会比可能的最快增长速率要慢得多。
- 经理们往往为已经成功的项目增加很多人手,但总体进展就会变慢,因为交流所用的花费增加,以及团队成员之间失去默契。
- 在没有对代码进行合理重构及改善的情况下,开发者快速的为系统添加新的功能,会使系统变得难懂,而且难以修改。
7. 在时间和空间上,因果并不密切相关(Cause and effect are not closely related in time and space)
我们善于为出现的困难寻找原因,即使这些原因很牵强,并且远非是真正的根本原因。
- 为了按时完成系统,开发团队不再接受来自客户的需求改变。因此,客户对发行的软件不满意。
- 实时系统历经坎坷之后,管理层迫使开发者同意,并且在给系统做出任何修改之前撰写详细的技术说明。结果开发者失去了为系统做出任何改进的动力,并且开始拖延。
8. 微小的改变可以产生明显的效果,但这种杠杆效应最大的地方往往也最不明显(Small changes can produce big results-but the areas of highest leverage are often the least obvious)
像改变公司政策、愿景或者广告用语这样显而易见并且关系重大的解决方案往往不起作用。相反,小而普通,但持续的改变却会带来大不相同的效果。
- 开发者每天都与客户进行交流,并且做出大部分决定。因此,能够更好地理解客户的需求、做出更好的决定并且给出最优的解决方案。
- 开发者为系统的每项功能设计自动化单元测试。因此,设计更灵活、人们更自信、系统在每此修改之后都能得到完全的测试。
9. 鱼与熊掌可以兼得,但不是同时兼得(You can have your cake and eat it too – but not at once)
我们经常会面对刻板的“非此即彼”选择。如果我们改变一下自己的观点及系统规则,这些选择有时并不会使我们进退两难。
- 经验丰富的项目经理知道增加系统特性的数量与削减时间和开支不可兼得。然而,如果我们完善一下想法、寻找合适的人才并且避免过度开发,这也是可能做到的。
- 开发者认为他们应该要么采用事务脚本,要么采用域模型体系架构模式。然而,复合域中的高性能解决方案可以将两者结合,以得到最佳性能。
10. 把一头大象分两半不会得到两头大象(Dividing an elephant in half does not produce two small elephants)
无法整体了解系统,往往会做出次优决定。
- 项目经理往往通过生成的代码量和迭代过程中实现的功能数来评估开发者。而开发者往往会生成大量无用代码。
- 管理层承诺,每发现一处系统bug,测试者将得到5美元。测试者对跟开发者合作不再感兴趣,并且不再试图消除产生bug的根本因素。团队之间良好而且高效的关系不复存在。
11. 无可非议(There is no blame)
我们喜欢归咎于客观条件,或对别人指指点点,甚至对此深信不疑。但是,我们自己以及问题的原因都是系统的一部分。
- 今天早上团队没有发布系统完全是乔的过错。即使项目经理亲切地为其提供了免费的啤酒、T恤以及披萨,他也没能在一晚上的时间内修复所有的缺陷。
- 人们不会使用一个公司优秀的Web 2.0社会化应用,用户喜欢简单实用的东西,并且不会感激你辛勤工作的成果。
然后呢?
以上11条系统思维定律表明,我们提出的所有解决方案都会产生一定的后果,有时非常严重并出乎意料。我们周围的系统本就那样,我们不应苛责它们,而是要从中学习。要掌握系统思维方式并控制这些系统,我们需要做到如下几点:
1. 要明白我们是在跟什么样的系统打交道,是人或是软件;
2. 有意识地学习相互关系、因果链;
3. 把系统看做一个整体,并且视其为其他系统的一部分。
系统思维方面有很多挑战,通过获取并且利用有关系统工作方式的知识,我们可以战胜其中的很多挑战。但是,大部分严峻挑战是我们人类与之相冲突的本性。我们的激情、感情以及本能可以轻易改变我们理智、条理分明的思维方式。掌握系统思维方式的第一步就是要学习如何跟自己合作。
后话
在软件开发过程中,你有(或缺乏)哪些系统思维的使用经验?
编者注:原文作者Andriy Solovey从事软件开发已有15年,做过开发人员、软件经理和系统架构师。关注构建优质、可靠和可用的软件。
编译:伯乐在线 敏捷翻译 - 朱勇
相关推荐
以下是对这11个系统思维定律的详细解释: 1. 今日的问题源于昨日的解决方案:我们在解决问题时,往往忽视了新问题可能由旧的解决方案引起。例如,奖励个别团队成员可能导致团队内部的不公平感,削弱整体团队合作。...
在Android开发中,遵循一些系统思维定律可以帮助开发者更好地理解和解决遇到的问题,提升开发效率和产品质量。以下是对这些定律的详细解析: 1. **今日的问题源于昨日的解决方案**:在Android开发中,我们经常为了...
根据《敏捷软件开发》一书,方法学主要由以下十三个核心要素构成: - **角色(Roles)**:定义了项目中的不同职责。 - **个性(Personality)**:指的是团队成员的性格特点。 - **技能(Skills)**:团队成员的专业...
另外,书中提到了“两座山峰模型”,即软件开发过程中存在一个初期的学习曲线和后期的调试曲线。这个模型揭示了软件开发的非线性特性,提醒开发者要在早期阶段就进行充分的设计和规划,以避免后期大规模的修改和返工...
另一个核心概念是“人月定律”,即增加人力往往不能按比例缩短项目时间,甚至可能延长项目周期。这是因为新增加的开发者需要时间来熟悉项目,同时,团队沟通和协调成本也会随之增加,这导致了所谓的“Brooks定律”。...
- 将软件系统视为一系列离散对象的集合,每个对象包含数据结构和操作。 - 强调对象和类的概念,有利于提高代码的复用性和可维护性。 4. **配置开发法** - 利用现成的软件包和配置工具快速搭建系统框架。 - 适用...
【软件开发涉及的两个方面】包括软件开发过程和开发过程中涉及的资源。开发过程涵盖从需求分析到最终产品交付的连续阶段,要求各阶段逻辑一致性。资源管理则涉及人员、硬件和软件资源的协调和管理,这两者的有效结合...
软件形式化方法是一种重要的软件开发技术,旨在通过严谨的数学工具和逻辑来精确描述和验证软件系统的规格和行为。这种方法论旨在解决所谓的“软件危机”,即在20世纪60年代末期,软件开发过程中遇到的诸如高昂的成本...
适用人群:系分备考者、产品经历、软件开发等,也适用于有相关知识点学习兴趣的小伙伴;内容概要:各系统的性能评价,以及阿姆达尔定律常考内容;其他:思维导图的方式介绍知识点,标注重点和示例
Brooks因其在IBM 360系统项目中的杰出贡献而闻名,该项目被誉为是现代计算机历史上的一个重要里程碑。他不仅担任了该项目的项目经理,还在操作系统的设计阶段发挥了重要作用。1985年,Brooks与Bob Evans和Erich ...
在这个项目中,我们使用MATLAB开发了一个简单的欧姆定律计算器。MATLAB(矩阵实验室)是一款强大的数值计算和数据分析软件,广泛应用于科学计算、工程设计以及数据分析等领域。 欧姆定律公式为:V = IR,其中V代表...
【创新思维的基础知识】 创新思维是推动科技进步和社会发展的重要动力,它涉及到人类社会的各个领域,...在IT行业中,创新思维尤其重要,无论是软件开发、系统设计还是问题解决,都需要不断挑战现状,推动技术的进步。
在软件测试领域,心理学因素起着至关重要的作用。软件测试并不仅仅是技术操作,它...通过重视测试人员的心理状态,培养独立思考和创新精神,以及建立明确的流程和目标,可以有效提升整个软件开发过程的质量和可靠性。
智能化使计算机具有模拟人的感觉和思维过程的能力,网络化使计算机互联起来,组成一个规模大、功能强、可以互相通信的网络结构,多媒体技术使多种信息建立了有机联系,并集成为一个具有人机交互性的系统。...
- **IEEE 1993年定义**:软件工程是将系统化的、严格约束的、可量化的方法应用于软件开发、运行和维护中。 - **Roger S. Pressman 2001年定义**:软件工程是一个过程、一组方法和一系列工具。 - **现代定义**:...
在本设计中,学生汪鹏举采用了MATLAB语言,开发了一款在Windows操作系统下运行的图形化潮流计算软件。该软件具有以下特点: - **易用性**:简洁的操作界面使得用户无需深入了解底层算法,即可进行潮流计算。 - **...
《计算机系统结构》课程教学内容改革的探讨主要集中在如何适应...通过深入学习多核技术,学生不仅能理解硬件层面的创新,还能适应软件开发的变革,为他们在多核时代的计算机科学与工程领域中取得成功打下坚实的基础。