陈亮亮的专栏

造适不及笑,献笑不及排,安排而去化,乃入于寥天一。

陈亮亮ID:cll0320
180357次访问,排名399好友2人,关注者8
cll0320的文章
原创 57 篇
翻译 0 篇
转载 0 篇
评论 331 篇
陈亮亮的公告
陈亮亮,字又明。湖北荆州人。
喜爱哲学与技术,尤其是中国传统哲学。
希望能交到更多的朋友。
chenyoming@gmail.com  
最近评论
mghueh:wow power leveling
carry1002:你好,我是猎头公司carry,我们服务的对象主要是世界500强企业,现在有thougthtworks公司的职位机会,TW是敏捷方法领域的领头羊,有兴趣的朋友请和我联系,我的msn:carry.1@hotmail.com
kjq_vb:<a href="http://www.wcfh.cn">福海大酒店</a>
[url=http://www.wcfh.cn]福海大酒店[/url]吴川市福海大酒店荣获AAA+级质量信誉企业,并通过了ISO9001质量体系认证,月饼荣获全国月饼

双金奖。[url=http://www.wc126.com]吴川网[/url]
limin4506:LZ高明,小子班门弄斧
limin4506:LZ

呵呵,<易经>我也花了不少时间.

后人的解释太牵强,古人未必想得那么深奥.

中国古代的文化,我慢慢也不看了.学习西方的思想,

文章分类
收藏
    相册
    照片
    朋友的Blog
    宗刚的专栏(RSS)
    小明的专栏(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 读易[9]·用中医看复杂系统收藏

    新一篇: 插件系统[8]·系统组装策略分析 | 旧一篇: 读易[8]·八卦一下三层架构

    当系统越来越复杂的时候,我们对它的掌控能力也就越来越弱了。一个复杂的系统是非常不好把握的,人体就属于这一类的系统。对于人的生理学研究,西医和中医是两种截然不同的方法。那么对应到我们的软件系统来看,是否也有类似的情形出现呢?

    一、复杂与精确的矛盾

    1.1 自然科学界

    在自然科学领域,科学家们认识到微观与整体的矛盾,其“不相容原理(互克性原理)”认为:“一个系统的复杂性增大时,我们使它精确的能力必将减少,在达到一定的阈值以上时,复杂性和精确性将互相排斥。”不相容原理是符合矛盾对立统一规律的。许多事物过份追求精确反倒更模糊,适当模糊反而可以达到精确的目的。

    上面的原理对于软件系统来说是同样成立的。

    1.2 中医经典

    早在春秋战国时期,我们的祖先就已经认识到精确与模糊的优劣。中医界有一本非常权威的书《黄帝内经》,其中就提出“夫阴阳者,数之可十,推之可百,数之可千,推之可万,天地阴阳者,不可以数推,以象之谓也。”

    这句话提到了,万物都由阴阳组成。最小的元素找到了,很自然就会认为逐步往上推演,由十到百,由百到千,由千到万,这样是不是可以将整个宇宙推出来呢。这个想法是不现实的。因为当复杂程度逐渐增大,很快就不是我们能推演的程度了。所以“天地阴阳者,不可以数推”。

    1.3 乐观的软件工程师

    我们经常会注意到这样一种现象,在我们分析软件的时候,将整个软件划分成一个一个的模块,然后经理将这些模块都分配下去。如果软件系统比较小,这样做是非常容易成功的,等到做了一个几万行的小项目得到成功后,然后做几十万或者几百万的项目时同样也会信心满满。

    软件工程师如此想到“几十万百万的项目和几万的差不多,结构都是类似的,不就是分层分模块吗,一样可以搞定。至于时间,按照以前的经验在乘上一个倍数就可以了。”

    殊不知,规模和所需的资源并不是按照线形关系增长的。下图描述了规模与复杂程度之间的对应关系。

    当规模达到一定的程度,耗费的资源就不是我们能够想象得到的了。现在最庞大的系统莫过于Vista,而它几千万行的代码正是由数量惊人的资源堆积起来的,Vista的不断延期在IT界也是人所共知。

    二、划分子系统

    针对上面所说的原理,其实在软件行业一直没有找到好的解决方法。若非如此,庞大的微软帝国也不至于一再失控了。

    2.1 中医中的子系统

    软件中没有好的方法,毕竟软件行业太年轻了。医学界却是探索了几百万年——真正的源头我觉得应该是从上古时期的巫医说起,而不仅仅是有文字记载的那么区区几千年。从医学界可以借鉴什么呢?下面来看看中医的一些入门知识。

    中医将人体分为“心、肝、脾、肺、肾”五个子系统,这里要强调的是这里的名词并不等同于西医中的人体器官。比如说“肝”,实际上包括了现代医学部分神经系统、消化系统、循环系统等的功能,“肾”实际上包括了内分泌系统,运动系统等的功能。

    这五个子系统都具有自己的作用,但并不能将它们孤立起来研究。

    不像西医那样,研究“心”的时候,拿把手术刀哗啦一下把人的胸膛破开,然后仔细研究心脏的结构、质地、颜色。有人戏说西医的“生理学”不是“生理学”,而应该是“死理学”。

    如果将各个器官分开来研究,得到的结果很可能是片面,不准确的。

    中医在研究“心”的时候,会通过观察人在各种活动的时候心会出现什么样的反应,通过五脏在完成生理功能的过程中和整体之间发生的各种关系和联系来研究。我们在受到惊吓、恐慌和思虑的精神状态下,会出现心慌、心悸等反应,故而中医将神志归为心。

    崇拜自然科学的人可能会起来反驳,“中国字的“想”有问题,为什么下面是一个“心”?现代医学早证明了,人思考问题是在用大脑而不是心。”原因在于中医研究人体和西医是不同的思路,中医将所有和“心”相关的部分 划为“心”这个子系统。

    对于五脏的研究,内容确实太多了,这里简单介绍一下只是想说明中医在研究人体这个复杂系统的时候,用了一个非常有效的方法,就是划分子系统。看上去比较儿戏,但简单的五部分确实就能治病救人,容不得我们不信。

    2.2 软件中的子系统

    软件中同样存在子系统的概念,将复杂的划分成简单的分而治之方法是自然而然就可以想到的。不过软件中关于子系统的划分思路和西医一脉相承。西医将人体分成一个个的器官研究,软件将系统分成一个个的模块开发。中医最聪明,对于人体这个复杂系统也仅仅分为“五”个子系统。相比起现在软件划分子系统的方法却是要高明得多了。

    按目前划分模块的方式来做软件也是可行的,不过当规模扩大到几百万几千万,甚至上亿的时候我们似乎就要考虑其他的思路。对于这点我考虑的不成熟,按下不表。等以后深入考虑后再来与大家分享。

    三、以象之谓也

    上面说“天地阴阳者,不可以数推,以象之谓也”。什么是以象之谓呢?

    易经中的八个卦就是 象,天地之间的事物形形色色,数不胜数,如果我们想要将所有的事情分清楚那就会到达上面所说的临界值,不能精确和复杂兼得。解释临界值之外的东西,易经中提供了一个有效的方法,就是将事物抽象、归纳。最终易经用八个现象来表示世界万象,其中运用推理、联想、类比、隐喻形成一个开放系统。

    中医中的“心、肝、脾、肺、肾”用“火、木、土、金、水”五行来表示,这也是“以象之谓”。上面说中医将人体系统划分成五个子系统,这只是第一步,接下来将每一个系统用一个“象”来表示,用“象”之间相生相克的关系来解释子系统之间的交互。

    五行本身和人体没有什么关系,但我们能用简单的象来解释复杂的系统。

    将复杂的系统简单化的最自然的想法就是细分,然后组合,但上面的分析说明系统的复杂程度和规模并不是线形的递增关系,所以简单的分而治之并不是万能的。当系统的规模达到一个临界值后,我们只能采取“以象之谓”的方法。用更加抽象的隐喻来描述和规划系统。

    这篇文章没有谈到怎样处理复杂的软件系统,仅仅是提出复杂与精确之间的互斥关系,并尝试用中医的思路来探讨这个问题的解决方式。而最后提出的“以象之谓”也可以说是一种隐喻,这点正好是我今后要着重研究的方向。大家如果有什么好的思路,可以拿出来一起讨论讨论。 

    发表于 @ 2007年01月07日 22:52:00|评论(loading...)|编辑

    新一篇: 插件系统[8]·系统组装策略分析 | 旧一篇: 读易[8]·八卦一下三层架构

    评论

    #paulzhang2006 发表于2007-01-08 12:23:38  IP: 218.249.220.*
    纵观软件开发的发展史,其实就是一个积累的过程(的确,积累是一个过程)。

    我们能够利用越来越多的已证明是可靠的前人开发的组件及服务:

    BIOS调用;
    操作系统 API调用;
    Java相关库及.NET相关库;

    C函数库;
    C++ STL及函数库、类库;
    MFC、VCL等类库;
    大量成熟可靠的其他函数库及类库。

    语言层面,我们能够利用日渐强大的能表达更抽象概念的语言来编写程序(估计今后某些语言1行代码能够表达现有大部分语言10行甚至更多行代码的业务);
    并且我们还能够调用越来越多的甚至与特定行业和业务相关的服务。

    不断的积累,不断的验证,不断的扩充,我们能够站在前人的肩膀上开发出越来越复杂的软件。

    所以,应付软件逐渐复杂的也许是唯一的办法就是:耐心积累可靠的服务供后人使用。
    #wangguog 发表于2007-01-09 17:51:35  IP: 218.249.220.*
    选择不同的抽象层次来考虑系统是降低目前工作复杂度的非常有效的方法。
    说实话,软件开发在绝大多数情况下与高科技无关,只能说属于工程范畴,某种意义上一个java高手和一个高级木匠没什么区别。而且领域内的多数知识严重依赖经验,缺少比较系统的理论,与计算机科学信奉的自动化思想相悖。
    所以个人认为在战略上应该从哲学层面考虑问题,寻找方法,在战术上还是应该寻求自然科学的方法,特别是应用高等数学和计算机工具来解决工程和管理问题
    #oscarxie 发表于2007-05-23 13:38:26  IP: 202.167.248.*
    划分模块是通用做法,难度还在于最终系统的集成,各个模块要无缝的整合在一起,要知道困难就大了,因为不同模块一般是不同团队完成的。
    #guogangj 发表于2007-07-18 08:14:39  IP: 61.172.24.*
    好文。前阵子我悟出个道理:“微观靠数学,宏观靠直觉。”没想到数千年前的《黄帝内经》里就有这么个类似的道理,当然“象”和直觉我相信还是有很大区别的。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 陈亮亮