效颦篇:编程本质论

先有leezy_2000兄的大作《编程本质论》,接着是johnnyxia兄的《也谈编程本质》, 在CSDN上引发了一场关于编程本质问题的热烈讨论。当时我也在QQ上和FrameSniper兄就这个问题聊了几句,当时就想写这么一篇效颦文章来凑个 热闹,只是因为没想到那篇BCBX的文章写了这么久,加上过了个年,于是耽搁了,现在过了两个多月了,再来旧话重提,恐有马后炮的嫌疑。

“效颦”的典故出自《庄子·天运》,曰:故西施病心而颦其里,其里之丑人见之而美之,归亦捧心而颦其里。其里之富人见之,坚闭门而不出;贫人见之,挈妻子而去之走。彼知颦美而不知颦之所以美。

正如我对FS兄所说的观点:虽然我们在软件业摸爬滚打了这么些年头,但软件的本质对于我们来说,与盲人面前的大象没有区别。每个人看到的都是其中很小的一 个方面,所有说出来的看法都是片面的,我也不例外。然而每个人将自已从不同角度得到的看法说出来,也许就能让我们对软件的本质有更全面的了解。这就是我为 什么明知是在“效颦”而仍要为之的原因之一(另一个原因当然是因为我也是“不知颦之所以美”)。


在研究“编程本质”前,当然首先要研究一下什么是“本质”,金山词霸对“本质”一词的解释有三个:

1、 事物中常在的不变的形体
2、 事物的根本性质
3、 哲学名词。某类事物区别于其它事物的基本特质

首先,软件应该说是没有什么具体的形体的,至于哲学,太高深了,非我辈所能妄言,所以我想研究的是:什么是“编程的根本性质”?
然后再来看看“编程”是一个什么概念?顾名思义,所谓“编程”就是编写程序,就是Coding,然而这只是一个狭义的概念。按照program一词的正式解释是:设计、编写、测试程序。也就是Development,即“开发”。

现在可以明确所谓“编程本质”就是“软件开发的根本性质”。


leezy_2000兄认为编程有四大要素:问题、概念、逻辑和技巧,并且认为其本质为:概念和逻辑。

而johnnyxia兄则认为编程的本质是Thinking in Programming Language。

此外在两篇文章的评论中还有很多其它的观点,有些还非常的独特,比如itpunk兄的:“编程的本质就是出卖劳动力换取一日三餐。”(窃以为“出卖劳动 力”不太准确,所有的工作都是如此,不独编程,换成“出卖代码”会更好些),这里不一一列举(BTW:我认为看CSDN上的文章,最好把所有评论看完,因 为这对文章最好的补充)。

我的观点是,他们说的都是正确的,但这不能算是“软件开发的根本性质”。


先 来看leezy_2000兄的观点:首先这种划分四大要素的分法就非常的主观,因为每个人从不同的角度来看,都可能有不同的分法。比如三个要素:问题,解 题思路(借用toomore兄的说法)及实现----个人更倾向于这种看法。或者还有人能分出五个要素来。既然它不是不变的,又谈何“根本性质”?

另外,所谓“要素”即“必要的元素”,意味着它们中的任何一项都是不可或缺的,如果硬要说其中包含着所谓的“本质”,那么所有的部分都是同等重要的,这个“本质”必须包含所有的要素,何故厚此薄彼?

leezy_2000兄强调概念和逻辑是基于软件的质量属性:健壮性、可重用性、易扩充性、容错性(其实这就是健壮性)而言的。而事实上软件的质量属性远不止这几个,按《软件需求》第11 章中的说法可以分成两类:对用户最重要的属性和对开发者最重要的属性。而这两类分别包括:有效性,高效性,灵活性,完整性,互操作性,可靠性,健壮性,可 用性(以上为用户方面),可维护性,可移植性,可重用性,可测试性(以上为开发者方面)。而且就这些属性来说,很多也是互相制约的,只能是根据实际情况取 舍,并非如leezy_2000兄所言的,只要对“逻辑进行提炼和精化”就能达到。

至于软件可以用硬件替代,不过是证明软件中包含逻辑,并不能证明逻辑就是软件的本质,而且还恰恰证否了这一点:套用前面的哲学说法来说,它们就不能算是软件“区别于其它事务的基本特质”了。

不可否认现在重视工具与技巧有些过度,沉迷于技术细节固然不是一种好的做法,在这一点上,我很支持leezy_2000兄对林锐的书的看法,正如《老子· 五十七章》所说:“人多技巧,奇物滋起”。但我还是支持cppTrier兄的观点:不可矫枉过正(虽然leezy_2000兄在文中提到这不是他的目的, 但事实上他的文章却得到这样的效果),相当部分的初学者其实都很盲目,很容易从一个极端走向另一个极端。技巧仍然是一个必不可少的要素。而且从某种角度上 说,即使是像模式之类的也是一种技巧

johnnyxia兄和cppTrier兄的观点比较一致,也很有道理,而且从狭义上说,Thinking in Programming Language就是Coding的本质(考虑到概念的完整性,这个Programming Language其实还应该包括Platform,在具体开发时,即使同样是用C++语言,面对Windows和Linux下不同的API,这个 Thinking多少也是有些不同的),所有Coding的过程都有这个“根本性质”,因为Coding一定是在一个确定的平台下用一种确定的开发语言来 进行,“语言磨砺了我们思维的方式,也决定了我们思考的范围。”大师就是大师。

然而对于“软件开发”来说,这个“本质”还是不够根本。拿现在异军突起的MDA来说,MDA提出了PIM(Platform Independent Model)和PSM(Platform Specific Model)的概念,将设计过程分为两个阶段。Thinking in Programming Language只是PSM阶段的工作,至于PIM阶段,则是一个更高层次的抽象。所以说Tinking in Programming Language也不能说是“软件开发的根本性质”。

不过我非常赞成Coding即Design的观点,MDA的PSM即证明了这一点,设计PSM的过程其实就是对Coding的改进,在PSM的代码自动生 成技术实现后,PSM就成为软件的实现阶段了。Coding也是软件开发的重要组成部分,鄙视Coding的所谓项目经理才是最应该被鄙视的。


那么什么才是“软件开发的根本性质”?我来说说我的看法吧(奏乐),软件开发的根本性质就是:通过Coding解决问题!(怎么都晕倒了?)

废话,这的确是一句废话。因为这是谁都知道的事。

然而这也是一句实话,真理有时候就是这么朴素。

首先,有软件就有Code,即使是MDA被完美地实现了,PSM可以直接生成代码了,也还可以认为PSM是一种图形化的Code,就如同工业上PLC所用的编程语言----梯形图,就是一种典型的图形化Code。

其次,软件的目的就是解决问题,不能解决问题的软件根本就是废物。

前面说过,我们都是在盲人摸象,然而摸不出象并不表示象就不存在。对于软件开发的问题,在具体的观点上,各人有各人的看法,但仍然还是存在普遍真理的,这 就是邓公的经典论断“不管黑猫白猫,抓得到老鼠就是好猫”,不论是什么软件理论或技术,只要是对解决问题有益的,就是好东东。

所以不论是概念逻辑分析,还是Thinking in Programming Language,只要有助于你的软件开发工作,那你就应该采纳。从解决问题的角度上说,所以用于解决问题的方法都可以看作技巧,不论是Coding的技 巧,还是设计模式,OO,UML……对于解决不同的问题,它们肯定会有不同的侧重,没有哪个是绝对的重要,还是应该以一种平等的观点来看待这些要素的。过 于强调其中的某些方面实在有误导之嫌,必然导致别人陷入像pbzjh兄那样的困境。正如toomore兄所言:“手中有了一把榔头,看什么都是钉子”,这 样的人还是很多,片面地强调某些方面则必然导致他们放下这把榔头,拿起的不过是另一把榔头。所以我认为还是应该强调它们的重要性是同等的,要根据实际情况 处理,如toomore兄所说(BTW:toomore兄的例子都很经典啊):“我记得中央体育台的中国象棋节目的张强大师有一次讲到,高手下棋从来是根 据具体的局面情况来制订策略,而许多低手下棋总喜欢把棋走成某几种固定的形状而不顾具体局势如何。”

基于解决问题这一个目的,对于软件公司的招聘要求也就好理解了,因为他们要的是能够为他们解决具体问题的人,而不是一些只会空谈的人。我们做技术的常常容 易犯自以为是的毛病(我也一样),总认为那些开公司的什么都不懂,其实不懂的恰恰是我们,因为经营公司与开发软件是完全不同的两回事。作为公司来说,特别 是目前国内的这些小软件公司,最重要的是以最快的速度开发出为用户解决问题的软件,不管你有多么强的逻辑分析能力,如果没有实用的技巧,它是不可能等你去 慢慢学习的。至于大公司,如微软之类,它有足够的资源去培养人才,所以它对技巧并不重视。打个简单比方:一个普通的镖局招人,肯定是要有一定外家功夫的 人,至于像段誉未学六脉神剑时那样,即使他有很强的内功,镖局也不会要的,因为不能打;但对于大的武林门派来说,要收门徒的话,却一般会挑选有潜质的人, 而不在乎他能不能打。(BTW:就像从来没有哪个镖局能发展成为知名武林门派一样,我感觉国内现有的软件公司也不太可能在有限的时间里发展成为国际知名软 件公司)

如果一定要在软件开发的过程中找一个重点的话,我认为是“问题”。只有在正确地定义了问题以后,后面的解决思路和实现才有意义,如果是对一个问题作了错误 的定义,即使后面提出了正确的解决思路和实现,那也是对错误问题的解决。这也许就是为什么Karl.E.Weigers凭一本不到200页的薄薄小书《软件需求》而获JOLT大奖的原因。

我本来就是个狂妄的人,所以也就没有什么假装谦虚的客套话,大家有板砖就尽管扔过来吧。^_^