友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

软件工程实践者的思想(PDF格式)-第2部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!





(  “何苦而不平”) ,所以这不会是一个死循环。  

     

   在愚公的论述中,我们看到了编程的根本:顺序、 



分支和循环。庞大若“愚公移山”这样的工程,都是 



可以通过这样简单的编程来实现的。这,就是编程的 



精义了。  



                                      …8 


…………………………………………………………Page 13……………………………………………………………

                                         『大道至简』  



                                                 



2。  会或者不会写程序的问题  



    我经常会被人问到“(我) 能不能学会写程序”这样的 



问题。  



    这个问题由来以久。上溯七、八年,程序员还是少有 



人从事的职业。听说的人少,真正了解的人也不多。而当 



一个程序软件被装在电脑里并开始运行时,人们便开始惊 



讶于程序员的厉害。所以“能不能学会写程序”甚至成了 



一些人对自己的智力考评,所以便有人向我这样发问。  



    愚公都能明白的编程精义,那些向我发问的智叟们又 



怎么会不明白呢?  



      



                                            …9 


…………………………………………………………Page 14……………………………………………………………

第 1 章  编程的精义  



   所以除了先天智障或后天懒惰者,都是可以学会写程 



序的。如果你能确信,自己知道在早上起床后需要:  



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



   )  如果天热则可反之  



   )  日复一日直到死亡  



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



件成立:  



   )  如果有类似于生病、不能行动、以及意外的紧急 



      事件,则当日可以略过  



   那么你就可以开始向设计师发展。因为你已经具备了 



一项常人不具备的基本素质:折衷。  



3。  程序  =   算法  +   结构  



   编程作为一种行为,只需要知道其逻辑方法就可以 



了。所谓编程实际上是把一件事情交给计算机去做,你认 



为这件事该如何做,就用“程序语言”的形式描述给计算 



机。如果你原本就不明白如何去做,那么你也不要期望计 



算机去理解你想要做什么。  



   所以编程的第一要务是先把事情分析清楚,事件先后 



的逻辑关系和依赖关系搞清楚,然后再去代码实现。一接 



到任务就开始 Coding  的程序员,通常就是加班最多的程 



序员。  



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



     



   第一个完成关于编程本质的思考的人,提出了一个公 



                                  …10


…………………………………………………………Page 15……………………………………………………………

                                         『大道至简』  



式“程序  =   算法  +   结构”。这个公式的精彩之处,在于 



它没有任何的地方提及到 Code 。甚至可以说,在这个公 



式里,代码是不存在的。  



    存在的只是思想。  



      



    算法是对一个程序的逻辑实现的描述,而结构是逻辑 



实现所依附的数据实体。只要开发人员将这个程序的算法 



设计出来了,把结构描述出来了,那么程序就已经定型了。 



剩下的事,简而言之,就是劳力活。  



                                               

      



    在计算机专业所学的课程中,同时讲述算法和结构 



的,是“数据结构”。现在,你放下手边这本书,再去读 



读被你扔到不知哪个角落的《数据结构》,你仔细看看, 



在所有的算法描述中,有且仅有三种执行逻辑:顺序、分 



支和循环。简单若顺序表,复杂如树、图,它们的算法都 



是用上面这三种执行逻辑来描述的。  



                                            …11


…………………………………………………………Page 16……………………………………………………………

第 1 章  编程的精义  



4。  语言  



   当你熟悉了一门语言之后,你会发现,编程语言只有 



喜欢与不喜欢的问题,没有会不会的问题。任何的一门语 



言,你都可以在两周内掌握并开始熟练编程。因为任何的 



一门语言,他们的底层函数库都是那么的相似,而他们 



API 都是那样的依赖于操作系统。A 语言里有的,B 语言 



里也基本都有。  



   通常而言,语言的差别主要表现在适用范围上。一些 



语言适合做数值处理,小数点后可以精确到原子级,而小 



数点前则可以表达到宇宙之无穷;另一些语言则适合做图 



形处理,它的底层函数库比其它语言可以快上十倍或数十 



倍;还有一些语言则适合于做网页,要用它来做一个通讯 



薄软件都将是史无前人的挑战。  



   成天讨论这门语言好,或者那门语言坏的人,甚至是 



可悲的。不但是悲其一叶障目,更要悲叹于那种大愚若智 



的自得心态。  



5。  在没有工程的时代  



   在没有工程的时代,上面所说的就是一个程序员的全 



部。他们掌握了一门语言,懂得了一些生活中最常见的逻 



辑,他们用程序的方式思考和学习了一些算法,并根据前 



人的经验,把这些算法跑在了一些数据结构之上,最后, 



                              …12


…………………………………………………………Page 17……………………………………………………………

                                         『大道至简』  



我们就看到了他们写的程序。  



    在没有工程的时代,出现了非常非常多的人物。其中 



算法大师,有游戏大师,有语言大师,有挣钱的大师……  



    唯独,没有工程大师。嗯,可以理解嘛,那是没有工 



程的时代。好蛮荒,好远古的。  



     



                                            …13


…………………………………………………………Page 18……………………………………………………………

                         



     第2章  是懒人造就了方法  



    “ 道有蜀王兵      ,亦有神作大滩江中。其崖崭峻不 

     僰         蘭 



可破,(冰)乃积薪烧之。”  



                             ——《华阳国志》  



1。  是懒人造就了方法  



    战国时期的李冰凿了一座山。  



   史记中说是“蜀守冰凿离堆”,是说李冰在成都的时 



候凿出了离堆。一说是李冰将都江堰附近的玉垒山凿了一 



个大口子,叫宝瓶口,而凿的石头就堆成了离堆。另一说, 



则是李的确是凿了一座“(溷) 崖”,但是是在沫水,亦即 



是今天的大渡河。  



   在哪里凿的山,是史学家都说不清楚的事。但的确凿 



了一座山,而且方法是“( 因)其崖崭峻不可破,(冰)乃积 



薪烧之”。  



   我们已经看到事物的进化了。同是战国时代,《列 



子·汤问篇》里的愚公就要“碎石击壤”,而李冰就已经 



懂得“积薪烧之”了。  



   会有人说愚公是“碎石”,并没有说他“碎石”的方 



法究竟是“斧钺以凿之”,还是“积薪以烧之”。但想想那 



个时代,如果有人懂得了烧石头这个方法,哪能不立即载 



     

                                      …14


…………………………………………………………Page 19……………………………………………………………

                                 『大道至简』  



文志之,永世传承。  



   再说了,愚公嘛。愚者怎么会呢?这还需要分析吗? 



需要吗?  



     



   所以愚公会凿,而李冰会烧。那李冰又是为什么会用 



 “烧”这种方法来碎石的呢?如果李冰也象愚公那样日复 



一日地督促着他的团队凿石开山,那他一定没有时间来学 



习、寻找或者观察,当然也不会发现“烧”这种方法可以 



加快工程进度,使得一大座山短时间就被哗啦哗啦地给 



 “碎”掉了。  



   要知道李冰的团队可是成百上千人,要修堰筑坝,还 



要“凿离堆”,当然还要吃喝啦撒睡。所以李冰如果忙起 



来的话,他必然是“受命以来,夙夜忧叹”,必然食难下 



咽,睡无安枕。反之,李冰一定是个闲人,可以闲到没事 



去看火能不能把石头烧爆。  



   这么大个工程里,如果有一个人会闲到看火烧石头, 



那他一定很懒。那么多事堆着不去做,去看烧石头,你说 



他不是懒是什么。  



     



   正是一个懒人造就了“烧石头”这个“碎石”的方法。 



愚公太勤快了,勤快得今天可以比昨天多凿一倍的石头。 



或者在愚公的项目计划案的首页里就写着朱笔大字:“吾 



今胜昨倍许,明胜今倍许,而山不加增,何苦而不快。” 



但是越发的勤快,愚公将越发没有机会找到更快的方法,  



   人的精力终归是有极限的。提出新的“方法”,解决 



                                   …15


…………………………………………………………Page 20……………………………………………………………

第 2 章  是懒人造就了方法  



的将是影响做事成效的根本问题。而愚公可以多吃点饭, 



多加点班,但突破不了人的精力的极限。  



                                                

      



    记住,在两千年前的某一天,闲极无聊的李冰下厨给 



夫人炒了一个小菜,他突然发现垒灶的鹅卵石被烧得爆裂 



开来,遇水尤甚。从此《史记》上记下了“蜀守冰凿离堆”, 



而《华阳国志》上记下了他做这件事的方法“积薪烧之”。  



    在差不多同一时间,愚公在山北之塞“碎石击壤”。  



2。  一百万行代码是可以写在一个文件里的  



    早期写程序,都是将代码打在穿孔纸带上,让计算机 



去读的。要让计算机读的纸带当然是连续的,这无需多讲。 



其实我也没有那样写过程序,真实的苦楚我也不知道。  



                                           …16


…………………………………………………………Page 21……………………………………………………………

                                『大道至简』  



   后来有了汇编语言,可以写一些代码了。这时的代码 



是写在文本文件里,然后交给一个编译器去编译,再由一 



个链接器去链接,这样就出来了程序。  



   第一个写汇编的人,可能写的是有名的“Hello World ” 



程序,那个程序写在一个文件里就行了。所以后来就成了 



习惯,大家都把代码写到一个文件里。早期的汇编语言里, 



GOTO 语句是用得非常非常频繁的,将一个语句 GOTO 



到另一个文本文件里去,既不现实也不方便。所以大家习 



以为常,便统统地把代码写到一个文件里。  



   再后来出了高级语言,什么 C  呀,Pascal  呀之类的。 



既然大家已经形成习惯了,所以很自然地会把一个程序写 



到一个文件里。无论这个程序有多大,多少行代码,写到 



一个文件里多方便呀。  



   直到如今语言发展得更高级了。可是程序员的习惯还 



是难改,一旦得了机会,还是喜欢把代码写到一个文件里 



的。  



     



   好了,有人说我是想当然尔。En ,这当然是有实据的。 



记得 Delphi 1。0 版发布的时候,全世界一片叫好声。连“不 



支持双字节”这样的大问题,都不影响他在华语地区的推 



广。然而不久,爆出了一个大 BUG !什么大 BUG          呢? 



Delphi 1。0  的编译器居然不支持超过 64K  的源代码文件!  



   这被 Fans  们一通好骂。直到我用 Delphi  2。0  时,一 



个从 VB  阵营转过来的程序员还跑过来问我这件事。好在 



Delphi 2。0  改了这个 BUG ,这让当时我的面子上好一阵风 



                                   …17


…………………………………………………………Page 22……………………………………………………………

第 2 章  是懒人造就了方法  



光。  



      



    64k  的文件是什么概念呢?  



    1 行代码大概(平均)是 30 字节,64k  的源代码是 2184 



行,如果代码风格好一点,再多一些空行的话,差不多也 



就是 3000 行上下。  



    也就是说,在 Delphi  1  的时代( 以及其后的很多很多 



时代) ,程序员把 3000 行代码写到一个文件里,是司空见 



惯的事了。如果你不让他这样写,还是会被痛骂的呢。  



      



    所以呢,按照这一部分人的逻辑,一百万行代码其实 



是可以写在一个文件里的。不单可以,而且编译器、编辑 



器等等也都必须要支持。这才是正统的软件开发。  



      



    勤快的愚公创造不了方法。这我已经说过了。对于要 



把“一百万行代码写到一个文件”,查找一个函数要在编 



辑器里按五千次 PageDown/PageUp           键的勤快人来说,是 



不能指望他们创造出“单元文件(Unit) ”这样的开发方法 



来的。  



      



    然而单元文件毕竟还是出现了。这个世界上,有勤快 



人就必然有懒人,有懒人也就必然有懒人的懒方法。  



      



    有了单元文件,也就很快出现了一个新的概念:模块。 



把一个大模块分成小模块,再把小模块分成更细的小小模 



块,一个模块对应于一个单元。于是我们可以开始分工作 



                                               …18


…………………………………………………………Page 23……………………………………………………………

                                         『大道至简』  



了,一部分人写这几个单元的代码,另一部分则写那几个。  



      



    很好,终于可以让源代码分散开来。结构化编程的时 



代终于开始了,新的方法取代了旧的方法,而这一切的功 



劳,是要归终于那个在按第 5001 次PageDown键时,突然 



崩溃的程序师。他发自良心地说:不能让这一切继续下去 



了,我一定要把下一行代码写到第二个文件里去。我发誓, 

我要在编译器里加入一个Unit 关键字。① 



3。  你桌上的书是乱的吗?  



    几周之前,在一所电脑培训学校与学生座谈时,一个 



学员问我:“为什么我学了一年的编程,却还是不知道怎 



么写程序呢”。  



    我想了想,问了这个学员一个问题:“你桌上的书是 



乱的吗?”  



    他迟疑了一下,不过还是回答我道:“比较整齐。”  



    我当时便反问他:“你既然知道如何把书分类、归整 



得整整齐齐地放在书桌,那怎么没想过如何把所学的知道 



分类一下,归纳一下,整整齐齐地放在脑子里呢?”  



      



    如果一个人学了一年的编程,他的脑袋里还是昏乎乎 



的,不知道从哪里开始,也不知道如何做程序。那想来只 



                           

                                                        

① Turbo Pascal 3。0  中才开始有了Uses 和Unit 关键字。在ANSI Pascal 



标准里并没有它。  



                                            …19


…………………………………………………………Page 24……………………………………………………………

第 2 章  是懒人造就了方法  



有一个原因:他学了,也把知识学进去了,就是不知道这 



些知识是干什么的。或者说,他不知道各种知识都可以用 



来做什么。  



      



    其实结构化编程的基本单位是“过程(Procedure) ”, 



而不是上一小节说到的“单元(Unit) ”。然而在我看来,过 



程及其调用是 CPU  指令集所提供的执行逻辑,而不是普 



通的开发人员在编程实践中所总结和创生的“方法”。  



    这里要提及到CPU指令集的产生。产生最初的指令集 



的方式我已经不可考证,我所知道的是CISC 指令集与 



RISC 指令集之争在 1979 年终于爆发。前者被称为复杂指 



令集,然而经过Patterson 等科学家的研究,发现 80% 的 



CISC指令只有在 20% 的时间内才会用到;更进一步的研 



究发现,在最常用的 10 条指令中,包含的流程控制只有 

 “条件分支(IF。。。THEN。。。)① ”、“跳转(JUMP) ”  和“调用返 



回(CALL/RET) ”……  



    于是 CISC 被 RISC(精简指令集计算机) 替代了。动摇 



CISC 指令集地位的方法,就是分类统计。  



      



    正如 CISC    指令集搅乱了一代程序设计师的思路一 



样,大量的知识和资讯搅乱了上面给我提问的那位学员的 



思想。他应该尝试一下分类,把既有的知识象桌子上的书 



一样整理一下,最常用的放在手边,而最不常用的放在书 



                           

                                                        

①   在x86  系统中,循环是用条件分支来实现的,而且条件分支指令 



并不是IF。。。THEN。。。 ,这里用这两个关键字,仅用于说明问题。  



                                             …20


…………………………………………………………Page 25……………………………………………………………

                                        『大道至简』  



柜里。如果这样的话,我想他已经在九个月前就开始写第 



一个软件产品了。  



      



    你桌上的书还是乱的吗?  



4。  我的第一次思考:程序  =   算法  +   结构  +   方法  



    我的第一次关于程序的本质的思考其实发生在不久 



前。那是我在 OICQ 上与 Soul  的一次谈话。  



    Soul(王昊)是DelphiBBS现任的总版主,是我很敬重的 



一位程序员。那时我们正在做DelphiBBS 的一个“B 计划 



II ”,也就是出第二本书。他当时在写一篇有关“面向对 



象(OOP) ”的文章。而我正在写《Delphi源代码分析》,在 



初期的版本里,有“面向对象”这一部分的内容。我们的 



            ① 

对话摘要如下  :  



Soul:我在写书讨论“面向对象的局限性”  

我  :En。这个倒与我的意见一致。哈哈哈。   

我  :“绝对可以用面向过程的方法来实现任意复杂的系统。要知道,航 

     天飞机也是在面向过程的时代上的天。但是,为了使一切变得不是 

     那么复杂,还是出现了‘面向对象程序设计’的方法。”  

我  :——哈,我那本书里,在“面向对象”一部分前的引文中。就是这 

     样写的。   

  



                                                         

①   这段对话的确很长。如果你不是非常有经验的程序员,那么不 



能完整地阅读和理解这段文字是很正常的。部分读者甚至可以跳 

过这段引文,直接阅读后面的结论。而有兴趣的读者,可�
返回目录 上一页 下一页 回到顶部 赞(9) 踩(9)
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!