《疯狂的程序员》序

Posted: 十一月 19th, 2008 | Author: | Filed under: 卧读 | 4 Comments »

绝影在CSDN Blog上连载《疯狂的程序员》,自2007年12月22日开始,到2008年9月15日全文完成,9个月时间写了35万字。对于专业作家,这也许算不得什么了不起的成就,可绝影只是一位技术工作者,9个月的业余时间,就全搭在这部书上面了。

以文学的角度来看《疯狂的程序员》网上连载版本,缺点和问题比比皆是,但这些瑕疵无法掩盖因其“真实反映程序员工作生活”而焕发的独有光彩(据我所知,印刷版本在文字方面改进良多)。“深入生活”无如“从生活中来”,我不相信有任何专业作家,能比绝影们更有资格写出《疯狂的程序员》这样的作品——看看市面上,有几本描写程序员的小说呢?

现在这部书要出版了,我又从头逐篇看Blog上的连载。越看越觉得,互联网改变出版,实在已经不是一种理论或是幻想。其表现有三:一,互联网让原本不属写作人群的人能够撰写并发布作品;二,互联网上改变了“小黑屋”式的写作,作读互动贯穿于并影响着写作全过程;三,读者评论、作者回应,乃至于包括正文在内的页面表现,构成了某种完整、自足的作品表现形式。对于出版机构而言,互联网变作了有效的“选题筛选器”。当然,在正式出版前,还有很多的编辑工作要做,但至少在写作阶段,已经和以前大有不同了。网上连载与印刷版本有没有冲突呢?如果有,怎样化不利为有利,使之促进印刷版本的销售?在与绝影签约后,出版社没有要求绝影停止在网上连载,这是一种勇敢应对新类型出版的积极态度。

绝影不是唯一、也不会是最后一位在CSDN平台上创作的作者。《疯狂的程序员》正好为其他用户树立了一个典范:程序员也能写书,而且是写出引起大家共鸣的优秀作品。我要恭喜绝影新书出版,更要鼓而呼之,希望更多的绝影涌现出来。


e人谷龙门阵之代码猴

Posted: 八月 27th, 2008 | Author: | Filed under: 卧读 | 2 Comments »

按:上次写了twitter.com的创业史,读者反映还不错。本来准备了资料,打算继续写其他一些网站或创业公司,今天看到登高CSDN个人空间推荐歌曲,突然想起一事,就打个岔先。和本系列其他文章不同,这篇要写一首歌,以及和它相关的事情。好奇吗?现在开始。

 

2007年3月份,我去硅谷Santa Clara参加CMP的SD West 2007大会,着意听了几场演讲或课程。最令人兴奋的是Robert C. Martin (Uncle Bob)的演讲“Craftsmanship and the Problem of Productivity: Secrets for Going Fast without Making a Mess”。甫一上台,Bob大叔就手舞足蹈唱起歌来,像极了一只焦躁的猴子。当然这只是个暖场的手段,演讲本身之精彩,自不待言,但Bob大叔那夸张到走调的演绎,让我对他唱的歌产生了兴趣。可惜闪念之间,还是觉得听后面的课程要紧,也就抛诸脑后了。

今天想起来,Uncle Bob的歌声仿佛还在耳边回响,趁着中午有点空闲,查了一下。原来那首歌叫做Code Monkey(代码猴子),作者是Jonathan Coulton。此人住在纽约布鲁克林,是个独立音乐人。在相当一段时间(大约两年)里,他每周创作、演唱并在网上循CC版权协议发布一首新歌。拜新科技所赐,从配乐演奏到主唱,Jonathan可以独力完成。Code Monkey就是这些歌曲中较为成功的一首。因为创作歌曲数量之庞大,Jonathan被外间叫做“写歌机器”。

千万别以为做音乐的都是文盲,人家Jonathan Coulton可是正经毕业于耶鲁大学,而且还当过一段时间的程序员,这首Code Monkey,灵感大概也来自当年做程序员的生活。

所谓code monkey,是一个英文习语,粗略而论有两层意思:其一,低水平的编码人员;其二,程序员自嘲。Uncle Bob在演讲中奉劝听众不要做code monkey,是为了提升听众的编程水平;而Jonathan在歌中唱的,可就用了“自嘲”那层含义了。且来看看歌词——

 

Code Monkey get up get coffee(代码猴子起身喝咖啡)
Code Monkey go to job(代码猴子上班去)
Code Monkey have boring meeting(代码猴子开了个无聊的会)
With boring manager Rob(一起开会的上司Rob也够无聊)
Rob say Code Monkey very diligent(Rob说代码猴子很勤奋)
But his output stink(但做的东西却不行)
His code not “functional” or “elegant”(他的代码“用不了”或“不够好”)
What do Code Monkey think?(代码猴子在想什么?)
Code Monkey think maybe manager want to write god damned login page himself(代码猴子想,上司可能想干脆自己来写那个TMD登录页)
Code Monkey not say it out loud(代码猴子没大声说出来)
Code Monkey not crazy, just proud(代码猴子可没疯,只是有点得意)

Code Monkey like Fritos(代码猴子喜欢吃Fritos薯片)
Code Monkey like Tab and Mountain Dew(代码猴子喜欢喝Tab和Mountain Dew)
Code Monkey very simple man(代码猴子是个直爽人)
With big warm fuzzy secret heart:(心里藏着点温暖的秘密:)
Code Monkey like you(2X) (代码猴子喜欢你)

Code Monkey hang around at front desk(代码猴子在前台混着)
Tell you sweater look nice(说你的毛线衣真好看)
Code Monkey offer buy you soda(代码猴子给你买苏打水)
Bring you cup, bring you ice(还送上杯子和冰块)
You say no thank you for the soda cause(你说谢谢,不用了)
Soda make you fat(因为喝苏打水会变胖)
Anyway you busy with the telephone(你得忙着接电话)
No time for chat(没时间闲聊)
Code Monkey have long walk back to cubicle he sit down pretend to work(代码猴子走回小隔间,坐下假装工作)
Code Monkey not thinking so straight(代码猴子没想通)
Code Monkey not feeling so great(代码猴子感觉不太好)

Code Monkey like Fritos(代码猴子喜欢吃Fritos薯片)
Code Monkey like Tab and Mountain Dew(代码猴子喜欢喝Tab和Mountain Dew)
Code Monkey very simple man(代码猴子是个爽直人)
With big warm fuzzy secret heart:(心里藏着点温暖的秘密)
Code Monkey like you(代码猴子喜欢你)
Code Monkey like you a lot (代码猴子很喜欢你)

Code Monkey have every reason(代码猴子有理由)
To get out this place(离开这个地方)
Code Monkey just keep on working(代码猴子还是留下来工作)
See your soft pretty face(看着你可爱柔软的脸)
Much rather wake up, eat a coffee cake(醒来,咖啡蛋糕做早餐)
Take bath, take nap(洗澡,睡觉)
This job “fulfilling in creative way”(这工作“创意无穷”)
Such a load of crap(真是废话一堆)
Code Monkey think someday he have everything even pretty girl like you(代码猴子以为总有一天会得到一切,包括像你一般好的女孩)
Code Monkey just waiting for now(代码猴子在等待)
Code Monkey say someday, somehow(代码猴子说,总有一天,总会实现)

Code Monkey like Fritos(代码猴子喜欢吃Fritos薯片)
Code Monkey like Tab and Mountain Dew(代码猴子喜欢喝Tab和Mountain Dew)
Code Monkey very simple man(代码猴子是个爽直人)
With big warm fuzzy secret heart:(心里藏着点温暖的秘密)
Code Monkey like you(2X)(代码猴子喜欢你)

 

上面的歌词,我只是随手译出中文,可能有一些不准确的地方,请方家指正。其中的Tab和Mountain Dew,分别是百事可乐及可口可乐推出的减肥饮料。

嗯,那就是典型的Code Monkey了……朝九晚五干着毫无激情的工作,巴望着能认识个好姑娘,可惜落花有意、流水无情,风流总被雨打风吹去。他每天做这白日梦:坏日子总会过去,我将拥有一切。这首歌在美国软件技术人群中流行一时。虽然许多中国程序员不喝Mountain Dew,但我相信他们听这首歌也会感同身受——这样的生活,什么时候才能熬到头呢?

再咀嚼咀嚼歌词,还是觉得自嘲的意味多过哀叹的意味。这首歌以Creative Common授权发行,有很多人拿来做成MV。最有趣的是一位Adobe程序员做的MV,他用魔兽世界的人物来演绎Code Monkey,既邪恶又幽默。

Jonathan Coulton弹吉他演唱的不插电版本也很有意思,有兴趣的读者可访问http://technorati.com/videos/youtube.com%2Fwatch%3Fv%3D7s8S7QxpjeY。


Dreaming in Code中文版第0章试读

Posted: 一月 15th, 2008 | Author: | Filed under: 卧读, 坐思 | 6 Comments »

0章:软件时间


那是1975年的冬天。我在终端机房中俯身敲击一台电传打字机,每打完一行,那笨重的机头就会摇头晃脑猛然撞回最左边,开始新的一行。我从几个小时前开始输入一行行黑代码[1],忘记了时间流逝,全然不知已是午夜时分。看门人已经关闭廊灯。我并没有得到许可在纽约大学物理系大楼中流连忘返、使用向高中学生免费发放的计算机账号。不过,倒也无人责难。


那时我年方十五,正迷恋于一个叫做Sumer的游戏,在游戏中,我管理着新月沃土[2]上一座古代城邦。今天的电脑游戏玩家也许会嘲笑其稚嫩:它在一卷纸上逐行打印出大写字母,报告游戏进程。玩家运筹帷幄,分配食用和留种的谷物,然后程序就会告知城邦每年的发展情况。“汉谟拉比陛下,”程序像一个诚惶诚恐的宰相般报告说,“微臣伏启圣鉴……”


没玩几天,我就已经把游戏彻头彻尾玩了个遍。但是,和现在令青少年着迷的大多数游戏不同,Sumer可以让玩家打补丁。谁都能够窥探其内部运行机制:该游戏只是向计算机发出的一系列简单指令,这些指令存储于一卷多行八孔纸带上。(电传打字机旁的塑料盘中堆积的纸带,几乎带来和游戏一样多的乐趣。)纸带像地下出版物一样在朋友间流传共享。只要花几个钟头学点简单的Basic语言,改游戏就会和玩游戏一样容易:将纸带上的指令装载到计算机,然后开始往程序里加代码。


Sumer是个空白画板——历史只是个轮廓,随时准备着让少年的梦想来浇筑。我和朋友们掌握了它简单的构造,开始往里加东西。让玩家可以选择不同的宗教信仰吧!偶尔来一次腺鼠疫,会发生什么事?蛮族入侵者应该很酷。嘿,搞几具弹石机如何?


那天晚上,我倾力于改造游戏中民众造反模式的设计。Sumer只提供粗糙的起义模式;如果你干得太差,人民就会起来推翻你。(Sumer的原作者是个乐天派。)我认为,游戏中的起义模式应该多种多样,所以就创建了一些子程序补丁——让Sumer陷入内战,或是引入一个要争取合法地位的反对派政府。


我不在乎干到多晚。F线地铁整夜运行,可以把我带回位于皇后大道的家。一定得重新设计游戏中的革命模式!


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


四分之一世纪后,2000年五月,我坐在旧金山的一间办公室里,眼睁睁紧盯着一台现代计算机屏幕(高解析度、数百万种颜色)。喝剩的咖啡纸杯胡乱摆在键盘边上。正是凌晨5点。


那时我四十岁,是在线杂志Salon的创始人和总编,此外还负责一个软件开发项目。我们花了几个月精心规划,希望给网站增加动态特性,使之彻底改观。然而,现在我却眼看着项目濒临绝境。


在没日没夜苦干了几个星期之后,主力程序员终于宣告工作完成,自己要飞往夏威夷,度一个全家盼望已久的假期。剩下他的老板,技术副总裁查德·迪克森(Chad Dickerson),独自琢磨为什么存储网站文章的数据库就是不肯与负责显示页面的程序对接。查德两个通宵没合眼,努力修复问题。若是不然,到周一早上,我们的两百万读者就只能看到网站上没更新过的旧闻了。


难道我们以前没做过软件吗?(做过。)是没有全面测试吗?(显然不太充分。)怎么会搞得一塌糊涂?(鬼晓得。)


我吃完了自动售货机里最后一袋饼干,徘徊又等待,却仍是毫无指望。时间还多。还有时间去读那位以新项目的名义准备香槟加蛋糕聚会的倒霉同事的邮件,回复他说:“或者咱们再等等吧。”还有时间去体会身陷困境孤立无援的感受,然后琢磨将系统的中心服务器命名为“卡夫卡”是不是个好主意。


大约早晨9点,我们终于发布了站点“改进版”的第一个版本。又是周一清晨,其他同事相继出现在办公室,他们过了好一会儿才意识到,我们六个人昨夜压根儿就没回家睡觉。


又过了几星期,程序员们修复了最严重的问题,软件运行趋于平静。但后来每当我听说某公司打算“升级其软件平台”、重新搭建一套大型系统时,我总不免暗自担心。


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


二十世纪九十年代科技行业的兴盛,给我们带来了“互联网时间”的概念。对该短语含义的理解见仁见智,但多指“快速”之意。数字时代的新时间机制下,一切皆有可能发生——技术产生、公司创立、创造财富——而且速度惊人。这意味着你没时间做到尽善尽美——无须担心,因为别人也一样。


随着投资潮退,“互联网时间”这个短语也风头尽失,很快被其他时髦词所代替。但新词掮客们的确一语中的。在做软件的过程当中,时间似乎确实时快时慢。如果一切顺利,你会沉浸在心理学家称之为“流逝”的状态中,全然忘记了时间。如果事有不谐,你又会陷入困境,四顾茫然、举步维艰。无论是哪种情况,时钟都被抛诸脑后。你用的是软件时间。


 


***********************************************************


 


在使用一门新编程语言时,程序员的第一个程序通常是“Hello World”——输入一系列代码,召唤计算机,命令它打印出这两个词,向主人致敬。在Sumer游戏所用的Basic语言中,这个程序像这样:


10 PRINT “HELLO WORLD!”


20 STOP


“Hello World”程序一无所用,但足可蛊惑人心;它鼓励新手,唤起每个程序员心中乐观的一面。“既然能叫它说话,就能让它做任何事!”计算机协会(The Association for Computing Machinery),计算机领域中的ABA[3]或AMA[4],维护了一张网页,上面列出将近两百种编程语言版本的“Hello World”程序。简直就是程序代码的罗塞塔石碑[5]。


在Java这种商业世界中流行的重量级编程语言里面,“Hello World”看起来高不可攀:


class HelloWorld {


public static void main (String args[]){


System.out.println(“Hello World!”);


}


}


Public static void:无数个Java程序代码块中,都有这串密语存在。这串词有特别的技术含义。不过我常常把它看作一首机器诗篇,在它召唤出的冷宫里面,多少软件项目一开始雄心勃勃,最终却未结善果。


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


如果你和计算机编程打过交道,就很难不对它又爱又恨。作为少年游戏玩家,我品味过编写代码的巨大快乐。作为媒体工作者,我见证了软件世界中无数个悲惨故事——无论是跨国公司、政府机构,还是军工大鳄,都曾一头撞上过代码的冰山。而作为一个经理人,我又得对付自己的泰坦尼克号。


这二十五年令人气馁的软件历史,也许不具代表性,但却是我的个人经验。依照硅谷的数字乌托邦理想,事情理应朝好的方向发展。在Salon网站发布失败后的几个月里,理想与现实之间的差异开始对我露出了利齿獠牙。


编程已不再处于萌芽期。我们的世界依赖于无穷复杂的软件。在长达半个世纪的研究和实践之后,为什么还是很难做到按时限、按预算做出计算机软件?为什么还是很难让软件可靠而安全?为什么还是很难把软件做得易于学习使用,且具备按需修改的灵活性?这只跟时间和经验有关吗?是否有出现某种根本性突破的可能?在软件的本质特性(抽象性、复杂性及延展性)上,是否存在某种总能打倒我们的无常之物,将开发者咒入充满不可挽回的延误和根深蒂固的缺陷的世界?


“软件难做,”编程界经典教科书的作者高德纳(Donald Knuth)这样写道。但原因何在?


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


你可能已经注意到,我把本章标为“第0章”。我无意搞笑,只是想指出计算机程序员和其他人的一处小小不同:程序员从0开始计数,而不是从1开始。要解释这种习惯的来源,得从计算机中央处理单元里的寄存器,以及数据队列的结构等等奥义秘辛说起。不过,我发现最直截了当的解释来自于一个网页,该网页试图向大众解释黑客的行为——“黑客”一词的本义是“痴迷的编程匠人”,而非后来衍化出的贬义“数码入侵艺术家”。


为什么程序员要从0开始计数?因为计算机从0开始计数!所以,程序员也训练自己这样计数,以免让他们要指示操作的计算机产生误解。这本也无伤大雅,只是使用计算机的大多数人是从1开始计数,未免令人烦恼。往下到系统层面,在这个层面上,数据被存储和操作——意味着我们的金钱、工作和设想被转换为机器可读的符号——计算机程序及编程语言经常会做小小的偏移操作,即“+1”或“-1”,使得计算机从0开始计数的列表与人类从1开始计数的列表保持同步。


在计算机的二进制数字世界里,所有的信息都被简化为0和1的序列。但是,在0和1 之间有空间存在,在机器计数和思考的方式和人类计数和思考的方式之间也有空间存在。当你寻找软件缺陷、延误和不按设计思路运行的原因时,那原因就藏身于这空间之中。


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


在构思本书的那段时间里,我每天要驾车从旧金山海湾大桥(Bay Bridge)上通过。一天早晨,当我的车努力爬上连接奥克兰(Oakland)岸边和桥东段中心较高地带的长长引桥时,我发现,右边有个新物体挡住了海湾碧水和远山绿树:那是一台高耸的红色起重机的顶端,正好超出桥面。它在那儿日复一日地矗立着,突然有一天,又多了12台起重机,在桥北一线齐齐排列,如同挤在食槽旁的机械怪兽,等着倒霉的上班人士送进嘴来。


这工程是要替换双层大桥的北半部分。在1989年的Loma Prieta大地震时,该部分上层一段五十英尺长的桥面坍塌到下层的车行道上。现在,将在旧桥旁边搭建一座更安全、更现代的新桥。


随后几个月,这些240英尺高的起重机,开始将一根根直径达8英尺、长达300英尺的锈钢管打进海湾水底。在清晨时分,从我远在伯克利(Berkeley)山的家中都可以听到敲击声。总共将会有160根这种大管子被打入海底,填上混凝土,支撑新桥的水上部分。整个过程设计精密、执行无误;它分毫不差,完全满足了我们对工程一词的信心。


关于软件缺陷的话题,只要谈上几分钟,必会有人拍案叹道,“为什么就是不能像造桥那样造软件?”


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


和摩天大楼、水坝等永久性建筑一样,桥梁体现了人类对物理世界的技术把握。在过去半个世纪里,软件成为构建这个世界的虽不可见但却深入渗透的人造物。“人类文明运行于软件之上,”广为应用的计算机语言C++发明人比昂纳·斯卓思柯普(Bjarne Stroustrup)这样说道。


初听起来,这像是奇谈怪论或是自卖自夸。即便没有Microsoft Windows,人类文明也会同样延续,对吧?然而,软件并不只是用来发电子邮件或写报告的程序那么简单;它已经不声不响地渗透到生活的每个角落。它存在于厨具里、汽车中、玩具里,建筑中。商业和银行、选举和新闻媒体、电影和交通网、医疗和国防、科研和基础公共服务——人类生存之所需都系于计算机代码这根易断的细线上。


而且我们要为其脆弱付账。根据国家标准和技术学会(National Institute of Standards and Technology )2002年的研究,软件错误每年造成美国595亿美元的经济损失,三分之二的项目明显延误或超出预算,甚至干脆无疾而终。


人类文明运行于软件之上。但是,软件创建艺术却隐于暗处,即便对于专家们也是如此。在历史上,我们从未如此地完全依赖于这样一种人类自己不知道怎么才做得好的产品。在对软件系统的加速依赖和踱着方步学习怎么做好软件之间,有一条巨大且有时叫人恐惧的壕沟。对软件的依赖以指数级增长,而做软件的技能——和应用技能的愿望——却进展缓慢。


你要和程序员说这些,就等着挨批吧。这边厢,有人也许会说,世界从未如此光明:我们拥有了比以往更好的工具、更好的测试、更好的语言,还有更好的方法!那边厢,你又听人家说,自计算机时代的黎明以来,其实并未取得多少进展。计算机先驱莫瑞斯·威尔克斯(Maurice Wilkes)[ 6 ]回忆起1949年他在英国剑桥的情形,在拖着打孔纸带上楼给雏形计算机EDASC装载程序时,他看到了未来:“我强烈地意识到,生命中剩下的好日子,都将耗费在给自己的程序找错误上头。”从威尔克斯的时代直到现在,尽管有那许多创新,程序员却一直陷于调试除错之苦境。工作中只有百分之一的灵感迸发,剩下的是艰难寻找、汗湿重衣;他们的作品永远尚未完成或不够完美,区别仅仅是“问题更少”的程度不同罢了。


 


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


 


软件就是麻烦一堆。而且我们不能够也不愿意把电脑一关走为上计。给我们带来挫败和束缚的软件,也用更多功能、更快更好的工作与生活方式来引诱我们。无路可回。我们对软件的需要,远甚于对它的仇恨。


所以我们梦想着得到更新更好的东西。在现代软件研究领域多有建树的专家弗里德里克·布鲁克斯(Frederick Brooks)在1987年写了一篇题为《没有银弹(No Silver Bullet)》的著名论文。布鲁克斯在论文中称,无论编写计算机程序是如何地令我们倍感挫败,也永远无法找到一种魔法般的突破——我们只能期待渐次前行。布鲁克斯的观点难以辩驳,但也难以接受;参加计算机业界的一些会议,或是浏览程序员网站时,你总会遇到一些坚称其错的人。


有些人梦想炸毁今天的整座软件大厦,替以某种全新之物。有些人则只一味盼望找到不太顽固、更能响应人类愿望和行为流程的程序员,盼望能得到召之即来、挥之即去的软件,盼望得到足堪依赖的代码。


We dream of it, then we try to write it — and all hell breaks loose.


梦之所寄,行之所为——地狱之门就此洞开。



[1] Black code,指原来程序逻辑中没有的部分,采用类似侵入的手段加进去的代码。


[2] 新月沃土系自中东两河流域及附近一连串肥沃的土地。包括今日的以色列、西岸、黎巴嫩、约旦部分地区、叙利亚,以及伊拉克和土耳其的东南部。由于在地图上形似一弯新月,所以美国芝加哥大学的考古学家詹姆士·布雷斯特德(James Henry Breasted)把这一大片肥美的土地称为“新月沃土”。


[3] American Bankers Association,美国银行家协会


[4] American Medical Association,美国医药协会


[5] Rosetta Stone,1799年法国士兵在埃及发掘出来的象形字黑石碑。也是美国著名的外语教程品牌。


[ 6 ] 1967年图灵奖获得者,他领导建造的拥有内存储程序的计算机EDASC于1949开始运行。


本书将由电子工业出版社近期推出,敬请留意。


代码,梦

Posted: 一月 13th, 2008 | Author: | Filed under: 卧读, 坐思 | 3 Comments »

今天下午19:00,翻译完Dreaming in Code最后的《结语》部分,这本书算是基本完成了。说来惭愧,去年初接下这个任务时,满以为顶多半年足可交稿。真正开始翻译时,才知道自己低估了任务难度。作者Scott Rosenberg是在线杂志Salon.com的主编,笔下极尽引经据典、推敲字句之能事,夹叙夹议,奇闻轶事和以精论妙谈,300来页一本书,触及软件开发中多个根本大题目,叫人看得心惊肉跳之余,又不由得掩卷长叹。


《大褂还是内裤》一文中,我简单提到Mitch Kapor和Chandler项目。Dreaming in Code在“叙”的部分就是写这个项目的。本书的副标题很长,也很吸引人:Two dozen programmers, three years, 4,732 bugs, and one quest for transcendent software(两打程序员,三年,4,732个缺陷,只为打造卓越软件)。Mitch Kapor和他的程序员们曾经打造过最伟大的软件,现在他们有了近乎奢侈的资源,为了“用代码改变世界”的梦想,共襄盛举。可惜他们遇到了“软件时间”的黑洞,从2001年开始,泥足深陷、举步维艰。Scott Rosenberg从项目一开始就贴身跟踪,记录下Chandler项目开发过程中的点点滴滴。


如果本书仅及于此,就不过是一篇尚可一观的“报告文学”。幸好Scott Rosenberg的主要目标是揭示软件开发中的普遍问题:为什么做软件这么难。在描写Chandler项目进展的段落之间,温伯格、布鲁克斯等大师级研究者,Linus Torvalds和Joel等实践者纷纷“出来”现身说法,还有来自各机构、媒体、作者的大量资料,从“软件时间”入手,兼及各种方法论、积木式编程、软件设计、项目管理,所有这些都是最后一个大话题的铺垫。在《结语》部分,Scott Rosenberg提出了这个大话题:人工智能有没有可能超越人类?在这个问题上,Mitch Kapor打了个20,000美金的大赌。他打赌,到2029年为止,都不可能造出能通过图灵测试的机器。


Mitch Kapor绝非悲观主义者。他本人和整个OSAF团队做梦都想通过软件系统“改变世界”。改变世界的梦想鼓舞过无数程序员,然而最初却不是对程序员说的。在Dreaming in Code书中提到这么一桩轶事:当年Steve Jobs(就是Apple的乔布斯大爷啦)想要说服百事的CEO John Sculley加入Apple,就对John Sculley说,你是想终己余生“卖甜水”呢还是过来造计算机、改变这世界?不过John Sculley加入Apple后不久,就联合董事会把Jobs赶出了公司。


过去几十年以来,计算机软、硬件制造者们一直以他们的努力推动这世界。而他们的每一分努力,因为halting problem(停机问题)的缘故,都注定是未完成的任务。他们是在挑战智慧和精神力的极限,简直是“逆天而为”——所以也难免要遇到软件生而固有的困难。


Dreaming in Code以一个具体项目的进程为例,列出了这些普遍存在而又近乎无法解决的困难。有趣都是,在翻译本书的过程中,每每与朋友聊天,他们提出的一些问题,在书中也都涉及。这本书很快就要出版了,到时一人送一本,他们是软件实践者,看后应该会比我更有感触和启发吧。


《南阳韩氏宗谱》全文

Posted: 十月 26th, 2007 | Author: | Filed under: 卧读 | 5 Comments »

按:此谱得于云南弥勒县弥阳镇,乃我韩氏一脉数百年传承之记载。前数月余曾刊《韩氏世系图》一幅,此后常有同姓询及。特将《宗谱》全文贴出,以供阅检。此谱文辞朴实、叙事简略,若与他谱对照,或可互校漏、误,俾得一更为可信之刊本。余力有未逮,待之以贤者。

又:正文中有括号者,均余所补。读者知之为要。

 

 

始祖讳成
明洪武恩授统兵官。同太祖讨陈友谅,会兵鄱阳湖。兵败,陈贼追急。公服太祖衣冠惑贼,投水靖难。至今人口啧啧,有公替死马家渡之言。后追封侯爵。子孙世袭将军。

一世祖讳春 (配)时氏
公山东济南府籍。洪武中,以荫袭侍卫随沐(英)辟滇。后沐镇云南,公授指挥,领中卫府,相传即今迤东道官署。子孙袭职。遂籍云南。卒,与氏俱葬省城东十余里,地名洋房凹。氏赠淑人。生子旺。

二世祖讳旺 (配)孙氏
荫袭武略将军,指挥使。氏赠宜人。生三子,长冕,次升,三昂。

三世伯祖讳冕
荫袭武略将军,指挥使。氏应,赠宜人。公生一子,讳爵,荫袭武略将军,指挥使。爵生一子,晋,荫袭武德将军职。氏诰赠恭人。晋生一子,禹谟,荫袭武略将军,指挥使。氏应,赠宜人。禹谟生一子,崇高,袭职。崇高生一子,汝松。汝松生一子,陛先。陛先生一子。荫祖,后遂失传。

三世祖讳升 (配)舒氏
官舍。生二子,长伦,次辅。辅配舒氏,卒,继配周氏。在官舍,生一子,讳洗。辅之后与氏俱失传。

三世叔祖讳昂
前皆以武弁从戎,自公出伍业儒。《昆明县志》:昂,中卫人,成化辛卯科解元,戊戍科进士,授顺天府宛平县。氏与后失传。

四世祖讳伦 (配)潘氏
校尉。公之先人,大小二支,皆省卫官宦籍。自公始,迁路南。今之藩衍于路者,皆公裔也。氏孺人。生二子,长淮,次潮。潮在官舍,与后俱失传。

五世祖讳淮 (配)陈氏
云南府学廪生。生三子,长邦良,次邦器,三邦佐。

六世祖讳邦器 (配)蒲氏
邑庠生。生二子,长景琦,次琮琦。

六世伯祖邦良 (配)潘氏
乡饮宾,乏嗣。

六世叔祖邦佐 (配)袁氏
官舍。生二子。长振琦,庠生;次嗣琦,乏嗣。振琦配李氏,生三子,长文灿,配李氏、张氏。邑贡生,学问渊博,屡试不第,精通地理、医术,治家有方。生二子,长名公,次名侯。振琦次子文炳,庠生。生二子,名乡,名臣。振琦三子文烜,庠生。生二子,名仕,名世。名乡、名臣、名仕、名世,四支迁移开化。

七世伯祖景琦 (配)陈氏、徐氏
廪生。生二子。长文烺,庠生。生三子,名彦,名贤,名宰。景琦次子文炽,生三子,名哲,名效,名忠。三房移居易门县。

七世祖琮琦 (配)李氏
生三子,长文辉[换火字边];次文燧;三文焕,庠生。

八世祖文燧 (配)朱氏
生一子,名帅。

八世伯祖文辉[换火字边] (配)李氏
廪生。生二子,名儒,名家。

八世叔祖文焕 (配)俞氏、杨氏
庠生。生三子。长名伯,(配)万氏。康熙甲子科举人,丁卯贵州同考官。初任安宁教,改昆明教,兼成材书院山长。再任登川州。文焕次子名师,廪生。文焕三子名献,廪生。

九世祖名帅 (配)吕氏
生二子,长璟,次瑢。弥东二房。

十世伯祖璟 (配)聂氏
生三子,长起龙,李氏;次起凤,李氏;三起麟,王氏。

十世祖瑢 (配)吕氏
生一子,世业。

十一世伯祖起龙 (配)李氏
生一子,国定。配李氏、范氏。国学生。生一子,耀,(配)杨氏。生三子,长殿元,武生,配田氏;次有光,武生,配赵氏;三殿甲,武生,配赵氏。

十一世祖世业 (配)袁氏
生四子,国富,(配)杨氏,乏嗣;国贵,乏嗣;国宝,夏氏;国材,沈氏。

十一世二叔祖起凤 (配)李氏
生一子,国治,配康氏。生二子,长煋,配陈氏;次熇,配张氏,乏嗣。

十一世三叔祖起麟 (配)王氏
生国鼎,(配)黄氏;国亮,(配)梁氏;国玺,配赵氏;国典。

十二世伯祖国宝 (配)夏氏

十二世祖国材 (配)沈氏
生四子,长炯,(配)王氏;次煦、熹、蒸。

十三世伯祖炯 (配)王氏
生五子,君选,君举,君聘,乏嗣,君用,君任。

十三氏祖讳煦
(配)陈氏。国学生。生一子,福远,(配)李氏。

十三氏叔祖讳熹
配周氏。继配罗氏。周氏生一子,君仁。罗氏生一子,应达,配李氏。应达与氏乏嗣。

十三世叔祖讳蒸。国学生。生一子,应祥,配杨氏。生一子,溥,配许氏。

十四世祖讳福远
配李氏。生三子,长曰灏,次源,三澎,一女从郭门。

十五世祖讳灏
配魏氏。生四子,长曰道昌,次道立,三道恒,四道原,一女从黄门。

十五世(叔)祖讳源
元配杨氏,乏嗣。

十五世叔祖讳澎
元配傅氏,继配胡氏。生一子名道渊,二女。又周氏生一子,名道泉,二女。

十六世祖讳道昌
生于咸丰戊午年八月二十三日未时,殁于民国壬甲二十二年六月初八日酉时。配曾氏,生于咸丰辛酉年七月二十九日亥时,殁于民国辛未年八月十四日己时。生六子,长曰克贤,次礼贤,三聘贤,四亲贤,五思贤,六用贤;二女,长适马姓,次适黄姓。

十六世叔祖讳道立
元配李氏,继配赵氏,乏嗣。

十六世叔祖讳道恒
生于同治甲子年三月十三日戍时。生一子,名见贤。母陈氏,生于同治七年戊辰 月 日 时,终于光绪三世年申辰腊月十三日未时。

十六世祖讳道源
生于同治丙寅年腊月初三日酉时,终于民国辛酉年冬月十四日亥时。配魏氏。魏氏生于同治癸酉年正月十九日酉时,终于民国戊寅年五月初十日午时。生二子,长名择贤,次名尚贤。

十六世祖讳道渊
生于光绪庚辰年六月廿四日未时,终于民国丁卯年正月十六日吉时。配马氏,生于光绪辛巳年七月廿一日未时,终于公元戊戌年正月初四巳时。生二女,长适马姓,次付氏。

十七世祖讳克贤
生于光绪癸未年四月十四日丑时,终于民国庚甲年五月初六日戍时。配邹氏。邹氏生于光绪甲申年十月十八日丑时,终于公元庚子年正月廿一日未时。生一子,名汝贵;一女,适李姓。

十七世祖讳礼贤
生于光绪丁亥年二月初六日子时,终于民国壬子年七月廿九日辰时。配赵氏,生一子,名鑫培,后失传。

十七世祖韩聘贤
乏嗣。

十七世祖韩亲贤
生于光绪十八年壬辰七月二十一日亥时。元配陈氏,继配刘氏。生二子。

十七世祖韩思贤
生于光绪二十七年辛丑七月初六申时。元配陈氏,继配杨氏。生三子。

十七世祖讳用贤
生于光绪三十三年丁未四月初六子时。配苗氏,生于??乙酉年五月十七日寅时。生二子,长子保昌,生于正月二十二日寅时。二子生于癸未年腊月二十五日寅时,配时氏,长子配蒋氏。

十七世叔祖荐贤
配黄氏。丁亥年三月十七吉时。黄氏生二子一女。子生于二月初十亥时,二子生于丁未年八月二十八丑时,女生于九月二十七辰时。

十七世祖,四支称,韩公讳亲贤
元配陈氏,继配刘氏。生二子一女。长子汝祥,次汝发。亲贤生于光绪壬辰年五月十五日吉时,终于公元辛丑年三月十五日辰时。亲贤元配陈氏,生于光绪壬辰年吉月吉月吉时,终于民国戊午年六月二十五日吉时。亲贤继配刘氏,生于光绪甲辰年五月二十一日亥时,终于公元庚子年三月初四日申时。亲贤长子汝祥,原命生于民国戊辰年四月十八日吉时。配张氏,生于民国己未年九月二十五日子时。汝贤次子汝发,原名生于民国庚午年。配王氏建英,生于公元一九三五年五月。汝祥生二女一子。长女生于公元壬辰年八月廿九日申时,次女生于公元乙未年十月初十日亥时,子生于公元戊戍年二月初十日亥时。(本页自此处始行间错乱)。

十七世祖保贤
生于光绪癸卯年吉月吉日吉时,终于公元丁酉年正月十二日寅时。配夏氏,生于光绪辛丑年,终于民国甲申年四月廿六日寅时;杨氏,生于光绪丙午年吉月吉日吉时,终于公元甲辰年二月十二日酉时。

十八世祖汝祥、汝贵(自此处始数字不清晰,稍后补录)


南阳韩氏宗谱世系图

Posted: 二月 8th, 2007 | Author: | Filed under: 卧读 | 10 Comments »

图序


我韩氏一门,自始祖成公以下,凡二十世,宗谱录者,十八世而已矣。以春公始,仅记十七世。而世有更替,嗣见存乏,长房未必袭祖荫而光大门楣,次子或可继香火且世代不绝。数百年间,行旅驻戍之劳苦,悲欢离合之秘辛,仕宦营营之沉浮,庶民碌碌之晨昏,倏而俱往,茫然不可追矣。惟余故纸一十八页,藏于乡间农舍。修谱大事,由一姓之公义,忽变而成一房之私务。国既禁之不及,家亦承之无力,是故谱系湮没,宗族断绝,此非独吾一姓一门之殇也。每念及此,腕为之扼断,酒为之不能下。幸于弥勒县访获《南阳韩氏宗谱》,阅之有所感,遂录毕誊清,条分缕析,得世系图一。图者,文之辅也;既一目以了然,又纲举而目张。族胞同门,有偶见之者,或四顾而有追远之意,则图之为图,尤韩氏之为韩氏焉。十九世孙 磊 焚香沐手撰。



韩氏世系图


(点击看大图)


南阳韩氏宗谱序

Posted: 二月 7th, 2007 | Author: | Filed under: 卧读 | 145 Comments »

(磊按:近日访得家谱,谱名《南阳韩氏宗谱》。名之以南阳者,盖追往而溯源也。自有明成公以降十数世,虽只记一姓之本支,我中华世系,传承久远,于此谱亦可管窥,睹之令人神驰。兹录《序》于下。)

且夫家之有谱,无异国之有史。国史纪一朝之治乱、兴衰、人物、事迹,而家谱则记一门之祖德、宗功、本支、源流,继继绳绳,以相传于未艾。抑即以贻后世,子孙触目惊心,由曾元而上溯高远,有以知其所由来,常切水木本源之念,时存敦雍睦族之思;而春露秋霜、冬烝夏禴,于是乎仁孝之心油然而生矣。则谱之攸关,典至巨也。

弥邑东偏,离城五里许,有村名三道桥,有韩氏者,系出大姬。自晋公族武子封韩原,而韩遂氏焉。韩穿、韩厥皆其后也。累朝以来,世族日繁,代有开达。但势殊时异,地角天涯,文物无征,难以悉考。即有明之成公者,同太祖讨陈友谅,靖难鄱阳湖,恩赐状元,授统兵元帅,爵封侯,子孙世袭将军。兹复啧啧人口,及春公者,由山东济南籍。洪武中,随国公沐出镇云南,授指挥使。仕宦日久,子孙遂隶于滇,为滇一世祖。又三世,有昂公者,以成化戊戍进士,授顺天府宛平县,亦誉重当时。递及我朝,讳名伯公者,尤以康熙甲子举人,擢丁卯贵州乡试同考官,后掌成才书院,而滇黔之颂教养者,于兹未堕。是以越至于今,后裔(此处一字不清)隶昆明、居开化、住路南、留弥阳,亦皆子孙繁衍,人文蔚起。其间之采芹食气、掇巍科而膺显秩者,指不胜屈。所谓源远流长、根深实茂,其滇中之望族焉。

余因世乱,避居是村。子壻韩灏执谱而问序于余。余素不能文,又谊不容辞,文亦略,为之叙其始末,以翼将来之览。斯谱者,敦本睦族,时相砥砺于仁人孝子矣耳。是为序。

 

辛未岁进士菊轩愚岳 魏锡龄 沐手撰


老祖宗的事

Posted: 十月 15th, 2006 | Author: | Filed under: 卧读 | 12 Comments »

很小的时候,跟父母回老家(云南弥勒)。父亲一系,祖祖辈辈流传下来,县城边上的一个村庄,整村都是姓韩。我辈分颇高,和许多老年人同辈,甚至有老人家是我的侄辈。人小,也不懂那么多,跟着大人们上山扫墓、下跪烧香,除了一个“累”字,只记得打谷场上旋转的“磨秋”。

后来进了屋里,族中长房拿出家谱给我们观看。厚厚一本,是清朝重修的。翻开来,说第一代祖讳成,朱元璋手下将领,在鄱阳湖之战中,形势紧迫,扮作朱元璋自杀,让陈友谅军误以为对方首脑已死,致酿成后患。这位韩成的后代,不知从何时迁居云南,传到第十九代,就是我这一辈了。

家谱上还有一首四言的歌赋,用来给族中子弟取名排字辈的。先父字辈为“永”,传到我这里,新社会了,没按字辈来,爷爷给我取名为“子非”,被姨婆否定,最后得了个普普通通的“磊”字。“磊”字虽然普通,据说是可以上家谱的,只是自我以下,因为属旁支,就不能再忝列了。

事隔多年,对于族谱文字的记忆,渐渐模糊,只记得这位老祖宗的名字和大略事迹。今天心血来潮,上网搜索了一把,居然典出有据。《明史》卷一百三十三有:“先一日,左副指挥韩成,元帅宋贵、陈兆先战没。……韩成子观至都督,别有传。”又有“又程国胜者,徽人。……张定边直前犯太祖舟,国胜与韩成、陈兆先驾舸左右奋击,太祖舟脱。”皇甫录《皇明纪略》有:“ 太祖征陈友谅于鄱阳湖,被围甚迫,介士韩成谓服龙袍冠冕诳贼,投水死,围解。友谅平,上念成忠,赐封高阳郡侯 。”成谥“忠壮”,史称“高阳忠壮侯”。

韩成子名韩观,《明史》卷一百六十六(列传第五十四)有:

韩观,字彦宾,虹人,高阳忠壮侯成子也。以舍人宿卫,忠谨为太祖所知,授桂林右卫指挥佥事。

洪武十九年讨平柳州、融县诸蛮,累迁广西都指挥使。二十二年平富川蛮,设灵亭千户所。二十五年平宾州上林蛮。二十七年会湖广兵讨全州、灌阳诸瑶,斩千四百余人。明年捕擒宜山诸县蛮,斩其伪王及万户以下二千八百余人。以征南左副将军从都督杨文讨龙州土官赵宗寿,宗寿伏罪。移兵征南丹、奉议及都康、向武、富劳、上林、思恩、都亮诸蛮,先后斩获万余级。

观生长兵间,有勇略。性鸷悍,诛罚无所假。下令如山,人莫敢犯。初,群蛮所在蜂起,剽郡县,杀守吏,势甚炽。将士畏观法,争死斗。观得贼必处以极刑。间纵一二,使归告诸蛮,诸蛮胆落。由是境内得安。

二十九年召还,进都督同知。明年复从杨文讨平吉州及五开叛苗,与顾成讨平水西诸蛮堡,还理左府事。建文元年练兵德州,御燕师无功。成祖即位,委任如故。命往江西练军城守,兼节制广东、福建、湖广三都司。

庐陵民啸聚山泽。帝不欲用兵,遣行人许子谟赍敕招谕,命观临抚之。观至,众皆复业,赐玺书褒劳。命佩征南将军印,镇广西,节制两广官军。帝知观嗜杀,赐玺书戒之曰:“蛮民易叛难服,杀愈多愈不治。卿往镇,务绥怀之,毋专杀戮。”会群蛮复叛,帝遣员外郎李宗辅赍敕招之。观大陈兵示将发状,而遣使与宗辅俱。桂林蛮复业者六千家,惟思恩蛮未附。而庆远、柳、浔诸蛮方杀掠吏民,乃上章请讨。

永乐元年与指挥葛森等击斩理定诸县山贼千一百八十有奇,擒其酋五十余人,斩以徇。还所掠男女于民,而抚辑其逃散者。明年遣都指挥硃辉谕降宜山、忻城诸山寨。荔波瑶震恐,乞为编户。帝属观抚之,八十余洞皆归附。明年,浔、桂、柳三府蛮作乱,已抚复叛,遣硃辉以偏师破之。蛮大惧。会朝廷遣郎中徐子良至,遂来降,归所掠人畜器械。

四年大发兵讨安南,诏观画方略,转粟二十万石饷军。已,复命偕大理卿陈洽选土兵三万会太平,仍令观侦安南贼中动静。寻从大兵发凭祥,抵坡垒关,以所部营关下,伐木治桥梁,给军食。安南平,命措置交阯缘途诸堡,而柳、浔诸蛮乘观出,复叛。

五年,观旋师抵柳州。贼望风遁匿,观请俟秋凉深入,且请济师。帝使使发湖广、广东、贵州三都司兵,又敕新城侯张辅遣都督硃广、方政以征交阯兵协讨。十月,诸军皆集,分道进剿。观自以贵州、两广兵由柳州攻马平、来宾、迁江、宾州、上林、罗城、融县,皆破之。会兵象州,复进武宣、东乡、桂林、贵平、永福。斩首万余级,擒万三千余人,群蛮复定。捷闻,帝嘉劳之。

九年拜征夷副将军,仍佩故印,总兵镇交阯。明年复命转粟给张辅军。辅再出师定交阯,观皆主馈运,不为将,故功不著。

观在广西久,威震南中,蛮人惴惴奉命。继之者,自山云外,皆不能及。十二年九月卒,无子。宣德二年,保定伯梁铭奏求观南京故宅。帝许之。既闻观妻居其中,曰:“观,功臣地,虽殁,岂可夺之?”遂不许。令有司以他宅赐铭。

朱国祯《涌幢小品》称:“韩观,韩成之子。成从明太祖,战死郎康山。观永乐时(1403-1424)镇交趾。前此为两广提督。到任,生员往迎,衣着特殊,观命斩之。侍从曰:生员也。观曰:生员亦强盗。朝延谓能应变立威,嘉之。以杀人太多,御史擬揭发之。乃请御史饮。设人皮坐褥,头、发、眼、耳、鼻皆全。菜上,盘中盛一人头。韩取箸抉其两眼食之,曰:它禽兽眼均不中吃,惟人眼味最美。御史战栗而去,不敢揭发。”

如果朱国祯所写属实,则我们家的第二代祖宗韩观先生,所做所为实在生猛,令人毛骨悚然。

在网上,还查得很多有趣的事情。例如,南京有一条韩家巷,即是上文保定伯求而不得的韩观故宅所在。又有新闻报道说,在南京郊外韩府山,发现悬棺,专家疑为韩成衣冠冢。如此等等,不一而足。回想起来,韩成、韩观以下,我族历代血脉传承,家谱上均有详录。只是《明史》称韩观无子,存疑。待有日再回家乡,应找到族中长老,借出家谱,抄录一份,对照史书阅读,当有无穷趣味也!


Blog连锁游戏:读书

Posted: 八月 24th, 2006 | Author: | Filed under: 卧读 | 2 Comments »

Tiny点名,不免要回应一下。只是可选太多,只好把“一本”的限定词去掉了……

1、你读了不止一次的书

这样的书有很多,比如《西游记》、《水浒传》、金庸的所有长篇、四书五经、《汉书》、《史记》、《大卫·考坡菲》、Canterbury Tales……其中,读了最多遍的,估计是《诗经》、《西游记》、《水浒传》和《易经》:《诗经》让我学会欣赏诗,《西游记》让我懂得怎样描写人物性格,《水浒传》让我懂得用动词和形容词,《易经》让我树立自己的哲学观和世界观。

2、身在沙漠时想读的书

缺乏相关体验。如果缺乏装备、处于比较危险的状态,应该是《沙漠求生指南》;如果是在沙漠绿洲上吃椰枣,看看《荒漠甘泉》啥的,估计不错。

3、让你发笑的书

《好兵帅克》和《闵豪生奇游记》。

4、让你哭的书

《射雕英雄传》里面,郭靖黄蓉躲在牛家村暗室疗伤一段对话,差点哭了。不知道为什么。

5、你希望是自己写的书

没有。我有我的风格,写不出别人的书

6、你希望从未写就的书

“写就”,是指“写完”呢,还是“写了并存在”?后者太多,前者,《水浒传》,招安之后的部分都不爱看。《西游记》也是,希望师徒4人的冒险永远继续。

7、正在读的书

《永玉六记》。老头这辈子不容易,成精了。

8、读来有意味的书

什么叫“有意味”?是有弦外之音,还是读来别有一番滋味?如果是前者,不知道;如果是后者,《通志堂集》和《闲止书堂集抄》。

9、一本改变你一生的书

太多,太多,太多了。生命永远在改变,每一本让我有感触的书,都在改变未来的人生。

上次玩这类游戏,我就让它短路了,这次不例外,短路了事。


入门不简单(《Beginning C# Objects中文版》书评)

Posted: 三月 29th, 2006 | Author: | Filed under: 卧读 | 31 Comments »

由于工作性质的关系,我常常需要为公司面试程序员。通常,我会首先要求应聘者做两件事:第一,口头说明虚方法、抽象方法、接口之间的异同和使用场景;第二,脱离IDE,手写一个简单的WinForm程序(例如包括布局整齐的两个文本框和三个按钮、点击按钮弹出消息框显示文本框内容),然后在命令行编译运行。第一题是考面向对象中的继承和多态概念,第二题则是考C# GUI类和关于委托等C#独有特性的基础知识,以及编译、调试技巧。很遗憾,有一大半的应聘者会在这两个简单考题面前败下阵来。尤其是第二个考题,甚至难倒了一些写代码有年头的程序员。为什么?因为这些程序员不具备基本的面向对象知识,更加不理解C#的面向对象实现手法。


这不能完全归咎于中国计算机教育。实际上,在美国或其他发达国家,真正懂得面向对象开发的程序员也并非随处可见。这也是Beginning C# Objects(及其Java原版本Beginning Java Objects)一书成为畅销书、并在Amazon上获得读者极高评价的原因。作者写道:“我们常常与一些软件开发者会面——在工作场所、在客户办公室、在专业会议上,或在大学校园里——这些开发者都尝试去掌握一门类似C#的OO编程语言,他们参加C#培训、阅读关于C#的书,或是安装和使用像Visual Studio .NET这样的C#集成开发环境(IDE)。然而,这是舍本逐末的做法:他们缺乏对什么是对象的基础认识,更为严重的是,缺乏利用对象从头开始构建软件应用程序的知识。”


翻开市面上任何一本你能找到的C#入门书,看看第一章讲什么,第一个范例是怎么实现的。闭上眼睛你都能告诉我,第一章多半是讲怎么安装VS.NET,第一个例子多半是拖一个按钮控件到窗体,双击后输入一段调用消息框的代码。我们的技术作者们,就是这样把读者引入歧途的。IDE(集成开发环境)能极大地提升生产力,但开发应用程序所需的高度专业的知识和技能,却非IDE所能代替。的确,任何一个菜鸟也许都能利用可视化组件拼凑出“看起来还不错”的应用程序,但这样的程序却将带来高昂的扩展和维护成本。


面向对象编程,绝非一些可视化组件那么简单,它涉及人类思维(抽象)模式、建模符号体系、面向对象方法学等诸多方面,对开发者有较高的要求。功夫过关的开发者,不止是技术高手,同时也一定会是有深度的思想者。把需求从自然语言翻译为对象模型,再把对象模型翻译为特定语言代码,殊非易事。最基础的,到底什么是对象?如果你曾经好好思考过这个问题,就会得到很多启发。例如,现实世界中的一张纸,如何抽象为计算世界中的对象?这个对象将具有那些特性(属性和行为),例如尺寸、颜色、质地、折叠、裁减,卷筒……?综合来看,面向对象的要素是什么?把事物抽象为对象的过程,是做思维体操的过程,也是极富挑战性和乐趣的过程。如果你还还不了解对象和面向对象的概念,或想与作者一起就该话题做更深入的思考,那本书第一部分就是最好的入门手册。


我认识一些优秀的程序员朋友,他们在大学时念的专业是建筑。这些朋友对应用程序架构和/或开发流程,有近乎严苛的要求,因为他们深刻地理解,蓝图、材料、工序……对于建造房屋是多么的重要。对象模型的静态方面(域类、数据结构等)在应用程序中开发相当于建材单元,而动态方面(行为、方法等)则是关于建材之间如何组合的指导书,它们合起来,构成一个应用程序的“蓝图”。越是复杂、大型的应用程序,对蓝图的要求就越高;即便是简单的应用,有蓝图也比较有利于维护、升级和扩展。给你一份需求说明书,你将如何分析它、并且组织出正确的对象模型(蓝图)?如果你对此信心不足,建议好好阅读本书第二部分。


第三部分涉及的范例,在有经验的开发者眼中看来,似乎过于简单。其实不然。整个开发过程当中,没有使用IDE拖放过任何一个控件,或在IDE中编译调试。这样做的目的有二:一、让读者可以掌握.NET Framework和C#本身的特性,而不会被IDE的花哨界面所迷惑、急于求成;二、帮助读者学会用正确的手法和模式(如公认的MVC模式)开发程序。例如委托(delegation),这是.NET Framework中一种特别的语言元素,也不易理解。如果你只懂得往窗体放一个按钮,双击该按钮,输入一行代码,那么你永远不会明白,这个过程体现了利用委托实现事件处理的巧妙手法。但是,如果让你脱离IDE编写事件处理方法,你就很快能明白这个道理,而且也知道怎么用于实践。IDE能提升生产力,不过它却不能凭空创造生产力,本源的生产力还是来自开发者的知识与技能。


面向对象编程已经流行多年,然而还是有无数的入门者在入门阶段就走错路子,抱着错误的观念、用错误的方式开发着意大利面般一团乱麻的程序。入门不简单,对于初学者如此,对于有经验的开发者,更该回头检讨自己在面向对象编程领域的经验是否根本就是错误或细枝末节的经验。本书作者开发和培训经验丰富(一位是NASA开发工程师,一位是大学教师和对象技术专家),理解面向对象程序员可能进入的误区和面对的挑战,他们知识与经验的总结,形成了这么一本用心良苦、循循善诱、深入浅出的C#面向对象开发指南。每一位C#开发者,无论有经验还是没经验,都该读读这本书。入门不简单,你真的入对门了吗?


(本书将由电子工业出版社于2006年5月出版)