跳到正文
Keyboard And Me

鼠疫

【本文内容主要整理自Sawbones,一个戏说医学史上各种不靠谱疗法的播客。笔者整理的过程中也有参考一些资料添油加醋一番。文章以娱乐为主,不过里边的故事也都是有事实依据的。文章的内容在任何情况下都不可用作治疗建议。】

瘟疫和鼠疫在英语里都是plague,所以本文也不严格区分了。西方古时流行过的最恐怖的瘟疫就是鼠疫,而且在20世纪前来来回回流行过许多次。中国也流行过鼠疫并且死过很多人,但古代中国人的死法实在太多了,瘟疫在历史书里实在不值一提。

古代有很多关于瘟疫传播的理论,流行最广泛的是所谓miasma,也就是“坏空气”理论。这种理论在欧洲,印度,中国都有差不多的版本。中国的我们叫瘴气。miasma理论认为瘟疫流行是因为某个地方的空气变坏了,然后呼吸到这种空气的人就会得病。古代中国认为瘴气产生于恶劣或者异常的气候下。这种理论其实就是胡猜出来的,看似能解释瘟疫的现象,其实方向完全错了。我们现在都知道瘟疫是细菌或病毒导致的,比如说鼠疫一开始是经由跳蚤传播给人的,和空气好坏并没有关系。

鼠疫是很可怕的传染病,因发病方式不同分为腺鼠疫和肺鼠疫。腺鼠疫发生的最多,患者淋巴结肿大,机体溃烂脱落,肺鼠疫则是肺部感染致死,死相大概略微好看点。古时得了鼠疫,存活率只有5%。

蒙古人进击乌克兰的时候,部队里开始流行鼠疫,于是蒙古军队把死者的尸体用投石器投到城里。这大概是最早的生物战。

十八九世纪的瘟疫医生其实大多不是医生,他们要么是水平不入流的手术师(理发师),要么是自以为有良方的路人丙。比如说有一个卖菜的提出吃蔬菜可以治黑死病,然后他就是会蔬菜疗法的瘟疫医生了。这样的医生甚至会被政府雇来控制疫情。真医生们跑哪去了呢?他们懂瘴气理论,所以瘟疫一来,他们就卷了铺盖举家搬迁了。一样搬迁走的还有富人,最后受苦的还是普通老百姓。

古人为了治疗鼠疫想了数不清的方法,当然这些方法没有一个靠谱的。比如既然认为是瘴气导致的鼠疫,那我们就隔离一下瘴气吧。怎么隔离呢?走到哪都捧一束花在鼻子前面。可是有时候外面空气真的很好,为啥还有人得鼠疫呢?这不对啊!于是又有人把自己隔离在阴沟里,还有人为了抢最臭的位置跟别人打起架来。

也有不这么恶心的鼠疫疗法,比如你可以用醋水洗澡。还有我们的老朋友放血疗法,放完后用泥巴和紫罗兰和一起涂在伤口上。而对于腺鼠疫,我们可以把肿大的腺体割开,放出脓液,然后用各种天然草药和大粪和在一起,然后涂在伤口上面。另外一个方法是用尿洗澡,而且最好用自己的尿,所以你只要在浴缸里躺两星期,中间不停喝水就行了。尿除了用来洗澡还可以用来喝,一天两杯,早一杯晚一杯。咦怎么说着说着又跑到奇怪的东西上去了?

除了这些自然疗法以外,我们还有魔法般的巫术疗法。比如说有一个疗法是找一只母鸡,把它拴在肿大的腺体上面,如果母鸡因此死了,那你基本就没救了。

也有些没这么不靠谱的疗法,比如说健康饮食,比如说搞好室内外环境卫生之类,中世纪的卫生状况是很差的,城市里面,不管家里还是街上,到处都是屎尿。这些措施虽然不见得能阻挡瘟疫,但多少还是有点正面效应的。另外城市里还收集了死者的尸体进行集中焚烧,死者的衣物也包括在内,这也在一定程度上控制了疫情。

宗教人士自然会认为这是上帝的惩罚,于是各种忏悔自虐,各种用鞭子抽自己,各种用刀切掉自己的器官。

还有人认为服用翡翠粉可以治疗鼠疫。翡翠虽然遍地都是,但总有穷人买不起,于是就用蛋壳加上各种植物残渣熬药吃。

我好想忘记提百病皆治的水银了吧?怎么能少了它呢?除了汞剂,我们还有砷剂可以服用。

还有心灵疗法:只要你不想着这个瘟疫,不想着你会死,你就不会死了。不要行房,不要出门,各种禁忌啥的也有。

还有人认为瘟疫是犹太人带来的,于是鼓动大家上街砍犹太人。

如果是现代人得了鼠疫,第一件事自然是隔离,然后就是各种抗生素。有些威胁生命的症状可以通过现代医疗器械帮患者挺过去。不过即使这样,患者存活率还是只有一半。 后记

整理这篇文章的心情还是比较沉重的,看来看去都是绝望的人们的各种无谓的挣扎。

最后少不了再提一下中医在抗击鼠疫中的巨大作用。先来个验方吧:“用猫胆一个,暖酒冲服,立愈”——这样的方子怎么可能不灵呢?老鼠怕猫啊!

清末南方疫情流行时,著名中医师黎庇留用升麻鳖甲汤治疗鼠疫,自谓能治好百分之七八十。所谓名医,也只是骗子而已。

民国年间鼠疫流行时,有多位中医名家跟政府申请到4000银洋,大概相当于几十万块人民币吧,成立了一个治疗组,结果送去10个病人无一治愈,数日后治疗组解散。

中医除了乱开方子乱骗人以外,医德方面也是异常高超,引用大公报:“自东三省防疫事起,西医之前往疫地者,前者方扑后者又登,大有奋不顾身之概,而我国医生平时最会说古方,讲大话……及以重金招往疫地,迄无一应者,岂西医不爱命华医不爱钱乎?曰,此非不爱钱,爱命胜于爱钱也,此即华医之特色处。”

如果用面试程序员的方式面试翻译

会是什么样子的呢

image

欢迎来到巴别塔公司。我们要求你会说所有人类语言。另外,周末无偿翻译你觉得怎样?图片来自维基百科

——面试是在这里吧?

是的。早上好,史先生,请坐,你来的正是时候。你是来面试“高级技术翻译”这一职位的,没错吧?

——没错。我会英语、法语、西班牙语、意大利语、德语,有七年的翻译经验,技术翻译和学术翻译都做过。我现在的翻译方向是医学论文,不过我也做过别的翻译,你在我简历里都能看到。

很好。你的经验和我们的职位似乎还蛮符合的。接下来,我们就例行地考考你的语言学知识吧,看看你的基础怎么样。

——据我了解,你们这份工作就是翻译药品的说明书和标签,对吧?

是的。我们只招最好的员工,我们要求他在职位需求的各个方面都有坚实的基础。

——好。那么……我们就开始吧?

嗯,首先是一些专门为面试准备的基础性问题。问题1:阿拉伯在 711 年到 1492 年之间入侵了伊比利亚半岛,这一事件对西班牙语产生了什么样的影响?

——不好意思,你是说——?

想要重听一遍问题是吧?是这样的:阿拉伯在 711 年到 14……

——请停一下,不用重听了,只是这问题有点出乎意料。我以为会问和职位相关的问题呢,不过这个问题的答案我也知道。伊斯兰在 8 世纪早期征服西班牙,直到收复失地运动之前,西班牙南部都有阿拉伯语人口居住,这段时间里西班牙语接纳了很多阿拉伯语词汇。比如西班牙语中的国际象棋,ajedrez,就来自于阿拉伯语的الشطرنج (ash shatranj)。

image 西班牙语的历史,万一下次面试用到呢。图片来自 Wikipedia https://en.wikipedia.org/wiki/History_of_the_Spanish_language

回答的很好,和我这里的答案完全一样,你的例子还能为你加分。第二个问题:该作者提出了一个语法正确但没有语义价值的例子,“Colorless green ideas sleep furiously”。

——这是一个问题吗?

当然是了。

——不好意思,我没注意到这是一个知识竞赛节目。乔姆斯基?

正确!那他是在哪本书里提到这个例子的呢?

——啥?这我就不知道了,读乔姆斯基是我在学校时的事情,现在我的主攻方向是翻译,不需要知道……

很遗憾,答案是《语法结构》,1957年出版。不过说到这个问题,能答出来的大多是应届生。

——怪我咯……

逆转 这棵树逆转了也没有意义,图片来自 Wikipedia https://en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously#/media/File:Syntax_tree.svg

好吧,下一个问题:“pater”、“father”、“Vater” 这几个单词分别来自拉丁语、英语、德语,我们可以看到,“p” 有时候演化成了 “v”,有时候演化成了 “f”。而 “piscis”, “fish”, “Fisch” 这几个单词……

——对不起,打断一下,我先问一下?这些问题和工作有关吗?你们说是要招聘技术翻译,到现在你们问我的都是语言学问题,关于翻译的问题一个都没有问到。

嗯,我能理解你的疑惑。你看,我们要招的是最好的翻译,要做好科学翻译,需要在语言学、古典文学等方面有坚实的基础,这一点各大公司都已经证明过了。

——你说的没错,我拿了拉丁语和古希腊语的学士学位,语言学的硕士学位,只不过过去几年没从事过学术相关的工作。

哦,所以这些问题你应该能回答才对。

——是能回答没错,但我过去几年的工作并不需要这些方面的知识啊。难道这份工作和语言学的某个领域相关?

没有,我们的工作是为客户做药品相关的翻译。

——那就好,要不就考一下我的翻译能力呗?我相信你们也准备了翻译题,对吧?

当然了,好主意,那么我们就开始笔试吧。来,这里有白板,有马克笔,我们来几个翻译题,测验一下你的能力。

——白板?

是的,请翻译下面一句:

ΠΕΡΙ ΤΟΥ ΠΑΙΔΟΣ ΤΟΥ ΕΠΙΒΙΟΝΤΟΣ

——……这是古希腊文。

没错。

——难道这个职位要翻译古希腊文?

哈哈,当然不要了。

——那为啥……咳别提了。我可不可以借本字典?

哦,这个测试的目的是看你能不能直接翻译,不能使用参考资料。不过如果需要的话,你可以使用纸笔。

——等等你说啥?为什么?就连日常翻译的时候我都会偶尔查查字典的,考古希腊语还不给我查字典?

嗯,各大公司的研究表明……

——当我什么都没说好了。让我想想,我觉得这句我在哪见过……“曾经生活过的男孩”?

正确,你很棒!

——是哈利波特书里的吧?

image 你懂的,没准你想练习一下已经生疏了的古希腊语,图片来自Amazon https://www.amazon.com/Harry-Potter-Philosophers-Stone-Ancient/dp/158234826X

哦,不是,是我从一本《搞定翻译面试:语言学150问》里挑的。

——我不是这个意思,我是说这句话其实是《哈利波特》第一章的标题。

这我就不知道了,我不是做翻译的。

——我知道,我只是指出来一下,这句话来自一本名著,可能比较好认出来。

这样不是挺好嘛。这意味着大部分人都准备过这些面试问题。

——带剧本的面试问题嘛。其实我并不习惯这样直接回答,一般我都会花时间斟酌,找出最佳翻译方式。

我了解。呃,我们还有一些考核方向。你有没有赢过翻马?

——你说的是?

嗯,你懂的,翻马,翻译马拉松。准备一堆梵语文档,供应一桌饮料和披萨,然后广招各路翻译,关他们整两天,看谁翻译的最快。有时候赢了还能拿到不值钱的小礼品。这种比赛你赢过没有?

——没有,我没有参加过什么“翻译马拉松”。

太遗憾了,我们特别看重“翻马”的获奖者。

——拜托别说“翻马”了……

好吧,顺便问问,你的书法水平如何?

——书法水平?

没错,你看,我们是一家大公司,但我们组是以独立的初创公司模式运行的,所以有时候我们的翻译还要做一些书写工作,所以我们期望候选人有很好的书法水平。

——所以你们是想让一个人干两个人的活呗,是不是最好还会点别的,比如说产品包装?

对了!我们称之为全栈翻译。

——唉……你刚说团队以初创模式工作,是什么意思?

意思是说我们走的是敏捷流程。一切都是扁平化的,薪水和职责除外。我们有一个翻译专家,他负责协调所有翻译人员在各个冲刺阶段的工作。

——翻译专家?听上去挺厉害的,他会几种语言?如果我们碰到难题,问他可不可以解决?

哦,其实他只会英语,有时候他说的我们也不都懂,他是澳大利亚人,口音比较特殊……不过他可是拿了敏捷证书的,人员组织能力超强,进度跟踪能力也很厉害。

——你开玩笑的吧?面试问我古希腊文,然后给我一个完全不懂古希腊文的领导?那你能不能给我一个理由,告诉我在你们这里工作究竟有什么好处?

哦,你可以在这里学到别处学不到的东西,你的工作会深度影响到这个世界。你的工作是有意义的,你永远不会觉得枯燥。我们为员工提供多方面的快速成长空间。

——翻译药品标签……

是的,我们正在改变世界,一次一个标签。

(HR语录:拒绝信的反馈内容一定要非常模糊,这样不但对候选人毫无用处,还能避免各种官司。)

Joel Furr的故事

Usenet上的另一个名人


Joel Furr是弗吉尼亚工理工大学的毕业生,是一名软件培训员。1990年后的一段时间里,Joel在Usenet上面相当活跃,于是就有了下面的故事。

Joel出席了2010年的ROFLcon大会。这个“笑得满地滚大会”是一个邀请网络名人乐一乐的大会,一共举办了三届。

alt.*的统治者

之前写过,alt.*是不同于其他六大类的一个“其他”类别。如果要在六大类下创建新闻组,你需要通过一个严密的投票过程,大家达成一致后才会创建这个新闻组。alt.*的创建则不然,你只要在alt.config新闻组下面发一个提议,如果哪个服务器的管理员觉得你这个提议合他胃口,就会在服务器上面创建这个新闻组。由于新闻组是分布式的,别的服务器在和它同步的时候会把上面新创建的新闻组也一并同步过去,然后它就成了人人都能看到的新闻组了。有时候就算你提提出的申请并没有值得一提的理由,就算你完全是在恶作剧,你的申请也可能会得到某个心不在焉的或者毫不在乎的管理员的批准。

松散管理的结果就是alt.*下面的新闻组乱得一团糟。很多无聊的人都会跑到alt.config下面提出各种毫无价值的申请,有不少还被批准了。所以就有这样的一个说法,说alt并不是alternate(备选)的意思,而是无政府主义者(Anarchist)、疯子(Lunatic)、恐怖分子(Terrorist)三个单词的首字母缩写。

Joel Furr对于这种状况很不爽,于是在很长的一段时间内,他都在alt.config新闻组里做义务审批,就跟皇帝审奏折一样。如果看到不合适的提议,他就耐心回帖说这个提议不合适。这样的事情Joel每天都要花半个小时到一个小时去做,回帖多了,Joel的“alt.*之王”的名声就传开了。这个国王本身并不是任何服务器的管理员,也没有什么实权。由于新闻组里的无政府主义者、疯子和恐怖分子数量巨大,Joel的努力并没有改变什么。过了一段时间,Joel就放弃去做别的事情了。

Serdar Argic之战

Serdar Argic是Usenet上面的第一个spammer,也就是群发垃圾信息的人。

现在说到垃圾信息,我们想到的是广告和诈骗,Serdar Argic发的垃圾信息则是政治口号。1914年,土耳其对亚美尼亚人发动了一场屠杀,这是大部分学历史的人的共识,但Serder认为其实是亚美尼亚人屠杀了土耳其人,并且在新闻组里疯狂地兜售自己的观点。Serdar用的方法也是kibozing,就是在所有新闻组里搜索带“土耳其”的关键字,然后在帖子下面回复一篇抹黑亚美尼亚并为土耳其洗白的文章。这么做的结果就是很多和历史相关的新闻组里充斥着垃圾帖,其中最惨的是soc.history和soc.culture.turkish,在垃圾帖横行最厉害的日子里,每200个帖子里,就有175个帖子是Serdar发的垃圾,剩下20个是骂Serdar的帖子,只有5个是正常讨论问题的。很多人因此被迫放弃了自己最常访问和浏览的新闻组。

然后就爆发了针对Serdar Argic的战争,Joel是里边的主力军,他创建了alt.fan.serdar-argic作为反击的大本营,所有对Serdar不满的人都可以来这里抱怨,对于Serdar的人肉搜索活动也是在这里展开的。整个搜索活动也的确找出了几个嫌疑人,但在90年代,人们在网上的信息本来就不多,搜出来信息也没多大用处,只能骂几句出出气。90年代中期还没有免费邮箱可以申请,大部分人的邮箱都是挂在公司或者学校名下的,Joel和他战友通过投诉的方式废了Serdar的若干个邮箱地址,但垃圾帖并没有停止下来。

然后忽然有一天,类似的垃圾帖就再也没冒出来了,就跟什么都没发生过一样,Serdar这个人也消失的无影无踪。

为了纪念这次事件,Joel还设计了T恤,并且在网上卖出去了一两百件。

T恤的图样。Serdar Argic至少影响到了这么多的新闻组。

关于狐猴的段子

alt.fan.lemurs是Joel Furr建立的一个新闻组。Lemur也就是狐猴,是一种生活在马达加斯加的拥有超级大眼睛的猴类。按理说新闻组里应该都是狐猴的粉丝,讨论大家对狐猴的喜爱的,实际上也是这样,但是在这个新闻组里,除了正经的对于这种动物的讨论,还有各种喝狐猴相关的段子。正是这些段子让这个新闻组显得与众不同。

这一切起始于弗吉尼亚工理工大学的BBS,很久以前的一天,一群搞计算机的学生在校园BBS里边瞎聊,其中一个在帖子里说别人是“lamer(挫人)”,然后另一个回帖假装不知道他在说什么,说“你说的是lemur(狐猴)吧?”第三个人回帖说“狐猴不就那一种大眼睛毛茸茸的小动物嘛。”然后一切就开始了,许多人参与进来编造和狐猴有关的段子,这些段子飞快地从一个版块烧到另一个版块,狐猴的形象也逐渐形成了:大眼睛,喜欢吃Twinkie(一种手指状的注心蛋糕),喜欢喝Big K葡萄汽水,语言包含三个单词分别是“吱”、“嘤”、“嗒”,喜欢别的大眼睛,喜欢在吊灯上面荡秋千……

Joel是狐猴段子最大的推手,但这些都仅限于校园网的BBS内部,不为外人所知。1991年后,Joel有了互联网账号并且开始泡Usenet新闻组,他觉得把这些段子的讨论搬到新闻组里应该很不错,就申请创建了alt.fan.lemurs这个新闻组,并且开始帖各种狐猴相关的段子。

我们来欣赏一下一些典型的段子吧,首先是关于狐猴的语言:

根据科学杂志《无法复制的结果》中一篇研究的说法,狐猴的语言包含三个单词:

嘤(形容词):非常诱人,性感

嘤(名词):国家地理摄影师

【注:在狐猴眼里,眼睛越大越性感,摄影师相机的镜头被狐猴当做巨大的眼睛,所以成了性感的名词。】

嗒(动词):和另一个物种性交,类似“兽交”的意思。

吱、吱、吱(名词):非常满足的性体验。

让我们来用这些知识翻译以下两只狐猴的对话:

狐猴甲:嗒嘤嘤

狐猴乙:吱、吱、吱

翻译:

狐猴甲:听说你和那个超帅的国家地理摄影师做爱了?

狐猴乙:是的,爽极了!

段子2,有人问怎样才能碰到一只狐猴,答案如下:

要在你家会见一只狐猴的成本并不高,在门口放几罐Big K葡萄汽水就可以了。你还可以故意激起它们的好奇心,在门前帖一个大告示,上面写着“马达加斯加原猴绝对禁止入内!”或者写一个“Twinkie快递员请注意:把我买的14箱超大包(tm)Twinkie放到厨房里,谢谢!”

BBS上面还有一个关于奶牛的笑话主题,后来也被纳入了狐猴的故事,讲的是奶牛有一艘飞船坠落在布莱克斯堡,钥匙丢了,奶牛进不去,但狐猴能从通风口钻进去,于是狐猴偷了奶牛飞船的设备,并且把奶牛用强大的哞语言(又叫MOO语言,Multi-Object Oriented Language,面向多对象语言)编写的飞船系统,让它能够接受狐猴语的指令。另外还有一个叫CIA(奶牛飞船调查局,Cowship Investigation Agency)的组织一直在调查奶牛飞船的问题。CIA的领导叫Allen Murphy,调查的主要对象是狐猴以及见过狐猴的人,因此就有人怀疑他是不是奶牛派来的卧底,对此Allen Murphy坚决否认:

现在我要借这个机会澄清一下:

我不是奶牛!

我不是奶牛!

我不是奶牛!

我不是奶牛!

我还有证书能证明这一点,你们看:CIA工作证、驾照、疯牛病疫苗接种证明……

很明显最后一个证书露馅了……奶牛军团渗透到了社会的各个角落,就连微软也不能幸免。微软的一个程序叫COMMAND.COM,如果你把M倒过来,就成了COMMAND.COW!很明显这就是奶牛之间发送指令的工具,所以大家都要小心啊!

虽然奶牛步步紧逼,但我们也无需为狐猴的处境担心,毕竟它们是灵长动物,比奶牛聪明多了……

很多人都在给狐猴的段子添油加醋,于是这个狐猴的故事讲了多年还没讲完。不过除了讲段子,Joel也是会干正事的。一开始大家对狐猴这种动物所知甚少,后来才知道这是一种濒危动物,而且在杜克大学有一个繁殖中心,于是Joel还组织网友一起去参观了这个繁殖中心,并为狐猴保护项目捐了款。

不过毕竟狐猴是一个冷门话题,alt.fan.lemurs在最火的时候,订阅人数能够排到所有新闻组“倒数四分之一里边的前几名”,对于一个冷门话题,这个排名已经是相当厉害了。

结尾

虽然Joel的名气没有James Parry大,但他一度也是很受欢迎的,在一次Kibo选举中,Joel获得的票数甚至超过了Kibo本人。

Joel Furr是网上最早把垃圾信息叫做spam的人,但也可能是之一,说不清。

现在Joel也不出没Usenet了,不过他还会偶尔写写博客。知道他名声的已经不多了。

Kibo的故事

Usenet一代教主的生平


Kibo在大约1989年的照片

一样,不了解Usenet请先看这篇。

Kibo读作“开博”,是James Parry的网名。James Parry是一个来自纽约的有点内向的设计师,他的工作就是画画图做做字体。但在Usenet上面,Kibo的职业是教主。

这里说的教主不是象征意义上的教主,而是真正的教主。Usenet上面有各种宗教相关的新闻组,有一次订阅人数统计显示,在各类宗教新闻组里面,基督教有29000人订阅排名第一,newage有26000人订阅排名第二,伊斯兰教和Kibology以21000的订阅人数并列排名第三。这个Kibology就是Kibo的教,我们就叫它Kibo教吧。

教主诞生

为什么Kibo这么出名呢?我们还要从很早的时候说起。1980年代末期Kibo就开始上Usenet了,算个早期的老用户。Kibo一开始算是个有趣的网友,但根本谈不上有什么名气。直到1988年的某一天,他忽然开始做一件前无古人的事情:他开始用搞怪的方式回复所有提到他的名字的帖子。

这件事情做一次不要紧,但Kibo却坚持做了很长时间。1988年的Usenet新闻组规模都不太大,只要你坚持不停做一件事情,大家就会注意到你。如果你说话很有趣,大家就更会注意你了。Kibo的回复基本上都是幽默式的,但又装作很认真的样子。有时候Kibo这个拼写出现在别的语境里面,和Kibo本人没有任何关系,但Kibo也都会“认真”地回复。

很多人都很奇怪,为什么Kibo能在众多的新闻组里找到提到他名字的帖子呢?难道他真的会去读Usenet上面所有新闻组里的帖子?难道他是传说中不知疲倦的人工智能?其实Kibo所做的,只不过把Usenet上面所有新闻组的内容都下载下来,用一个文本搜索工具(grep)在里边搜“Kibo”。由于这种做法是Kibo首创,所以就有了一个叫Kiboze的动词来表示这种做法。这种做法后来被很多人效仿,其中最著名的恐怕是创造Perl编程语言的Larry Wall了,他也会用这种方式搜索并且回答Usenet里边关于Perl编程的问题,当然,他的搜索是用自己的Perl语言写的。

我们来看一个典型的Kibo回复的例子吧。原帖是这样的:

Mary Rose Campbell 写道:

在卡内基梅隆大学,我们在Skibo中心(就是我们的学生会)还有一个叫“灰物质”的东西,就是一堆形状、墙体、孔洞、台阶,用一张深灰色地毯盖起来,看上去像一只巨大的猫玩偶。

然后是Kibo的回复:

其实这是S. Kibo的真人模型,也就是是我的高高祖叔父。几万亿年前他进化到“巨型元生界阿米巴”是就是这个样子的,现在他已经进化成三叶虫了。

– K.

由于Kibo坚持不懈的回复,慢慢的他就成了Usenet上面的名人。根据Kibo自己的估计,在他使用Usenet的15年里,所有的回复加起来应该有780万词,足够塞满100本书了。

1989年Kibo和他的的朋友们就开始谈论Kibo教了,alt.religion.kibology这个新闻组则是在1991年成立的。刚开始成立的时候,里边的主要内容是各种对Kibo教主的崇拜,就跟前一阵子的拜春哥教一样。自从1995年以后,这个新闻组逐渐变成了Kibo式幽默贴的集中营,其中不少帖子是Kibo本人发的。

HappyNet

1992年Kibo的名气已经很大了,他发起了一个HappyNet的倡议,目的是重组Usenet,把它变成一个Happy的地方。根据Kibo的倡议,HappyNet可以按照人群特征分成三大类,分别是:非傻叉、傻叉、大傻叉。用英语讲就是nonbozo、bozo、megabozo。根据Kibo的研究,这三者占用户比例分别是1%、90%、9%。Kibo在倡议书里还讲了一个很简单的判别方法,只要回答一个问题就行了:

你是一个傻叉吗?(单选) □是 □不是

如果你选了是,那你就会被分到“傻叉”组,如果你选了不是,那你就会被分到“大傻叉”组。

为了维持HappyNet的美好秩序,Kibo还制定了一系列规章制度:

发帖签名超过四行的,罚以110波特的速度阅读《战争与和平》。

签名包含巨大ASCII字符画的,罚以110波特的速度阅读《战争与和平》,书的内容是盲文,手指要用砂纸打磨过。

回帖只写一句“Me too!”的,回帖者的真名改为“Me Too”。

把新闻组叫做“bboard”或者“notesfile”的,罚背《韦伯词典》第九版。

拼写错误,too写成to,it’s写成its,lose写成loose,you’re写成your……罚抄写《韦伯词典》第九版十次。

……

看不懂幽默的,就地正法。

HappyNet的倡议是很长的一个搞笑帖子,当时在网上引起了巨大的反响,各种讨论层出不穷。Kibo在1992年发了第一版,1994年又发了一版,最后一版是1998年发的。1999年Kibo还搞了一个类似的帖子叫HappyWeb,写的是怎样让Web也成为一个美好的地方,里边一样充满了Kibo式的幽默。

总统竞选

1992年,Kibo在网上发起了一场总统竞选活动,为此Usenet上面还建立了一个新闻组。1992年的总统参选人是克林顿和小布什,还有一个来自少数党派“自由党”的名叫佩洛特的人。Kibo当时年龄只有25岁,完全不具备总统竞选资格,他只是在网上玩玩而已。但后来他还真玩大了,他的竞选声明和其他几位的被一起放到一个FTP上面,后来还出现在白宫网站的链接中,直到后来自由党发出投诉,这个链接才被撤下去。

虽然总统竞选失败了,但后来Usenet上面出现过一次投票,话题是当外星人降临时应该派谁作为人类的发言人,Kibo毫无疑问地以巨大票数当选了。

其他兼结尾

以Kibo命名的新闻组还有好几个,alt.politics.kibo是为竞选总统造势而创建的。还有两个alt.exploding.kibo和alt.imploding.kibo,是因为Kibo这个词像是爆炸的声音,于是就被无聊人士创建了。

Kibo自己设计的个人Logo

Kibo后来经常会很长时间不登陆Usenet,每当他不在的日子,新闻组里就会开展Kibo代理人竞选。等他回来以后代理人就要主动退位。有一阵子Joel Furr(下一个故事的主角)冒充了Kibo一阵子,被大家批评的够呛。

现在的Kibo应该偶尔还会上一下Usenet,但已经不会回复带他名字的帖子了。

Mel Kaye的故事

真·程序员用十六进制码编程

主角Mel Kaye,后排最右

【这是一篇翻译,原文链接在此,这是1983年的一篇仿史诗体文章,所以里边提到“当今”指的都是80年代早期。作者Ed Nather,主角Mel Kaye均已年长去世。TLDR:真·程序员用机器代码编程,真·程序员一个字节一个字节地手动优化存储器物理寻址,真·程序员不但技术高超,而且有原则有个性。】

最近有一篇展现编程的“大丈夫”一面的文章,里边有这么一句粗暴直接的话:

真·程序员用FORTRAN编程

也许现在的程序员是这样吧, 在这个堕落腐朽的年代 到处都充斥着淡啤酒、计算器、还有“用户友好”的软件 但是在过去美好的日子里, “软件”还是一个听上去有点滑稽的新词 而真·计算机是使用磁鼓和真空管组装起来的, 真·程序员写的则是机器代码。 不是FORTRAN,不是RATFOR,甚至,连汇编语言都不是。 机器·代码。 实实在在、原汁原味、深不可测的十六进制代码。 直截了当。

为了避免新一代程序员 对这段辉煌的历史一无所知 我觉得自己义不容辞,我要用文字 努力填补这一段代沟, 真·程序员是怎样写代码的 我把这个程序员叫做Mel, 因为这就是他的名字。 LGP-30

我是在Royal McBee计算机公司上班时第一次碰到Mel的, 这是隶属于Royal Typewriter的一家子公司,现在已经解散了 Royal Typewriter制造了LGP-30, 一种小型的,低价的(以当时的标准) 磁鼓存储计算机, 而且刚刚开始制造 RPC-4000,一种大大改进了的 更大、更好、更快的——磁鼓存储计算机。 RPC-4000

我当时被雇来为这个新机器 写一个Fortran编译器,而Mel则负责引导我了解这台新机器。

Mel对编译器不感冒。 “如果程序不能重写自己的代码,” Mel说,“那它能有多挫啊?”

用十六进制代码, Mel写了公司最受欢迎的计算机程序 程序运行在LGP-30上面 能跟人玩“二十一点”, 每次计算机展会上 它都能戏剧般的吸引到不少人 IBM的销售都会围成一圈,对它指指点点 究竟展览对于销售有没有帮助 我们从来没有讨论过 21点的程序是用打印机输出的,当时还不知道什么叫显示器

Mel的任务,是为 RPC-4000重写二十一点游戏 (平台移植是什么意思?没听说过) 新机器有一个一加一寻址模式, 每一个机器指令 和它的操作代码 以及操作所需的内存 都拥有一个第二地址,用来告诉你 下一个指令在旋转磁鼓上的具体位置

用现代术语讲 就是相当于每个指令都捆绑了一个goto 放到Pascal的烟管里抽一口吧 磁鼓

Mel对RPC-4000情有独钟 因为他可以优化自己的代码 他可以手动设置指令在磁鼓上的存储位置, 然后当一条指令执行完的时候, 磁头会正好停到下一条指令所处的位置上 然后下条指令就可以好不耽误时间地立即执行了 有一个程序也可以做这件事 叫做“优化汇编器” 但Mel拒绝使用它。

“你永远不知道它会把东西放到哪里,” 他解释道,“所以你只能使用不同的常量。”

这句评论我花了很久才明白是什么意思, 因为Mel知道每一条 操作指令的数字值, 而且手动分配了磁鼓的存储地址, 他写的每一条指令, 都可以被认为是一个数字常量。 他可以把比如说一条“加值”指令, 当作一个数值去做乘法, 如果“加值”指令对应的正好是一个合适数值的话。 别人要改他的代码可不容易。

我把Mel手动优化过的代码 和优化汇编器“按摩”过的代码比较了一下, Mel的总是跑得更快。 因为在那会“自顶向下”的程序设计 还没被发明, 而且就算发明了,Mel也不会去使用的。

他会先把程序循环中最里层的部分写好, 让这部分内容优先 运行在磁鼓最合适的位置上。 优化汇编器做不到这点,它没有这么聪明。 Mel也从来不会去写延时循环, 即使Flexowriter这种笨重的输出设备 需要在输出之间延时才能工作正常。 新式磁鼓

他只需把磁鼓上的指令放在特殊位置上, 这样下一条指令会刚好跳过磁头, 然后磁鼓只能重新旋转一圈 才能找到这条指令。这样就正好实现了延时。 他为这个流程创造了一个很好记名字。 虽然“最优”是一个绝对化的术语, 就和“独一无二”一样,但在习惯使用过程中 它也变得相对化了: “不是特别最优”或“不够最优” 或者“不是特别最优”。 Mel把导致磁鼓最大延时的存储地址叫做“最劣”址。

当他写完“二十一点”程序 并且让它运行起来后 (就连初始程序都被优化过了, 他骄傲地说), 他从销售部门得到一个修改·需求 程序用了一个优美的(优化过的) 随机数生成器 用来洗牌以及处理牌局, 有的销售人员认为这个游戏太公正了, 因为有时候客户会输掉。 他们想要Mel修改程序, 让可以通过控制台的感知开关 调整获胜几率,这样就可以让客户能赢了。

Mel很抗拒 他觉得这是绝对的不诚实, 的确也是 他还觉得这是对他作为一个程序员的人格侮辱, 这话也没错 所以他就拒绝做这件事。 销售部·领导和Mel谈过, 大·老板也和Mel谈过,程序员·同事也劝过, 最后Mel还是让步了,去写了代码 但他把条件写反了, 于是当感知开关打开以后, 程序就会作弊,不是会输,而是次次会赢。 Mel对他的杰作相当满意, 说他潜意识里有无法控制的道德感, 并且坚决拒绝修正这个问题。

Mel离职另谋高就以后, 大·老板让我看看代码 看能不能把这个条件判断修改过来。 虽然不怎么情愿,我还是答应了。 追踪Mel的代码是一场真正的历险。 我常常觉得编程是一种艺术形式, 它的真正价值只能被 别的熟知这种艰深艺术的人理解; 一些美妙的细节和智慧的处理, 常人可能永远都看不到,更不用说去欣赏了, 软件的过程天然就是这样子的。 通过阅读一个人的代码, 你可以了解很多关于这个人的东西, 即使十六进制代码也是一样的。 Mel在我的眼里,就是一个不为外人所知的天才。

也许最让我吃惊的 是我在里边找到了一个没有条件判断的循环。 没有条件判断。没有 常识告诉我这必须是一个闭循环, 程序走到这里会永远不停地循环下去。 但实际情况是,程序可以直接跑进这段代码 然后再安全地抵达了另外一边。 我花了两个星期才弄明白这是怎么回事。

RPC-4000计算机有一个相当现代化的功能 叫做索引注册器。 它可以让程序员写一个循环, 在里边使用索引过的指令; 不过每使用一次, 索引注册器里的数字 就会被加到这条指令的地址上面, 这样它就会指向 序列中的下一条数据。 不过他就需要每次 手动为索引注册器增值。 Mel从来没这么做过。

取而代之的是,他会把指令拖到一个机器注册器里, 为它的地址加1, 再把它存储回来。 然后他再直接从注册器中 执行修改过的指令。 循环在写的时候就 把增加的执行时间也算进去了—— 这条指令执行完后, 下一条就会刚好处在磁头的阅读位置上, 可以直接继续。 但循环里边没有条件判断。

最重要的线索出现了, 当我我注意到索引注册器位元的时候, 这个位元处在指令的地址码和操作码之间, 而且是开启的—— 尽管Mel从来没使用过索引注册器, 所以此处一直是为0的。 当我看明白的时候,我简直被亮瞎了。

他把工作的数据 放在了存储的最顶端—— 指令能处理的最大的地址值—— 所以,当最后一条数据处理完以后, 增加指令地址 就会让地址发生溢出。 然后就会导致操作码被加1, 让它成了指令集里的下一条指令: 一条跳过指令。 于是理所当然,下一条程序指令 就到了地址位置0, 然后程序就开心地运行下去了。

我没有和Mel再联系过, 所以我不知道他是不是 面对着洪水般的编程技术变革 已经让步了。 我喜欢想象他没有让步。 无论如何, 我已经被他的技术深深折服, 不想再去找那处有问题的条件判断了。 我告诉大·老板我找不出。 大·老板听了也没觉得奇怪。

当我离开这家公司的时候, 在你打开对应的感知开关以后, “二十一点”还是会作弊的, 我觉得这样挺不错。 深入研究了真·程序员的代码, 我觉得自己有点心累。


原文

The Story of Mel, a Real Programmer

This was posted to USENET by its author, Ed Nather (utastro!nather), on May 21, 1983.

A recent article devoted to the macho side of programming made the bald and unvarnished statement:

     Real Programmers write in FORTRAN.

 Maybe they do now,
 in this decadent era of
 Lite beer, hand calculators, and "user-friendly" software
 but back in the Good Old Days,
 when the term "software" sounded funny
 and Real Computers were made out of drums and vacuum tubes,
 Real Programmers wrote in machine code.
 Not FORTRAN.  Not RATFOR.  Not, even, assembly language.
 Machine Code.
 Raw, unadorned, inscrutable hexadecimal numbers.
 Directly.

 Lest a whole new generation of programmers
 grow up in ignorance of this glorious past,
 I feel duty-bound to describe,
 as best I can through the generation gap,
 how a Real Programmer wrote code.
 I'll call him Mel,
 because that was his name.

 I first met Mel when I went to work for Royal McBee Computer Corp.,
 a now-defunct subsidiary of the typewriter company.
 The firm manufactured the LGP-30,
 a small, cheap (by the standards of the day)
 drum-memory computer,
 and had just started to manufacture
 the RPC-4000, a much-improved,
 bigger, better, faster --- drum-memory computer.
 Cores cost too much,
 and weren't here to stay, anyway.
 (That's why you haven't heard of the company,
 or the computer.)

 I had been hired to write a FORTRAN compiler
 for this new marvel and Mel was my guide to its wonders.
 Mel didn't approve of compilers.

 "If a program can't rewrite its own code",
 he asked, "what good is it?"

 Mel had written,
 in hexadecimal,
 the most popular computer program the company owned.
 It ran on the LGP-30
 and played blackjack with potential customers
 at computer shows.
 Its effect was always dramatic.
 The LGP-30 booth was packed at every show,
 and the IBM salesmen stood around
 talking to each other.
 Whether or not this actually sold computers
 was a question we never discussed.

 Mel's job was to re-write
 the blackjack program for the RPC-4000.
 (Port?  What does that mean?)
 The new computer had a one-plus-one
 addressing scheme,
 in which each machine instruction,
 in addition to the operation code
 and the address of the needed operand,
 had a second address that indicated where, on the revolving drum,
 the next instruction was located.

 In modern parlance,
 every single instruction was followed by a GO TO!
 Put *that* in Pascal's pipe and smoke it.

 Mel loved the RPC-4000
 because he could optimize his code:
 that is, locate instructions on the drum
 so that just as one finished its job,
 the next would be just arriving at the "read head"
 and available for immediate execution.
 There was a program to do that job,
 an "optimizing assembler",
 but Mel refused to use it.

 "You never know where it's going to put things",
 he explained, "so you'd have to use separate constants".

 It was a long time before I understood that remark.
 Since Mel knew the numerical value
 of every operation code,
 and assigned his own drum addresses,
 every instruction he wrote could also be considered
 a numerical constant.
 He could pick up an earlier "add" instruction, say,
 and multiply by it,
 if it had the right numeric value.
 His code was not easy for someone else to modify.

 I compared Mel's hand-optimized programs
 with the same code massaged by the optimizing assembler program,
 and Mel's always ran faster.
 That was because the "top-down" method of program design
 hadn't been invented yet,
 and Mel wouldn't have used it anyway.
 He wrote the innermost parts of his program loops first,
 so they would get first choice
 of the optimum address locations on the drum.
 The optimizing assembler wasn't smart enough to do it that way.

 Mel never wrote time-delay loops, either,
 even when the balky Flexowriter
 required a delay between output characters to work right.
 He just located instructions on the drum
 so each successive one was just *past* the read head
 when it was needed;
 the drum had to execute another complete revolution
 to find the next instruction.
 He coined an unforgettable term for this procedure.
 Although "optimum" is an absolute term,
 like "unique", it became common verbal practice
 to make it relative:
 "not quite optimum" or "less optimum"
 or "not very optimum".
 Mel called the maximum time-delay locations
 the "most pessimum".

 After he finished the blackjack program
 and got it to run
 ("Even the initializer is optimized",
 he said proudly),
 he got a Change Request from the sales department.
 The program used an elegant (optimized)
 random number generator
 to shuffle the "cards" and deal from the "deck",
 and some of the salesmen felt it was too fair,
 since sometimes the customers lost.
 They wanted Mel to modify the program
 so, at the setting of a sense switch on the console,
 they could change the odds and let the customer win.

 Mel balked.
 He felt this was patently dishonest,
 which it was,
 and that it impinged on his personal integrity as a programmer,
 which it did,
 so he refused to do it.
 The Head Salesman talked to Mel,
 as did the Big Boss and, at the boss's urging,
 a few Fellow Programmers.
 Mel finally gave in and wrote the code,
 but he got the test backwards,
 and, when the sense switch was turned on,
 the program would cheat, winning every time.
 Mel was delighted with this,
 claiming his subconscious was uncontrollably ethical,
 and adamantly refused to fix it.

 After Mel had left the company for greener pa$ture$,
 the Big Boss asked me to look at the code
 and see if I could find the test and reverse it.
 Somewhat reluctantly, I agreed to look.
 Tracking Mel's code was a real adventure.

 I have often felt that programming is an art form,
 whose real value can only be appreciated
 by another versed in the same arcane art;
 there are lovely gems and brilliant coups
 hidden from human view and admiration, sometimes forever,
 by the very nature of the process.
 You can learn a lot about an individual
 just by reading through his code,
 even in hexadecimal.
 Mel was, I think, an unsung genius.

 Perhaps my greatest shock came
 when I found an innocent loop that had no test in it.
 No test.  *None*.
 Common sense said it had to be a closed loop,
 where the program would circle, forever, endlessly.
 Program control passed right through it, however,
 and safely out the other side.
 It took me two weeks to figure it out.

 The RPC-4000 computer had a really modern facility
 called an index register.
 It allowed the programmer to write a program loop
 that used an indexed instruction inside;
 each time through,
 the number in the index register
 was added to the address of that instruction,
 so it would refer
 to the next datum in a series.
 He had only to increment the index register
 each time through.
 Mel never used it.

 Instead, he would pull the instruction into a machine register,
 add one to its address,
 and store it back.
 He would then execute the modified instruction
 right from the register.
 The loop was written so this additional execution time
 was taken into account ---
 just as this instruction finished,
 the next one was right under the drum's read head,
 ready to go.
 But the loop had no test in it.

 The vital clue came when I noticed
 the index register bit,
 the bit that lay between the address
 and the operation code in the instruction word,
 was turned on ---
 yet Mel never used the index register,
 leaving it zero all the time.
 When the light went on it nearly blinded me.

 He had located the data he was working on
 near the top of memory ---
 the largest locations the instructions could address ---
 so, after the last datum was handled,
 incrementing the instruction address
 would make it overflow.
 The carry would add one to the
 operation code, changing it to the next one in the instruction set:
 a jump instruction.
 Sure enough, the next program instruction was
 in address location zero,
 and the program went happily on its way.

 I haven't kept in touch with Mel,
 so I don't know if he ever gave in to the flood of
 change that has washed over programming techniques
 since those long-gone days.
 I like to think he didn't.
 In any event,
 I was impressed enough that I quit looking for the
 offending test,
 telling the Big Boss I couldn't find it.
 He didn't seem surprised.

 When I left the company,
 the blackjack program would still cheat
 if you turned on the right sense switch,
 and I think that's how it should be.
 I didn't feel comfortable
 hacking up the code of a Real Programmer.

This is one of hackerdom’s great heroic epics, free verse or no. In a few spare images it captures more about the esthetics and psychology of hacking than all the scholarly volumes on the subject put together.

[1992 postscript --- the author writes: “The original submission to the net was not in free verse, nor any approximation to it --- it was straight prose style, in non-justified paragraphs. In bouncing around the net it apparently got modified into the `free verse’ form now popular. In other words, it got hacked on the net. That seems appropriate, somehow.”]