正文

[编程思想]大道至简--编程的精义(强烈推荐) 2006-08-09 23:47:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/fengfei/17428.html

分享到:

                                大道至简 
                                                                   ——软件工程实践者的思想 
 
                                       周爱民(Aimingoo) 著

                                                  序 
 
             2004年 11月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技术界就是需要有真正实践经验的专家把他的思考和心得与我们分享。Aimingoo 在 Delphi 领域颇有名气,其技术钻研的深度直达系统核心层,从其著作《Delphi 源代码分析》可见一斑。不过接下来第二反应就是太薄了,能不能加厚啊。比如说这些感悟都是有其来源的,可以把实际案例啊,背景故事啊都加上。不然太薄了,出版社没有办法出版啊。——国家对于出版的书号是有严格控制的,所以书号是有成本的。一本讲技术高端的图书销量肯定是有限的,以现实情况而言,如果很薄定价就只能比较低,成本无法回收。而且内容只是心得,没有案例,读起来也很硬,对读者的要求也很高,销量可能就更少了。 


             爱民听完我的意见,还是坚持这本书就是这样的风格。出厚书违背了他的本意,要不然怎么叫“大道至简”。

             书稿在 2005 年 3 月杀青后,我从 7 月开始在《程序员》上陆续选择其中的三章发表,看看读者的反馈。不过限于篇幅,删掉了一些内容,不能完整体现出作者系统思考的脉络,也比较遗憾。 


             2005 年 11 月爱民跟我讨论到即使没有出版社愿意出版印刷,也要把他的作品用电子版问世,并邀我作序。我十分感慨,在这个浮躁功利的社会,难得还有这样的朋友。 


            现在,我又仔细从头到尾读了一遍。很多作者写书是为厚而厚,大部分内容都是水分,作者原创经验精华只有很少,甚至没有。而这本书是作者从事十年开发工作的总结,虽然不厚,却闪烁着独立思考的光芒。

          世界“虽变化万端,而理为一贯。”作者在软件开发一线浸淫近十年,回头思考何为开发的本源?这些理论、方法的本质为何?粗粗一看,这些道理稀松平常,专家教授无数著作早就谈过,还用作者来写吗?其实不然,理论都是从实践而来,但我们学习软件开发的时候,是先掌握这些专家总结的果实,而不是探求本源,所谓“知其然而不知其所以然”。这些道理看似都知道,但却没有真正体会上身,在实践中最重要的去应用这些道理,而不是方法。 大多数人看书都希望学到一些招数、方法,能尽快在工作中用上,这是不错。但要想真正达到更高境界,就必须明白背后的道理。真正的专家是从根上解决问题的,所以大物理学家杨振宁在北京大学针对本科生讲物理学,讲得深入浅出,大受欢迎,就是因为杨先生可以从历史本源来剖析物理定律公式。


             只有招数,不明道理,碰到变化的情况,就束手无策了。而在软件开发中,每个团队、每个项目都不是尽然相同的。明白道理,才能知变通之道。

             这本小书不是一本教你项目管理,软件工程或者编程技巧的书籍,他是一本闪烁思考光芒的技术散文集,我衷心祝愿这本书的读者,能把这本书当作一位朋友的思考,一位朋友的总结,来参照自身,这样就会有收获,有想法了。

           我也和爱民建议,这本书的很多主题还可以展开,无论是批评,还是讨论,只要有兴趣的朋友,可以给爱民,我或者《程序员》杂志社写信,我们诚恳邀请各位来共同思考,共同把实践经验与大家分享,这样意义也就更大了。 期望大家的参与,谢谢。
 
                                                                                      蒋涛
                                                                               2005.11月
                                                                         
jiangtao@csdn.net
 
 
注:关于书的序的讨论,参见附录之一。

 

                                电子版发布前言
 
             我终于决定发布这本书的电子版了。


             完成这本书的时候,我已经在这个行业里做了十年了。这十年来,我对自己的经历做过两次回顾。第一次是关于技术的,这造就了那本《Delphi 源代码分析》,是讨论开发的技术和方法细节的。第二次就催生了这本《大道至简》,讨论的则是工程、管理中的思想。


            我其实是很希望这本书能放在读者的书架案头,而不是放在电脑的某一个目录中。因为它应当是一本可以阅读和品味的书,而不是在电脑中备查的技术资料。


            然而,我在决定担任这家公司的软件架构师的同时,我就意识到,我没有足够的精力来运作这本书。——我的意思是如果要把他做成纸质的书的话,我没有足够的精力。

            出版商是要寻求利润的。——于此,我一早就知道。但我从来不知道:到底一本书簿一点或者厚一点,哪个会让出版商更有利润。


             我只想写一本“阐明软件工程的思想核心”的书。这本书要很容易就读明白,还要很容易就想通,还要很容易就知道:工程其实很简单,只是大家把它做复杂了。

             然而问题是:我把它写得太简单了,以至于只写了110 页,就没有必要再写下去了。


             我当然可以把一本书写得很复杂,或者很厚。这很容易,就如做 Coder 一样:把代码写烂或者写乱都很容易,要想写得简洁却远非易事。 


             代码写得太简洁,老板会认为你在偷懒;书写得太薄,出版社就不愿意出。我看来是忘掉了侯捷先生说过的“买书如买纸”,以书的厚薄来论价值的故事。


             忘掉了就忘掉吧。好的一面是现在书变成了电子版,大家终于可以读到它了。不好的呢?我想大概不要钱的东西很难得到珍视吧:如果下载这本书只是因为收集,而不是阅读,那会是让我感到比讨论“买书如买纸”这样的事更为难过的。


             好吧。希望你能象对待纸质书籍那样来阅读这本《大道至简》。放心,我并不介意你把它打印出来放在床头。

补充声明:我保留在传统媒体(书籍、杂志)上刊载、
出版本书的权利。但允许任何人在网络上非商业性地、自
由地、不加修改地传播这本书的电子版本。
 
 
                                              周爱民 2005年10月14日
                                               
http://www.doany.net/
                                                mailto:aim@263.net

 

                                          目录
 
1. 编程的精义
1.  编程的精义
2.  会或者不会写程序
3.  程序 =  算法 +  结构
4.  语言 
5.  在没有工程的时代
 
 
2. 是懒人造就了方法
1.  是懒人造就了方法
2.  一百万行代码是可以写在一个文件里的
3.  你桌上的书是乱的吗
4.  我的第一次思考:程序=算法+结构+方法

3. 团队缺乏的不只是管理
1.  三个人的团队
2.  做项目 =  死亡游戏 ?
3.  做 ISO 质量体系的教训
4.  谁动摇了你的制度?
5.  “那我们就开始开发吧”
6.  组织的学问:角色
7.  跟随蚂蚁。但不要栽进蚂蚁洞里。42
8.  “什么是增值税发票?”

4. 流于形式的沟通
1.  客户不会用 C,难道就会用 UML 吗?
2.  项目文档真的可以用甲骨文来写
3.  最简沟通
4.  为不存在的角色留下沟通的渠道
5.  流于形式的沟通  
 
5. 失败的过程也是过程
1.  做过程不是做工程
2.  做过场
3.  实现,才是目的 
4.  过程不是死模型 
5.  “刻鹄类鹜”与“画虎类狗” 
6.  工程不是做的,是组织的

6. 从编程到工程
1.  语言只是工具
2.  程序 
3.  方法 
4.  过程
5.  工程 
6.  组织 
7.  BOSS
8.  上帝之手

7. 现实中的软件工程
1.  大公司手中的算盘
2.  回到工程的关键点
3.  思考项目成本的经理
4.  审视 AOP 
5.  审视 MDA 
 
8. 是思考还是思想
1.  软件工程三个要素的价值
2.  其实 RUP 是一个杂物箱
3.  UML 与甲骨文之间的异同 
4.  经营者离开发者很远,反之亦然
5.  矛盾:实现目标与保障质量
6.  枝节与细节 
7.  灵活的软件工程

 

                                     第1章  编程的精义
 
          “虽我之死,有子存焉;子又生孙,孙又生子;子又有子,子又有孙。子子孙孙,无穷匮也。而山不加增,何苦而不平?”
                                                          ——《愚公移山》,《列子·汤问篇》 
 
1.  编程的精义
           仅仅就编程序来说,实在是一件很简单的事,甚至可以说是一件劳力活。两千年前的寓言中,已经成就了一位工程名家:愚公。在这位名家的身上,浓缩了项目组织者、团队经理、编程人员、技术分析师等众多角色的优秀素质。他的出现,远远早于计算机发展
的历史,甚至早于一些西方国家的文明史。

            汤问篇中所述的愚公移山这一事件,我们看到了原始需求的产生:
           “惩山北之塞,出入之迂”
            我们也看到了项目沟通的基本方式:
           “聚室而谋曰”
             然后,我们看到愚公确定了一个项目的目标:

            “毕力平险,指通豫南,达于汉阴”
             并通过研讨,择定了一个井然有序的、可以实现的技术方案: 
            “扣石垦壤,箕畚运于渤海之尾”
 
             在这个项目中,动用了三名技术人员和一名工程管理人员:
            “(愚公)率子孙荷担者三夫” 
             并获得了一名力量较弱,但满富工作激情的外协: 
            “邻人京城氏之孀妻,有遗男,始龀,跳往助之”
 
             基本上,这已经描述了“愚公移山”整个工程的概况。接下来,我们应该注意到愚公作为编程人员的基本素质。在与“河曲智叟”的对答中,他叙述了整个工程的实现程序:
            “虽我之死,有子存焉”,这里描述了可能存在的分支结构,即“IF”条件判断。

            “子又生孙,孙又生子;??子子孙孙,无穷匮也”这里描述了完成这个工程所必须的循环结构。 作为优秀的程序分析师,愚公论述了这个循环的可行性:由于“山不加增”,所以条件“山平”必将成立(“何苦而不平”),所以这不会是一个死循环。
 
           在愚公的论述中,我们看到了编程的根本:顺序、分支和循环。庞大若“愚公移山”这样的工程,都是可以通过这样简单的编程来实现的。这,就是编程的精义了。

2.  会或者不会写程序的问题
             我经常会被人问到“(我)能不能学会写程序”这样的问题。 


             这个问题由来以久。上溯七、八年,程序员还是少有人从事的职业。听说的人少,真正了解的人也不多。而当一个程序软件被装在电脑里并开始运行时,人们便开始惊讶于程序员的厉害。所以“能不能学会写程序”甚至成了一些人对自己的智力考评,所以便有人向我这样发问。 愚公都能明白的编程精义,那些向我发问的智叟们又怎么会不明白呢?

             所以除了先天智障或后天懒惰者,都是可以学会写程序的。如果你能确信,自己知道在早上起床后需要:  

            如果天冷则先穿衣服后洗漱  

            如果天热则可反之  

            日复一日直到死亡


            那么你就可以开始编程了。甚至,如果你认为以下条件成立:  

             如果有类似于生病、不能行动、以及意外的紧急事件,则当日可以略过


             那么你就可以开始向设计师发展。因为你已经具备了一项常人不具备的基本素质:折衷。

3.  程序 =  算法 +  结构
             编程作为一种行为,只需要知道其逻辑方法就可以了。所谓编程实际上是把一件事情交给计算机去做,你认为这件事该如何做,就用“程序语言”的形式描述给计算机。如果你原本就不明白如何去做,那么你也不要期望计算机去理解你想要做什么。

 
             所以编程的第一要务是先把事情分析清楚,事件先后的逻辑关系和依赖关系搞清楚,然后再去代码实现。一接到任务就开始 Coding 的程序员,通常就是加班最多的程序员。 


             记住:积极工作和勤于思考都要占时间。

             第一个完成关于编程本质的思考的人,提出了一个公式“程序 =  算法 +  构”。这个公式的精彩之处,在于它没有任何的地方提及到 Code。甚至可以说,在这个公式里,代码是不存在的。 


             存在的只是思想。

             算法是对一个程序的逻辑实现的描述,而结构是逻辑实现所依附的数据实体。只要开发人员将这个程序的算法设计出来了,把结构描述出来了,那么程序就已经定型了。
剩下的事,简而言之,就是劳力活。

             在计算机专业所学的课程中,同时讲述算法和结构的,是“数据结构”。现在,你放下手边这本书,再去读读被你扔到不知哪个角落的《数据结构》,你仔细看看,在所有的算法描述中,有且仅有三种执行逻辑:顺序、分支和循环。简单若顺序表,复杂如树、图,它们的算法都是用上面这三种执行逻辑来描述的。

4.  语言
             当你熟悉了一门语言之后,你会发现,编程语言只有喜欢与不喜欢的问题,没有会不会的问题。任何的一门语言,你都可以在两周内掌握并开始熟练编程。因为任何的一门语言,他们的底层函数库都是那么的相似,而他们API 都是那样的依赖于操作系统。A 语言里有的,B 语言里也基本都有。


             通常而言,语言的差别主要表现在适用范围上。一些语言适合做数值处理,小数点后可以精确到原子级,而小数点前则可以表达到宇宙之无穷;另一些语言则适合做图形处理,它的底层函数库比其它语言可以快上十倍或数十倍;还有一些语言则适合于做网页,要用它来做一个通讯薄软件都将是史无前人的挑战。


              成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的。不但是悲其一叶障目,更要悲叹于那种大愚若智的自得心态。

5.  在没有工程的时代
              在没有工程的时代,上面所说的就是一个程序员的全部。他们掌握了一门语言,懂得了一些生活中最常见的逻辑,他们用程序的方式思考和学习了一些算法,并根据前人的经验,把这些算法跑在了一些数据结构之上,最后,我们就看到了他们写的程序。

              在没有工程的时代,出现了非常非常多的人物。其中算法大师,有游戏大师,有语言大师,有挣钱的大师?? 唯独,没有工程大师。嗯,可以理解嘛,那是没有工程的时代。好蛮荒,好远古的。

                                             

阅读(3918) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册