大道至简:软件工程实践者的思想(典藏版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-30 06:00:07

点击下载

作者:周爱民

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

大道至简:软件工程实践者的思想(典藏版)

大道至简:软件工程实践者的思想(典藏版)试读:

大道至简

——软件工程实践者的思想:典藏版

CIP号:第178074号

ISBN:978-7-121-17790-3

中图分类:TP311.5

关键词:软件工程-研究

北京,2012/08,电子工业出版社

版次:1

印次:1

价格:49.00

印数:4000册

印张:14.25

字数:300

开本:787×980 1/16

语种:中文摘要

本书提出了审视软件工程的全新视角和软件工程的体系模型(EHM,软件工程层状模型)。本书用非工程的方式重新解析软件工程现象,全面、细致而深刻地分析了工程中各个环节的由来、价值及其内在关系。综合论述开发、工程二者的现状,例如对程序员“工匠思想”的起源进行广征博引的分析,也对工程中“敏捷过程”的经验主义本质进行深至髓质的论证。全书语言轻快,可读性强,薄且有味。

本书是在“思想方法学”这一软件工程尚未涉足过的领域中的实习之作。作者亲历国内软件工程的英雄时代、泡沫时代,从失败中醒觉而创建独特的思考方法,对软件开发、工程中的现状深刻反思,从而完成这本专著。在缺乏独立思维、对国外工程理论亦步亦趋的国内工程界、开发业界,该书无疑是一份激荡新思的佳作。本书是第一本讨论软件工程思想本源的书籍,也是第一本从工程实践出发溯源而论的佳作。

本典藏版在内容上以该书第二版为底本并进行了大量的文字修订,补充追加了第三版中的“具体工程”一章。并且,考虑到典藏的价值,本书收录了公开文档“幕后故事”的精华摘选。周爱民 著付睿 责任编辑张春雨 其他贡献者李玲 封面设计对第二版的赞扬

最关键的还是思想和观念上的一些改变。

石头,http://blog.csdn.net/pizzq

立刻就被这本书深深地吸引住了,好几次在车上看得入迷了差点错过下车。

大P,http://blog.csdn.net/planeboy

一口气通读下来后,能够留在我短时记忆十分糟糕的大脑里的就只剩下:语言只是工具、boss是“经营者”,以及软件工程中作者的一些感悟。

wangwei,http://blog.wwtyler.com/

我们的名词太多了。其实我感觉最好的方法论,是《大道至简》,本来就是简单的道理何必复杂化?软件开发工程师就是把复杂的东西简单化。否则只能叫技术员。

蓝叶菱,http://hi.baidu.com/westsky

作者是程序员出身,是真正的软件工程实践者,这本书确实是一个有真正经验的人的总结。(这)在书中还是有不少体现的——这是我真实的感受!

Suilj,from http://hi.chinaunix.net/

又这么一口气看完了这本书,两三个小时对着电脑,哈哈,乐在其中。

高峰,http://blog.csdn.net/gaofen115

虽然是一本探讨软件工程方面的书,但包含其中的思维方法和道理,其实对其他许多情况也都是适合的。

RealTwo,http://hi.baidu.com/the3eye

真的将软件工程分析得很透,这本书你能够看到很多以前你学到的东西的缩影。他用生动形象的语言和插图给了一个诠释。(软件工程层状模型的)每一部分都是经典独到的。如果你细细品味,可以学到很多属于你的管理与设计的技巧。

http://suifengfeiyang1697.blog.hexun.com/

还没有读完一遍,我就已经有读第二遍的想法了!!!

雷伟波,http://hi.baidu.com/

本想随意翻翻,但看完第一章就忍不住看完了。

王德水,http://www.cnblogs.com/cnblogsfans

一本值得一看的好书,里面都是周爱民多年来对软件工程实践的思想,值得我们去阅读,去思考。

http://www.cnblogs.com/TV9

很精简的一本书,就一百多页,但是里面诠释的东西却是软件工程的一些精髓。

http://blog.sina.com.cn/extinct

不断逼迫你去思考,从自己的亲身经历和愚公移山这个人所尽知的经典故事出发帮助你去思考。

陈瑞江,http://blog.csdn.net/rjchen

一本能让我有读第二遍的冲动的少有的书。读起来好像在聊天,将以往工作中的问题、疑惑摆出来,讲清楚,化解掉。将市面上充斥着的各种理论、方法加以梳理。

http://blog.sina.com.cn/zmoka对第一版的赞扬(摘选)

国人对软件工程的深刻经验,薄且有味。

肇宇,http://zychen.blogbus.com/

清楚地阐述了软件工程的关键问题,绝对不像那些教科书一般说教。

Sqlxx,from http://www.yoese.net/

以独特的视角洞悉软件工程的精髓。

云海天潮,http://xmxsuperstar.spaces.live.com/

不做工具的奴隶,而做思想的主人。

狂奔的蜗牛,http://yubin530.bokee.com/

虽然有很多个人色彩在里面,……但这种思想让我受益匪浅。

Fireice,http://borland.mblogger.cn/fireice

喜欢这种写作的风格,以及短小的篇幅。

云风,http://www.codingnow.com/

愿朋友们也能从中感悟些什么。

LwT,http://zyonghua.spaces.live.com/停下来,思考才是进步的本质

我个人的工作是非常忙碌和繁杂的,由于Borland/CodeGear同时拥有Win32、.NET 和Java的产品和开发工具,因此我必须了解这三个平台的知识和技术——更不用说软件工程了。因为Borland/CodeGear近几年来除了有Together这个产品之外,Borland/CodeGear内部的许多R&D团队也开始使用敏捷开发(Agile Development)的软件工程来研发新产品,尤其是,Borland/CodeGear 拥有目前.NET和Java平台上最先进的MAD/DDA技术和产品了。

因此我必须阅读大量的技术书籍,每天在Internet 上不断地补充新知,以应付工作上的需要。长期的积累,虽然让我学习了许多技术,但是真正让我不断超越昨日自我的因素,并不光是这些单点的技术,而是多参考业界大师级人物的思想,以及更实际地看看我们同侪的思考,更重要的是,不时地停下来融合思考的结果。以前我非常享受在工作时与李匡正先生、苏国钧先生以及我的其他好友共同讨论的时光,盖因在这些好友的谈话和思想中,蕴藏了他们丰富的知识和智慧的精华,让我受益良多。

爱民是我大陆的好友,年轻有活力。每次我到大陆,如果有时间和他见面,他总是有许多话和我谈论。爱民和我还有一个共同点,那就是我们俩都是技术书籍的作者,这让我更进一步认识到在我了解的技术书籍作者中,爱民是一位非常有实力的佼佼者。

由于工作的关系我认识了爱民,也让我有机会能亲自聆听他的一些想法、经验和智慧的结晶,因此我非常幸运地能够借由这个机缘不断地成长和进步。如果您不像我这么幸运,能够因成为爱民的好友而获益良多,现在您可以借由阅读爱民的新作《大道至简》来撷取他的思想精华。适时地停下来,参考优秀软件人才的想法,搭配我们学习的各种技术,最后再加入自己融合思考的结果,您将会体验到从未有过的成就感。如果您还不知道这个成功秘诀的话,那么不妨就从《大道至简》开始吧。

李 维

2007年1月

李维

Embarcadero大中华区技术总监

乔治亚工学院信息研究所毕业,拥有超过20年的丰富系统开发经验,熟悉CodeGear的各种RAD开发工具,例如Delphi、C Builder、Delphi Prism和JBuilder等。此外,李维先生先后任职于鼎新计算机及康大信息等公司,使用Informix、MS SQL Server和Oracle等大型数据库,熟悉数据模型(Data Model)和应用系统。李维先生为知名计算机技术作家及专业技术研讨会讲师,其所撰写的技术文章有超过100篇被广泛地刊登在RUN!PC、CSDN等著名的计算机杂志中,而所著作书籍之中有多本中文Delphi/C++Builder作品是最被津津乐道的,并最为大中华区开发人员熟知的。李维先生对于云端运算有丰富的见解,日前于台湾、泰国、新加坡、马来西亚举办过多场“云端策略和解决方案”研讨会。第四版前言

不要急

我是天生的急脾气。据父母说,我曾经与哥哥各分得一桃,便见我一口、两口,未等到第三口咬实在,桃就已经全下了肚。然后便眼巴巴地看着哥哥吃得欢乐,而我却连桃的滋味都不太知道。

不知道我的父母是不是拿了《西游记》中的故事来哄我,但若以我小时候的性急,确实可以做到“桃味不知”。以至于到了后来,等到我十多岁的时候,渐渐懂事了,便在自己的书房写了一幅字:默然心自澄,谦逊品渐高。

个中还有许多缘由,但终归是渐渐地安静了下来。

安静下来了,便有了机会来反思一下。若是总急于去解释什么、争辩什么,那么眼里便只见别人的弊端,耳中便只有别人的错漏,因而也就总是很难回头来看看自己。

可能那个自己,正立在田间地头指指戳戳,出言絮絮状若村妇。

读书

在我看来,反思既不是设问,也不是反问,更不是某种思维法(例如逆向思维),它只意味着对一个目标的持续关注。

读书与写书,是我持续关注的一个目标。

然而就读书来说,我读得不多。我习惯大量地收集与归目,这一方面是为了查阅的方便,另一方面,当遇到某些问题或思考倾向了某个话题,我总是能及时地知道“找某类书来翻翻”。收集这些书的目的,原本也无过于此。

但我总归还是读些书的。我读书很细、很慢,常在空白处写写画画,甚不爱惜。读书如食,贪而成嗜,这种读法的所得是难为浅读者道的。不过回到我们这里的话题,这样地收集与读书,或是我常常“反思”的一个源起。

写书

写书是我的另一种反思。

但凡一件事情,我们都该有自己的观点。对于这观点,应该先说清楚它,再坚持它,再尝试否定它。《大道至简》一书三版,便是我在说清楚自己的观点。而我这五年来沉默与坚持,便是不断地向自己挑战:我说得对吗?我在陈述一种什么样的道?这是道吗?这是未来吗?这是方向吗?以及,这一切或许原本就是错的?![1]

正如我一直以来在做的,写书即是在整理我的观点,坚持它,而后尝试否定它。这样的反思是我这些年来写作的主要动力。我的所得,往往不是在于追求新的技术,进而去学习、应用它们,以获得某种技艺上的纯熟,而是往往在于对它们背景里那些旧的、真实的、剥离了广告术语的东西的追问。这种追问,既是对别人的,也是对自己的。惟只这样公平地置疑,才脱离了促狭的味趣,而变成进步的动力。

这才是本书的姊妹篇《大道至易》的由来,也是本书发行它的第四版的原因。

第四版

首先,坦率地说,这一版并没有什么新东西。

若以完整性而言,第三版(点评版)已经有本书的全部内容了。但点评版的问题在于版式过乱,印刷质量也有问题,并且它的字体太小以至于影响到了阅读。因此若继续刊印点评版,其实是对读者的不负责任——所以如果你是第三版的读者,那么第四版真的只益“典藏”。若退至第二版,则又因为内容上缺少“第十章 具体工程”,而无法作为姊妹篇《大道至易》(以下称做“易”)的参考。当然,再追溯至第一版(电子版,2005.11.06),则内容上缺的就更多了。“易”是本书的后续,并基于本书中几个关键问题的反思。这些反思起至本书电子版发布后不久,只是在这么多年之后,我才有将它写成一本书的能力与阅历罢了。但是“易”一书的写作风格和内容体系与本书完全不同,因此根本上无法做成同一本书。

所以一定程度上来说,这本“典藏版”既是为读者“典藏”而出,亦是专为《大道至易》的发行而出。在内容上以第二版为底本,加上了第三版中的“具体工程”一章。并且,考虑到典藏的价值,本书收录了公开文档“幕后故事”的精华摘选。

惟只陈述这一事实,敬请读者谨细遴选。

致谢

感谢所有的读者、编者以及一直以来支持我的朋友们。[2]

感谢李维先生为本书作序。

感谢所有对这本书提出意见、观点和评论的朋友们。

感谢那些在这本书的撰写与出版中给我帮助与支持的同事、好友和同行专家们。

感谢博文视点资讯有限公司。

感谢我的中学语文老师。

感谢Joy。En,……我最爱的妻。

周爱民

2012年5月[1]: 引自我的博客文章“与读者谈谈《大道至简》这五年”,文章写于该书第三版(点评版)出版之际。[2]: 本版选用了李维先生在第二版中所写的序“停下来,思考才是进步的本质”。多年来,这句话是时时鸣响于我耳畔的警语。第三版前言(点评版,摘选)

重新认识我们自己

首先,如同我们并不了解自己一样,对于我们这个项目团队,乃至于整个软件行业中的许多人,也许都从来没有去尝试认清我们自己。如此,我们又妄谈什么开发,又妄谈什么工程呢?

你认为你呆在一个“敏捷的”团队里面吗?或者是呆在一个“正规的、工程化的”团队里面吗?或者,你就只是呆在一个“松散组织”里面,三个星期以来,还没有与对面的那位大胡子兄弟打过一次招呼……

你认为这就是“我们自己”吗?那个被称为“敏捷团队”、“工程化团队”或“松散组织”的一群人,就是“我们”?我们用这些名词的时候,只是我们“仿佛像是”这些个名词而已。然而请注意,原先说出类似这些名词的人,现在有些已经作古,有些活到了七老八十,还有些已经在开始抽自己的耳光了。而且,更加重要的是,这些人——他们——远在千里之外、异国他乡,处于不同的文化背景、教育背景、历史背景与工程背景等之下,他们说出这些名词的时候,代表的是他们——他们自己的——那个确定的团队。

以及,他们的确定的心跳。

东施效颦有什么不对吗?没什么不对,“效颦”这件事情实在太正确了,以至于无法反驳:爱美之心人皆有之,与追求先进的科学技术生产力一样都是人的、社会的本性。东施的问题只在于她未能在“效颦”之前看看自己的面目,也未能在“效颦”之后看看自己的面目——多数的人、多数的团队,能做到这件事情的一半,就已经很了不起了。

丑态总是有的,我们只是不自知,或者不自认罢了。

点评版的一些说明

这五年来,我渐渐地接受了关于这本书的种种声音。甚至我越来越想听到更多的声音,只要这声音中包含着思考。思想是一种过程,而非某种确定的结果,所以言及你我的观点的时候,所谓的正确与错误,只有一时一事的分别。更重要地是,要看到谈论者在这其中的思想与背景。

我越来越深刻地体会到背景对于工程实践者及他们团队的实质影响,因此也越来越想看到不同背景下的同仁们、前辈们,以及专学者是如何理解工程的。这是我邀请几位师者、友人来合著《大道至简》点评版的初衷。所以在点评版的邀请函中,我曾告诉各位专家:我不对任何言论做任何辩解。我希望读者听到一些更加真实的声音,了解他们的思想。这些声音与思想是未经诠释的,未加修饰的,未有私念的。总之,各位专家是在为这本书的文字而阐发观点,还是这些文字只是引子,让大家有机会说出某些观点,等等这些“貌似的根源”其实并不关键。

更为关键的是:我不能去干扰这一切。正如秋桐夜雨,你我能听,已是幸甚;能有所感,便是美事;能知其美方是智者,知其寒方是醒客。读书、做事、写文章等行事之中,我们在大多数时候,忘掉了听。

在这本点评版中,我新加了一章“具体工程”,这出自我读《人月神话》时的许多感受。在近两年的实践中,我不停地关注与审视这一观念,补充它、完善它,最终,它成了本书中完整的一章。这既是对我以前所谓“灵活的工程(flexible engineering)”的最终注解,也是实现工程灵活性的必由之路。

周爱民

2009年9月第二版前言(摘选)

你在做什么“你在做什么?”我经常这样反问那些跑来问我问题的人们。然后他们就愣住了。

做了许多年的开发,其实有很多人并不知道“自己在做什么”。《愚公移山》的故事里面,愚公为山所阻,苦于“出入之迂”,然后就决定“移山”。看起来伟大而风光的工程,可能只是拍拍脑袋的一时主意——如果只是觉得绕路太远,那么劈山开路岂不是更加经济?

愚公移山只是一种精神追求,而做工程却不是追求精神目标。我们的目标是完成工程,但是你现在环顾一下你的团队:有多少人的眼光是落在工程本身上的呢?

程序员正在调试代码,项目经理在忙着开会,市场经理在请客吃饭,老板可能还在来公司的路上……总之,你的身旁没有什么人关注工程本身。即便有一个人或几个人在像模像样地画着模型图,或者写着需求、分析与设计书,但是对于他们来说,这只是例行的工作,而不是出于工程本身的需要。

其实这也是我在几年前的状态,同时身兼主程、团队负责人和项目经理的时候,我列出的工作清单排满了上班与下班的时间。我甚至忙到不知道自己有多忙。直到我将自己的角色分解到“工程层状模型(EHM)”中,我才渐渐地梳理出自己的工作方法。《大道至简》向你讲述两个内容:做什么和为什么做。“做什么”作为一种状态或现象,通常是(阶段性)不变的,所以人们了解自己“在做什么”时多数只需要观察。简而言之,只需要自省,就可以了解自己的所作所为了。然而“为什么做”却相对更难于理解,因为这是“表象下的实质”,潜藏得很深:习以为常,便会根本上忘却“习”的来由。例如项目总监说要一份计划,你大概只需要拿一个以前做过的文档模板,很快就能写出一份项目计划案来。但在这个过程中,你已经忘掉了“项目计划案”真正存在的价值——写它的目的,并不是“完成工作”。

写一份项目计划案的时候,你的角色是项目经理,你的职责是计划与分工,你的目标是工程的时间、进度与质量的平衡。这份文档是工程的纲要,因此阅读群体是整个团队和项目干系人。所有这些,都可能导致文档的规格和措辞存在差异。

所以你需要认识“为什么做”。

这其实并不是非常困难的。例如我在工程中经常问的问题是“可不可以不做”——哈哈,看起来我很偷懒似的。其实不然,因为接下来我就会从不同的人那里得到“非做不可”的种种理由。

然而这是方法或者手法。《大道至简》并不告诉你这些具体的方法与手法,我只是叙述了基本的原理与思想。《大道至简》陈述的是一种途径、一个方面,以及一些探求途径、方面过程中的故事与思考。

做事有没有章法,在于你头脑够不够清醒;头脑够不够清醒,在于你是否看到事物的本实。具体到如何做一件事(例如做软件工程)的方法与步骤,是本书所不能告诉你的。而反过来说,如果你认为你自己“足够清醒”,那么这本书原本也就不会告诉你更多。

你足够清醒吗?

关于《愚公移山记》

在基本不影响原故事的前提下,我在本书中对愚公移山的故事进行了续写。书中的九幅四格漫画,不但概括了这个故事的大意,也是整本书的框架骨骼。

为了使得整个故事更加完整并具连续性,我对愚公移山中人物的历史背景进行了一些设定(姓氏的设定主要是为了避免在故事中出现“愚公n代”这样的写法)。这里先做一些交代:愚公,复姓公输,祖上虞国人(今山西平陆县北)。后迁居到太行山北,时以虞人自称,性情耿正,人称愚公。智叟,复姓端木,魏国河曲人(今山西芮城西,风陵渡一带),后迁与愚公毗邻,仍以河曲人自称。邻人京城氏,世居此地,有孀妻遗男。京城一氏的后代中,有很多复祖姓目夷的人。

周爱民

2006年9月2日第一版前言(电子版,摘选)

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

周爱民

2005年10月14日作者简介

周爱民(Aimingoo),有十余年的软件开发、项目管理、团队建设的经验。曾任多家软件公司高级程序设计师、项目经理、部门经理、区域总经理等职,前支付宝(中国)公司业务架构师,前盛大网络平台架构师。目前主要从事软件工程、体系架构和语言基础方面的研究与实践。

■ 2001年,主持完成的“极光数据处理仓库中心系统”被河南省信息产业厅授予省高新技术产品二等奖。

■ 2003年,被美国Borland公司授予“Borland Delphi产品专家”称号。

■ 2004年,出版《Delphi源代码分析》,被誉为“Delphi领域精品著作”。

■ 2005年,发布《大道至简——软件工程实践者的思想》第一版(电子版)。

■ 2006年,发起开源项目Qomolangma OpenProject,探讨语言系统基础技术。

■ 2008年,出版《JavaScript语言精髓与编程实践》,电子工业出版社。

■ 2008年,发起开源项目derlang,探讨erlang in delphi,以及erlang的应用技术。

■ 2009年,在开源项目QoBean中尝试Meta Language与DSL等实现。

■ 2009年,发布《动态函数式语言精髓》(电子版)。

■ 2012年,出版《JavaScript语言精髓与编程实践(第2版)》,电子工业出版社。

■ 2012年,出版《大道至易——实践者的思想》,人民邮电出版社。

■ 2007年至2012年,出版《大道至简——软件工程实践者的思想》第二版、第三版(点评版)、第四版(典藏版),电子工业出版社。软件工程层状模型(EHM)

Engineering Hierarchy Model·第一章· 编程的精义“虽我之死,有子存焉;子又生孙,孙又生子;子又有子,子又有孙。子子孙孙,无穷匮也。而山不加增,何苦而不平?”

——《列子·汤问篇》之《愚公移山》第一节 编程的精义

仅仅就编程序来说,实在是一件很简单的事,甚至可以说是一种劳力活。两千年前的寓言,已经成就了一位工程名家:愚公。这位名家的身上,浓缩了项目组织者、团队经理、编程人员、技术分析师等众多角色的优秀素质。他的出现,远远早于计算机发展的历史,甚至早于一些西方国家的文明史。

从《汤问篇》中所述的愚公移山这一事件里,我们看到了原始需求的产生:“惩山北之塞,出入之迂”

也看到了项目沟通的基本方式:“聚室而谋曰”

然后,我们还看到愚公确定了这个项目的目标:“毕力平险,指通豫南,达于汉阴”

并通过研讨,择定了一个井然有序的、可以实现的技术方案:“扣石垦壤,箕畚运于渤海之尾”。

在这个项目中,动用了三名技术人员和一名工程管理人员:“(愚公)率子孙荷担者三夫”

并获得了一名力量较弱,但满富工作激情的外协:“邻人京城氏之孀妻,有遗男,始龀,跳往助之”。

基本上,这已经描述了“愚公移山”整个工程的概况。接下来,我们应该注意到愚公作为编程人员的基本素质。在与“河曲智叟”的对答中,他叙述了整个工程的编程实现:“虽我之死,有子存焉”,这里描述了可能存在的分支结构,即“IF”条件判断;“子又生孙,孙又生子;……子子孙孙,无穷匮也”,这里描述了完成这个工程所必需的循环结构。

作为优秀的程序分析师,愚公论述了这个循环的可行性:由于“山不加增”,所以条件“山平”必将成立(“何苦而不平”),所以这不会是一个死循环。

在愚公的论述中,我们看到了编程的根本:顺序、分支和循环。庞大若“愚公移山”这样的工程,都是可以通过这样简单的编程来实现的。这,就是编程的精义了。第二节 能不能学会写程序的问题

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

这个问题由来已久。上溯十余年,程序员还是很少有人从事的职业。听说的人少,真正了解的人也不多。而当一个程序软件被装在计算机里并开始运行时,人们便开始惊讶于程序员的厉害。所以“能不能学会写程序”甚至成了一些人对自己的智力考评,所以便有人向我这样发问。

愚公都能明白的编程精义,那些向我发问的智叟们又怎么会不明白呢?

所以除了先天智障或后天懒惰者,都是可以学会写程序的。如果你能确信,自己知道在早上起床后:如果天冷则先穿衣服后洗漱;如果天热则可反之;日复一日直到死亡。

那么你就可以开始编程了。甚至,如果你认为以下条件成立:如果有类似于生病、不能行动,以及意外的紧急事件,则当日可以略过。

那么你就可以开始向程序设计师发展了。

因为你已经具备了一项常人不具备的基本素质:折中。第三节 程序=算法+结构

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

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

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

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

存在的只是思想。

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

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

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

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

成天讨论这门语言好,或者那门语言坏的人,甚至是可悲的。既悲其一叶障目,更悲其大愚若智的自得心态。第五节 在没有工程的时代

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

在没有工程的时代,出现了非常非常多的人物。其中,有算法大师,有游戏大师,有语言大师,有挣钱的大师……

唯独,没有工程大师。嗯,可以理解嘛,那是没有工程的时代。好蛮荒,好远古的。【愚公移山记:移山伊始】

智叟无法阻止愚公移山的计划,于是便让儿子顺道去经商。而邻人京城氏的儿子,也在数年后随他们远游求学去了。[1]: 提出这个公式(Algorithms+Data Structures=programs)的人是被称做“Pascal语言之父”的瑞士计算机科学家尼古拉斯·沃思(Niklaus Wirth)。这个公式是他的一本书的名字,他因为提出“结构化程序设计”的概念而获得 1984 年的图灵奖。正是他的学生菲力浦·凯恩(Philippe Kahn)创建了 Borland公司,才有了后来的Turbo Pascal和Delphi。·第二章· 是懒人造就了方法“僰道有故蜀王兵兰,亦有神作大滩江中。其崖崭峻不可破,(冰)乃积薪烧之。”

——《华阳国志》第一节 是懒人造就了方法

战国时期的李冰凿了一座山。《史记》中说李冰在成都做太守的时候凿出了离堆。一种说法是他将都江堰附近的玉垒山凿了一个叫宝瓶口的大口子,而凿的石头就堆成了离堆。另一说法,则是李冰的确凿了一座崖,但是在沫水,亦即是今天的大渡河。

在哪里凿的山,是史学家都说不清楚的事。但的确凿了一座山,而且方法是“(因)其崖崭峻不可破,(冰)乃积薪烧之”。

我们已经看到事物的进化了。《列子·汤问篇》里的愚公要“碎石击壤”,而李冰就已经懂得“积薪烧之”了。

会有人说愚公是“碎石”,但史书中并没有说他究竟是零敲碎打呢,还是用火来烧爆掉的。但想想在那个时代,如果有人懂得了烧石头这个方法,哪有不立即载文志之,永世传承的。

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

所以愚公会凿,而李冰会烧。那李冰又是为什么会用“烧”这种方法来碎石的呢?如果李冰也像愚公那样日复一日地督促着他的团队凿石开山,那他一定没有时间来学习、寻找或者观察;当然也不会发现“烧”这种方法可以加快工程进度,使得一大座山在短时间内就被哗啦哗啦地“碎”掉了。

要知道李冰的团队可是成百上千人,要修堰筑坝,要“凿离堆”,当然还要吃喝拉撒睡。所以李冰如果忙起来的话,他必然是“受命以来,夙夜忧叹”,必然食难下咽,睡无安枕。反之,李冰一定是个闲人,可以闲到没事去看火能不能把石头烧爆。

在这么大的工程里,如果有一个人会闲到看火烧石头,那他一定很懒。那么多事堆着不去做,去看烧石头,你说他不是懒是什么?

正是一个懒人造就了“烧石头”这个“碎石”的方法。愚公太勤快了,勤快到今天可以比昨天多凿一倍的石头。或许在愚公的项目计划案的首页就写着朱批大字:“吾今胜昨倍许,明胜今倍许,而山不加增,何苦而不快。”但是越勤快,愚公将越没有机会找到更快的方法。

人的精力终归是有极限的。提出新的“方法”,解决的将是影响做事成效的根本问题。愚公可以多吃点饭,多加点班,但突破不了人精力的极限。

记住,在两千年前的某一天,闲极无聊的李冰下厨给夫人炒了一个小菜,他突然发现垒灶的鹅卵石被烧得爆裂开来,遇水尤甚。从此《史记》上就记下了“蜀守冰,凿离堆”,而《华阳国志》上则记下了他做这件事的方法:积薪烧之。第二节 一百万行代码是可以写在一个文件里的

早期的程序,都是将代码打在穿孔纸带上,让计算机去读的。要让计算机读,纸带当然是连续的,这无须多讲。其实我没有那样写过程序,其中的苦楚我也不知道。

后来有了汇编语言,可以写一些代码了。这时的代码是先写在文本文件里,然后交给编译器去编译,再由链接器去链接,这样就出来了程序。

第一个写汇编的人,写的可能是有名的“Hello World”程序,那[1]个程序写在一个文件里就行了。后来就成了习惯,大家都把代码写到一个文件里。在早期的汇编语言里,GOTO语句用得非常非常频繁,将一条语句GOTO到另一个文本文件里去,既不现实也不方便。所以[2]大家习以为常,便统统地把代码写到一个文件里。

再后来出现了高级语言,什么C呀,Pascal呀之类的。既然大家已经形成习惯了,所以很自然地会把一个程序写到一个文件里。无论这个程序有多大,多少行代码,写到一个文件里多方便呀。

直到如今,语言发展得更高级了。可是程序员的习惯还是难改,一旦得了机会,他们总还是喜欢把代码写到一个文件里的。

好了,有人说我是想当然耳。嗯,这当然是有实据的。记得Delphi 1.0发布的时候,全世界一片叫好声。连“不支持双字节”这样的大问题,都不影响它在华语地区的推广。然而不久,爆出了一个大BUG!什么大BUG呢?Delphi 1.0的编译器居然不支持超过64KB的源代码文件!

这被Fans们一通好骂。直到我用Delphi 2.0时,一个从VB阵营转过来的程序员还跑过来问我这件事。好在Delphi 2.0改掉了这个BUG,这让我很有面子,好一阵风光。

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

1行代码大概(平均)是30字节,64KB的源代码是2 184行,如果代码风格好一点,再多一些空行的话,差不多也就是3 000行上下。

也就是说,在Delphi 1.0的时代(以及其后的很多很多时代),程序员把3000行代码写到一个文件里,是司空见惯的事了。如果你不让他这样写,还是会被痛骂的呢。

所以呢,按照这一部分人的逻辑,一百万行代码其实是可以写在一个文件里的。不但可以,而且编译器、编辑器等也都必须予以支持。这才是正统的软件开发。

勤快的愚公创造不了方法。这我已经说过了。对于要把“一百万行代码写到一个文件里”,并且查找一个函数要在编辑器里按5 000次PageUp/PageDown键的勤快人来说,是不能指望他们创造出“单元文件(Unit)”这样的开发方法来的。

然而单元文件毕竟还是出现了。这个世界上,有勤快人就必然有懒人,有懒人也就必然有懒人的懒方法。

有了单元文件,也就很快出现了一个新的概念:模块。把一个大模块分成小模块,再把小模块分成更细的小小模块,一个模块对应于一个单元。于是我们可以开始分工作了,一部分人写这几个单元的代码,另一部分则写那几个。

很好,源代码终于可以被分割开来了。结构化编程的时代终于开始了,新方法从此取代了旧方法。而这一切应当归功于那个在按第5 001次PageDown键时,突然崩溃的程序师。他发自内心地说:“不能让这一切继续下去了,我一定要把下一行代码写到第二个文件里去。[3]我发誓,我要在编译器里加入一个Unit关键字。”第三节 你桌上的书是乱的吗

我曾经在一所电脑培训学校与学生座谈时,被一个学员问道:“为什么我学了一年的编程,却还是不知道怎么写程序呢?”

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

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

我当时便反问:“你既然知道如何把书分类、整整齐齐地放在书桌上,那怎么没想过如何把所学的知识分类、归纳一下,整整齐齐地放在脑子里呢?”

如果一个人学了一年的编程,他的脑袋里还是晕乎乎的,不知道从哪里开始,也不知道如何做程序。那想来只有一个原因:他学了,也把知识学进去了,就是不知道这些知识是干什么的。或者说,他不知道各种知识都可以用来做什么。

其实结构化编程的基本单位是“过程(Procedure)”,而不是上一小节说到的“单元(Unit)”。然而在我看来,过程及其调用是CPU指令集所提供的执行逻辑,而不是普通的开发人员在编程实践中所总结和创生的“方法”。

这里要提及 CPU 指令集的产生。产生最初的指令集的方式我已经无可考证,我所知道的是,CISC指令集与RISC指令集之争在1979年终于爆发。前者被称为复杂指令集,然而经过Patterson等科学家的研究,发现80%的CISC指令只有在20%的时间内才会用到;更进一步的研究发现,在最常用的10条指令中,包含的流程控制只有[4]“条件分支(IF...THEN...)”、“跳转(JUMP)”和“调用返回(CALL/RET)”……

RISC(精简指令集计算机)由此成为一种可能的发展方向,进而演变成一场长达20年的指令战争。而动摇了CISC指令集地位的方法,就是分类统计。

正如CISC指令集搅乱了一代程序设计师的思路一样,大量的知识和资讯搅乱了上面向我提问的那位学员的思想。他应该尝试一下分类,把既有的知识像桌子上的书一样整理一下,最常用的放在手边,而最不常用的放在书柜里。如果这样,我想他应该在九个月前就开始写第一个软件产品了。

你桌上的书还是乱的吗?第四节 我的第一次思考:程序=算法+结构+方法

我对程序的本质的第一次思考发生在几年前。那时我与Soul(王昊)有一次网上对话。

Soul是DelphiBBS现任的总版主,是我很敬重的一位程序员。那时我们正在做DelphiBBS的一个“B计划II”,也就是出第二本书。他当时在写一篇有关“面向对象(OOP)”的文章,而我正在写《Delphi源代码分析》。在这本书的初期版本里,有“面向对象”的内容。[5]

我们的对话摘要如下:

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

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

我:“绝对可以用面向过程的方法来实现任意复杂的系统。要知道,航天飞机也是在面向过程时代上的天。但是,为了使一切变得不是那么复杂,还是出现了‘面向对象程序设计’的方法。”

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

Soul:现在的程序是按照冯·诺伊曼的第一种方案做的,本来就是顺序的,而不是同步的。CPU怎么说都是一条指令一条指令执行的。

我:面向过程是对“流程”、“结构”和“编程方法”的高度概括。而面向对象本身只解决了“结构”和“编程方法”的问题,而并没有对“流程”加以改造。

Soul:确实如此。确实如此。

我:对流程进一步概括的,是“事件驱动”程序模型。但这个模型不是OO(面向对象)提出的,而是Windows的消息系统内置的。所以,现在很多人迷惑于“对象”和“事件”,试图通过OO来解决一切的想法原本就是很可笑的。

Soul:我先停下来,和你讨论这个问题,顺便补充到书里去。

我:如果要了解事件驱动的本质,就应该追溯到Windows内核。这样就涉及线程、进程和窗体消息系统这些与OO无关的内容。所以,整个的RAD(快速应用程序开发)编程模型是OO与OS(操作系统)一起构建的。现在很多的开发人员只知其OO的外表,而看不到OS的内核,所以也就总是难以提高。

Soul:OO里面,我觉得事件的概念是很牵强的,因为真正的对象之间是相互作用的,就好像作用力和反作用力,不会有个“顺序”的延时。

我:应该留意到,整个的“事件”模型都是以“记录”和“消息”的方式来传递的。也就是说,事件模型停留在“面向过程”编程时代使用的数据结构的层面上。因此,也就不难明白,使用或不使用OO都能写Windows程序。

我:因为流程还是在“面向过程”时代。

Soul:所以所谓的面向对象的事件还是“顺序”的。所以我们经常要考虑一个事件发生后对其他过程的影响,所以面向对象在现在而言还是牵强的。

我:如果你深入OS来看SHE(结构化异常处理),来看

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载