复杂度的指数曲线,以及敏捷原则的根本

标签: 复杂度 指数 曲线 | 发表时间:2011-08-02 21:46 | 作者:gigix diaoxsh
出处:http://gigix.thoughtworkers.org/

想象我正在往一个已有的代码库中添加新的功能。假如我一次只添加一个小修改,这个小修改是如此简单以至于它只有两种状态——写完代码之后只要看一看,我要么是改对了要么是改错了;如果改错了,我就用另一种方式来修改,后者一定是正确的。

如果我一次不是添加一个小修改,而是添加两个,然后把两个修改放在一起来验证。这时可能的状态就有四种:一种正确的,以及三种不同的出错方式。

如果我再贪心一点(或者是因为某些客观条件的约束),一次添加三个小修改然后再验证。这时可能的状态就成了八种:一种正确的,以及七种不同的出错方式。

所以这就是复杂度和变量个数之间的关系:C=(V的N次方),其中C为“复杂度”,V为“单个变量可能的取值个数”,N为“变量个数”。所以复杂度随变量个数的增加而指数上升。所以几个简单的问题可以分别解决、而合并成一个复杂的大问题就根本无法解决,因为整个问题的复杂度不是做加法而是做乘方。

所以聪明的程序员知道要小步快跑。所以一次只做一件事、做好提交等build通过了再开始下一件。所以要频繁地跟其他人的修改集成。所以不要同时开多个story卡来做。所以不要讲什么“反正这些都是我的工作怎么做都是一样的”。所以不要讲什么“小心翼翼地重构太麻烦了不如一步就改过去多省事”。因为软件开发的工作量不是要敲多少次键盘,而是要处理多少复杂度。把渐进式的修改变成大步伐的修改,会增加工作量,而不是取巧。

所以越是痛苦的事越要频繁做直到它不再痛苦。所以要让反馈周期缩短再缩短。不光是为了练习和得到信息,更是为了降低需要处理的问题的复杂度,使普通人也可以处理——从这个意义上来说,再次向所有不采用敏捷方法的程序员致敬,为他们所能处理的超大复杂度。

相关 [复杂度 指数 曲线] 推荐:

复杂度的指数曲线,以及敏捷原则的根本

- diaoxsh - 透明思考 - Thoughts
想象我正在往一个已有的代码库中添加新的功能. 假如我一次只添加一个小修改,这个小修改是如此简单以至于它只有两种状态——写完代码之后只要看一看,我要么是改对了要么是改错了;如果改错了,我就用另一种方式来修改,后者一定是正确的. 如果我一次不是添加一个小修改,而是添加两个,然后把两个修改放在一起来验证.

Eclipse:使用Metrics 测量复杂度

- - CSDN博客推荐文章
Metrics可以进行许多有用的代码度量,包括圈复杂度度量,它用于测量方法中惟一路径的数目. 在Eclipse中安装和使用Metrics步骤 . Elipse中安装Metrics插件 . 打开Help->Install new Software,点击Add,添加Repository. 选择相应的版本插件,继续随后的安装 .

关于复杂度的一些想法

- - No Headback
之前陶师傅推荐过这么一篇文章, Complexity has to live somewhere,大致意思是系统的复杂度是没法凭空消失的,只能从一个地方转移到另一个地方,因为现实世界的逻辑就是那么多,边边角角的 case 就是那么多,你必须要处理,这必然会给系统引入复杂度. 尽管这些复杂度你可以转移给你的同事,或者外包给第三方系统,但复杂度是不灭的.

MySQL源码:JOIN顺序选择的复杂度

- - OurMySQL
   在看MySQL优化器代码过程中,这应该是相对较简单/代码较清晰的部分了. MySQL优化器有两个自由度:单表访问方式,多表顺序选择. 前文已经介绍过MySQL单表访问的一些考量(ref/range等),本文将介绍JOIN在顺序选择上的复杂度分析.    当有多个表需要JOIN的时候,MySQL首先会处理两类特殊情况,一个是常数表,一个是由于外连接导致顺序依赖关系.

Linux下操纵CPU曲线绘制心形

- TheLover_Z - 博客园-首页原创精华区
不久之前看了「编程之美」,里面有在windows下操纵CPU绘制正弦曲线的示例程序. 思路很简单,但是需要知道几个windows的API函数. 刚开始我想尝试在windows下绘制心形,不过没能做到,原因是CPU曲线是CPU利用率和时间构成的函数的关系,心形是一个封闭图形,不可能是一个函数,所以至少需要两条CPU曲线才能绘制(这需要你的机器为双核或多核或者多个CPU),然而windows的任务管理器,我没能找到将两条CPU曲线绘制在同一图表下的方法,所以没能成功.

阐述休闲游戏设计中的学习曲线

- 沈蚊 - GamerBoom.com 游戏邦
若关于游戏你仅限于体验,那么认为游戏学习方式根植于游戏本身也就情有可原;这不过是根据游戏呈现方式所得出的结论. 作为游戏设计师,你应意识到学习曲线也是需要设计的内容. 游戏学习曲线在新玩家如何认知游戏方面影响很大. 虽然我猜想你应该能够轻松想象学习曲线的样子,但我还是决定绘制一幅,因为在我们把握其精髓前,有些内容还是需要先理清.

炒作和实力:给你的创业公司画个曲线

- SotongDJ - 爱范儿 · Beats of Bits
Jules Maltz 是投资机构 IVP ( Institutional Venture Partners)的合伙人,今天在 TechCrunch 上发表了一篇《别随大流》的文章,其中谈到 2 x 2 思考矩阵和炒作曲线图很有意思. “每当我要面对一笔新投资时,经常会用 2 x 2 的思考矩阵来看待项目.

微软中国发售舒适曲线键盘3000

- SINCERE - Engadget 中国版
微软并不是大家所想像的那样只做"软"的,这次即刻在中国上市了一款新硬件外设:微软舒适曲线键盘3000. 名字有点长,其实就是卖瓜的王婆想多夸下自己产品的特点;和一般键盘不同的反向倾斜、键盘托手和曲线造型,键盘右上方增加了 4 个 Windows 多媒体快捷键,另外还配备了 USB 2.0 接口;要价149元,只是一时半会看到这个歪歪斜斜的键盘不习惯倒没关系,真要操作起来会如何.

使用 amcharts 和 highcharts 绘制多曲线图的通用方法

- - CSDN博客Web前端推荐文章
       工作中用到, 这里分享一下. 可以使用 amcharts 和 highcharts 在同一坐标中绘制多个对比曲线图. 当然, 对图形没有过多装饰, 可以参考 API 文档:.       amcharts 与 highcharts 对于数据格式的要求是不一样的.        由于 javascript 所使用的标准数据格式是 JSON, 因此, 可以非常方便地进行数据拼接和组合.

我眼中的 性能劣化、优化的曲线

- - 码蜂笔记
随着代码写得越来越烂,程序运行时 数据库操作更多、IO 阻塞等待跟过、不必要的对象创建、GC 回收更频繁,线程的上下文切换也更多,开销越来越多,所有因素综合起来,程序运行更慢,响应延迟加大. 当到达临界点的时候,压垮骆驼的最后一根稻草出现了,系统直接崩溃. 代码的实现一直保持良好,不断通过 合并查询等措施减少数据库操作,通过优化SQL语句缩短了单次数据库操作的时间,通过更好的日志记录方式减少 IO 操作,减少 IO 阻塞等待的时间,进而又可以减少线程切换的次数,通过避免不必要的对象创建,可以提升代码的执行速度,还可以减少 GC 的次数,种种优化效果综合起来的结果就是程序运行稳定,响应时间缩短.