ieasy.org上的jabber服务开始支持SSL了,它的SSL证书由CAcert.org签署。 CAcert.org是一个提供免费安全认证的站点。这也是我选择它的原因。
但是,问题在于CAcert.org的根证书并没有为大部分软件所包含,像Firefox、IE都没有包含,所以你得去https://www.cacert.org/cacert.crt 来安装证书才行。当然常用的jabber客户也没有包含,你需要手工的设置才行。
对于Psi的用户,可以简单的安装这个文件cacert.org.xml到psi所安装的目录(一般是c:\program files\psi\)下certs目录就可以了,关于这份证书的正确性,你可以到https://www.cacert.org/index.php?id=3下载CAcert.org的根证书对比一下即可。你也可以手工添加:)
关于CAcert.org 还想说两句,它提供了客户端证书用于验证客户,也提供了服务器证书。挺不错的。不过好像客户端的证书用于加密邮件在thunderbird 和 outlook上都没有成功。主要是导入证书的问题。回头有时间再仔细研究:)
从这里下载了jabberd 1.4,从这里下载了jabber's msn transport. 遵照邮件列表中的
这篇email,我终于安装调试好了MSN Transport :) 以后不用出过代理,就可以上msn了:P
几天以前,ieasy.org上的jabber服务搞定了。以后有兴趣的可以使用ieasy.org作为jabber服务器。现在支持注册新用户。暂时还不支持SSL和其它的Transport服务。以后有时间会逐步摸索把服务都建立起来。
接触jabber这个东东,主要我是想在我的Palm Tungsten W 上使用MSN, 找到了Chatopus, Chatopus是一个palm os上运行的jabber客户端。依仗着jabber server的msn transport服务,我就可以用我的pda上msn了。
现在的问题是,palm os 4上QQ的客户端很少,有的话也很不好用,j2me的。如果能有支持transport 到QQ的jabber服务就好了。可惜经过考察,现在没有:(。 于是我打算自己写一个,第一步就是架一个jabber服务器啦,呵呵。然后考察现有的QQ客户端实现:OpenQ, perl-oicq,lumaQQ. 研究jabber transport的工作原理。 这些天太忙了,等忙过了这段,就开始研究,有了好结果再向大家汇报:)。
我的JID是
在学校里,不能直接连接国外网站,当然我们有办法找到代理来浏览网页 :P . 不过对于fetchmail + mutt的邮件解决方案,fetchmail怎么利用代理收gmail的信呢?
首先你得有能用的socks代理。
其次,你需要有runsocks或者tsocks这一类socks客户端。这种客户端当你配置好配置文件以后,可以用runsocks command的方式运行你的程序“command”,它就会用socks代理出去了.关于这么配置,我就不赘述了,请参照文档。
这时,你可能已经想到,那我直接用runsocks运行fetchmail不就行了么? 没错, 当然可行,不过前提是你的fetchmail是支持SSL的。而且有些小问题:
1。有可能你的fetchmail不止收取一个gmail的信件,还有其他服务器的,比如(eyou.com? :P),他就是国内的了,用了代理反而慢了。(当然这个问题也能解决,比如你自己在本地建一个socks代理,配置成访问指定目标地址时使用另一个站外socks服务)
2。还有可能,你的整个Linux系统就只运行了一个fetchmail daemon他是全局的,读取所有用户的配置文件,你没法让它以runsocks运行,或者你不想修改配置好的/etc/init.d/fetchmail启动文件。 那就可以用我下面说的方法:
答案是:stunnel . stunnel可以建立一个SSL的tunnel. 看下面这个命令
runsocks stunnel -d 10000 -c -r pop.gmail.com:995
-d 10000 表示在本地监听10000这个TCP端口。-c 表示使用client模式。 -r pop.gmail.com:995 表示连接远程的服务器以及端口。
运行完这条命令之后,你在试一下telnet localhost 10000 ?然后再输入 user yourid, pass yourpass , list, exit等POP3会话命令试试,可以了吧? 没错,我们在本地10000端口和远程的pop.gmail.com:995建立了一个tunnel,而且是脱掉了SSL的,就是明文,(没关系,这是本地的连接,不怕sniffer的).
利用这种方法,你只需要在你的fetchmail配置文件中配置主机为localhost,端口为10000就可以了。
BTW:值得提到的是,fetmail是支持plugin的,在命令行里写 --plugin "command %h %p" 或者在配置文件里写 poll xx.xx.xxx.xx plugin "command %h %p", command就是你提供的程序,%h是host,%p是port,fetchmail从command的stdout读东西,把要写数据写给command的stdin,
所以我们又有了一个方案,前提是fetchmail支持ssl, plugin里面写
plugin "runsocks nc %h %p"
其中nc就是有着TCP/IP瑞士军刀之称的 netcat
awstats是一个极好用的网站访问日志统计工具,它可以统计每天/每月的访问量,大家通过哪些搜索引擎,搜的什么关键字才来到你的网站的. 访问你的人都来自那些IP,那些国家,使用什么浏览器等等。 使用这样的工具,你就能更好的把握你的网站的用户群的爱好,呵呵
这次,我介绍一下显示来访者地区的插件。awstats是可以增加插件的。我做的这个qqhostinfo插件,可以在访问主机表格中增加一列,显示ip对应的位置。当然这个资料来源于著名的QQWry.Dat文件。上一篇blog我介绍了一个用perl脚本写的查询ip地址位置的程序。刚好,awstats的插件也需要perl来写。
1。首先,点击这里下载插件。把它放在awstats/wwwroot/cgi-bin/plugins中。
2.下载上一篇blog提到的分析QQWry.dat的perl脚本。放在同一目录。
3。去网上下载QQWry.Dat放在同一目录中,注意文件名一定要是QQWry.Dat
4。编辑你得awstats配置文件,大概在LoadPlugin="hostinfo"的后面增加一行
LoadPlugin="qqhostinfo"
现在,应该就好了。效果大概是这样的。 (Location这一列)

非常想自己写一个程序分析QQWry.dat的格式, 从而使用在我的网站日志分析程序中。由于ieasy.org用的是awstats,支持perl写的插件,我就打算写一个perl脚本。
找到如下信息:
《关于QQwry格式》 http://dev.csdn.net/article/33/33563.shtm
正当我想自己写的时候,碰巧找到了雷傲论坛的代码,里面正好有perl写好的:) 这里下载 用的时候,把脚本的保存为qqwry.pl,再去http://www.cz88.net/下载一份最新的QQWry.Dat,
写一个你得Perl脚本test.pl,如
#!/usr/bin/perl
use strict;
require "qqwry.pl";
print ipwhere("${ARGV[0]}");
print "\n";
$./test.pl ip地址
hehe,这样就可以查了 .下一篇blog我会讲讲怎么写那个awstats的插件。
hehe,是我2002年写的。只支持vc6
以前都是在linux下编程序,现在改到写vc程序,便觉得visual studio内置的编辑器非常的不好用,呵呵 :)
下载了一个vim for windows 6.1之后,看了一下文档发现早就有人有同感了,写了一个VisVim( vim add-in )来解决,现在把安装心得和大家共享一下
1.首先安装一个vim
可以到ftp://ftp.vim.org/pub/vim/pc/gvim61.exe下载一个完全的安装版本 这个东东比较大, 但是比较方便。呵呵。当然你也可以去下载相应的OLE GUI executable 和runtime files 但是注意一定要是OLE 的GUI版本才行。
2.到你的vim安装目录下,假设是e:\tools\gvim
>cd e:\tools\gvim
>cd vim61\visvim
>regsvr32 VisVim.dll #win95/98可以跳过这步
3.要是你还没有注你的OLE gvim
>cd e:\tools\gvim\vim61
>gvim -register
4.打开visual studio 运行
Tools
Customize...
Add-Ins and Macro Files
5.点Browse 找到gvim\vim61\visvim\目录下面VisVim.dll
6.选中新加入的这个Add-in,关闭对话框
7.这时你就可以看到工具条上的Vim按钮了。第一个按钮会弹出一个设置对话框 。。。。这之后我就不讲了。
到现在为止,你只需要配置好你的gvim 比如字体呀、颜色呀、自动缩进呀、语法呀什么的就行了。是不是很好用? :P
http://blog.csdn.net/ultralzl/archive/2004/07/16/42931.aspx
计算机寓言 - 信息时代的启示
目录
引言 III
第一篇 秋 1
第二篇 冬 15
第三篇 春 29
第四篇 夏 43
引言
(一次前前往西藏拉萨的超越机器学院的旅行。)
虽然我的C.P.Yu博士通信交往已有多年,但我从来没有见过他的面。去年《编程之禅》出
版后不久,他给我的信停止了。几番查询也无济于事,不知道发生了什么。我别无选择,
只好长途跋涉去拉萨看看我的良师兼益友是否安危无恙。
这次旅行由五次乘飞机,两次乘火车和一次骑大象组成,平安无事。不久我发现自己正沿
着陡峭的石头小路往上爬,这条小路直通座落在云层之中的西藏大学。
小路的尽头是一扇厚厚的石门,门外挂着个铜钟。我双手握紧钟舌重重一击,钟声在山峦
之间回响萦绕。一群栖息在附近草丛中的鸟儿,,被这深沉的钟声惊吓得振翼拍翅,像一
阵和风似的从头上飞过。
此时,一位身穿褴褛长袍的老者从门边出现了。"这个入口仅仅是为举行仪式准备的,”
他说,“请随我走学生入口吧。”
我随他来到旁边的一扇小木门前,刚要抬脚进门,老者用他的小手指顶在我的胸口上,把
我给拦住了。“你为何来这里,西文的野蛮鬼?”他礼貌地问。
“我是来看Yu博士的。”
老者扬了扬一条眉毛,然后让我进去了。
这里和我所期望的大相径庭。在我的脑海里,早已勾画出了一套具有现代中国传统风格的
简单建筑。但是恰恰相反,我看到了一排排拱塔,塔身包裹着褪了色的红漆。沿着四周的
墙有许多壁龛,里面供奉着古代的神像。其中一个雕塑尤其令我记忆深刻。它是位女士,
从身躯里伸出许多臂膀来,每只手上都拿着一张卡片,卡片上戳有一些微型方孔。屋子主
人注意到我对此很兴趣,就在一边说:“老了,很老了。没有人知道她的名字。
我们爬上了一条楼梯,尽头是一扇小铁门。主人用一张塑料安全卡把门开了。一排杂乱的
古代计算机设备展现在眼前,奇异的磁盘驱动器和古旧的主机,被大衣挂钩和裸露的电缆
缠绕在一起,计算机的机箱几乎被埋在了厚厚的灰层里,一堆发霉的MS-DOS使用手册散
落在一边。很明显,这个房间已经很久没有人进来了。
“Yu博士死了,”主人说:“这里是他度过他最后时刻的地方。当时在操作系统里有一个
错误,他没能来得及排队这个错误就。。。”他的声音渐渐小了。因为无法控制自己的感
情而感到羞愧,他转身下楼去了,把我一个人留了下来。
正在我想跟他下楼时,听见一阵奇怪的噼噼啪啪声。这是一台原始的打印机,不知怎么回
事,它竟然被满打满算了。一条慢慢的纸流从窄槽里漫了出来,落到布满灰尘的地板上。
然后,随着一阵呼哧呼哧声,打印机停了。我几乎不知道自己干了些什么,便糊里糊涂地
收拾起那些纸张,匆匆离开房间。铁门在我身后吱吱呀呀地关上了。
老者正在楼底上等我,他领着我穿过迷宫式的院子,然后把我半推出了门。“下次带些多
余的内存条来,”他说,“我们这里很紧缺。”接着便在我身后把门关上了。
下山的路走了一半,我才想起来看看打印机上的内容。那是一套寓言集,很明显,它是
Yu博士最后的作品。我很快便意识到,这些寓言是他的遗言,是他对信息时代的启示孜孜
不倦进行探索的记录。
第一篇 秋
虚幻与真实
1 彩虹
一间大办公室,里面满满地有许多工作间。每个工作间都坐着一位男士或女士,身着蓝色
的服装。电话铃声此起彼伏。电脑屏幕发出的琥珀色光线映在无色的天花板上,非常刺眼
。
窗外,暴风雨来临了,雨点砸在地上,狂风猛烈地摇着树梢,雷声运动着这幢黑色砖墙的
建筑物。
男士和女士们根本没看见这场暴雨的到来,也没听见狂风的呼啸。
突然,灯光暗了下来,屏幕上变成一了片空白,电话铃声哑了。人们咒骂着,像一只只小
虫从那些方形的茧包中钻了出来。
人们聚集到一起,谈论着,笑声充满了整个走廊。
一位男士,站在窗外户边看着这场暴雨过去,一道彩虹金光闪闪地挂在东方的天空上。
2 机器人
一位科学家用他自己的形象制造了一个机器人。科学家坐在自己的创造物前,看着它脸上
奇怪而熟悉的笑容和丰富的表情,恼了。他想测测这个机器人的智商,便问机器人:“这
个宇宙始于何时,又将于何时轮回?”
机器人回答说:“这个宇宙在我出生的时侯被创造,在我死亡时它也将结束。当我行走时
,我并不移动--相反,是世界在我的脚下移动。当我闭上眼睛时,除了虚空以外不存在
任何事物,但当我两次睁开眼睛时,世界便一眨眼又回到了现实中来。没有什么东西是真
实的,没有什么东西是永恒的。当我离开一个地方时,这个地方就像烟雾一样散去;只有
当我回来时,它才又重新出现。除了我本身以外,没有任何东西存在,我就是虚无的上帝
。”
科学家得意地点点头,“我明白了,你毕竟只是台计算机而已。”
3 专家系统
一位计算机科学家和一位年轻的女士结了婚。科学家知道他将早她去世,于是开始营建一
套专家系统。这是一套能录制他所知道的任何事情的程序。当系统完成时,他对妻子说:
“从现在起你将永远不会孤单。”
不久以后他死了。他的妻子从葬礼上回来后,把那套专家系统调到了电脑屏幕上。她那死
去丈夫的面容出现了。她对着屏幕讲话,屏幕便立刻作出了回答。
她流着泪将那套程序从电脑中删除了。当有人问她为什么时,她说:“我太爱我的丈夫了
,以致于不能用那种方式来想起他。”
4 电脑色情狂
以前有一个男子酷爱色情画。他买了一台昂贵的电脑,这样他就能观看高分辩率的女人裸
体照片。他亲热地给他的电脑取了个名字叫“安琪儿”,并花费大量的时间来观看他所收
集的照片。
不久,他便对现实中的女人失去了兴趣。当有人问他为什么时,他回答说:“我的电脑是
我创造的世界,它顺从于我的每一个念头。当我坐在屏幕前,我就像一个上帝,为什么我
要浪费时间在现实中那些不合意的或纠缠人的女人身上呢?”
一位程序员听到这话,抱怨道:“为了这样的一种基本目的而使用电脑是完全错误的,你
应该活在现实的世界里。”
那个色情狂便问程序员:“顺便打听一下,你用你的电脑干些什么?”
程序员骄傲地挺起了胸脯,“我编写程序来模拟经济趋势。”他说。
5 新闻发布会
一名市场营销员和一名程序员都在一次新闻发布会上发言,将一项有关新的电脑技术的消
息公布于众。
市场营销员说:“这项技术比原子弹、晶体管和电话三项发明加起来对世界文明的影响都
要大。”
程序员则是说:“这项技术在有限的领域内,在有限的程度上,解决了一些技术性的问题
。”
猜猜看,记者们将会引用谁的发言。
6 神符
从前有个巫师,他非常强大并且功力深厚。一天晚上,一轮昏暗的月亮出没在天空,一尾
彗星像不祥的眼睛挂在西边。此时,巫师制作了一张力量的神符。在那神符上面有许多圆
圈、方块、线条、箭头和词--有魔力的词,如建筑、信息、自动化、集成、分销。
然后,巫师把他那飘逸的乡满银色的星星的长袍扔在一边,穿上了羊毛三件套,朝硅谷奔
去。
他走进一位军机大臣的办公室,说:“看啊,用这张神符,我们将捕获人们的思想。不计
其数的黄金将飞进我们的保险箱,不可限量的电脑资源将归入我们的项目。”
军机大臣拉开他的抽屉,翻出了一大堆纸张,每一张上面都有不同的神符,“我的神符已
经够多了,”他说,“我所需要的是一套好的,稳健的和有用的程序。”
巫师只好回去了,他气得直咬牙,咒骂这次倒霉的运气。
7 垃圾和福音
一名程序员参加了一次业务讨论会。
第一位发言的人把一张胶片放在投影幻灯机上,许多组数据便在屏幕上显现了出来。“这
张表格向我们显示,”他说,“我们将会赚很多钱。”
程序员问:“当你准备这张表格时,你是做何种设想?”
那位发言人挠挠脑袋,“我是在电脑上制作这张幻灯片的。”
程序员咬着牙,“你不曾听说过‘垃圾进,垃圾出’(Garbage In, Garbage Out)这句
话吗?”
那位发言人仰头大笑:“你引用错了,正确的说法是‘垃圾进,福音出’(Garbage In,
Gospel Out)!”
8 人工双脚
一位著名的科学家正在预测电脑的未来:“在人工智能方面的发展,将导致电脑在各个方
面都与人平等。电脑将会被编程以便能够作决定,并提供定于想像力的解决方案,甚至感
受人的情感。”
那天晚上,科学家梦见他的双脚变成了两只轮子。
9 考试
一位编程初学者问编程大师:“幻觉和真实之间的区别是什么?”
大师考虑了一会儿,然后让那位初学者在屏幕上敲入单词“THUNK”(thunk,计算机中的
形式实在转换程序--译注)。“现在大声朗读这个单词。”大师命令道。
初学者读道:“TUNK”。
就在这里,大师重重地敲了一下初学者的头。
初学者揉着耳朵问道:“你这是不是意味着,疼痛是真实的,而屏幕上的那个单词却不是
呢?”
大师叹了口气,“孺子不可教也。”,他说。
10 示意图
编程大师叫他的一位初学者画了张计算机系统图。真实这位初学者画了张软件图,但图上
没有标示硬件;然后他画了张硬件图,但图上又没有标示用户;接着他画了张用户图,但
又没有标示功能;于是他又画了张功能图,但却没有标示软件。最后这位初学者沮丧地放
弃了,并对大师说:“这个系统太复杂了,根本无法画在一张图上,它不可能在同一时刻
被全部理解。”
大师听到这里,笑了一会儿,随后开始哭了起来。初学者问他为什么,他回答说:“你认
为计算机系统很复杂,但与一只的眼睛相比,它还不算复杂。繁衍生命的地球的系统要远
远复杂得多。而在数十亿个太空世界中,地球本身仅仅是一颗行星而已。”
“初学者说:“我还是不明白,你为什么笑了又哭呢?”
“这还不明显吗?因为资本主义和共产主义之间的区别,这就要引发战争了。想想看--
那些经济理论系统顶多是浩瀚宇宙中无足轻重的一方面的不完整的图表。然而,有些人却
因为在某种抽象的教条上产生了就要毁掉这个地球。这不可笑吗?这不可悲吗?”
11 树叶
一位公司行政官花了一上午时间听取其下属的汇报,在每个汇报结束时,汇报人都交给他
一叠写满实际情况和数据的文件。
到了中午,行政官把那堆文件塞进了他的公文包,向大家匆匆致谢后便离开了大楼。时值
深秋,片片树叶被大风从那半秃的树枝上扯摘下来。
突然,他的公文包的锁扣断开了,那些文件被风摇着,翻腾着,同那些黄色的烂树叶混在
一起,像一群受惊的鸟飞散开来。
第二篇 冬
战争与死亡
1 盖娅
盖娅对她最聪明的孩子曼说:“你将成为我的才能的管家。”曼投入盖娅的怀中,对她非
常尊敬。
但是,一个邪恶的念头闯进了曼的脑海:“只有我的身体是属于盖娅的,我的灵魂属于来
世,并且将从此轮回。”于是曼不再崇敬盖娅。
然后,又一个邪恶的念头闯进了曼的脑海:“因为我比盖娅强大,所以我应让她成为我的
奴隶。”
于是曼用庞大的刑具来折磨盖娅,他弄破她的皮肤露出了骨头,把浓烟灌进她的鼻腔里,
泼脏水到她的胸上。
盖娅对曼说:“你冒犯我,后果自负。”但曼听不进她的话,那些话对他来说是耳边风或
海里的潮汐。
于是,盖娅抬起手,将灾患--吞食生命的灾患降临在了曼的身上。然后,盖娅流着泪召
集她的那些不听话的孩子们回到了她的发源地,回到了那个寒冷的却又舒心的地球上。
2 战争机器
一位将军对一位考古学家说:“看啊,这台已经造好的机器,它能在片刻之间便招来死亡
,它的一小块铁片要比古代的珍宝昂贵得多。这不是奇迹吗?这台毁来者机器?”
考古学家拍着那台战争机器冰冷的金属外壳,非常难过,就像一个人拍着即将离别的朋友
的脸庞。然后他说了这样一番话:“一天,我走过一片空地,我发现了一把又旧又钝的剑
,我拾起它,但它在我手中腐烂了,不值一文。”
3 两位老人
两位老人坐在公园的长椅上,谈起了过去的时光。
“当我年青的时侯,”第一位老人说,“我是海军士兵,我在每个港口都有个女孩。当我
年纪大点时,我是名推销员,我在每个城镇都有个女孩。当进入中年时,我又花钱买来许
多漂亮妓女服务。现在我满腹哀,因为我不久就要死了,再也尝不到女人肉体的快感了。
”
“我的生活却不同,”第二位说,“当我和我的妻子刚刚结婚时,我们一个晚上做两次爱
,对于刚刚开始的爱的激情我们不知所措。随着我们年纪的增长,我们做爱频繁了,但每
一次爱抚都充满了缠绵的快感。当进入中年时,我们很少做爱,但我们的灵魂就好像融为
一体。现在,我充满了喜悦,因为我将在死亡那无穷无尽的永世,永远地爱她。
4 影子武士
一位初学者对编程大师说:“对于我们所编的一些软件,我感到越来越不安。如果我们的
程序被用在战争的武器上,那么,我们不是要为因此而导致的死亡负责吗?”
大师回答说:“在未来,战争将要依靠计算机,而不是钢铁和肉体。那些迷失于茫茫数据
之中的将军和政客们,将忙于模拟和幻觉而不能自拔。那里,世界将得到拯救。”
5 医学研究者
有一位科学家常用动物做实验。他全神贯注于他的研究,笼子里动物惊恐的叫声,他充耳
不闻;活生生的大脑被剖开后用夹子夹着,他视而不见;强腐蚀性的药物胶布下面散发出
的腐烂的肉体的异味,他似乎也没闻到;当他的实验品死了时,他也感觉不到解脱。
一天,这位科学家得知自己患了癌症。“我多么高兴呀,”他想,“诸如我之类的科学家
经过长期劳作,现在终于找到了治疗这类疾病的办法。”
六个月后,这位科学家躺到了医院的病床上。受化学疗法的影响,他的头已经秃了,身上
的褥疮浸透了纱布绑带。一根根管子插进了他的血管,一副氧气罩往他的肺里充着气。
死神就坐在床边,没被人看见。“我认为,我应该让他活得更长些。”死神说。
6 舰载系统
有一艘军舰,装备了一套尖端的计算机系统。一天,这艘军舰击落了一架民航客机。海军
的一位代表说:“我们的系统极为先进,不会出任何差错。尽管这套系统从未被调试过,
它也没有出差错--是一位年青军官出的错。”
一位程序员听到这话,简直不能相信自己的耳朵。“只有凶手才可能会这样说,‘我是清
白的,那不是我--那是我的手钉的。’一套计算机系统由三个部分组成:硬件、软件和
人。如果人犯了错误,系统早就已经失效了。”
7 宇宙飞船
十三名科学家聚集在一起,互相谈论着:“我们已经给地球千万了无法修补的污染,让我
们再寻找另一个世界来居住吧。”
于是他们建造了一艘宇宙飞船,飞船载着他们穿过空荡荡的太空。这个航空器呈圆形,里
面所有的东西也是圆的。废物经过处理后变成了食物,即使空气中的水分也被收集起来再
利用。靠这样的方法,他们试图模拟地球的生态系统。
那些科学家在太空里航行已经有很多个月了。一天,废物处理器破裂了,剧毒的沉淀物涌
了出来。疾病开始在那些科学家中间滋生,他们一个接一个地都死去了。
8 博物馆
有位富人一次把大笔的钱花在制造低温箱上,他想让他的身体能在他死的时侯被冷冻住,
并能在未来的某个时侯复活。
两个星期以后,他参观了一座博物馆。在那儿,蜡封的玻璃棺里,他看到了法老们干巴巴
的、洒了香水的尸体。这些尸体被展示出来,使人大开眼界。
9 圣诞节的故事
一名程序员编写了一段程序,这段程序绘出了一棵圣诞树,并能同时演奏“铃儿呆铛”的
歌曲。
碰巧,圣诞老人从旁边经过。程序员全神贯注地盯着屏幕,并没有觉察到这位精灵身穿的
飘逸的绿色长袍和几乎拖到地上的长胡须。
这位老精怪从程序员的肩膀上望过去,看到那个屏幕,心里想:“在我年青的时侯,情形
和现在截然不同。我还记得,那时侯猎人们都是光着脚在雪地里奔跑,用尖锐的石器宰杀
野鹿。猎人们把野鹿的内脏吊在青树上,目的是为了让野鹿还生,然后他们点燃一根大木
头,在火上烤着野味,唱着圣歌。那段过去的时光简直是太美好了。”
10 去世的顾问
两位计算机顾问正在谈论着一位刚刚去世的同事。
“我简直不能相信,”第一位顾问说:“他以前看一去很有活力。他知道五士多种文本编
辑程序和一百多种编程语言。他有一间屋子,里面堆满了各种各样口算生产厂家的个人电
脑。他属于所有网络,每一天收到一百多封电子邮件,并认真答复每一封邮件。他秘书科
被计算机革命通上了电源,拧开了开关。”
“对于他的过世,我也感到很吃惊。”第二位顾问说,“顺便说一下,他怎么死的?”
第一位顾问摇了摇头,“他得冠心病。”
11 玻璃城
在玻璃城里,一位公司行政官正站在一座塔的顶上,他说:“看看我们所建造的一切吧!
我的城市,是时代的奇迹,如今,世界上的事务要在这里处理。晚上,街灯点亮了天空。
是的,我是众生之首。”
死神就站在这人身边,没有被发现。死神低声道:“在非洲有许多白蚁堆,远比这座城市
复杂多,而它们处理的事务与你们处理的事务相比,丝毫不显得渺小。高高在上,永恒的
星星点亮了无边无际的天空。更何况,你那城市的灯泡还不如一只小虫的屁股发出的亮光
呢!”
然后,死神继续赶他的路因为他和墨西哥的一场地震还有个约会。
第三篇 春
真爱与新生
1 两名学生
曾经有一名学生,他在课余时间里穿上古时侯的盔甲,随后他如今那些和他有类似想法的
人在一起,模仿古代社会里的贵州和太太们。
另一名学生是计算机科学专业的,他问一名学生为什么要穿着奇装异服走来走去。后者回
答说:“二十世纪是多么的枯燥无味,你花那么多时间呆在冰冷的机器中间,而我在寻觅
过去时代的美丽和浪漫。”
计算机专业的学生淡淡一笑,领着第一名学生进了数据中心。“这里有你所蔑视的机器,
它们不比你的长凳更雪亮吗?它们在全副武装的铁箱里不是很安全吗?三百年之后,孩子
们将会装扮成以前的计算机科学家。”
2 一对猎人
一名程序员一次发明了一套经济电脑系统。当这套系统完成了并被安装到客户指定的地点
后,他前去拜访用户,期望能够得到他们的感激。
当他走进大厅,发现一位漂亮的女士正坐在一台终端机前。“你觉得这套新的系统怎么样
?”他问。
女士叹了口气,凄凄婉婉,“在我们安装这台电脑之前,”她说,“我必须和许多人说话
,并执行不同的任务,可现在,我除了是一台终端机的附属物以外,什么也不是了。我的
工作成绩是根据我每天进行多少次屏幕演示而定的。有时侯,我的背简直酸得直不起来。
”
程序员沉默片刻,然后说:“我是这个电脑系统的发明者。对于这套系统的创建,我很兴
奋。我必须运用我的一点一滴的技巧和知识来使这套系统易于使用。得知你对它很不,我
感觉非常难过。”
女士触摸着他的手。“不要责怪自己,”她说,“你活在另一个世界里,你怎么会知道我
们的情感和心愿呢?”
真可谓水到渠成。那天晚上,他们两个人做了爱。深夜,那名程序员醒了一会儿,他躺在
床上,眼睛盯着天花板,他那熟睡的情人的头在他的胸膛上轻轻摇晃起伏。
3 公司行政官的幻境
有一位公司行政官,他有幢很大的房子,一辆非常昂贵的汽车,一台速度很快的电脑,一
位富有的妻子和一个可爱的懒妇。他从一个城市飞到另一个城市出差,住最好的宾馆。他
白天整天喝咖啡,到了晚上就喝威士忌。
一天,他坐在飞机上,飞机正做着令人困乏的远程的航行,他的眼睛瞟向了窗外。零散的
云朵在田野里投下斑驳的影子。他朝下望去时,似乎觉得他所过的生活像下面的小房子一
样遥远,像公路网漫无目标地通向四方。
幻境过去了。当他着陆并去酒巴要了几杯烈酒后,甚至幻境的记忆也消失了。
4 航行者
一名程序员曾创建了一套庞大的数据库,它包含了世界上有关文学、史实、人物和数据的
所有资料。然后他又建立了一套先进的索引系统将那些知识联系起来,这样,他便能随心
所欲地在数据库里航行。他坐在电脑前享用着他的劳动成果,即满足又愉悦。
三分钟过后,程序员开始头痛;三小时过后,程序员感到很不舒服;三天过后,程序员毁
掉了他的数据库。当问他为什么要这样做时,他回答说:“那套系统把这个世界置于我的
指尖,我能到任何地方,观看任何事情。因为我不再被外界的条件所限制,所以,我没有
理由不知道任何存在着的应该被知道的事物。我吃不下,睡不着。我所能做的就是在数据
库里游荡。现在我可以休息了。
5 正在工作的父亲
一个小孩在学校里学到了有关计算机图形学方面的知识。当他回到家里,他发现他的父亲
正在一台手提电脑前敲动键盘。”你在干什么呀?”小孩问。
父亲不想被打扰,“我正在工作!”他大声吼着。
小孩垂头丧气地盯着地板,“我以前并不知道你能用电脑工作。”他说
6 智力游戏
一家电子游戏公司雇了一名顾问设计世界上最难的图形智力游戏。
这位顾问幂思苦想了很多天,最后他胳膊下夹着一只盒子回来了。他一边往里走,盒子里
一边哗哗作响。
“你已经发明出了世界上最难的图形智力游戏吗?”董事长问。
“是的。”顾问打开盒子,往董事长桌子上一倒,倒出了上千张一模一样的黑色方块绝片
。
董事长疑惑地看着这些方块,“我不明白。”
顾问说:“有再种方法可以使一个图形智力游戏玩起来很难。第一种是要有类似的形状,
第二种是要有类似的颜色。在这个智力游戏中,每张绝片都有相同的开关和相同的颜色。
难道还有比这更难的了吗?”
“但是,如果所有的方块都一样,那么它们怎样排列都可以,即使一个小孩也能够把它们
排列在一起。”
顾问一本正经地点点头,“在生活中,就是这样--最困难的问题往往最容易解决。
7 电子邮件系统
一位公司行政官思量着使他的员工工作起来更有效率,于是安装了一套电子邮件系统。
两个星期以后,行政官停止了这套系统的运行。当有人问他为什么时,他说:“只要两个
员工之间一产生小小的分歧,第一个员工就发一封邮件。第二个员工读后便会写一封回信
,并发一份拷贝给他的经理,然后第一个员工又写另一封邮件,并把拷贝发到大楼里飞来
散去,每个人都没法完成工作。
当我的员工成熟了,能就会新技术了,我将让他们重新使用这套电子邮件系统。”
8 鸭子
一位经理常常对她的小女儿说:“妈咪必须拼命地工作,所以,当妈咪晚上回到家的时侯
,你要好好听话。”
一天,保姆生病了,这位经理不得不把她的女儿办公室去。她的办公室在一个工业园里,
园区中央是一个很大的鸭塘。小追逐着给小鸭子喂食,红通能宾脸上充满了欢笑。
当那位经理又一次对她的女儿说:“妈咪工作很忙,你要好好听话”时,小双手叉着腰,
小眉毛紧锁着,倔强地说:“但妈咪。。。你是和小鸭子一起工作。”
两个星期以后,那位经理正坐在会议室里开会,突然忍不住笑了起来。
9 老太太
一名程序员在路上遇到了一位老太太。这位老太太正在编着藤椅,她那双饱经风霜的手飞
快地缠绕着,从某种程度上说,藤条的粗糙更加有助于而不是妨碍她干着手中的活儿。
“那是一张漂亮的椅子,老太太,”他说:“藤条的展示出交叉对立的矢量的相交,极富
意味地表达了一个多元二次方程式。”
老太太甚至没抬眼看他,“手里有活儿,心里有上帝。”她说。
10 各有所思
一名市场推销员正在谈论电脑业的轶事。“一次,我遇到了编程大师。”他说。
“真的吗?”有人问,“他长得什么样子?”
推销员沮丧地摇摇头,“我记不太清了。当我告诉他我们能赚多少钱时,他没吭声;当我
告诉他 让他编写什么程序时,他紧盯着他的终端;当我告诉他计算机工业接下来将发生
什么变化时,他一句话也没说就走开了。”
此时,推销员的眼睛向下瞧去,在他脚边有一只猫正盯着他,它的头好奇地歪歪地翘着。
11 立碑
曾经有一名程序员在一个遥远的开发中心工作,中心座落在一个荒凉的岛上。一天晚上,
他睡不着觉,便起来到户外走走。
算法和公式像不散的幽灵在他的脑海里回旋,不断提醒他那些尚未完成的事情,他感觉就
像肩膀上正找着巨大的重担,因为公司的前途依赖于他的成功。
这是一个晴朗的夜晚,一轮凸月把道路涂成灰白色。他来到了一处荒地,发现了许多立碑
,这些立碑排成一个圆圈。这是已被人们遗忘的民间传说中所提到的一处旧址程序员想起
了他曾经在书上读到过的什么事情--这些立碑曾经是天文计算器,用来预测天体的运行
周期。他抬眼望去,看见一尾声流星就像一根银针划过天空。
无比的兴奋在他的心里涌动,他开始大笑起来。他的笑声在空旷的田野里回响,吵醒了在
那些白色石头废墟下酣睡的古人们的好梦。
第四篇 夏
启示
1 蜘蛛网
一位军机大臣长途跋涉前来拜访编程大师。军机大臣原以为这位大师既有钱又有势,但他
失望了。了看见大师身穿T恤衫和蓝色的牛仔裤,正端坐在一间小小的工作室里。
身穿三件套的军机大臣又臂交叉抱在胸前,向下注视着大师。"你因头脑精明而著称,"军
机大臣说,"那么,我问你,计算机的秘密是什么?"
大师抬起头看着军机大臣,一句话没说。随后他领着军机大臣来到花园,那里有一只蜘蛛
已经在两根之间吐织出了一张网。露珠挂在网上,阳光被反向成千万条细细的彩虹。
大师低声说:"仔细看着。"然后他拾起一根细枝,轻轻碰了一下蜘蛛网,那张网便像个生
灵一样颤动着。"这就是计算机的秘密。"他说。
军机大臣认为大师在嘲弄他,便捡起一块石头朝那张网扔去。石头穿网而过,那张网只留
下了破碎褴褛的丝缕挂在潮湿的叶缘上。他走了,与来的时候相比,他一点也没有变聪明
。
2 两位艺术家
两位艺术家互相谈论他们各自的艺术品。
"我自己混制颜料,"第一位说,"我从地里挖出矿石来,把它们磨成粉,并用我的唾沫把
石粉混合搅拌,然后把存放在一个泥坛子里。我用自己的斧子砍下一块树皮,我用这块树
皮来作画。当我完成一幅艺术作品时,我知道那完全是属于我的。"
"我自己设计图形程序,"第二位说,"我从满是灰尘的杂志堆中打捞出程序和算法。我在
自己的键盘上输入数学公式,用这些数学公式绘出我的曲线。当我完成一幅艺术作品时,
我知道那完全是属于我的。"
3 一则古老的寓言
董事长命令他的程序员制造一台功能强大的巨型计算机。
这名程序员工作了许多个月。终于,他领着董事长进了一间堆满铁盒子的房间,这些盒子
上镶嵌着闪闪的指示灯。"这就是我按照您的旨意建造的机器,"他说,"它能回答任何问
题。"
董事长被吸引住了,他决定问这台计算机一个自从时间开始以来就困绕着人类的问题:"
上帝存在吗?"
程序员把这个问题敲入了计算机。
灯光闪烁着,房间涌起了一股股电热。最后,一个深沉的声音从一个铁盒子里面发出来,
"现在他存在!"
听到这个,董事长惶恐地溜走了。
程序员淡淡地一笑,心想:"那个傻瓜以为计算机说的是它自己呢!"
4 两个计算机使用者
在一间办公室里有两个计算机使用者。第一个使用者说:"我一刻也不能忍受这台机器了
。当我输入命令的时侯,它却不执行。真是,它按一种方式运行,但然后又按另一种方式
运行。我想它肯定是恨我,因为当我迫切需要它的时侯,它似乎总是出错。"
第二个使用者说:"我在我的计算机前面,就像一位端坐在宝座上的国王。我签发了一条
命令,便静静地等着,看看发生了什么。当我的愿望满足了,我很高兴;我的愿望受到了
阻挠,我就试试另一条不同的命令。我把我的计算机看作是一个奴隶,我不期望它像我一
样聪明。"
5 程序员的梦
有一名程序员从来不在晚上编写程序。有人问他为什么,他回答说:"一天晚上,我在我
的终端前睡着了。我感觉到我的意识漂出了我的身体,顺差电缆流进了数据中心。我感到
自己进入了主机,看见那些程序就像疾风一样飞过内存,我静静地惊诧于这完美的对称。
我发现了一个武器,这是一条与外界相连的通道,穿过那些将信息发往世界各地的不计其
数的电脑,我达到了电话系统里。我的意识变得更加平静。我一会儿无处不在,一会儿踪
迹全无,不着边际。千万年一瞬即过。突然间我醒了,我的头压在键盘上,整个屏幕满是
不断重复的字母'A'。这就是我为什么不在晚上编写程序的原因。"
6 两位公司行政官
一个公司的董事长让他的两位行政官谈谈他们各自的工作观。
第一位行政官似乎认为这个问题没有必要考虑,很快就说了起来:"我的身心完全投入到
我的工作当中,我整日整夜地工作,我希望我的员工也能有同样的敬业精神,我根本没有
退休的打算。"
第二位行政官考虑了一会儿,然后谨慎地说:"我的每一种行为,每一句言语都经过了我
自身的中央处理器的处理。有时侯,当我遇到难题时,我就叭在桌子上睡一会儿,醒来时
便有了答案。我总是使我的组织异性到不再需要我的指引的时侯,我将悄然引退。"
7 程序员的妻子
有一名程序员,他发明了很多东西,但那些发明的理念总是被别人偷窃。程序员的妻子满
肚子怨恨,她问:"你为什么从不为你的那些思想去争取荣誉呢?"
程序员眨眨眼睛,就好像刚刚从梦中醒来。他说:"当我编程的时侯,我处于一系列的连
锁关系之中。我的想法变得具体起来,我的理念把虚幻转变成现实,存在的结构就在我眼
前重新组合,我变成了宇宙创造力的载体,我腾空而起就像乘着龙的翅膀。我为什么要在
乎是否有人知道我的名字呢?"
8 固执的经理
一名初学编程者告诉大师,他计划就会一位特别麻烦的经理。"在我的电脑的协助之下,
我手边已经有一上亿条事实,我将写份详细的报告,那位经理将会惊奇于我的数据,并改
变他的想法。"
大师评论道:"世界上所有的事实都不可能改变一个固执的人的想法。他一旦抓住了一个
适合于他的本性的观念,就绝不会传诵这个观念,即使在他的脖子了架一把刀。对于这样
一个人而言,上亿条事实他也会无动于衷。"
初学者挠挠前额,"既然事实如此无能为力,那么我怎样才能改变他的想法呢?"
大师说:"你必须忘记事实,你必须忘记数据。给他一个观念,这个观念要能在他的本性
和世界之间架起一座桥梁,只有那里,了都会改变他的想法。"
9 两位经理
有两位经理主管同一个项目。一天,他们都参加一次计划会议。
一天的会议结束了。第一位经理萎靡不振地走到了家门口,用肩膀掸开了家门。他对妻子
抱怨说:"我简直不能相信人们是多么的愚蠢。今天我参加了一个没完没了的会议,他们
讨论那些芝麻点儿大的事,就像讨论生死之事似的。我当时所能做的,就是控制自己不尖
叫出来。如果要我在那里再多工作一天的话,我真的要发疯了。 "他的妻子被他的话吓住
了。那天晚上,他一直都醒着,孤零零的。
当第二位经理回到家里,他对他的妻子说:"今天非常有成效。我参加了一个会议,会上
讨论了许多小细节,但那些只是事情的表面现象。随着我们进一步的互相交谈,我发现就
像一朵芬芳的鲜花在我们面前绽放。真的,我们是思想的园丁。"然后他吻了他的妻子,
在余下的时间里他已忘记了白天的工作。
10 两位教师
在一条街道的人行道上,一位身着黑色套装的老头正在大声嚷嚷着引自一本圣书中的仙落
。他的脸胀得通红,眼里充满着可怕的愤怒。几位身着真丝时装的年轻人从旁边经过,他
们似乎什么也没听见,好像只是找到了笑料而已。
远处,一座山俯视着这座城市。在山上,一位爷爷和他的孙子坐在一起,他们静静地看着
太阳渐渐西沉。正当夕阳摸着了平滑连贯的地平线时,爷爷俯过身来,凑到孩子的耳边,
轻轻地告诉了他一个秘密。
11 圣人们
历代圣人们从天堂下到人间,寻找一位可靠的继承人。他们立刻便陷入了要寻找的人的类
型的争论中。
释迦牟尼盘着腿坐在树下,他说:"当然,我们必须找一位僧人,只有僧人才能理解宇宙
那稍纵退逝的本质。"
孔夫子捋了捋他的稀疏的胡子,"僧人只关心他们自己的发展。我们应该找一位政治家,
他能制定法律,从而给社会带来秩序。"
摩西双臂交叉在结实的胸前,"政治家总是被权力的爱好所左右。我们最好找一位律师,
他可以对法律进行解释。"
耶稣深深地叹了口气,"律师经常是冷酷无情的。我们应该找一位传道士,他能教诲大众
。"
穆罕默德的眼里闪着火光,"吵,总是吵!我们需要一位武士,他将捍卫人类的神圣。"
老子站在一边,没有加入这场争论。其他的那些圣人都要求老子做个评判。"我们应该寻
找什么样的人?"他们问。
老子一声未吭,只是带领他们沿着一条崎岖的小路行走。
小路变成了大路,接着大路又变成了高速公路,他们来到了一座城市。耀眼的灯泡和花花
绿绿的广告招牌遮住了地平线,电线像黑色的蜘蛛网一样在头上穿越交叉,汽车就像发疯
的铁壳昆虫一样飞驰而过。当飞机尖锐的轰鸣空透那褐色的有毒的云层时,众圣人都用手
捂住了耳朵。
最后,他们来到一幢大楼前。在这幢大楼里,他们看见一个人正坐在电脑屏幕前。
那些圣人用一种不信任的眼光看着老子,"一名程序员?你发疯了吗?"他们问。
老子笑了。"请看仔细些。除了他眼前的屏幕,这个人什么也没看见。被周围的电脑簇拥
着,他只知道他所创造的现实,但又意识到那是虚幻。他已经超越了技术。也超越了机器
。"
关于《编程之道》及其作者
当你进入Internet,在Yahoo或Infoseek等搜索引擎中敲入"The Tao of Programming"(
本书的英文名)之后,你将会惊奇地发现,这本书的出现频率是如此之高,有500多个站
点贴有该书的内容!本书的流行程序,由此可见一斑。
更有意思的是,本书中的很多格言妙语,在美国被印在了T恤衫、咖啡杯等商品上,成为
这些商品促销的手段之一。可见,这本书当时在有为风靡,与其说它导致了一段流行时尚
,不如说它形成了一个文化热点。
迄今为止已重印了12次的《编程之道》,自问世以来,受到来自各方面的好评。
本书一出息,《纽约时报》和《科学家》杂志便长远规划了本书的内容;美国的许多全国
性报刊,包括《迈阿密先驱报》,和众多广播电台,如"美国公众放手电台 ",均调试评
价了本书;本书是美国Prentice Hall Book Club的特别推荐读物,并被《电脑购买者》
杂志评为最受欢迎的十本书之一。
本书的作者杰弗雷。詹姆斯(Geoffrey James)毕业于加利福尼亚大学,1977年开始在一家
大的电脑公司里任软件工程师。他因设计和运用了一种先进的电脑辅助排版系统而荣获美
国的"卓越技术奖章",他还为一些主要电脑供应商揣摩全球计划。
杰弗曾执教于加利福尼亚大学、华盛顿大学和波士顿大学,教授技术与管理方面的课程,
并多次应邀在国际会议上发表演讲。他已经撰写了七本书,最近的一本新书《电子精英的
经营智慧》在初版后的三周内便销售一空。
步入中年的杰弗雷现在是Insitute for Business Wisdom的执行董事,该学会倡导"应用
文化动力学"的理念,即把最好的管理技术结合进最成功的高科技企业,并将此管理技术
交流和推广到其它行业的企业。该学会的网址为http://www.businesswisdom.com。若想
对作者有更多的了解,除了些站点外,您还可以访问http: //www.upside.com或
http://www.datamation.com来检索他最新的文章,这些文章以论述高科技产业的发展趋
势,及其企业的管理和产品营销为主。
杰弗雷对中国的文化和历史特别感兴趣,尤其是太极拳。他每天早晨起来都要练太极拳,
已经有20多年了。据作者本人说,他当初写这本《编程之道》的时侯,其灵感的产生和构
思的形成,得益于每天早晨太极拳练习后的那种玄妙的感觉。
http://blog.csdn.net/ultralzl/archive/2004/07/15/42056.aspx
编程之禅
前言
《编程之道》的出版在程序设计业内得到了普遍的接受,出版社邀请我翻译一些与之相
关的文章,以作为那部著名的经典之作的补充。虽然,我申明我的能力难以
胜任,但我最终还是被说服试一试。
本书是许多个月来研究和翻译的结果,它试图通过对那些传统著作的摘录,来馐一个复杂的主题。我不怀疑,将会有许多计算机考古专家对我的摘录标准提出意见
。他们地问,“他为什么不把《UNIX程序员、大象和妓女》的寓言包括进来?”“他竟敢忽视历史悠久的故事《图灵集市历险记》!”对于这些批评,我只能说,>
我已经尽了我最大的努力来选择有代表性的内容。
为了确定文中各个章节的年代,我利用了朝代系统。对于那些不熟悉这套划分年代的方法的人来说,可以按四个朝代(或者说“四代”)来划分。
第一个朝代,即所谓的“黄金时代”,要追溯到由玻璃管构建计算机的日子;许多现代的学者断言,这个年代具有神话色彩。第二个朝代开始于晶体管的发明,而
结束于集成电路的再现。
现代计算机的历史,开始于第三个朝代,它由主机和控制主机的军机大臣所统治。第四个朝代开始于对“集成教”的镇压,“集成教”对业已建立的秩序的反抗,
被狂热的“蓝色兵团”残酷地摧毁了。具有讽刺意义的是,正是这次镇压,导致编程之禅扩散到了外部世界。
除了组成该书主体的古老的素材以外,我还有幸得到了Babbage博士和Yu博士的帮助,他们分别为该书撰写了引言和序。我希望他们对该书的贡献能够或多或少地>
弥补我作为编者的不才。
Geoffrey James
1988年1月于洛杉矶
目录
前言
序
引言
第一篇 木
第二篇 火
第三篇 土
第四篇 金
第五篇 水
根据古老的“五行学说”,本书由五部分:
木 火 土 金 水
大师:忍者 行者 隐者 大力神 阿幸
媒体:编年史 民间故事说教 公案 俳句
硬件:键盘 显示器 CPU 打印机 磁盘
方向:东 南 中 西 北
软件:编辑程序格式化程序调试程序解释程序编译程序
感觉:触觉 视觉 嗅觉 听觉 味觉
阶段:界面 设计 编码 排错 测试
动物:龙 凤凰 牛 兔 蛇
系统:VMS CP-6 OS/VS MS-DOS Unix
这套分类系统包罗万象,要想在该书的篇幅内把它阐释清楚是不大可能的。然而,在沉思
于这些千变万化的对应关系之后,您或许会发现其中那令人惊异的洞察力
。
序
毫无疑问,古老的编程艺术在西文人的脑海里通常会被误解,现代的观点则认为这是一
种工程学、机械论和唯物论。
许多人认为,编程仅是为了达到一个目的而使用的一种手段,而且,一个程序(及 程
序员)只能依据其赚钱的能力来评价。
这些原始的错觉,来自于对编程的真正意图的一种很深的误解。
高超的程序员并非致力于表面的成功,而是在人机之间寻找一种神秘的存在。
根据禅的解释,在硬件、软件、固件、界面和理解之间没有分界--相反,所有这些都
结合进了一个和谐的整体。
只有当程序员最终学会了将那种“自我自我的存在”的虚假感觉抛在一边,此种境界才
可能达到,而那种“自我的存在”的感觉往往伴随在我们大多数人的生活之中。
这是计算机所带来的--禅师程序员的行为方式。
有人说,掌握了禅机的程序员也就掌握了生命。这样的程序员是以一种永不疲倦的童稚
的欢乐来看待这个世界的。
觉悟了的程序员,走在大街上也能感觉到两旁房子和大楼里面的电脑。
觉悟了的程序员,能够感觉和听到调制过的数据穿过电脑线时那种电流脉冲的持续不断
的嗡嗡声。
觉悟了的程序员已经与宇宙合为一体。
我以前的学生Geoffrey能够完成这样一个工作,将失落的编程之禅的经典著作再现于
世,作为一名教师,我感到由衷的满足。
真心希望,这本书能够重新确立禅在完善的程序员教育中的重要地位。
C.P.Yu博士莲花大学超越机器学院
西藏拉萨
引言
当James先生要求我给他的这本书写一篇引言的时侯,除了讲述一下关于我自己在程序
维护这个神秘的领域中的个人经历,我实在想不到更好的办法了。程序的维护是程序设
计艺术中很少被人理解的领域。
有的读者肯定会坚持说,在禅的深奥教义和程序维护的卑微技艺之间,并没有什么共同
点。但正如一位大师所言:“方法和途径(也就是道)存在于所有的程序之中,甚至在
电子游戏里。”因此,长期被的程序维护艺术必定有其禅的方面,这点是确凿无疑的,
虽然那对于未经训练的头脑来说或许不会立刻显现出来。
我的故事开始于我从大学计算机科学专业毕业后的几个星期。我大学毕业后的目标是为
一家研究和开发机构工作,最好是编译程序或操作系统设计的部门。我最后终于找到一
家愿意盲雇佣我的机构,但条件是我必须在一段时间内,通过完成程序维护的工作来
“学会这套系统”。
我当然会对这个建议产生抵触心理。我花了五年的大学时间,竟然是为了浪费时间来解
决其他一些程序员的错误!然而,因为他们曾经答应日后让我干感兴趣的工作,于是我
便接受了,并在心中提醒自己,即使这份工作干不出名堂,我还能找到其他的工作。
当我第二个礼拜去报到的时侯,我被领着去与那个程序维护组的师父见面。人事部总管
带着我快步地穿过开发中心黑暗的走廊,最后她指着长长的大厅通道尽头处的一扇门说
:“他在那里面。”说完志身走了,好像有些心神不定。
我向门口走去,眼睛朝里面窥探,我看见一个男人正坐在终端前工作,但他背对着我,
所以我不知道他有多大年纪,长得什么样。我只有靠咳嗽一声来表明我的存在,这里,
那位大师甚至没有回头瞅一眼便说:“请坐”。
越过他的肩膀,我瞟见了那些难以理解的屏幕显示,随着他纤长的手指在键盘上飞舞,
它们一闪一闪地出现在他的终端上。最后,他满意地咕哝了一声,退出系统, 然后转
过身来面对着我。
我所看见的让我吃了一惊,因为他看上去不像那种应该是禅师的人,他的脸乏味,几乎
是丑陋的,他的头发如同一圈烦恼的光环。但人们首先注意的是他的眼睛,透过厚厚的
眼镜片射出淡淡的蓝光。
他从头到脚地打量了我一番,然后点点头,就好像确认一个个人观点,“你就是那个新
来的?”他酸酸地问。
“是的。”我回答。我假装充满激情,把我的经历和在大学的成绩向他作了快速的汇
报。
这位礼貌的听着,然后说:“那很好,但你以前做过程序的维护工作吗?”
我坦白地告诉他我没有做过。
师父长长地叹了口气,“那好,我们应该做我们做做的事。”他说。然后他从一个架子
上取下一本庞大的程序清单,随意地翻开它,并递给我。接着他问:“你怎样对付这个
?”
我眼睛盯着这本清单,那上面是汇编语言,还搀和着一些奇怪的宏语言。每隔十几行语
句,控制权便转移到某个神秘的子程序,而且,即使这个程序具有任何结构性,我也看
不出来。“这是什么程序、”我问。
师父把那本清单从我的膝盖上拿了过去,“这是《世代大师编码藏经》,”他说,“当
你学会了从迷魂阵中把错误的代码抓出来时,那就是你出师的时侯了。”然后 ,他合
上清单,把它放回到书架上。
我不久便意识到,程序的维护远比我想象的要难得多。我起初试图学会那本《编码藏
经》中所用的汇编语言,但令我烦恼的是,我发现那套汇编语言从未按规矩提供过说明
文档,现存的仅有一些笔记,是一位多年前就死去或离开公司的硬件开发者写的。
这本《编码藏经》不能给我什么帮助了。虽然其中偶尔有一些注释,但这些注释和这种
汇编语言一样模糊,除了一些涉及到有关原始硬件构造的使人干着急的资料以外,别无
它物。
当我向那位师父抱怨这一切的时侯,他礼貌地听着,并在我们两人沉默了许久之后,回
答我说:
“你正在试图理解某种不可能被你的理性思维所理解的东西,”他说,“这样所导致的
结果必然是失败。你必须先清空你的大脑,只有那时,你才能开始领悟《编码藏
经》。”
接着,师父开始慢慢地向我阐释那本《编码藏经》里复杂的逻辑。当我聆听他那温和的
声音时,我终于开始觉察到一点光芒的闪烁,这是隐藏在《编码藏经》中辉煌的和永恒
的灵光。“那些大师对‘良好的程序设计惯例与规则’一无所知,”师父说,他们努力
去理解普遍意义上的计算机思维的内部活动,他们还需要什么说明文档呢?那些程序是
极限的表达。
然而,即使我慢慢开始有所领会,我还是感觉到自己像一只在琥珀在挣扎的小飞虫。师
父所讲的与我曾学过的东西截然不同,我的理性思维很难接受。但师父总是耐心地一遍
遍解释说,我必须不靠理性思维去推理,而要用潜意识来领悟《编码藏经》的内涵。
经过数月的指点后,我感到很自信了,便想试试我的第一块修补程序。为了给师父一个
惊喜,我偷偷地工作。我写了一段能重新运行几行语句的补丁,把程序重新进行汇编,
并把新程序释放到生产系统中去。
第二天早上,我来晚了一会儿。让我感到奇怪的是,开发中心的主任和从事部总管 正
在师父的办公室里。当我走进大厅后,从事部总管看见了我就把门关上了。我听见了很
大的说话声,但听不清说什么。
等到那两位来访者离开后,我走进师父的办公室,“什么事?”我问。
“你的修补程序,昨天晚上六点整进入了生产系统。它现在已经被删除了。”
“那么?”
“你仍然可以继续工作。”师父说。
最后,我终于明白,所有用我的理性思维去理解《编码藏经》的努力都是徒劳的,这使
我很绝望。师父觉察到了我思想上的这个变化,他开始向我传授开机。他教给我冥想和
查错的技巧,他说这些技巧是从计算机时代之初,由技术支持部一代一代地传下来的。
我听着听着,开始意识到一个关于我以前的编程体验的特大事实。在大学里,我一起认
为程序员的工作主要是控制硬件和软件的活动,编程的最高艺术境界是,为了完成一项
任务或达到一个目标而成功地运用高超的编程技巧。但程序维护是不同于程序开发的。
要想维护一个程序,就要把程序看作是一棵渐渐成长的植物,拔苗助长是毫无益处的。
事实上,这样的行为更容易导致植物的死亡。一个程序必须被小心地滋养。程序员在对
程序进行改动之前,必须对每一个逻辑关系非常熟悉,必须对程序的意图有很深刻的理
解力。这种理解力不是在一夜之间就可以得来的,需要 长时间的积累。
好几个月以后,我终于能够给《编码藏经》成功地设计修补程序了,但设计之前要经过
长时间的冥想,还要把那本程序清单打开着支在我的桌子上。我还发现,如果我工作的
时侯点燃一支香,口中不停在重复师父教给我的口诀:“Null-So-Stix-Etx-Eot”
(ASCII码表中头五个字节NUL、SOH、STX、ETX、EOT的发音--译注),我更容易集中
注意力。师父说,那个口诀意味着宇宙的“五原”。
不久我发现我不再关心是否能为工作成绩而得到奖励了,在我自身和我所维护的程 序
之间也看不见任何分离了。我像一个一生都活在阴影里的人一样,开始理解编程之禅,
这是一种隐于程序员设计背后的难以言喻和难以形容的力量,就像投射影子的太阳一
样。
从那毫无意义的“自我的存在”中摆脱出来后,我开始发觉,那些伟大的编程语句过去
对我来说似乎模糊不清,只是因为我还没有彻悟,无法理解它们。我现在知道了为什么
过去的那些程序员从不为他们的程序提供文档,因为英语语言的描述本身更让人迷惑,
而非使人受到启发。
一天,我发现自己正在解决的一个问题涉及到《编码藏经》中最复杂的部分--错误分
析全程。我在对此一无所知的情况下,给出了一个修补程序,它能通过对硬件 中断区
的内容进行检查来测定错误的情况,使程序能继续正确执行。
那天下午,师父第一次走进了我的工作间,他把手放在我的肩膀上,眼睛朝下看着我,
“现在该是你出师的时侯了。”他说。
这些就是我第一次接触禅式程序设计的经历。虽然从那以后我被指派参加过很多项目设
计,但我从未忘记过我的第一位师父给我的教诲。
想象一下我的惊奇--当我在《编程之禅》中发现了如此之多的我师父非常喜爱的语言
时。我终于看到了那些隐于他那难忘的演说背后的古代传统。
James先生将那本经典的影响深远的著作重新发掘出来,我们大家都欠他一份人情。要
不是他的持之以恒,它可能会永远失传。在本书中,James先生收集了一大堆定期,如
异端的说教、民间故事和诗歌等,它们组成了具有传奇色彩的“集成教”的教义。正是
通过James先生这样的学者的努力,才使得深藏禅机的程序设计的光芒永世不灭地照耀
着后代的人们。
Charlie(Chuck)Babbage
第一篇 木
大师:忍者
媒体:编年史
硬件:键盘
方向:东
软件:编辑程序
感觉:触觉
阶段:界面
动物:龙
系统:VMS
木
作为MRVMS/IIIX禅学院的复兴者,编程大师忍者(这是后人给他起的绰号,他的真实姓
名无法核实--译注 )非常有名。有一些传说,说他从一名不起眼的程序员一跃成为某
家实力雄厚的程序设计机构的开发部主管。他在完成了一套先进的操作系统后,便悄然
消失了。据他说,这套系统既不需要硬件也不需要软件,同样能准确地发挥功能。他现
在的去处无人知晓,但听说,他时常以一位管理顾问的装束出现。
一
忍者最初来到那家开发中心工作的时侯,他被分配去支持操作系统。一天,一位经 理
走进了忍者的工作间。
"你为什么不工作?"经理问。
"系统瘫痪了。"忍者说。
"经理皱起了眉头。"我们付给你薪水,是要你保持系统的正常运行!"他大声说。
"系统没有瘫痪。"忍者说。
二
忍者大师如是说:
"如果你的应用程序不能正确地运行,不要去责怪操作系统。"
三
忍者大师参加一次电脑展示会。
许多公司都押运出了明亮的显示器和他们所能搜罗到的所有最新、最大的硬件,以及身
着泳装的金发模特儿。
忍者甚至一眼也未瞥那些展摊。相反,他只是打开一张折叠椅,静静地坐在角落里。不
时地有人从他身边经过,并问他一两个问题。他思考片刻,然后用简短的话作出回答。
人们盘着腿围坐在这位大师身旁--那些收集来的宣传册散落在一边--静静地等着他
开口说话。
四
忍者大师如是说:
“对于聪明的人,只要一个字;对于快马,只要轻轻一鞭;对于写得好的程序,只要单
独的一个命令。”
五
忍者大师参加一次董事会。当他开始解释有关那套软件的技术特性时,那些公司行政官
们,有的在座位上烦躁不安,有的盯着窗外,有的望着咖啡杯发呆。
于是,这位大师开始谈那套软件将会赚多少钱了,这时那些行政官们便纷纷竖起了 耳
朵,并开始在房间里欢蹦着,显然,他们被这悦耳的声音吸引住了。
六
一位公司行政官来看忍者,他发现这位大师正在玩电脑游戏。“这是什么意思?”行政
官询问道。
“我正在测试系统。”大师说。
行政官凑近屏幕定眼一看,果然如此。
七
一天,董事会成员集中在一起讨论业务善,他们召来忍者大师,让他作个报告。“你的
季度预测是怎样的?”他们问。
“没有季度预测。”忍者回答道。
“那么你今年的预算计划呢?”他们问。
“没有今年的预算计划。”忍者回答说。
然后他们问:“你能确认你是忍者大师吗?”
“没有忍者大师。”忍者大师回答着。
董事们被搞得糊涂了,只好暂停会议各自回家去了。
八
忍者大师如是说:
“设计一个千百万程序的操作系统很容易,要改变一个人的本性却困难得多。”
九
三名来自不同的电脑公司的行政官前去向忍者学习领导艺术的真谛。
忍者问第一位行政官,“你有你们公司现在的机构设置图吗?”
第一位行政官从口袋中掏出了一张纸,“我一直带着一张在身边。”他说着便把那张纸
递给了忍者。
忍者饶有兴趣地看着那张纸,“这看上去似乎已经在计算机上建立了模板。”他评 论
说。
“的确如此,”这位行政官骄傲地说,“我们已经把我们的机构设置图都计算机化了,
以便一接到通知就能立刻选择调用。”
忍者笑着,把那张纸递了回去,“我帮不了你什么。”他说。
第二位行政官接着问忍者领导艺术的真谛。
“你有你们公司现在的机构设置图吗?”忍者问。
第二位行政官摇摇着,“我们的机构设置在这几年都未变过,我几年前就记住了。”
忍者皱起了眉头,“我帮不了你什么。”了说。
第三位行政官还是问忍者领导艺术的真谛。
“你有你们公司现在的机构设置图吗?”忍者问。
第三位行政官耸了耸肩,“我们没有机构设置图,”他说,“每个人喜欢做什么就做什
么,喜欢什么时侯做就什么时侯做。”
忍者紧皱眉头,“我帮不了你什么。”他说。
三位行政官凑到一边耳语了一阵,转过身来对忍者说:“那么好吧,让我们看看你的机
构设置图。”
忍者领着他们来到一片开阔地上,那里孤零零地长着一棵树。“这就是我的机构设置
图。”忍者边说边把手搭在那表皮粗糙地树干上。
第二篇 火
大师:行者
媒体:民间故事
硬件:显示器
方向:南
软件:格式化程序
感觉:视觉
阶段:设计
动物:凤凰
系统:CP-6
火
编程大师行者收集了各种各样有关开发刺目的民间故事。最近的计算机考古研究显示,
下面的这些民间故事是以历史事实为基础的。虽然一部分夸张的成分可能会无意中被添
加进去,但其历史真相的核心内容依然存在。
一
当一位项目经理为他的软件项目配备人员时,他会在一天内雇佣三百名程序员。一位获
得计算机科学博士学位的学者前来求职,他被给予了一个薪水很高的职位。
一天,那位项目经理被解职了。“我认为,每个人都应清楚自己的职责和履行自己的职
责。”新来的项目经理在检阅他的程序员队伍时如此说道。听到这话,那位学者悄悄地
溜走了。
二
两位程序员正在急诊有关用户界面的问题。
“在‘使用起来简单轻松’方面,许多意义重大的革新正在进行当中,”第一位程序员
说,“不久以后,人们在使用电脑之前将不再需要阅读那些冗长乏味的用户手册了。程
序都将是不言自明的。”
第二位程序员想了一会儿,然后说:“上个星期我准备劈些木柴烧火,但我的斧子又旧
又钝。于是,我去五金店买了把新的。”
“这挺有趣儿,”第一位程序员说,“但这和用户界面有什么关系呢?”
“这把新斧子附带有一本长达八页的使用说明书。”他回答说。
三
一次有一位第三者问一名工程师、一名数学家、一名物理和一名程序员:“一只盒子有
几个面?”
工程师首先回答。“一只盒子有四个面。”他说。
“此话怎讲?”智者问。
“四个垂直的面就是我所说的面,它们被一顶一底连接在一起。”工程师回答。
“太荒唐了,”数学家评论道,“一只盒子有六个面。”
“此话怎讲?”智者问。
“盒子是一个立方体,因此有六个面。”,数学家回答。
“不对,”物理学家说,“一只盒子有十二个面。”
“此话怎讲?”智者问。
“严格说来,有六个外部的面和六个内部的面。”物理学家回答。
智者看着一声未吭的程序员。“你的意见呢?”智者问。
“一只盒子只有两个面。”程序员说。
听了这话,工程师、数学家和物理学家大笑起来。
“此话怎讲--一只盒子只有两个面?”笑声停住后智者问道。
“这是基于个人经验,”程序员说,“那‘里面’是安置电路板的地方,而‘外面’是
放显示器的地方。”
“正是如此。”智者说。
四
一位新上任的董事正在召开与程序员们的见面会。
在宴会进行当中,一位程序员背诵起了如下的演说--“我们一直都在期盼着你的到
来,您的前任根本没有您这种高贵的能力。现在你来了,我们会变得真正具有生产
力。”
这位新董事被奉承的喜形于色,“这演说词是你自己写的吗?”他问。
“这是我们开发中心的惯例,”那位程序员说,“无论哪位新董事到任的时侯,我们都
要发表那段演说,这是我所知道的唯一的一段演说词。”
五
一天,开发中心的一位程序员发现了一套可以生成迷宫图案的算法系统。他非常勤奋地
对这套算法进行了修改,这样可以让它在长长的打印纸带上生成一个不间断的迷宫。
不久,他制做了一个有几百万条分贫的迷宫,四十英尺长,七英尺宽。他把打印纸带挂
在了程序员办公室门口长长的过道上,不一会儿,所有编程人员都挤在了那个迷宫前,
试图解决这个庞大的难题。
开发中心的主任恰巧从旁边经过,他惊愕地盯着这场景,面色阴沉。但当他走进编程大
师的办公室想寻求帮助时,大师早已不在那儿了。
六
五名初学者哭着走进了大师的办公室,“呜,呜!听说我们的项目可能要被取消了。”
大师说:“所有事情照常继续,直到它们停止。”
听了这话,那些初学者便返回各自的工作中去了。
七
一天,开发中心接到消息,一位新主任将被任命来负责这里,他是位军机大臣,对电脑
知之甚少。
程序员们听到这条消息都非常吃惊,纷纷停止了编程,把许多时间都浪费在揣摩那即将
到来的不幸的日子。
看到这些,一位大师决定必须得做点什么。于是,他借来了一套装扮大猩猩的服装。
不久,那位大臣就职了,他把所有的经理召集到一间小会议室,随行而来的是几位总部
的公司行政官,据说,他们是来使开发中心“平稳过渡”的。
突然,那位大师穿着装扮大猩猩的服装破门而入。他蹦上会议桌,把文件踢得到处都
是,并对着那些行政官咆哮嗥叫,行政官们坐在那里只剩下目瞪口呆了。然后,他唰地
一下离开了会议室,正如他来时一样。
听到这件事,程序员们便都回到各自的工作岗位上去了。
<作者按>
作者曾经和几个人谈过,他们都亲眼目睹过此传说中描绘的事件。作者也曾听说,一年
之后,类似的挑衅行为在IBM的某部门中发生了。这第二起事件与第一起的不同之处在
于,程序员穿了一套运动服,站在门口大声地咳嗽。
八
一组程序员正在向董事长汇报。“今年最大的成果是什么?”董事长问。
那些程序员在一起商量了一会儿,然后回答说:“我们今年解决的bug(程序错误--
译注)比去年多百分之五十。”
董事长疑惑地看着他们,很显然,他不知道BUG是什么意思。他小声地与身边的大臣嘀
咕一阵后,转过身来对着程序员,气得满脸通红。“如此差劲的质量控制,你们应该问
心有愧。明年不允许有‘BUG’!他命令道。
可以肯定,第二年那些程序员向董事长汇报的时侯,有关BUG只字未提。
九
一位公司行政官来参观开发中心,他在长长地走廊里走着,就像一位检阅部队的将军一
样。他不时地偏上来和他遇到的人谈谈话。最后,他走进了一位程序员的办公室,这位
程序员正在聚精会神地为操作系统查错。
行政官环顾了一下办公室,注意到有尊猪的雕像摆在程序员的终端上。”我常常被程序
员收集的那些古玩和纪念品所深深吸引,”行政官说,“在它们背后似乎有一些非常有
趣的故事。比如说吧,那里的那个雕像是什么意思?”他指着那尊雕像。
程序员从终端前抬起头来,眨眨眼睛,然后盯着那尊雕像,就好像是头一回看到它似
的。“这是头猪呀!”他说。
第三篇 土
大师:隐者
媒体:说教
硬件:CPU
方向:中
软件:调试程序
感觉:嗅觉
阶段:编码
动物:牛
系统:OS/VS
土
以下语录的作者,编程大师隐者,在人们心目中的形象一直很模糊。他被COBOL语言标
准委员会的特务所暗杀,除此之外,人们对他知之甚少。
一
我听说过:
开始时似乎比较容易的事情,结尾时往往是最困难的。这就是为什么程序员说--“开
发前面的百分之九需要一半时间,而另一半时间则用来完成最后的百分之十。”
二
我听说过:
在人机界面中犯的最大错误是忽视计算机的权利。被迫与旧概念兼容的系统总是受到历
史的限制。计算机不应该模拟现实--它们应该超越现实。
三
我听说过:
一家计算机公司设计了一套强大的系统,这套系统超前于它所在的时代。因为担心这套
新设计可能会被复制,他们对硬件的结构设计保密,并为操作系统申请了专利。
十年以后,一位初学者向编程大师问起那个放在数据中心后面的又脏又旧的木箱子。
四
我听说过:
不要让政治原因影响技术方面的决定;也不要根据科技论文来做出政治决定。只有在无
知者的头脑中,这些东西才会混到一直。
五
我听说过:
项目计划和公布的时间表,本身毫无意义。那些日期和项目进展的里程碑本质上不意味
着什么。然而有一个秘密的时间表,它被所有工作于一个项目的人所理解。这个秘密的
时间表从未被外界的关注所愚弄,也从未被操纵以迎合市场的方案。这个秘密的时间表
总是被遵守,因为它反映了所有开发部成员之间的相互理解。当项目反映了这个现实
时,程序会如期完成;当项目计划与此现实相矛盾时,程序会被延误。
六
我听说过:
有三种情况肯定会导致程序设计项目的失败。第一种情况是,主管此项目的经理对软件
一无所知;第二种情况是,对程序代码负责的项目带头人对编写代码毫无兴趣 ;第三
种情况是,编写代码的程序员是临时雇佣的,对项目缺乏忠诚。这三种情况中的任何一
种都会导致项目的失败;三种情况同时出现,就必死无疑了。
七
我听说过:
许多公司行政官乐于看到把他们摆在高高在上,而让他们的下属居于其下的机构设置
图。这些行政官无异于那些玩“山上的国王”游戏的孩子们。机构设置图有时侯叫做树
状结构,但使用那些结构图的行政官们似乎总是忘记,树叶在底下的树是已经被连根拔
起的树,活不了多久。优秀的行政官总是把自己看作是组织的询问,承受作为领导的重
担,因为这才是他发挥作用的最佳途径。
这就是关于编程大师忍者的著名寓言--他没法传授领导艺术的真谛,因为那三位想当
他学生的人太相信他们自己的力量了。当一个组织被出色地领导时,雇员甚至不知道他
们正在被领导。当项目完成时,他们会对自己说:“看看我们通过我们自己的努力所取
得的成绩吧!”
八
我听说过:
一个程序的价值不能由它的宣传册的大小,或出现在大众计算机杂志上的整页广告的数
量来判断。这些噪音越响,程序越不可能有用;真正优秀的程序不需要广告,用户会口
口相伟。
九
我听说过:
有一种循环,这是一种宇宙的节奏。今天一个程序流行,明天是另一个;今天修正 了
五百个程序中的错误,明天又将出现五百个新的。要理解生命,就要知道这种节奏的存
在。要理解禅,就要活在这种节奏之外,从日常生活的牵挂之中超脱出来。只有这样,
头脑才会自由。
第四篇 金
大师:大力神
媒体:公案
硬件:打印机
方向:西
软件:解释程序
感觉:听觉
阶段:排错
动物:兔
系统:MS-DOS
金
编程大师大力神试图在讲解中使用公案--禅的一种独特的教学手段。通常说来,每个
公案的含意都很难辨析,并且常常有好肉食的和外在的意思。
一
一个在大学里学习了很长时间的初学者来拜访编程大师。
初学者说:“我已经记住了《计算机编程艺术》的十二卷书中所汇集的算法,我能用
LISP、PROLOG、ALGOL、MODULA2和ADA语言编程。
大师礼貌的点点头。”我很少遇见像你这样博学的人,”他说,“我想听听你关于 我
写过的一个程序的意见。”
“我很高兴助您一臂之力。”说着,初学者骄傲地挺起了胸脯。
大师走到他的电脑前插入一张软盘。“首先我得拷贝一下。”他解释说。
他们坐在那儿,听着旋转的驱动器沙沙作响同。突然电脑上显示出一条信息,“磁盘上
没有空间--Abort,Retry or Ignore?”
大师敲了个“R”进行重试,他们又一次听着驱动器的声音,接着那提示又一次出现在
屏幕上。大师仅仅再次摁了个“R”,重复着同样的事情。
最后初学者再也按捺不住了。“磁盘上没有空间了,”他生气地说,“他太满了!”
大师说道:“是你的脑袋太满了。”
初学者一下子恍然大悟。
二
大师如是说:“任何一个程序,无论它多么小,总存在着错误。”
初学者不相信大师的话,“如果一个程序小得只执行一个简单的功能,那么会怎样?”
他问。
“这样一个程序将没有意义,”大师说,“但假设这样一个程序存在的话,操作系统最
后将失效。产生一个错误。”
但初学者不满足。“如果操作系统不失效,那么会怎样?”他问。
“没有不失效的操作系统,”大师说,“但假设这样一个操作系统存在的话,硬件最后
将失效,产生一个错误。”
初学者仍不满足。“如果硬件不失效,那么会怎样?”他问。
大师长叹一声。“没有不失效的硬件,”他说,“但假设这样的硬件存在的话,用户就
会想让这个程序做一件不同的事,这件事也是一个错误!”
没有错误的程序是一则谬论,世间难寻。假设存在着一个没有任何错误的程序,那么这
个世界将会不复存在。
三
象牙塔里的魔术师前来拜访编程大师,像往常一样,带来了他最新的发明。
编程大师从他的终端前抬起头来,看见魔术师站在门口,“这次你带来了什么呀?”大
师问。
“这是我最伟大的发明,”魔术师说着,用车推着一个盒子进了屋,“这是终极桌上印
刷系统,有了它,排字机、描图桌和照相机能做的事我全能做。我已经设计好了,任何
熟悉传统印刷术的人能够在几个月内学会。这儿有我制作的样张,看,它像《古腾保圣
经》的首页。”
大师仔细地看了看样张,露出一丝微笑。“这部装置打算用来干什么?”他问。
“我们将用它来印刷技术说明资料。”魔术师说。
<作者按>
这位魔术师经常出现在禅的民间故事中,作为对立面。这个人物是否真正存在,不得而
知。然而有传说说,这座象牙塔曾被一伙狂热的信徒控制,这伙人被唆使去干软件盗
版、谋杀以及其它各种各样的不道德的事情,以报复机器时代的Cray-2超级计算机的统
治。
这座象牙塔在第三个朝代末被包围并几乎毁掉,但由于政府的援助而幸免于难,并得以
重建。
四
一位初学者走进大师的工作间,看见一台新电脑摆在大师的桌上。
“那台电脑是什么?”初学者问。
大师把手搭在一个小盒子上,这个小盒子通过一根电缆与那台电脑相连。“看,”大师
说,“这部装置控制着我们在屏幕上看到的东西。”
初学者紧紧地盯着屏幕,但他看到的只是毫无意义的符号。
“这个屏幕模仿的是一张桌子,”大师解释道,“比如说,屏幕的这里是文件柜和 垃
圾桶,这里是打字机和计算器。”
“这是一项伟大的发明。”初学者敬畏地低声说道。
“并不像看上去的那样伟大。”大师说,他推着初学者的肩膀往后退了几尺,“你能看
见那两张桌子吗?”大师问道。
初学者点点头。“一张在地板上,另一板在屏幕上。”他说。
“是这样的。那么,是否有一张桌子上少了什么东西?”
初学者沉思片刻。“其中一张桌子上没有电脑。”他说。
大师摇摇着。“任何一张桌子上都没有电脑。”
五
一位初学者问大师:“程序设计的真正含义是什么?”
大师回答说:“饿的时侯就吃;困的时侯就睡;当时机恰当时,就进行程序设计。”
六
编程大师走进初学者的工作间,听见了一阵骚乱。
“这些该死的电脑!”初学者气愤地叫嚷着,“要想让它们做点事,我得使用三个甚至
四个编辑程序。有时侯我被搞得糊里糊涂,结果删除了整个文件,这简直难以忍受!”
大师盯着初学者。“那么你打算怎样补救呢?”他问。
初学者想了一会儿。“我将设计一个新的编辑程序,”他说,“一个将取代所有这些程
序的程序。”
突然,大师敲了一下初学者的脑袋。这一击并不重,但初学者却很惊讶。“你这是什么
意思?”初学者惊问道。
“我根本不想学另一个编辑程序。”大师说。
初学者一下子就恍然大悟了。
七
一位初学者问大师,“每当我在一套新的系统上编程时,必须学会一种新的语言。为什
么没有一套标准呢?”
大师转身而去。“唯一真正的标准是死亡。”他说
八
一位初学者问大师:“在ADA编译程序中有没有佛性?”
大师回答说:“你曾注意到在八进制、十六进制和十进制中字符NUL都是000吗?”
初学者一下子就恍然大悟了。
九
名叫狄阿古和古多的两位程序员正在向大公司的董事长汇报。
当古多站起来发言时,他对那位公司行政官说,“你天生聪明,能够理解电脑的真 正
含义。”“瞎扯,”狄阿古说,“你为什么表扬这个蠢才?他也许是行政官,但他对电
脑一无所知。”
行政官对他们俩都给予了奖励,然后雇了一名顾问来决定他们俩谁对谁错。
第四篇 水
大师:阿幸
媒体:俳句
硬件:磁盘
方向:北
软件:编译程序
感觉:味觉
阶段:测试
动物:蛇
系统:Unix
水
尼姑阿幸最初是写俳句的。俳句即短诗,用一套预先好的章节来试图表达一种情感或一
种想法。阿幸的俳句则更多地表达了一名程序设计者的那种孤独的生活:为了调试而工
作到深夜,徒劳无获的测试,看着一段程序编译时的那种简单的喜悦,等待。所有的程
序设计者都有过这些体验,但他们很少提及,即使是在他们之间。
本书这最后一部分,显然是一部大作中的片段。作者不才。未能将这些短诗中的深奥的
意蕴完全翻译出来,以达到和原诗类似的效果,还望读者多多包涵。
一
程序不过是梦,
生于无形无象的禅中,
我们只是那做梦的人。
二
我编程三日,
两耳不闻人声,
只有硬盘在歌唱。
三
编译程序在运行,
像一条湍急的河流,
我静静地等侯。
四
为何要用LISP?
COBOL语言我不懂,
所以我用LISP。
五
编程一整夜,
透过窗户,照到屏幕上,
初升的太阳。
六
硬件和软件,
我们是你们的主人和奴隶,
我们的生活是程序。
七
你能听见吗,
上程序的声音?
答案是NUL。
八
电子邮件说,
项目已取消,
清理文档时,我哭了。
九
计算中心空空荡荡,
静静的只有风扇在嗡鸣。
我走过一排排的CPU,
磁通量刺痛了我的皮肤。
我打开一扇门,又冷又硬,
看见指示灯在控制板上跳动。
一台没有灵魂的机器,人们说,
但它的灵魂是同事们的汗水,
在它里面有我们多年的生命,
失望,友谊,悲伤,欢乐,
算法成功时的狂喜,
和无数个徒劳无获的长夜。
我听见了叹息和欢笑的回声,
在这间黑洞洞的办公室里,
终端机闪耀着光芒,就像星星一样。
http://www.lslnet.com/linux/docs/linux-3274.htm
虽然too old,但读来很有意思:)
《编程之道》(小赵译版)
蓝森林 http://www.lslnet.com 2001年1月1日 21:39
The Tao Of Programming —— 编程之道
Translated By Geoffrey James
[小赵]翻译整理
说明:
本文是<<编程之道>> <<编程之禅>><<计算机时代的寓言>>其中的一册, 由小赵翻译
整理, 另外, 这三册书的完整电子文档由小赵根据市面上的<< 编程之道>>一书(包括了上
面的三卷)录入整理, 随后将一起刊登(参见《编程之道》全译文)。
Table of Contents 目录
# Book 1 -- The Silent Void
# Book 2 -- The Ancient Masters
# Book 3 -- Design
# Book 4 -- Coding
# Book 5 -- Maintenance
# Book 6 -- Management
# Book 7 -- Corporate Wisdom
# Book 8 -- Hardware and Software
# Book 9 -- Epilogue
The Silent Void
Book One
Thus spake the master programmer:
编程大师如是说:
"When you have learned to snatch the error code from the trap frame, it
will be time for you to leave."
“当你从我手中夺走水晶球时,就是你离开的时候了。”
1.1
Something mysterious is formed, born in the silent void. Waiting alone and
unmoving, it is at once still and yet in constant motion. It is the source
of all programs. I do not know its name, so I will call it the Tao of
Programming.
寂静的虚空里诞生了神秘的东西,这种东西恒久存在永不消失,它是所有程序的根源所在
,我不知道怎么形容它,姑且称它为编程之道。
If the Tao is great, then the operating system is great. If the operating
system is great, then the compiler is great. If the compiler is greater,
then the applications is great. The user is pleased and there is harmony in
the world.
如果道是完美的,那么操作系统就是完美的,如果操作系统是完美的,那么编译嚣就是完
美的,如果编译嚣是完美的,那么应用程序就是完美的,所以用户心满意足,整个世界因
此和谐。
The Tao of Programming flows far away and returns on the wind of morning.
编程之道去如黄鹤来如晨风。
1.2
The Tao gave birth to machine language. Machine language gave birth to the
assembler.
道生机器语言,机器语言生汇编嚣。
The assembler gave birth to the compiler. Now there are ten thousand
languages.
汇编器生编译器,最后产生上万种高级语言。
Each language has its purpose, however humble. Each language expresses the
Yin and Yang of software. Each language has its place within the Tao.
不论多么的微不足道,每种语言都有它自己的目的,每种语言都表达了软件的阴阳两极。
每种语言都各得其道。
But do not program in COBOL if you can avoid it.
但是尽量不要用COBOL语言。
1.3
In the beginning was the Tao. The Tao gave birth to Space and Time.
Therefore, Space and Time are the Yin and Yang of programming.
道之初,带来了空间和时间,所以,空间和时间是编程的阴阳两极。
Programmers that do not comprehend the Tao are always running out of time
and space for their programs. Programmers that comprehend the Tao always
have enough time and space to accomplish their goals.
不懂编程之道的程序员常常把空间和时间消耗殆尽,得道的程序员则总是有足够的空间和
时间去完成编程任务。
How could it be otherwise?
否则会是什么样呢?
1.4
The wise programmer is told about the Tao and follows it. The average
programmer is told about the Tao and searches for it. The foolish programmer
is told about the Tao and laughs at it.
上士闻道,从而行之。中士闻道,谨而寻之。下士闻道,大笑之。
If it were not for laughter, there would be no Tao.
大笑不足为道。
The highest sounds are the hardest to hear. Going forward is a way to
retreat. Greater talent shows itself late in life. Even a perfect program
still has bugs.
希音不闻,进即是退,大嚣晚成。任何程序都有漏洞。
The Ancient Masters
Book Two
Thus spake the master programmer:
编程大师如是说:
"After three days without programming, life becomes meaningless."
三日不编程,食肉无味。
2.1
The programmers of old were mysterious and profound. We cannot fathom their
thoughts, so all we do is describe their appearance.
远古时代的编程大师们高深莫测,我们不能揣测他们的所思所想,只能描述外表所见。
Aware, like a fox crossing the water. Alert, like a general on the
battlefield. Kind, like a hostess greeting her guests. Simple, like uncarved
blocks of wood. Opaque, like black pools in darkened caves.
他达明,如狐狸过水;机警,如战场上的将军;和善,如主妇款待客人;简单,呆若木鸡
;混沌,如深渊之水。
Who can tell the secrets of their hearts and minds?
谁能道尽他们的所有?
The answer exists only in the Tao.
答案仅存于道。
2.2
Grand Master Turing once dreamed that he was a machine. When he awoke he
exclaimed:
超级大师图灵曾梦见自己是一台机器,醒后他这样回忆:
"I don't know whether I am Turing dreaming that I am a machine, or a
machine dreaming that I am Turing!"
“我不知道是图灵梦见自己变成机器还是机器梦见自己变成图灵。”
2.3
A programmer from a very large computer company went to a software
conference and then returned to report to his manager, saying: "What sort of
programmers work for other companies? They behaved badly and were
unconcerned with appearances. Their hair was long and unkempt and their
clothes were wrinkled and old. They crashed out hospitality suites and they
made rude noises during my presentation."
一个大公司的程序员参加一个软件会议后向他的主管汇报:“那些别的公司的程序员都是
些什么样的人呀?他们举止不雅,不修边幅,头发蓬乱,衣服破旧,根本不热情好客,还
在我说话的时候乱嚷嚷。”
The manager said: "I should have never sent you to the conference. Those
programmers live beyond the physical world. They consider life absurd, an
accidental coincidence. They come and go without knowing limitations.
Without a care, they live only for their programs. Why should they bother
with social conventions?"
他的主管说:“我不应该让你参加这次会议,这些程序员生活在现实世界之外。他们认为
生活是可笑的,一场意外的偶然而已。他们来去自由,无所牵挂,他们只为他们的程序生
活。为什么要用世俗的烦扰去扰乱他们呢?”
"They are alive within the Tao."
“他们生活在道中”。
2.4
A novice asked the Master: "Here is a programmer that never designs,
documents, or tests his programs. Yet all who know him consider him one of
the best programmers in the world. Why is this?"
一个初学者问主管经理:“有一个程序员,他从来不预先设计,也不写文档,甚至不测试
他的程序,但是知道他的人都认为他是世界上最伟大的程序员,为什么呢?”
The Master replies: "That programmer has mastered the Tao. He has gone
beyond the need for design; he does not become angry when the system
crashes, but accepts the universe without concern. He has gone beyond the
need for documentation; he no longer cares if anyone else sees his code. He
has gone beyond the need for testing; each of his programs are perfect
within themselves, serene and elegant, their purpose self-evident. Truly, he
has entered the mystery of the Tao."
经理说:“那个程序员掌握了道。他不需要预先进行设计;系统崩溃时他也从不烦燥,只
是接受发生的一切而不管发生的事是好是坏 。他不需要写文档,他从不顾及有没有人看
他写的代码。他也不需要进行测试;他写的每个程序都有一个完美的自我,平静而优雅,
它们的目的不言自明。他已经真正掌握了道的精髓。”
Design
Book Three
Thus spake the master programmer:
编程大师如是说:
"When program is being tested, it is too late to make design changes."
“程序被测试时再去改变它的设计已经太晚了。”
3.1
There once was a man who went to a computer trade show. Each day as he
entered, the man told the guard at the door:
曾经有一个人参加计算机展览,每天他进门时都对门卫说:
"I am a great thief, renowned for my feats of shoplifting. Be
forewarned, for this trade show shall not escape unplundered."
“先警告你,我是偷盗高手,我入室偷盗的本领闻名遐迩。这次展览会也再劫难逃。
”
This speech disturbed the guard greatly, because there were millions of
dollars of computer equipment inside, so he watched the man carefully. But
the man merely wandered from booth to booth, humming quietly to himself.
警卫因此大动干戈,因为里面有价值百万的计算机设备,所以他牢牢盯紧了这个人,但是
这个人只是从一个摊位逛到另一个摊位,一边平静地喃喃自语。
When the man left, the guard took him aside and searched his clothes, but
nothing was to be found.
当这个人离开时,警卫搜了他的身,但是什么也没有发现。
On the next day of the trade show, the man returned and chided the guard
saying: "I escaped with a vast booty yesterday, but today will be even
better." So the guard watched him ever more closely, but to no avail.
展览会的第二天,这个人又对警卫说:“昨天我满载而归,但是今天我会收获更大。”所
以警卫更加小心地盯紧他,但是这样做完全于事无补。
On the final day of the trade show, the guard could restrain his curiosity
no longer. "Sir Thief," he said, "I am so perplexed, I cannot live in peace.
Please enlighten me. What is it that you are stealing?"
展览会的最后一天,警卫再也不能忍住他的好奇心了。“小偷先生,”他说,“ 你说我
惊慌不安,请告诉我,你到底偷了什么?”。
The man smiled. "I am stealing ideas," he said.
这个人笑笑说:“我在偷想法。”
3.2
There once was a master programmer who wrote unstructured programs. A novice
programmer, seeking to imitate him, also began to write unstructured
programs. When the novice asked the master to evaluate his progress, the
master criticized him for writing unstructured programs, saying: "What is
appropriate for the master is not appropriate for the novice. You must
understand the Tao before transcending structure."
有一位编程大师,他写非结构化的程序,一位初学者刻意模仿他,也写非结构化的程序。
当他让大师看他的进步时,大师批评了他的非结构化程序:“ 对一位编程大师合适的东
西未必对一个初学者同样合适,在超越结构化之前,你必须理解编程之道。”
3.3
There was once a programmer who was attached to the court of the warlord of
Wu. The warlord asked the programmer: "Which is easier to design: an
accounting package or an operating system?"
###有人问一位程序员,“一个财务软件和一个操作系统哪个更容易设计?”
"An operating system," replied the programmer.
“是操作系统”,这位程序员回答说。
The warlord uttered an exclamation of disbelief. "Surely an accounting
package is trivial next to the complexity of an operating system," he said.
此人大惑不解。他说:“显然一个财务软件比起操作系统来说其复杂性是微不足道的”。
"Not so," said the programmer, "when designing an accounting package, the
programmer operates as a mediator between people having different ideas: how
it must operate, how its reports must appear, and how it must conform to the
tax laws. By contrast, an operating system is not limited my outside
appearances. When designing an operating system, the programmer seeks the
simplest harmony between machine and ideas. This is why an operating system
is easier to design."
程序员说:“不,设计财务软件时,一个程序员必须成为持不同意见的用户与计算机的一
个中介,他必须了解用户的操作习惯,报表要是什么形式,如何遵循税法。相反,一个操
作系统完全与这些外部的东西无关。设计操作系统,程序员只需要达到自己的设想与机器
之间的简单的和谐。这就是为什么操作系统反而比财务软件更容易设计。”
The warlord of Wu nodded and smiled. "That is all good and well, but which
is easier to debug?"
这些人笑着说。“不错,但是哪一个更容易调试呢?”
The programmer made no reply.
程序员没有回答。
3.4
A manager went to the master programmer and showed him the requirements
document for a new application. The manager asked the master: "How long will
it take to design this system if I assign five programmers to it?"
一个项目经理带给编程大师一个项目的需求,然后问大师:“如果我给你5个程序员,要
多少时间设计这个项目?”
"It will take one year," said the master promptly.
“一年”,大师说。
"But we need this system immediately or even sooner! How long will it take
it I assign ten programmers to it?"
“但是我们等不了那么长时间,越快越好,如果10程序员呢?”
The master programmer frowned. "In that case, it will take two years."
大师皱了一下眉头说:“那就要花2年”。
"And what if I assign a hundred programmers to it?"
“那,100年程序员呢?”
The master programmer shrugged. "Then the design will never be completed,"
he said.
大师耸了耸肩说:“那这个项目就永远完不成了。”
Coding
Book Four
Thus spake the master programmer:
编程大师如是说:
"A well-written program is its own heaven;
a poorly-written program is its own hell."
“写的好的程序是它自己的天堂,写的不好的程序是它自己的地狱”
4.1
A program should be light and agile, its subroutines connected like a
strings of pearls. The spirit and intent of the program should be retained
throughout. There should be neither too little nor too much, neither
needless loops nor useless variables, neither lack of structure nor
overwhelming rigidity.
一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。自始至终,目标明确
。增之一字节则太长,减之一字节则太短。既没有不必要的循环也没有没有被引用的变量
,既不缺少结构化也不至于僵硬呆板。
A program should follow the Law of Least Astonishment. What is this law? It
is simply that the program should always respond to the user in the way that
astonishes him least.
一个程序应该遵循``最小惊讶原则'',什么是``最小惊讶原则''?就是说一个程序应该最
小程度地引起用户的惊讶。
A program, no matter how complex, should act as a single unit. The program
should be directed by the logic within rather than by outward appearances.
无论一个程序无论有多么复杂都应该是一个单一的整体。程序是被它的内部逻辑所指引而
不是它的外观表现。
If the program fails in these requirements, it will be in a state of
disorder and confusion. The only way to correct this is to rewrite the
program.
如果一个程序不能满足所要的需求,它就会处于混乱无序的状态中。唯一的出路就是重写
这个程序。
4.2
A novice asked the master: "I have a program that sometimes runs and
sometimes aborts. I have followed the rules of programming, yet I am totally
baffled. What is the reason for this?"
一个初学者问大师:“我的一个程序有时正常有时不正常。我已经完全遵循编程的规则,
而且我完全被它弄糊涂了,到底是什么原因会导致这样呢?”
The master replied: "You are confused because you do not understand the Tao.
Only a fool expects rational behavior from his fellow humans. Why do you
expect it from a machine that humans have constructed? Computers simulate
determinism; only the Tao is perfect.
大师说:“你困惑是因为你不了解道。只有傻瓜才会相信只要遵循别人所说就能得到想当
然的结果。为什么你要从一个人类自己构造的机器中去得到想当然的结果呢?计算机只是
决定论的产物;只有道才是唯一完美的。
The rules of programming are transitory; only the Tao is eternal. Therefore
you must contemplate the Tao before you receive enlightenment."
任何编程的规则都只适合于特定的情况,只有道才是永恒不变的。所以在你受到指引之前
要先去思考道。”
"But how will I know when I have received enlightenment?" asked the novice.
“但是我怎么知道我何时受到指引呢?”
"Your program will then run correctly," replied the master.
“当你的程序正确运行时”。大师说。
4.3
A master was explaining the nature of the Tao to one of his novices, "The
Tao is embodied in all software -- regardless of how insignificant," said
the master.
初学者请大师解释“道法自然”。大师说:“道存在于任何软件中--无论是多么没有意
义的软件”。
"Is the Tao in a hand-held calculator?" asked the novice.
“难道也存在于手持式的计算嚣里?”,初学者问。
"It is," came the reply.
“是的,”
"Is the Tao in a video game?" continued the novice.
“也在游戏机里?”,初学者又问到。
"It is even in a video game," said the master.
“是的,甚至也存在于游戏机里”。大师说。
"And is the Tao in the DOS for a personal computer?"
“也存在于个人计算机的DOS里吗?”
The master coughed and shifted his position slightly. "The lesson is over
for today," he said.
大师咳嗽了一声,稍微动了一下,说,“今天的课就到这里”。
4.4
Price Wang's programmer was coding software. His fingers danced upon the
keyboard. The program compiled without an error message, and the program ran
like a gentle wind.
###编程大师编写软件时,手指在键盘上快速飞舞。程序编译时没有一条错误信息,程序
运行起来就象一阵微风吹过。
Excellent!" the Price exclaimed, "Your technique is faultless!"
太精彩了!你的技巧已经无可挑剔了。
"Technique?" said the programmer, turning from his terminal, "What I follow
is the Tao -- beyond all technique. When I first began to program I would
see before me the whole program in one mass. After three years I no longer
saw this mass. Instead, I used subroutines. But now I see nothing. My whole
being exists in a formless void. My senses are idle. My spirit, free to work
without a plan, follows its own instinct. In short, my program writes
itself. True, sometimes there are difficult problems. I see them coming, I
slow down, I watch silently. Then I change a single line of code and the
difficulties vanish like puffs of idle smoke. I then compile the program. I
sit still and let the joy of the work fill my being. I close my eyes for a
moment and then log off."
“技巧?”,大师转过身说,“我所遵循的是道--它超乎所有的技巧。当我开始编程时我
看到的是整个一大块的程序,三年后我看到的是子过程。现在我什么也看不到了。我的整
个存在是没有任何形式的虚无。我感觉很悠闲,总之,事实上是我的程序自己在写,有时
我看到一些问题,我看到它们,就停下来静静地观察它们,然后我改变了一行代码,难题
就象一阵轻烟一样化为乌有。然后我编译程序。坐在那里享受工作的喜悦。闭了一会眼睛
然后退出系统。
Price Wang said, "Would that all of my programmers were as wise!"
“什么时候我的程序员才能都达到这样的境界!”
Mainteance
Book Five
Thus spake the master programmer:
编程大师如是说:
"Though a program be but three lines long, someday it will have to be
maintained."
“既使一个程序只有三行长,也总有一天需要去维护它”
5.1
A well-used door needs no oil on its hinges.
A swift-flowing steam does no grow stagnant.
Neither sound nor thoughts can travel through a vacuum.
Software rots if not used.
经常使用的门不需要往门轴里上油。
流动的东西就不会停滞不前。
流水不腐,户枢不蠹。--王磊
声音和思想都不能在真空里传播。
软件不用就会腐朽。
These are great mysteries.
5.2
A manager asked a programmer how long it would take him to finish the
program on which he was working. "I will be finished tomorrow," the
programmer promptly replied.
经理问程序员要多长时间才能完成他的项目。“明天”
"I think you are being unrealistic," said the manager. "Truthfully, how long
will it take?"
“太不着边际了,老实说,要多久?”
The programmer thought for a moment. "I have some features that I wish to
add. This will take at least two weeks," he finally said.
程序员想了一想说。“还有一些新的功能要加进去,可能至少要两个星期吧。”
"Even that is too much to expect," insisted the manager, "I will be
satisfied if you simply tell me when the program is complete."
“即使两个星期恐怕也太夸张了,什么时候你只要告诉我说程序已经完成就好了。”
The programmer agreed to this.
Several years slated, the manager retired. On the way to his retirement
lunch, he discovered the programmer asleep at his terminal. He had been
programming all night.
几年后,这个经理已经退休了,在他的离职午餐上,他发现这些程序员在他的终端前睡着
了,他整夜都在编程。
5.3
A novice programmer was once assigned to code a simple financial package.
一个初学者被要求编写一个财务软件。
The novice worked furiously for many days, but when his master reviewed his
program, he discovered that it contained a screen editor, a set of
generalized graphics routines, and artificial intelligence interface, but
not the slightest mention of anything financial.
他疯狂地工作了很多天,但他的主管检视他的程序时发现,它写了一个编辑嚣,一个图形
程序集,和人工智能的界面,但是看不到任何跟财务有关的东西。
When the master asked about this, the novice became indignant. "Don't be so
impatient," he said, "I'll put the financial stuff in eventually."
主管要求解释时,程序员被激怒了:“你太没耐心了,我会在最后写财务的部分。”
5.4
Does a good farmer neglect a crop he has planted?
Does a good teacher overlook even the most humble student?
Does a good father allow a single child to starve?
Does a good programmer refuse to maintain his code?
一个好的农民不会不管他的庄稼。
一个好的老师不会不管哪怕是最差的学生。
一个好的父亲不会让他的任何一个孩子挨饿。
一个好的程序员不应拒绝维护他的程序。
Management
Book Six
Thus spake the master programmer:
编程大师如是说:
"Let the programmer be many and the managers few -- then all will be
productive."
“增加程序员,减少经理--这样他们都可提高效率。”
6.1
When managers hold endless meetings, the programmers write games. When
accountants talk of quarterly profits, the development budget is about to be
cut. When senior scientists talk blue sky, the clouds are about to roll in.
经理们忙于无休无止的会议时,程序员们在写游戏。财务主管在谈论季度盈利时开发预算
将会被削减。当老科学家在谈天空的蓝色时,云团蜂拥而至。
Truly, this is not the Tao of Programming.
这不是编程之道。
When managers make commitments, game programs are ignored. When accountants
make long-range plans, harmony and order are about to be restored. When
senior scientists address the problems at hand, the problems will soon be
solved.
经理分配任务时不会包括游戏,会计师做长期计划时,应该做到面面俱到,皆大欢喜。科
学家提出一个问题,就会很快得到解决。
Truly, this is the Tao of Programming.
这才是编程之道。
6.2
Why are programmers non-productive? Because their time is wasted in meetings.
为什么程序员没有效率,因为他们把时间都浪费在开会上了。
Why are programmers rebellious? Because the management interferes too much.
为什么程序员难于管理?因为管理者的干预太多了。
Why are the programmers resigning one by one? Because they are burnt out.
为什么程序员一个接一个地辞职,因为他们累坏了。
Having worked for poor management, they no longer value their jobs.
在糟糕的管理下工作,他们享受不到工作的乐趣。
6.3
A manager was about to be fired, but a programmer who worked for him
invented a new program that became popular and sold well. As a result, the
manager retained his job.
一个经理将被解雇,但他手下的一个程序员写了一个流行的软件并且销路很旺。所以经理
保住了他的工作。
The manager tried to give the programmer a bonus, but the programmer refused
it, saying, "I wrote the program because I though it was an interesting
concept, and thus I expect no reward."
经理为程序员分红,但程序员拒绝了,他说:“我写程序是因为写程序很有趣,所以我并
没想过得资金”。
The manager, upon hearing this, remarked, "This programmer, though he holds
a position of small esteem, understands well the proper duty of an employee.
Lets promote him to the exalted position of management consultant!"
这位经理说,“这位程序员,不管他现在是什么位置,他都能理解一个雇员的职责所在。
我们要把他提升为管理顾问”。
But when told this, the programmer once more refused, saying, "I exist so
that I can program. If I were promoted, I would do nothing but waste
everyone's time. Can I go now? I have a program that I'm working one."
这位程序员又一次拒绝了,他说:“我是一个程序员所以我可以编程,如果我被提升了,
除了浪费别人的时间什么也做不了,现在我可以走了吗?我还有一个程序没写完。”
6.4
A manger went to his programmers and told them: "As regards to your work
hours: you are going to have to come in at nine in the morning and leave at
five in the afternoon." At this, all of them became angry and several
resigned on the spot.
经理对程序员说,“你们的工作时间是早上9点到正午点。”,所有的程序员都很不满。
So the manager said: "All right, in that case you may set your own working
hours, as long as you finish your projects on schedule." The programmers,
now satisfied, began to come in a noon and work to the wee hours of the
morning.
经理又说:“好吧,那随你们的便,只要能按时完成任务。”,程序员们这下满意了,他
们中午上班,一直工作到凌晨。
Corporate Wisdom
Book Seven
Thus spake the master programmer:
编程大师如是说:
"You can demonstrate a program for a corporate executive, but you can't
make him computer literate."
###
“你可以向一位公司主管演示一套程序,但你不能让他的电脑变得象人一样。”
7.1
A novice asked the master: "In the east there is a great tree-structure that
men call 'Corporate Headquarters'. It is bloated out of shape with
vice-presidents and accountants. It issues a multitude of memos, each saying
'Go, Hence!' or 'Go, Hither!' and nobody knows what is meant. Every year new
names are put onto the branches, but all to no avail. How can such an
unnatural entity exist?"
一个新学问大师:“在东方,有一个庞大的机构,人们称作总部。它由为数众多的大小领
导。每天发出大量的备忘录,每个备忘录都说:‘干这个,干那个’,没有一个人知道它
是什么意思。每年这个机构都会有更多的人加进来而变得越来越大,但是去没有人去做事
情。怎么烩样奇怪的东西还能存在呢?”
The master replies: "You perceive this immense structure and are disturbed
that it has no rational purpose. Can you not take amusement from its endless
gyrations? Do you not enjoy the untroubled ease of programming beneath its
sheltering branches? Why are you bothered by its uselessness?"
大师说:“你已经知道这个巨大的机构并不合理,你就不能不管它为什么这样吗?你尽管
享受它的好处就是了,干吗要去管它到底是没有效率呢?”
7.2
In the east there is a shark which is larger than all other fish. It changes
into a bird whose winds are like clouds filling the sky. When this bird
moves across the land, it brings a message from Corporate Headquarters. This
message it drops into the midst of the program- mers, like a seagull making
its mark upon the beach. Then the bird mounts on the wind and, with the blue
sky at its back, returns home.
在遥远的东方,传说有一只巨大的鱼,叫鲲,它变成了一只大鸟,叫鹏,鹏的翅膀可以遮
天蔽日,这只大鸟经过陆地的时候,它带来了一个消息,它把这个消息丢在程序员中,就
象一只海鸥在海滩上做的记号,然后鹏背负蓝天,乘风而上,回家去了。
The novice programmer stares in wonder at the bird, for he understands it
not. The average programmer dreads the coming of the bird, for he fears its
message. The master programmer continues to work at his terminal, for he
does not know that the bird has come and gone.
初学者惊恐地看着这只鸟,根本不敢相信,中级程序员担心这只鸟的到来,因为它害怕它
带来的消息,编程大师则继续在他的终端前工作他根本不知道这只鸟曾经来过。
7.3
The Magician of the Ivory Tower brought his latest invention for the master
programmer to examine. The magician wheeled a large black box into the
master's office while the master waited in silence.
一个学究带着他的最新发明去见编程大师,他把一个大黑盒子推进大师的办公室。
"This is an integrated, distributed, general-purpose workstation," began the
magician, "ergonomically designed with a proprietary operating system, sixth
generation languages, and multiple state of the art user interfaces. It took
my assistants several hundred man years to construct. Is it not amazing?"
“这是综合的、分布式的通用工作站,”,学究开始介绍了,“按人体工学设计的操作系
统,第六代的高级语言,多样的用户界面,整整花了我的助手好几百人年的时间,挺不错
吧?”
The master raised his eyebrows slightly. "It is indeed amazing," he said.
大师扬了一下眉毛,说:“的确很了不起。”
"Corporate Headquarters has commanded," continued the magician, "that
everyone use this workstation as a platform for new programs. Do you agree
to this?"
“头儿已经说了,”这位学究继续说,“每个人都要用这个工作站作平台,你觉得怎么样
?”
"Certainly," replied the master, "I will have it transported to the data
center immediately!" And the magician returned to his tower, well pleased.
“当然了,”,大师回答说,“我要马上把它送到数据中心去!”,这位学究满意去回去
了。
Several days later, a novice wandered into the office of the master
programmer and said, "I cannot find the listing for my new program. Do you
know where it might be?"
几天后,一个新手走进大师的办公室说,“我找不到我新写的程序了,你知道它可能会在
哪儿吗?”
"Yes," replied the master, "the listings are stacked on the platform in the
data center."
“当然,”,大师说,“你的程序在数据中心的平台里放着。”
7.4
The master programmer moves from program to program without fear. No change
in management can harm him. He will not be fired, even if the project is
canceled. Why is this? He is filled with the Tao.
编程大师从一个项目转到另一个项目而豪无顾虑,任何管理上的变动都不能影响他,他不
会被解雇,即使项目被取消了。为什么呢?他了解了道。
Hardware and Software
Book Eight
Thus spake the master programmer:
"Without the wind, the grass does not move.
Without software, hardware is useless."
风不动则草不动,
没有软件,硬件只是一堆发热的电子器件
8.1
A novice asked the master: "I perceive that one computer company is much
larger than all others. It towers above its competition like a giant among
dwarfs. Any one of its divisions could comprise an entire business. Why is
this so?"
一个初学者问编程大师:“我知道有一家计算机公司比所有其它的公司都大。在它面前它
的竞争对手就象站在巨人面前的侏儒。它的任一部门都有各自的业务,为什么会这样呢?
”
The master replied, "Why do you ask such foolish questions? That company is
large because it is so large. If it only made hardware, nobody would buy it.
If it only maintained systems, people would treat it like a servant. But
because it combines all of these things, people think it one of the gods! By
not seeking to strive, it conquers without effort."
大师说,“为什么你问如此愚蠢的问题呢?那家公司大是因为它就是如此之大,如果它只
做硬件,就没有人会买,如果它只维护系统,人们只会把它当作仆人,但是它的业务囊括
了所有这些东西,人们就对它顶礼莫拜好象不用努力奋斗就可击败竞争对手
8.2
A master programmer passed a novice programmer one day. The master noted the
novice's preoccupation with a hand-held computer game. "Excuse me", he said,
"may I examine it?"
有一天编程大师碰见了一个正玩掌上游戏机的编程新手,他说:“给我看一下?”
The novice bolted to attention and handed the device to the master. "I see
that the device claims to have three levels of play: Easy, Medium, and
Hard", said the master. "Yet every such device has another level of play,
where the device seeks not to conquer the human, nor to be conquered by the
human."
新手把游戏机递给大师,“我看到上面说明了三种难度的玩法:容易,中等,高难”,大
师说,“但是每个这样的游戏机都有另外一种玩法,此时游戏机即不是想着怎么赢你,也
不是怎么被你赢。”
"Pray, great master," implored the novice, "how does one find this
mysterious setting?"
“那么请问大师”,初学者说,“这种玩法到底是怎样玩的呢?”
The master dropped the device to the ground and crushed it under foot. And
suddenly the novice was enlightened.
大师把游戏机摔到地下然后用脚踩碎它,突然初学者明白了。
8.3
There was once a programmer who worked upon microprocessors. "Look at how
well off I am here," he said to a mainframe programmer who came to visit, "I
have my own operating system and file storage device. I do not have to share
my resources with anyone. The software is self-consistent and easy-to-use.
Why do you not quit your present job and join me here?"
有一个工作在微机上的程序员对前来参观的大型机程序员说:“看看我这里吧,我有自己
的操作系统和文件存储设备,我不需要与别人共享任何资源,软件条条有理并且易于操作
。为什么你不辞去你的工作到这里来呢?”
The mainframe programmer then began to describe his system to his friend,
saying: "The mainframe sits like an ancient sage meditating in the midst of
the data center. Its disk drives lie end-to-end like a great ocean of
machinery. The software is a multi-faceted as a diamond and as convoluted as
a primeval jungle. The programs, each unique, move through the system like a
swift-flowing river. That is why I am happy where I am."
大型机的程序员对他的朋友说:“大型机就象古代圣贤一样深思熟虑,它的磁盘设备从头
到尾就象是一个巨大的机械设备的海洋。软件象钻石一样有多个面,象远古的森林一样令
人费解。每一个程序都象水经过河流一样穿行于系统中,那就是为什么我乐于为它工作”
The microcomputer programmer, upon hearing this, fell silent. But the two
programmers remained friends until the end of their days.
微机程序员听了这些话后,默默不语,但这两个程序员至死都是很好的朋友
8.4
Hardware met Software on the road to Changtse. Software said: "You are the
Yin and I am the Yang. If we travel together we will become famous and earn
vast sums of money." And so the pair set forth together, thinking to conquer
the world.
硬件和软件在路上碰见了,软件说:“你是阴我是阳,如果我们联手就可以赚大钱。”所
以它们走到了一直,考虑怎样征服世界。
Presently, they met Firmware, who was dressed in tattered rags, and hobbled
along propped on a thorny stick. Firmware said to them: "The Tao lies beyond
Yin and Yang. It is silent and still as a pool of water. It does not seek
fame, therefore nobody knows its presence. It does not seeks fortune, for it
is complete within itself. It exists beyond space and time."
不久,它们遇到了固件,固件衣衫褴褛,拄着一根拐棍步履蹒跚。固件对它们说:“道在
于阴阳之外。它静如止水,它从不指望能扬名远近,所以没有人知道它的存在。它也不寻
求幸福,它只是与它自己的存在在一起,它存在于空间和时间之外。”
Software and Hardware, ashamed, returned to their homes.
软件和硬件面有惭色,各自回了家。
Epilogue
Book Nine
Thus spake the master programmer: 编程大师如是说:
"Time for you to leave."
“现在是你出师的时候了。”
发信人: freshrain (02CS~~努力中), 信区: Programming
标 题: 计算机科学与技术学习心得(ZZ)
发信站: 我爱南开站 (2004年09月28日17:11:24 星期二)
计算机科学与技术学习心得
计算机科学与技术反思录
计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近
三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不
可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需
要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设
计),但计算机专业的优势就在于,我们掌握许多其他专业并不“深究”的东西,例
如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程
序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科
学,并将重点放在计算理论上。
计算机理论的一个核心问题——从数学谈起:
记得当年大一入学,每周六课时高等数学,天天作业不断(那时是六日工作制)。颇
有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科
学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方
向不见得有问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如
网络安全,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许
是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是
从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽
象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推
导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在
现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课
上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学
与技术的应当本着这个方向)。
其实我们计算机系学数学光学高等数学是不够的(典型的工科院校一般都开的
是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数
学分析),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向
于证明型的数学课程,这对我们培养良好的分析能力极有帮助。我的软件工程学导师北
工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件
设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推
理能力,从所受训练的角度上要远远在我们之上。当年出现的怪现象是:计算机系学生
的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数
学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错
了也说不一定,其中原因何在,发人深思。
我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则
更大。通常非数学专业的所谓“高等数学”,无非是把数学分析中较困难的理论部分删
去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去
的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓“工程数学”
已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现
用现查,何必费事记呢?再不然直接用Mathematics或是Matalab好了。
我在系里最爱做的事情就是给学弟学妹们推荐参考书。中文的数学分析书,一般都
认为以北大张筑生老师的“数学分析新讲”为最好。万一你的数学实在太好,那就去看
菲赫金哥尔茨的“微积分学教程”好了--但我认为没什么必要,毕竟你不想转到数学系
去。吉米多维奇的“数学分析习题集”也基本上是计算型的东东。书的名气很大,倒不
见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是
高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》
也是很好的教材。
中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因
为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京
大学林成森,盛松柏两位老师编的“高等代数”,感觉相当舒服。此书相当全面地包含
了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内
容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能
吃透此书,就可以算高手。国内较好的高等代数教材还有清华计算机系用的那本,清华
出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不
过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨
论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了
一些再读。
正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的
目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题
思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练
自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系
的同学之间思维上的差距。
概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东
西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻
辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说
清华计算机系开有“随机数学”,早就是必修课。另外,离散概率论对计算机系学生来
说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校
开设了单纯的“离散概率论”课程,干脆把连续概率删去,把离散概率讲深些。我们不
一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为
好。
计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般
学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像
可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数
值的为主。这门课有两个极端的讲法:一个是古典的“数值分析”,完全讲数学原理和
算法;另一个是现在日趋流行的“科学与工程计算”,干脆教学生用软件包编程。我个
人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是
很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力
的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社
(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系
写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为
以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组
求解,插值方法,数值积分,场微分方程数值求解。李庆扬的那本则理论性过强,与实
际应用结合得不太紧。
每个学校本系里都会开一门离散数学,涉及集合论,图论,和抽象代数,数理逻辑。不
过,这么多内容挤在离散数学一门课里,是否时间太紧了点?另外,计算机系学生不懂
组合和数论,也是巨大的缺陷。要做理论,不懂组合或者数论吃亏可就太大了。从理想
的状态来看,最好分开六门课:集合,逻辑,图论,组合,代数,数论。这个当然不现
实,因为没那么多课时。也许将来可以开三门课:集合与逻辑,图论与组合,代数与数
论。(这方面我们学校已经着手开始做了)不管课怎么开,学生总一样要学。下面分别
谈谈上面的三组内容。
古典集合论,北师大出过一本《基础集合论》不错。 数理逻辑,中科院软件所陆钟万教
授的《面向计算机科学的数理逻辑》就不错。现在可以找到陆钟万教授的讲课录像,
http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧。总的来说,学集
合/逻辑起手不难,普通高中生都能看懂。但越往后越感觉深不可测。
学完以上各书之后,如果你还有精力兴趣进一步深究,那么可以试一下GTM系列中的
《Introduction to Axiomatic Set Theory》和《A Course of Mathematical
Logic》。这两本都有世界图书出版社的引进版。你如果能搞定这两本,可以说在逻辑方
面真正入了门,也就不用再浪费时间听我瞎侃了。
据说全中国最多只有三十个人懂图论。此言不虚。图论这东东,技巧性太强,几乎每个
问题都有一个独特的方法,让人头痛。不过这也正是它魅力所在:只要你有创造性,它
就能给你成就感。我的导师说,图论里面随便揪一块东西就可以写篇论文。大家可以体
会里面内容之深广了吧!国内的图论书中,王树禾老师的“图论及其算法”非常成功。
一方面,其内容在国内教材里算非常全面的。另一方面,其对算法的强调非常适合计算
机系(本来就是科大计算机系教材)。有了这本书为主,再参考几本翻译的,如Bondy &
Murty的《图论及其应用》,人民邮电出版社翻译的《图论和电路网络》等等,就马马虎
虎,对本科生足够了。再进一步,世界图书引进有GTM系列的"Modern Graph Theory"。
此书确实经典!国内好象还有一家出版了个翻译版。不过,学到这个层次,还是读原版
好。搞定这本书,也标志着图论入了门。
离散数学方面我们北京工业大学实验学院有个世界级的专家,叫邵学才,复旦大学概率
论毕业的,教过高等数学,线性代数,概率论,最后转向离散数学,出版著作无数,论
文集新加坡有一本,堪称经典,大家想学离散数学的真谛不妨找来看看。这老师的课我
专门去听过,极为经典。不过你要从他的不经意的话中去挖掘精髓。在同他的交谈当中
我又深刻地发现一个问题,虽说邵先生写书无数,但依他自己的说法每本都差不多,我
实在觉得诧异,他说主要是有大纲的限制,不便多写。这就难怪了,很少听说国外写书
还要依据个什么大纲(就算有,内容也宽泛的多),不敢越雷池半步,这样不是看谁的
都一样了。外版的书好就好在这里,最新的科技成果里面都有论述,别的先不说,至少
是“紧跟时代的理论知识”。
组合感觉没有太适合的国产书。还是读Graham和Knuth等人合著的经典“具体数学”吧,
西安电子科技大学出版社有翻译版。 抽象代数,国内经典为莫宗坚先生的“代数学”。
此书是北大数学系教材,深得好评。然而对本科生来说,此书未免太深。可以先学习一
些其它的教材,然后再回头来看“代数学”。国际上的经典可就多了,GTM系列里就有一
大堆。推荐一本谈不上经典,但却最简
单的,最容易学的:http://www.math.miami.edu/~ec/book/这本“Introduction to
Linear and Abstract Algebra"非常通俗易懂,而且把抽象代数和线性代数结合起来,
对初学者来说非常理想,我校比较牛的同学都有收藏。
数论方面,国内有经典而且以困难著称的”初等数论“(潘氏兄弟著,北大版)。再追溯
一点,还有更加经典(可以算世界级)并且更加困难的”数论导引“(华罗庚先生的名著,
科学版,九章书店重印,繁体的看起来可能比较困难)。把基础的几章搞定一个大概,对
本科生来讲足够了。但这只是初等数论。本科毕业后要学计算数论,你必须看英文的
书,如Bach的"Introduction to Algorithmic Number Theory"。
计算机科学理论的根本,在于算法。现在很多系里给本科生开设算法设计与分析,确实
非常正确。环顾西方世界,大约没有一个三流以上计算机系不把算法作为必修的。算法
教材目前公认以Corman等著的"Introduction to Algorithms"为最优。对入门而言,这
一本已经足够,不需要再参考其它书。
再说说形式语言与自动机。我看过北邮的教材,应该说写的还清楚。但是,有一点要强
调:形式语言和自动机的作用主要在作为计算模型,而不是用来做编译。事实上,编译
前端已经是死领域,没有任何open problems,北科大的班晓娟博士也曾经说过,编译的
技术已相当成熟。如果为了这个,我们完全没必要去学形式语言--用用yacc什么的就完
了。北邮的那本在国内还算比较好,但是在深度上,在跟可计算性的联系上都有较大的
局限,现代感也不足。所以建议有兴趣的同学去读英文书,不过国内似乎没引进这方面
的教材。可以去互动出版网上看一看。入门以后,把形式语言与自动机中定义的模型,
和数理逻辑中用递归函数定义的模型比较一番,可以说非常有趣。现在才知道,什么叫
“宫室之美,百官之富”!
计算机科学和数学的关系有点奇怪。二三十年以前,计算机科学基本上还是数学的一个
分支。而现在,计算机科学拥有广泛的研究领域和众多的研究人员,在很多方面反过来
推动数学发展,从某种意义上可以说是孩子长得比妈妈还高了。但不管怎么样,这个孩
子身上始终流着母亲的血液。这血液是the mathematical underpinning of computer
science(计算机科学的数学基础),也就是理论计算机科学。原来在东方大学城图书馆中
曾经看过一本七十年代的译本(书皮都没了,可我就爱关注这种书),大概就叫《计算
机数学》。那本书若是放在当时来讲决是一本好书,但现在看来,涵盖的范围还算广,
深度则差了许多,不过推荐大一的学生倒可以看一看,至少可以使你的计算数学入入
门。
最常和理论计算机科学放在一起的一个词是什么?答:离散数学。这两者的关系是如此
密切,以至于它们在不少场合下成为同义词。(这一点在前面的那本书中也有体现)传
统上,数学是以分析为中心的。数学系的同学要学习三四个学期的数学分析,然后是复
变函数,实变函数,泛函数等等。实变和泛函被很多人认为是现代数学的入门。在物
理,化学,工程上应用的,也以分析为主。
随着计算机科学的出现,一些以前不太受到重视的数学分支突然重要起来。人们发现,
这些分支处理的数学对象与传统的分析有明显的区别:分析研究的问题解决方案是连续
的,因而微分,积分成为基本的运算;而这些分支研究的对象是离散的,因而很少有机
会进行此类的计算。人们从而称这些分支为“离散数学”。“离散数学”的名字越来越
响亮,最后导致以分析为中心的传统数学分支被相对称为“连续数学”。
离散数学经过几十年发展,基本上稳定下来。一般认为,离散数学包含以下学科:
1) 集合论,数理逻辑与元数学。这是整个数学的基础,也是计算机科学的基础。
2) 图论,算法图论;组合数学,组合算法。计算机科学,尤其是理论计算机科学的核心
是
算法,而大量的算法建立在图和组合的基础上。
3) 抽象代数。代数是无所不在的,本来在数学中就非常重要。在计算机科学中,人们惊
讶地发现代数竟然有如此之多的应用。
但是,理论计算机科学仅仅就是在数学的上面加上“离散”的帽子这么简单吗?一直到
大约十几年前,终于有一位大师告诉我们:不是。D.E.Knuth(他有多伟大,我想不用我
废话了)在Stanford开设了一门全新的课程Concrete Mathematics。 Concrete这个词在
这里有两层含义:
首先:对abstract而言。Knuth认为,传统数学研究的对象过于抽象,导致对具体的问题
关心不够。他抱怨说,在研究中他需要的数学往往并不存在,所以他只能自己去创造一
些数学。为了直接面向应用的需要,他要提倡“具体”的数学。在这里我做一点简单的
解释。例如在集合论中,数学家关心的都是最根本的问题--公理系统的各种性质之类。
而一些具体集合的性质,各种常见集合,关系,映射都是什么样的,数学家觉得并不重
要。然而,在计算机科学中应用的,恰恰就是这些具体的东西。Knuth能够首先看到这一
点,不愧为当世计算机第一人。其次,Concrete是Continuous(连续)加上discrete(离
散)。不管连续数学还是离散数学,都是有用的数学!
理论与实际的结合——计算机科学研究的范畴
前面主要是从数学角度来看的。从计算机角度来看,理论计算机科学目前主要的研
究领域包括:可计算性理论,算法设计与复杂性分析,密码学与信息安全,分布式计算
理论,并行计算理论,网络理论,生物信息计算,计算几何学,程序语言理论等等。这
些领域互相交叉,而且新的课题在不断提出,所以很难理出一个头绪来。想搞搞这方面
的工作,推荐看中国计算机学会的一系列书籍,至少代表了我国的权威。下面随便举一
些例子。
由于应用需求的推动,密码学现在成为研究的热点。密码学建立在数论(尤其是计算
数论),代数,信息论,概率论和随机过程的基础上,有时也用到图论和组合学等。很多
人以为密码学就是加密解密,而加密就是用一个函数把数据打乱。这样的理解太浅显
了。
现代密码学至少包含以下层次的内容:
第一,密码学的基础。例如,分解一个大数真的很困难吗?能否有一般的工具证明协议
正确?
第二,密码学的基本课题。例如,比以前更好的单向函数,签名协议等。
第三,密码学的高级问题。例如,零知识证明的长度,秘密分享的方法。
第四,密码学的新应用。例如,数字现金,叛徒追踪等。
在分布式系统中,也有很多重要的理论问题。例如,进程之间的同步,互斥协议。一个
经典的结果是:在通信信道不可靠时,没有确定型算法能实现进程间协同。所以,改进
TCP三次握手几乎没有意义。例如时序问题。常用的一种序是因果序,但因果序直到不久
前才有一个理论上的结果....例如,死锁没有实用的方法能完美地对付。例如,......操
作系统研究过就自己去举吧!
如果计算机只有理论,那么它不过是数学的一个分支,而不成为一门独立的科学。
事实上,在理论之外,计算机科学还有更广阔的天空。
我一直认为,4年根本不够学习计算机的基础知识,因为面太宽了......
这方面我想先说说我们系在各校普遍开设的《计算机基础》。在高等学校开设《计
算机基础课程》是我国高教司明文规定的各专业必修课程要求。主要内容是使学生初步
掌握计算机的发展历史,学会简单的使用操作系统,文字处理,表格处理功能和初步的
网络应用功能。但是在计算机科学系教授此门课程的目标决不能与此一致。在计算机系
课程中目标应是:让学生较为全面的了解计算机学科的发展,清晰的把握计算机学科研
究的方向,发展的前沿即每一个课程在整个学科体系中所处的地位。搞清各学科的学习
目的,学习内容,应用领域。使学生在学科学习初期就对整个学科有一个整体的认识,
以做到在今后的学习中清楚要学什么,怎么学。计算机基本应用技能的位置应当放在第
二位或更靠后,因为这一点对于本系的学生应当有这个摸索能力。这一点很重要。推荐
给大家一本书:机械工业出版社的《计算机文化》(New Perspective of Computer
Science),看了这本书我才深刻的体会到自己还是个计算机科学初学者,才比较透彻的
了解了什么是计算机科学。另外在厦门大学赵致琢老师的著作《计算科学导论》当中的
很多经典理论都是在同类书籍中很难找到的。看看他也许你才会明白一个最基本的问
题:为什么计算机科学叫计算科学更为准确。这本书在世界上也可成为精品级的著作。
一个一流计算机系的优秀学生决不该仅仅是一个编程高手,但他一定首先是一个编程高
手。我上大学的时候,第一门专业课是C语言程序设计,念计算机的人从某种角度讲相当
一部分人是靠写程序吃饭的。在我们北京工业大学实验学院计算机系里一直有这样的争
论(时至今日CSDN上也有),关于第一程序设计语言该用哪一种。我个人认为,用哪种
语言属于末节,关键在养成良好的编程习惯。当年老师对我们说,打好基础后学一门新
语言只要一个星期。现在我觉得根本不用一个星期,前提是先把基础打好。不要再犹豫
了,学了再说,等你抉择好了,别人已经会了几门语言了。
汇编语言和微机原理是两门特烦人的课。你的数学/理论基础再好,也占不到什么便宜。
这两门课之间的次序也好比先有鸡还是先有蛋,无论你先学哪门,都会牵扯另一门课里
的东西。所以,只能静下来慢慢琢磨。这就是典型的工程课,不需要太多的聪明和顿
悟,却需要水滴石穿的渐悟。有关这两门课的书,计算机书店里不难找到。弄几本最新
的,对照着看吧。组成原理推荐《计算机组成与结构》清华大学王爱英教授写的。汇编
语言大家拿8086/8088入个门,之后一定要学80x86汇编语言。实用价值大,不落后,结
构又好,写写高效病毒,高级语言里嵌一点汇编,进行底层开发,总也离不开他,推荐
清华大学沈美明的《IBM—PC汇编语言程序设计》。有些人说不想了解计算机体系结构,
也不想制造计算机,所以诸如计算机原理,汇编语言,接口之类的课觉得没必要学,这
样合理吗?显然不合理,这些东西迟早得掌握,肯定得接触,而且,这是计算机专业与
其他专业学生相比的少有的几项优势。做项目的时候,了解这些是非常重要的,不可能
说,仅仅为了技术而技术,只懂技术的人最多做一个编码工人,而永远不可能全面地了
解整个系统的设计,而编码工人是越老越不值钱。关于组成原理还有个讲授的问题,在
我学这门课程时老师讲授时把CPU工作原理誉微程序设计这一块略掉了,理由是我们国家
搞CPU技术不如别的国家,搞了这么长时间好不容易出了个龙芯比Intel的还差个十万八
千里,所以建议我们不要学了。我看这在各校也未见得不是个问题吧!若真是如他所
说,那中国的计算机科学哪个方向都可以停了,软硬件,应用,有几项搞得过美国,搞
不过别人就不搞了,那我们坐在这里干什么?教学的观念需要转变的。
模拟电路这东东,如今不仅计算机系学生搞不定,电子系学生也多半害怕。如果你真想
软硬件通吃,那么建议你先看看邱关源的“电路原理”,也许此后再看模拟电路底气会
足些。教材:康华光的“电子技术基础”(高等教育出版社)还是不错的(我校电子系
在用)。有兴趣也可以参考童诗白的书。
数字电路比模拟电路要好懂得多。推荐大家看一看我们北工大刘英娴教授写的《数字逻
辑》业绩人士都说这本书很有参考价值(机械工业出版社的)。原因很明了,实用价值
高,能听听她讲授的课程更是有一种“享受科学”的感觉。清华大学阎石的书也算一本
好教材,遗憾的一点是集成电路讲少了些。真有兴趣,看一看大规模数字系统设计吧
(北航那本用的还比较多)。
计算机系统结构该怎么教,国际上还在争论。国内能找到的较好教材为Stallings
的"Computer Organization and Architectureesigning for Performance"(清华影印
本)。国际上最流行的则是“Computer architecture: aquantitative approach", by
Patterson & Hennessy。
操作系统可以随便选用《操作系统的内核设计与实现》和《现代操作系统》两书之
一。这两部都可以算经典,唯一缺点就是理论上不够严格。不过这领域属于Hardcore
System,所以在理论上马虎一点也情有可原。想看理论方面的就推荐清华大学出版社《操
作系统》吧,高教司司长张尧学写的,我们教材用的是那本。 另外推荐一本《Windows
操作系统原理》机械工业出版社的,这本书是我国操作系统专家在微软零距离考察半
年,写作历时一年多写成的,教操作系统的专家除了清华大学的张尧学(现高教司司
长)几乎所有人都参加了。Bill Gates亲自写序。里面不但结合windows2000,xp详述操
作系统的内核,而且后面讲了一些windows编程基础,有外版书的味道,而且上面一些内
容可以说在国内外只有那本书才有对windows内核细致入微的介绍,
如果先把形式语言学好了,则编译原理中的前端我看只要学四个算法:最容易实现
的递归下降;最好的自顶向下算法LL(k);最好的自底向上算法LR(k);LR(1)的简化SLR
(也许还有另一简化LALR)。后端完全属于工程性质,自然又是another story。
推荐教材:Kenneth C.Louden写的“Compiler Construction Principles and
Practice”即是《编译原理及实践》(机械工业出版社的译本)
学数据库要提醒大家的是,会用VFP,VB, Power builder不等于懂数据库。(这世界
上自以为懂数据库的人太多了!)数据库设计既是科学又是艺术,数据库实现则是典型的
工程。所以从某种意义上讲,数据库是最典型的一门计算机课程——理工结合,互相渗
透。另外推荐大家学完软件工程学后再翻过来看看数据库技术,又会是一番新感觉。推
荐教材:Abraham Silberschatz等著的 "Database System Concepts".作为知识的完整
性,还推荐大家看一看机械工业出版社的《数据仓库》译本。
计算机网络的标准教材还是来自Tanenbaum的《Computer Networks》(清华大学有译
本)。还有就是推荐谢希仁的《计算机网络教程》(人民邮电出版社)问题讲得比较清
楚,参考文献也比较权威。不过,网络也属于Hardcore System,所以光看书是不够的。
建议多读RFC,http://www.ietf.org/rfc.htm里可以按编号下载RFC文档。从IP的读起。
等到能掌握10种左右常用协议,就没有几个人敢小看你了。再做的工作我看放在网络设
计上就比较好了。
数据结构的重要性就不言而喻了,学完数据结构你会对你的编程思想进行一番革命性的
洗礼,会对如何建立一个合理高效的算法有一个清楚的认识。对于算法的建立我想大家
应当注意以下几点:
当遇到一个算法问题时,首先要知道自己以前有没有处理过这种问题.如果见过,那么你一
般会顺利地做出来;如果没见过,那么考虑以下问题:
1. 问题是否是建立在某种已知的熟悉的数据结构(例如,二叉树)上?如果不是,则要自己
设计数据结构。
2. 问题所要求编写的算法属于以下哪种类型?(建立数据结构,修改数据结构,遍历,查找,
排序...)
3. 分析问题所要求编写的算法的数学性质.是否具备递归特征?(对于递归程序设计,只要
设计出合理的参数表以及递归结束的条件,则基本上大功告成.)
4. 继续分析问题的数学本质.根据你以前的编程经验,设想一种可能是可行的解决办法,
并证明这种解决办法的正确性.如果题目对算法有时空方面的要求,证明你的设想满足其
要求.一般的,时间效率和空间效率难以兼得.有时必须通过建立辅助存储的方法来节省时
间.
5. 通过一段时间的分析,你对解决这个问题已经有了自己的一些思路.或者说,你已经可
以用自然语言把你的算法简单描述出来.继续验证其正确性,努力发现其中的错误并找出
解决办法.在必要的时候(发现了无法解决的矛盾),推翻自己的思路,从头开始构思.
6. 确认你的思路可行以后,开始编写程序.在编写代码的过程中,尽可能把各种问题考虑
得详细,周密.程序应该具有良好的结构,并且在关键的地方配有注释.
7. 举一个例子,然后在纸上用笔执行你的程序,进一步验证其正确性.当遇到与你的设想
不符的情况时,分析问题产生的原因是编程方面的问题还是算法思想本身有问题.
8. 如果程序通过了上述正确性验证,那么在将其进一步优化或简化。
9. 撰写思路分析,注释.
对于具体的算法思路,只能靠你自己通过自己的知识和经验来加以获得,没有什么特定的
规律(否则程序员全部可以下岗了,用机器自动生成代码就可以了).要有丰富的想象力,就
是说当一条路走不通时,不要钻牛角尖,要敢于推翻自己的想法.我也只不过是初学者,说
出上面的一些经验,仅供大家参考和讨论。
关于人工智能,我觉得的也是非常值得大家仔细研究的,虽然不能算是刚刚兴起的
学科了,但是绝对是非常有发展前途的一门学科。我国人工智能创始人之一,北京科技
大学涂序彦教授(这老先生是我的导师李小坚博士的导师)对人工智能这样定义:人工
智能是模仿、延伸和扩展人与自然的智能的技术科学。在美国人工智能官方教育网站上
对人工智能作了如下定义:Artificial Intelligence, or AI for short, is a
combination of computer science, physiology, and philosophy. AI is a broad
topic, consisting of different fields, from machine vision to expert
systems. The element that the fields of AI have in common is the creation of
machines that can "think".
这门学科研究的问题大概说有:
(1)符号主义: 符号计算与程序设计基础,知识表达方法 :知识与思维,产生式规
则,语意网络,一阶谓词逻辑问题求解方法:搜索策略,启发式搜寻,搜寻算法,问题
规约方法,谓词演算:归结原理,归结过程专家系统:建立专家系统的方法及工具
(2)联接主义(神经网络学派):1988年美国权威机构指出:数据库,网络发展呈直线
上升,神经网络可能是解决人工智能的唯一途径。
我想对于人工智能的学习,大家一定不要像学数学似的及一些现成的结论,要学会分
析问题,最好能利用程序设计实现,这里推荐给大家ACM最佳博士论文奖获得者涂晓媛博
士的著作《人工鱼—计算机动画的人工生命方法》(清华大学出版社)。搞人工生命的
同学不会不知道国际知名的涂氏父女吧。关于人工智能的书当然首选《Artificial
Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
关于网络安全我也想在这里说两句,随着计算机技术的发展,整个社会的信息化水平突
飞猛进,计算机网络技术日新月异,网络成了当即社会各个工作领域不可缺少的组成部
分,只要有网络存在,网络安全问题就是一个必须解决好的问题,学习网络安全不是简
简单单的收集一些黑客工具黑一黑别人的网站,而是要学习他的数学原理,实现原理,
搞清底层工作机制,这样才能解决大部分的现有问题和新出现的安全问题。
关于计算机科学的一些边缘科学我想谈一谈软件工程技术,对于一个企业,推出软件是
不是就是几个程序员坐在一起,你写一段程序,我写一段程序呢?显然不是。软件工程
是典型的计算机科学和数学,管理科学,心理学,社会学等学科的综合。它使我们这些
搞理论和技术的人进入了一个社会。你所要考虑的不仅仅是程序的优劣,更应该考虑程
序与软件的区别,软件与软件产品的区别,软件软件产品的市场前景,如何去更好的与
人交流。这方面我还在学习阶段,以后这方面再写文章吧,先推荐给大家几本书:畅销
20年不衰的《人月神话》(清华大学中文版,中国电力出版社影印版),《软件工程-实
践者研究的方法》(机械工业出版社译本),《人件》(据说每一位微软公司的部门经
理都读过这本书,推荐老总们和想当老总的同学都看看,了解一下什么是软件企业中的
人)以及微软公司的《软件开发的科学与艺术》和《软件企业的管理与文化》(研究软
件企业的制胜之道当然要研究微软的成功经验了!)
关于计算机技术的学习我想是这样的:学校开设的任何一门科学都有其滞后性,不要总
认为自己掌握的某门技术就已经是天下无敌手了,虽然现在Java,VB,C,C++用的都很多,
怎能保证没有被淘汰的一天,我想.NET平台的诞生和X#语言的初见端倪完全可以说明问
题。换言之,在我们掌握一门新技术的同时就又有更新的技术产生,身为当代的大学生
应当有紧跟科学发展的素质。举个例子,就像有些同学总说,我做网页设计就喜欢直接
写html,不愿意用什么Frontpage,Dreamweaver。能用语言写网页固然很好,但有高效的
手段你为什么不使呢?仅仅是为了显示自己的水平高,unique? 我看真正水平高的是能
够以最快的速度接受新事物的人。高级程序设计语言的发展日新月异,今后的程序设计
就像人们在说话一样,我想大家从xml中应是有所体会了。难道我们真就写个什么都要用
汇编,以显示自己的水平高,真是这样倒不如直接用机器语言写算了。反过来说,想要
以最快的速度接受并利用新技术关键还是在于你对计算机科学地把握程度。
计算机技术牵扯的内容更为广泛些,一项一项说恐怕没个一年半载也说不清。我只想提
醒大家的还是那句话,技术与科学是不能分家的,学好了科学同时搞技术,这才是上上
策。犹如英语,原先人们与老外交流必须要个翻译,现在满马路的人都会说英语。就连
21世纪英语演讲比赛的冠军都轮不到英语系的学生了。计算机也是一样的,我们必须面
对的一个现实就是:计算机真就只是一个工具,如果不具备其它方面的素养,计算机系
的学生虽然不能说找不到工作,不过总有一天当其他专业性人才掌握了计算机技术后将
比我们出色许多。原因就在于计算机解决的大都是实际问题,实际问题的知识却是我们
少有的。单一的计算机技术没有立足之地。
我想是时候指出:学习每一个课程之前,都要先搞清这一课程的学习目的。这一学
科的应用领域。据我自身所了解到的同龄同学和低年级的同学的学习状况:他们之中很
少有人知道学一个学科的学习目的,期末考试结束了也不知道学这科做什么用。这就失
去了读计算机科学的意义。当然这与现存的教育思想不能说一点关系都没有。
总的来说,从教育角度来讲,国内高校的课程安排不是很合理,强调理论,又不愿意在
理论上深入教育,无力接受新技术,想避开新技术又无法避得一干二净。我觉得关键问
题就是国内的高校难于突破现状,条条框框限制着怎么求发展。我们虽然认识得到国外
教育的优越性,但为什么迟迟不能采取行动?哪怕是去粗取精的取那么一点点。我们需
要改变。从我们自身角度来讲,多数人4年下来既没有学习计算机科学的学术水平,也没
有学习计算机技术的那种韧劲。在我刚上大一时,我的计算机科学入门导师,淮北煤炭
师范学院王爱平教授曾经对我说过这样一番话:“当你选择了计算机这一门科学,就意
味着你踏上了一条不归路,就意味着你一生都要为之奋斗……你的身后是悬崖,只有向
前走,不能往后退。”
有些同学说按照这样学习学的东西太多,有的未见得有用,我想打个形象的比方:
学校学出来的人都是一个球体,方方面面的知识都应具备。可是社会上需要球体的地方
很少,反而需要的是砖和瓦,即精通某一行的人才。但是对于同等体积的物体,用球体
来改造是最方便最省事的。学校的学生很多,为了能够使更多的学生来适应这个社会,
学校也就不得以把所有的学生都打造成一个球体,然后让社会对这些学生进行再加工,
成为真正能够有用的人才。即使你非常清楚自己的将来要干什么,并且非常下定决心要
走自己的路,这一步你也必须走,世界是在不断变化的,你不能预料未来。想清楚,努
力去干吧!
必须结束这篇“胡侃”了,再侃下去非我力所能及。其实计算机还有很多基础课都值得
一侃。怎奈我造诣有限,不敢再让内行耻笑。对于博大精深的计算机科学,我只能说我
永远都是个Beginner.最后声明:这些只针对本科阶段的学习。即使把这些全弄通了,前
面的路还长,计算机科学需要我们为之奋斗......学习计算机科学需要韧性,更需要创
新,需要激情。深刻学习理论知识,勇于接受新技术的挑战,这才是我们这一代人应具
有的素质。最后送大家一句话“Wake up every day with a feeling of passion for
the difference technology will make in people's life!”。
在我大一时无意中找到了南京大学网友sir的帖子“胡侃(理论)计算机学习”,这个帖
子对我的大学生活起了至关重要的作用,也因此同他成为了好友,本帖子在原有帖子的
基础上改进了其中我认为不太合适的理论,修正了一些观点,在推荐教材方面结合我的
学习情况有了较大改变。值得一提的是增加了一些计算机理论的内容,计算机技术的内
容结合我国的教学情况和我们学习的实际情况进行了重写。感谢大家的支持,这篇文章
才能比较快的完成,这里也只是写下了我在学习计算机科学时的所思所想,很不成熟。
与原文相比增加了一些推荐参考书,删去了一些过陈旧的难以找到的材料。并且对一些
问题作了更为详细地阐述,也增加了一些新观点。希望大家多多讨论,改进不足,让我
们共同努力吧!
我的数码世界 - Ma Jian 's Home Page 马剑的个人主页
呵呵, 今天我开始了一个新的wiki页面 - 我的数码世界。 我将逐渐介绍我的数码硬件,我使用它时的感受。我喜欢的软件,以及我为什么喜欢它们。还会给出一些介绍和连接。争取全面介绍我的数码相关生活。:)
听说那个Google Desktop了, 早就想有这个冬冬了, Single几年前就跟我说想要这个东西来管理资料。
不料,那天装的时候报告说和我电脑上的MS ISA Firewall Client冲突,要我升级到4.0,愁啊。
今天,我把ISA Firewall Client卸载了,安装上Google Desktop,又把Client装上了,居然又能用了,FT啊。
嗬嗬,不过终于能用了,不错。
前几天发现,我的blog的左面导航栏的项目符号再firefox中总是高出一截儿,查了所有的css都没搞明白怎么回事儿。
昨天,突然发现这是MoinMoin里面宏Anchor搞得鬼。这个宏在当前位置插入一个<a id="xxx" >的tag,可是却没有封口,应该为< a id="xxx"></a>,导致firefox解析除了问题。IE比较皮实对这种问题能忽略。 现在我只得添加另一个宏[[HTML("</a>")]].
最好是把MoinMoin代码改了,不知道现在新的MoinMoin还有没有这样的bug.
补充:
刚刚改了/usr/lib/python2.3/site-packages/MoinMoin/formatter/text_html.py
99行:
def anchordef(self, id):
return '<a id="%s"></a>' % id
以前特别奇怪,为啥google搜不到我wiki上的内容呢?今天去看MoinMoin的帮助才突然发现,wiki页面header里默认的加入了< meta name="robots" content="noindex,nofollow" >,搜索引擎当然不再索引了。 修改moin_config.py增加html_head_queries= "" 就可以去掉了
现在改过来了,希望以后能够看到变化:)
Liquid Reality - Transmit Linux Sound to Windows by Christian Schneider
办公室的机器都是Windows的,常常开一个X Server,来使用宿舍的Linux机器,问题是怎么把Linux上的声音引过来呢?答案是EsounD
以前曾经找过,有一个用java做的esd,还得安装jdk比较麻烦。现在好了,找到了一个package,里面是esound 的cygwin的port.运行esd -tcp -public
然后在你得linux box上设置环境变两export ESPEAKER=
还有另外一个问题,我办公室的机器是在防火墙后面的,怎么办呢?答案是:ssh tunnel
首先,为了Xserver能使用,打开putty的X forward
其次,为了Esound能用,设置tunnel : R16002:localhost:16001(含义是在Linux上主机上开一个端口16002tunnel到本地windows的16001端口),这样你再设置export ESPEAKER=localhost:16002 (记得esd启动用esd -tcp即可,不需要-public了)。
现在putty登陆到Linux机器,运行xmms,可以了吧?:)
lbdb: The Little Brother's Database
小哥数据库(LBDB)是从大哥数据库(BBDB)得到灵感的,呵呵,BBDB是emacs mailer用的一个外部Email地址查找器。而LBDB是为Mutt服务的,呵呵,Mutt可是我收发信件的最爱工具阿:)。
还是介绍LBDB吧:他可以从多个数据源得到地址数据,包括:
finger
收到的信件
passwd文件,
GPG钥匙,
pine地址本,
palm(jpilot)地址本,
BBDB,
LDAP,
Evolution等等。
在Mutt中,要写信时按"Q",输入收信人的名字或者昵称或者地址一部分,就能找到具体的Email地址:)
方便吧:)
呵呵,今天是用apt-cache search xscreensaver无意中搜到的。好像最后更新是2001年,不过还是挺好用的。他可以定期更新你的壁纸,还有不同的淡入淡出方式可以选择。
刚刚从Debian News看到关于Debian无法实施SenderID技术的声明。
关于SenderID技术:
IETF多年来没有颁布有效的反垃圾邮件技术规范,这导致了目前反垃圾邮件技术的多样性。然而,反垃圾邮件并非一件孤立的任务,它往往需要不同的邮件服务器之间有效协同运作才能真正发挥作用,在现有条件下,任何一种单一的技术都缺乏大规模实施的土壤。最近,这种情况出现了改变的迹象。由微软公司和pobox.com提出的SenderID技术很可能将成为反垃圾邮件技术标准。
不久前,IETF发布了名为“DNS中MTA认证记录”技术规范的最新修订版。此前,隶属于Internet研究任务组织(IRTF,该组织配合IETF进行相关的研究工作)的反垃圾邮件研究组(ASRG)一直在从事将已有的几种反垃圾邮件技术合并的研究。这个规范最终由微软公司的Jim Lyon和Pobox.com公司的Meng Weng Wong共同开发,目前已经成为“Internet草案(Draft)”。
工作原理
可以说,SenderID的前身就是比尔·盖茨曾经描绘过的Caller ID技术。顾名思义,就是根据发送方所提供的表明来源的信息来决定接收与否。事实上,这种技术并不直接判断某封邮件是否是垃圾邮件,而是判断邮件的来源是否与其标称相符。也就是说,它不是用来阻止垃圾邮件的发送,而是正确回答“谁发送了邮件”这个基本问题,从而使得垃圾邮件的判定更加简单。
SenderID的工作流程大致分为三步:首先,所有的邮件发送者根据SenderID所规定的格式,将其所属域中具有邮件发送职能的主机IP注册到DNS中;随后,接收邮件的系统在每次接收邮件时检查其“主发送域”(purported responsible domain),也就是说,即使中间经过了几次MTA路由,也要查出其原始发送域;最后,邮件接收系统向主发送域进行DNS查询,检查邮件发送者所使用的IP是否在该域的MTA IP列表中,如果不符,则可证明这封邮件是欺骗邮件,通常可以拒收。
前景预测
AOL邮件运营总监BrainSullivan表示,“关于反垃圾邮件,目前能做的工作就是进行邮件发送者授权。” 据悉,此前,美国的ISP们曾经支持不同的反垃圾邮件标准。直到上个月,微软才刚刚宣布自己研发的CallerID和AOL、Earlthlink的SPF标准以及Sender Policy Framework合并,形成新标准:SenderID。SPF反垃圾邮件协议的创始人Meng Weng Wong对4大ISP达成一致表示欢迎。SenderID将首先在Hotmail、Yahoo以及AOL等各大邮件服务提供商中实施,随后逐渐推广到整个Internet。AOL、Earthlink、Yahoo都表示将于年底起兼容DomainKeys和SenderID两种反垃圾邮件协议。而微软对Yahoo的DomainKeys不感兴趣,仍在考虑其他第三方协议,比如Cisco的。此前,AOL、Earthlink邮件系统都已经支持SPF协议,微软将于近期投入使用SenderID协议。
SPF和SenderID协议更容易推广,因为该协议采用了FromIP鉴别技术。除了对MTA(加入主发送域的提取和验证功能)和DNS(加入新类型的记录,以“_ep”专用子域的形式体现)的修改之外,SenderID检查主发送域的方式还决定了当前的部分邮件系统要做出一定的调整。对于普通邮件,SenderID系统会检查其“From”字段;对于邮件列表,则要求其具有合法的“Sender”字段;对于转发邮件,新规范建议使用“Resent-From”字段;对于来自其他网络的邮件,例如来自手机和PDA,以其服务运营商名义发送的邮件,则需要相关的服务运营商提供合法的“Sender”字段。否则相关的邮件可能会被拒收。
SenderID实施的难点在于对DNS机制的扩充,虽然我们都知道这是必需的,但这样给业界带来的巨大实施成本也不容忽视。SenderID并非什么高深技术,它像现有的各个RFC一样,只是一个解决某种需求的在技术和工程上恰当的方法,它无疑也将是各方妥协的结果,当然,由于它是由Microsoft和pobox.com提出的,并得到yahoo和AOL等巨头的支持,以及IETF的认可,可以预料它的前途一片光明。
(计算机世界报 第29期 D7)
微软的相关网站:Sender ID Framework
对此,Debian表示因为微软的Microsoft Royalty-Free Sender ID Patent License条款的限制,Debian项目无法实施SenderID,因为这个License条款违背了deiban的Debian Free Software Guidelines (DFSG).
SenderID作为一个解决垃圾邮件的技术草案如果想真正发挥作用当然需要Internet最为广泛的支持才行,而不是MS,Yahoo,AOL,Earthlink几家公司的事情....
Debian -- News -- DEPLOY: Debian project unable to deploy Sender ID
MD4, MD5, HAVAL-128 and RIPEMD 都不安全了!
http://www.smth.org/bbscon.php?board=NewSoftware&id=518255
https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=39807
http://www.readyresponse.org/index.php?option=content&task=view&id=94&Itemid=2
以前就这么认为:MD5算法虽然没有人证明是安全,但是没人能攻破它,所以放心大胆的用吧。…… 现在不行啦,王教授已经成功的找到了快速的算法,该算法可以对给定任意一个输入找到另一个输入,使得它们的md5一样。也就是说,可以找到方法针对一个有数字签名的文档伪造出一个与其签名一样的文档,后果严重把。应该提到的是,现在sha-1算法还没有被攻破,但是能保证它不被攻破么?
附一些网站的评述:
2004年8月17日的美国加州圣巴巴拉,正在召开的国际密码学会议(Crypto’2004)安排了三场关于杂凑函数的特别报告。在国际著名密码学家Eli Biham和Antoine Joux相继做了对SHA-1的分析与给出SHA-0的一个碰撞之后,来自山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。在会场上,当她公布了MD系列算法的破解结果之后,报告被激动的掌声打断。王小云教授的报告轰动了全场,得到了与会专家的赞叹。报告结束时,与会者长时间热烈鼓掌,部分学者起立鼓掌致敬,这在密码学会议上是少见的盛况。王小云教授的报告缘何引起如此大的反响?因为她的研究成果作为密码学领域的重大发现宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。会议总结报告这样写道:“我们该怎么办?MD5被重创了;它即将从应用中淘汰。SHA-1仍然活着,但也见到了它的末日。现在就得开始更换SHA-1了。”
问题来源于学校里的IPTV使用的是多播技术,似乎现在用Linux+netfilter做的NAT不支持对multicast,所以内网的机器没法看IPTV了。
15号,Lazy@PKU提出这个问题,我查了一下文档,想到如下的解决方法
更具体的说,是不是要支持NAT下的multicast?
我觉得其实这跟netfilter没什么关系,只要netfilter不把multicast的包drop掉
问题归结到最后其实就是对multicast route 的管理
有两类方法,一个是应用层的deamon 比如:Zebra, mrouted, or pimd
我详细讲讲另一个就是用Linux kernel自身的功能
1。保证kernel支持IGMP协议,
2. 设置multicast的路由,比如内网接口是eth1
route add -net 224.0.0.0/8 eth1
3.打开forward,当然如果是NAT的话自然就打开了
echo 1 > /proc/sys/net/ipv4/ip_forward
这样,我觉得就应该行了:)
为什么可以呢:a.内网发送的加入组播的igmp包通过NAT的MASQUERADE发送到外网上一级
的router,等于是NAT主机加入了组播
b.发往组播地址(224.0.0.0/8)的包被NAT主机forwarding,根据route table 发往内网网
卡eth1,内网机器最终收到
我没有环境测试,大家有空试一下吧,:)
相关文档:http://lartc.org/lartc.html#LARTC.MULTICAST
【 在 lazy (draughts) 的大作中提到: 】
: 谁没事弄弄netfilter架构做透明网关对multicast
: 的支持把,否则看IPTV很麻烦。一直没精神折腾这个
今天给Blogbus的网管写了封建议信:)
BlogBus的网管:你好,我有好几个朋友都是使用blogbus来做自己的网志,我经常给他们留言,有时在我自己的blog(www.ieasy.org)中引用他们的文章.发现一个问题, 贵站使用的都是gb2312编码,而我的blog用的是UTF-8编码,所以blogbus上看到引用连接都是乱码.
大家应该可以预见到Unicode/UTF8编码规范在今后的广泛使用,而且事实上现在很多的Blog都是UTF8编码的,所以我非常非常希望blogbus也能够走在前面,采用utf8编码.
谢谢 Albert Ma
MoinMoin中支持子页(SubPage),但是指向子页的连接不是形如PageOne/SubPage而是把/换成了_2f 变成了PageOne_2fSubPage,这样看起来就不直观了。
我修改了/usr/lib/python2.3/site-packages/MoinMoin/wikiutil.py增加了函数
def quoteFilename_plus(filename):
"""
Return a simple encoding of filename in plain ascii.@param filename: the original filename, maybe containing non-ascii chars
@rtype: string
@return: the quoted filename, all special chars encoded in _XX
"""
safe = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/"
res = list(filename)
for i in range(len(res)):
c = res[i]
if c not in safe:
res[i] = '%%%02x' % ord(c)
return ''.join(res)
并修改了quoteWikiname = quoteFilename
为quoteWikiname = quoteFilename_plus
这样就能看到斜杠了,而且中文也不会显示为_f3_e3之类的而是用标准的%f3%e3的Escape码。
Download details: Internet Explorer Tools for Validating XML and Viewing XSLT Output
困扰我已经很久的问题终于找到解决了,怪自己为什么现在才去寻找这样一个东东。
这个东东可以在右键菜单中增加两个功能:1 Validate XML . 2 查看XSL输出。
注意:下载的exe安装完,需要你到安装目录下,右键点那个inf文件,安装。 安装后,ie右键
会多出一个功能,如下图:
attachment:IncludeExternalFile.py of MacroMarket - MoinMoin
呵呵.在建设自己的主页时希望能够包含我的网志的内容,当然是动态更新.想到可以用MovableType的模板生成一个文件(比如新文章列表),然后再用MoinMoin的macro包含之
结果搜了半天,发现没有,没办法,硬着头皮,学着别人的macro的写法,自己写了一个IncludeExternelFile.py 呵呵.虽然很简单,不过我可是一点都不会python啊.
使用的时候比较简单:[[IncludeExternalFile(文件路径)]] 这里的文件路径是相对于配置参数IncludeExternalFileRoot的, 这个配置必须在配置文件里定义.这都是处于安全的考虑.因为估计站长不希望自己的/etc/passwd出现在沙箱里吧:)
现在要在服务器端根据User-Agent头信息判断客户端是那种浏览器。
结果发现MSIE居然也写自己是Mozilla 4.0,所以找到下面这个网站,详细介绍了每一种浏览器的Browser ID Strings
Browser ID Strings (a.k.a. User Agent ID)
这里项系列出来了各种string, 可是没有做一定的总结,也就是说, 我希望给我一个方法就可以知道到底是IE还是mozilla.只好自己分析了。
今天随便看看我的主页的访问日志,发现有3万多次访问/EAII/gen.php,一看果然新生成了3万多个Email地址图片,使用的Email都是诸如bkbTsh9NyQexB@BdptjSkeJKxna1gOh.QWO的垃圾输入! 这些访问都来自218.104.71.162,中国科技大学的一个IP.不知道这位仁兄想要干嘛,帮我测漏洞么?还是仅仅是无聊?
也怪我不好, 当时写这个程序根本没有想到会有这样的情况发生.sigh.
现在我增加校验码的检查,应该可以缓解这个情况了.
BTW:以前gen.php用的是GET方法,免不了将email地址留在了access_log里,现在改成了POST方法,保护大家的隐私.
这2个修改之后,EAII发布version 1.1
EmailAddressInImage - Ma Jian 's Home Page
用图片表达电子邮件地址 - EmailAddressInImage (EAII)
介绍
垃圾电子邮件的泛滥,让大家在上网发言时都格外小心, 不敢随便留下自己的Email地址,担心自己的地址被Bot搜集了去:(。 有的人只好使出各种招数,比如把@换成 AT,换成#, 等等。
我做的这个东东用图片来表达电子邮件, 在图片的url信息里也没法找到相应的Email地址, 因为我们是用Email地址的md5哈希来表示的。 邮件地址搜集者只好用手工方法或者图象处理的方法来获得,显然这两者都是很麻烦的。
FundPlan - Ma Jian 's Home Page
平时大家一起吃饭,现场大家都掏钱包不好,所以就由一个人先垫上,回头攒多了再结,
一般都是写在一个Excel文件中发群体信件,总觉得,第一总发信不方便,第二手工去修改excel文件也容易出错而且不好同步。
所以我就用php+mysql写了这个软件"基金计划 - FundPlan" ,希望以后自己会用,还希望共享给大家,让大家都能方便使用。
大家用的时候有什么建议和意见欢迎来信讨论:)
要做一个类似资源管理器的树型结构菜单,而且具体的树的结构是用XML格式描述的.自然的我想到了使用XSL.
首先我先找到一个tree 的javascript实现
http://www.treemenu.net/ ,这个东东做的不错:)


而且,兼容多种浏览器.我根据XML的结构很容易的就完成了那个XSL,马上在IE看到了效果,可是Mozilla/Firefox却显示空白,什么都看不到:(
我开始找问题,首先写了最简单的XSL来测试,还不行,后来发现这是另一个问题, mozilla对于stylesheet指定的xsl路径中包含中文处理不当,无法正确处理.
排除了这个问题后发现我逐步增加xsl中的东西,发现在调用treeview构造树那个函数时,页面不正常了, 变成空白了.
这时我才想到使用firefox的javascript console,我马上发现一个exception,关于document.write时 指针为空.
我来到mozilla的主页找到了下面这段话
FAQ: XSL Transformations (XSLT) in Mozilla
What about document.write?
Just like for XHTML, document.write is not supported during XSLT transformations. Sadly, current builds don't error, but just give unexpected results.....
看来,一时半会mozilla是不会支持在xsl中使用document.write了, 而treeview正是使用这个方法才实现树型结构, 没办法,要想照顾mozilla的用户只好在服务器端用xml+xsl构造html了.
这里要注意非xsl情况下treeview对于mozilla是支持的很好的, 也就是说使用静态html或者脚本比如php/jsp/asp/python/perl或CGI产生的叶面都可以用的:)
两个文件 A和B,
现在要得到在A中出现,不在B中出现的所有行
即A-B
我想到的方法
grep -v -f B.txt A.txt >new.txt
不过要求B.txt中不能含有空行,否则new.txt就是空的了。
去掉空行的方法
sed -e "/^$/d" B.txt >B2.txt
遗留问题: 该方法实际上是拿B中的每一行作为一个pattern去匹配A中的每一行,没被匹配的才打印出来。如果B中刚好包含了pattern的元字符,比如".^$*"就会有问题, 应该找到方法disable掉grep regexp的功能。
Designing Simple front ends with dialog/Xdialog LG #101
lg上讲的dialog/xdialog使用方法, 很好啊,以后自己写脚本就方便了。
Leaning Out of Windows LG #101
Finally, we have those annoying Flash ads. If you use Mozilla's new Firefox browser, you can add a plugin (see the Properties dialog) which replaces all Flash ads with a link that says something like "Click to play". The ad won't appear now unless you tell it to.
呵呵,回头看看是哪个插件
My solution: dproxy
http://dproxy.sourceforge.net
dproxy可以作为dns的cache和proxy,适用于局域网里router上架设。
secure email-clients with PGP/MIME
一个PGP/GnuPG的问题,让我头疼已久了。 我在Linux上使用mutt/Gnupg签名的信件,在windows上的outlook 安装gpg、gnupg plugin,都不行。现在明白了。
邮件使用gpg/gpg加密有两种方式
1。PGP/inline
2.PGP/MIME
mutt使用的是PGP/MIME,而 outlook/gpg/gnupg plugin for outlook都是使用PGP/inline
secure email-clients with PGP/MIME仔细描述了现在有那些邮件客户端支持PGP/MIME.
OUTLOOK当然不在其列。 解决方案倒是有, 使用relay, 比如GPGrelay。 不过outlook用起来还是不太方便。 GPGrelay 把validate之后的正文作为附件, 真是太bt了。
这样搞严重影响了gpg/gnupg的普及, 我觉得。
附一篇讲gpg算法的中文文档
Mutt PGP/OUTLOOK & OutLook Express
里面提到可以配置mutt或pathch mutt 来让他迁就 outlook
### GPG for Outlook
# don't do PGP/MIME but encrypt directly in the body
set pgp_create_traditional
# help Outlook (patched)
set pgp_outlook_compat=yes
# to cope with umlauts etc. we have to sign it ourselves and not let mutt do it
unset pgp_autosign
macro compose y "
###
patch 在 这里
我想两个程序的输出合并起来存入一个文件或管道,怎么办?
bash下,
${ echo "line1";cat /tmp/file1;echo "end"} >/tmp/file2
注意, {}中的每一个命令后都有;不然会有问题:)
一个快捷方式
javascript:d=document;t=d.selection?d.selection.createRange().text:d.getSelection();void(window.open('http://www.ieasy.org/cgi-bin/mt/mt.cgi?is_bm=1&bm_show=category,excerpt,text_more,keywords&__mode=view&_type=entry&blog_id=1&link_title='+escape(d.title)+'&link_href='+escape(d.location.href)+'&text='+escape(t),'_blank','scrollbars=yes,width=400,height=700,status=yes,resizable=yes,scrollbars=yes'))
放到连接里,就可以自动撰写自己的blog了:)
昨天一哥们找我看看,他的要架一个基于perl的论坛, 怎么都不行, 总是500错误。
把我也难住了, 明明都没有错误,就是不能运行:( ,自己回宿舍仔细的看了一会儿,才发现他的脚本都是dos格式的, 也就是说换行是\r\n.
而脚本开头都是#!/usr/bin/perl, 因为后面多了一个^M所以 linux去找一个叫做/usr/bin/perl^M的解释器, 当然找不到了, 所以出错, dos2unix *就搞定了。
遇到问题一定要有耐心, 不能拖沓, 最后就一定能解决:)
wakka wiki引擎是一个很简单的,但是很容易扩展的wiki引擎。用php和mysql实现。 今天弄了半天才让它支持中文。
把默认的charset改成gb2312,
grep -r -i charset *
然后修改之:)
还有handler/page/edit.php里有一处使用了htmlentity....之类的函数,破坏了汉字
把它改了,改成了只去掉<>之类的字符。具体什么函数忘了:( , 看一下php手册字符串函数就能找到。
还有一点就是wakka wiki 规定的wikiname 比较奇怪, 它要求必须是几个连起来的词,每个词第一个字母大写才行,象这样 WikiName
我把它改了, 呵呵, 只要字母打头就行了:)
去年5月份在研究virtual ethernet adapter这个东东,
基本的思路就是建立虚拟网卡, 把本应ethernet传送的包通过tcp传出去,
win2000/xp 的adapter和linux的switch 已经做出来了.
不过性能还是很不好,后来就放在那里了, 前两天还在想要不要把这个东东写成论文. __可是__, 今天上网碰巧看到这个词 softether , 马上google it, 发现竟然是一个和我的思路一样的东东, 一个日本的大一学生已经做出来了:( http://www.softether.com . 于是自己很受刺激 . :(
现在他们已经做到了可以应用的阶段, 而且的确有一些值得学习的地方.
但是我们(还有我的一个室友,当时我们两个都研究这个)觉得, 我们应该把我们自己做的东西公布出来, 得到更广泛的支持.
我们已经迟了一年了. 不能再迟了.
我一天之内得到两个教训, 这回是教育我们有了好的想法后, 一定要坚持到底,否则最终一事无成!
先贴一下当时的问题:
现在的需求是
宿舍的机器只能访问免费地址
所以如果让postfix直接发信到目标的smtp服务器
很多发往国外的信就发不出去了。
我就不得不用一个能发信到各处的smtp服务器作为relay
(当然它允许在认证后relay)
而我希望的是能够根据目标的ip,
如果是免费ip,postfix就直接发送
如果不是,才使用relay
该怎么设置?
------------------
然后现在的解决方案
多亏了smth的一个高手指点:)
"man 5 transport"
讲一下我做的步骤
首先编辑/etc/postfix/transport
加入
#开始
pku.edu.cn smtp:
.pku.edu.cn smtp:
sohu.com smtp:
#以上几个地址的邮件使用smtp直接发送
* :
# 其他的地址使用main.cf里定义的默认的方式(默认的relay)发送
#结束
postmap /etc/postfix/transport
在/etc/postfix/main.cf里加入
transport_maps = hash:/etc/postfix/transport
postfix reload
这个解决了我的问题,不过还没有达到我的针对免费ip选择relay的需求
大家如果有什么新的想法欢迎讨论:)
中国数字部落(DIGIBLOG.ORG) - 无关紧要的消息
Linux2.6出来了:)我最想使用的就是里面的抢占式内核cpu分配,会使得桌面应用起来感觉机器快了很多:)
安装配置mailman(邮件列表的管理软件)遇到几个问题
1:按照/usr/share/doc/mailman*/下的文档配置完之后,不起作用(发不了信)
结果后来发现没有启动/etc/init.d/mailman start
2:mailman create的时候总是报错 找不到 grpname()函数找不到
后来发现使mailman的版本太低
3:升级mailman以后,发现/etc/init.d/mailman start报错 no site ..... found
后来根据google发现因为没有配置一个全站的maillist名字叫做mailman
应该用/var/mailman/bin/newlist mailman建一个新的
4.发现简体中文的界面包错,后来发现需要一个python的gb2312的补丁