“我会更加努力地工作”——一匹名叫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年,做过开发人员、软件经理和系统架构师。关注构建优质、可靠和可用的软件。《如何使用搜索技巧来成为一名高效的程序员》就是他所写。

原文链接:http://www.jobbole.com/entry.php/394-软件开发中的11个系统思维定律

转载于:https://www.cnblogs.com/MSRA_SE_TEAM/archive/2010/12/18/1909855.html

[FW]软件开发中的11个系统思维定律相关推荐

  1. 11 Laws of The System Thinking in Software Develo(软件开发中的11个系统思维定律)

    The System Thinking Laws from Peter Senge's book "The Fifth Discipline" applied to Softwar ...

  2. 软件工程中的系统文献映射研究实例-软件开发中的假设条件与哪些软件制品关联(第四部分)

    之前的博客详细描述了软件工程中的系统文献映射研究方法.这里接着给出一个我曾经做过的工作作为例子,以更直观地展示这种研究类型.该研究的背景信息这里不再赘述. 这篇博客主要介绍第三个研究问题的结果,即软件 ...

  3. 软件开发中常见知识总结

    最近在准备软件开发的笔试面试,复(yu)习(xi)了一些在软件开发中的常见知识.为了给自己攒点RP,故与大家分享一二. 软件开发需要准备的比较多,主要分为编程语言,数据结构和算法,计算机网络,计算机操 ...

  4. C++软件开发中“时间”相关操作全攻略

    1.  时间概念 在日常生活中我们遇到的和时间相关的概念有北京时间.时差.12小时制.24小时制等,在软件开发中我们也经常遇到和时间相关的概念,软件虽说是一个虚拟的事物,但它仍然是来源于生活,不会脱离 ...

  5. 直播平台软件开发中选择点播播放器哪家强?

    直播平台软件开发中选择点播播放器哪家强? 太长不看版 这里选择了开源播放器IjkPlayer和直播云厂商播放器PLDroidPlayer作为测试样本. 数据统计 软硬编码 IjkPlayer PLDr ...

  6. 软件开发中会使用到的图

    文章目录 软件开发中会用到的图 一.背景 二.图为了解决什么问题 三.不同流程中适合运用的图 四.实际的运用 五.结语 软件工程中的各种图 软件工程用的15种图 数据关系流图怎么画?这款软件教你轻松绘 ...

  7. 我的软件开发中经验教训

    作者:追梦1819 原文:https://blog.csdn.net/weixin_39759846/article/details/116780540 版权声明:本文为博主原创文章,转载请附上博文链 ...

  8. 软件开发中的著名定律

    软件开发中的著名定律 和其他领域一样,在软件开发的世界中也有一些有趣而著名的定律,开发人员.管理人员还是架构师,都经常在会议或闲谈中提到他们,很多时候我们都只是点头附和,免得让人知道自己其实根本没听说 ...

  9. 浅谈软件开发中的假设条件

    翻开第一篇聊假设条件的博客,发现已经快2年了.那篇主要涉及了点架构方面假设条件的东西,不是很全,今天开一篇聊一下软件开发中的假设条件.如果把假设条件限定在架构方面,稍显冷门.但如果将其扩展到整个软件开 ...

最新文章

  1. CSS选择器和参考手册
  2. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
  3. 爬虫-08-requests使用入门-利用发送post与get请求
  4. Educational Codeforces Round 24 E. Card Game Again(双指针)
  5. [再寄小读者之数学篇](2014-05-23 递增函数的右极限)
  6. GCC 用 C++ 来编译(酷壳)
  7. MySQL索引(1)
  8. 树形$dp$学习笔记
  9. C#利用Process关闭所有的IE窗口
  10. unity相机渲染不同层的东西和相机的深度
  11. 1.2.2算法设计题
  12. h5侠客行服务器维护有更新什么,侠客行h5转生条件大全及转生激励说明
  13. Verilog求相反数
  14. NFS存储服务器搭建
  15. 标准的软件测试文档,软件测试上线的标准是什么?
  16. VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充
  17. 饥荒联机版服务器搭建教程-WeGame
  18. 【HTML501】HTML基础01_简介_基础_元素_属性
  19. 流程图在线绘制,快速、便捷、高效
  20. 华为系统取名鸿蒙,华为自主操作系统为何取名鸿蒙?看完西游记就知道霸气在哪里!...

热门文章

  1. 卷积核和全连接层的区别_「动手学计算机视觉」第十六讲:卷积神经网络之AlexNet...
  2. mysql 查询语句_SQL语言mysql基础查询语句
  3. 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
  4. 查看某个端口的进程 lsof -i:端口号
  5. linux可以使用的远程管理,linux下可以使用以下()方法进行远程管理
  6. 手机知识:NFC是什么,有什么用?看完你就明白了!
  7. 如何快速清空Linux中的大文件?
  8. 霸榜Github第一!谷歌重磅开源的“海啸”,我服了
  9. IDEA高级技巧:集成JIRA、UML类图插件、SSH、FTP、Database管理
  10. GET和POST有什么区别?