65.9K
CodeProject 正在变化。 阅读更多。
Home

真正的程序员不使用 PASCAL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (46投票s)

2001年1月24日

公共领域
viewsIcon

201776

downloadIcon

1

关于计算机编程艺术的非常幽默的历史文本。

更新 

在我发布这篇文章的 11 年后,我感到有义务补充一些当时缺失的信息。这里是它们。

真正的程序员不使用 Pascal[1]是 Ed Post 撰写的一篇关于计算机编程的文章,他来自Tektronix, Inc.,于 1983 年 7 月发表在《Datamation》杂志上,作为给编辑的信。[2] Datamation[3]  

如果您想了解更多信息,请参阅关于原文的维基百科文章。现在请欣赏原文。

2001 年原版免责声明 

我不知道这篇文章的原作者是谁。我第一次看到这篇文章是在 1986 年,但其他人告诉我当时它已经很老了。在 1986 年,我们觉得它非常有趣,但我猜想年轻的开发者可能从未读过它。所以请欣赏这篇非常棒的文章。

引言

回到那些美好的日子——计算机的“黄金时代”,那时很容易将男人和男孩区分开来(有时在文献中称为“真男人”“可食者”)。在这个时期,真男人是那些理解计算机编程的人,而可食者是那些不理解的人。真正的计算机程序员会说诸如“DO 10 I=1,10”“ABEND”(他们实际上是说大写字母,你们懂的),而世界上其他人则会说诸如“计算机对我来说太复杂了”“我无法与计算机产生共鸣——它们太没有人情味了”之类的话。(之前的一篇作品[1]指出,真男人不会与任何东西“产生共鸣”,而且不怕没有人情味。)

但是,一如既往,时代在变迁。如今,我们面对的世界是,老太太们可以在微波炉里拥有计算机,12 岁的孩子可以在玩《太空侵略者》和《吃豆人》时击败真男人,任何人都可以购买甚至理解自己的个人电脑。真正的程序员正面临灭绝的危险,即将被拥有 TRASH-80 的高中生所取代。

显然需要指出典型的青少年《吃豆人》玩家与真正的程序员之间的区别。如果这种区别被明确,它将为这些孩子们提供追求的目标——一个榜样,一个父亲形象。它也将帮助解释真程序员的雇主们,为什么用 12 岁的《吃豆人》玩家取代他们团队中的真程序员是一个错误(这会节省大量薪资)。

语言

区分真正程序员与普通人的最简单方法是看他们使用的编程语言。真正的程序员使用 **FORTRAN**。可食者使用 **PASCAL**。PASCAL 的设计者 Nicklaus Wirth 曾做过一次演讲,当有人问他“你的名字怎么发音?”时,他回答说“你可以叫我的名字,发音是‘Veert’,或者按价值称呼我,‘Worth’。”。从这句话中可以立即看出,Nicklaus Wirth 是一个可食者。真男人唯一认可的参数传递机制是“值-返回调用”,正如 IBM\370 FORTRAN-G 和 H 编译器所实现的。真正的程序员不需要所有这些抽象概念来完成他们的工作——他们满足于使用打孔机、FORTRAN IV 编译器和啤酒。
  • 真正的程序员用 FORTRAN 进行列表处理。
  • 真正的程序员用 FORTRAN 进行字符串操作。
  • 真正的程序员用 FORTRAN 进行会计(如果他们做的话)。
  • 真正的程序员用 FORTRAN 编写人工智能程序。
如果你不能用 FORTRAN 做,就用汇编语言做。如果你不能用汇编语言做,那就不值得做。

结构化编程

计算机科学界的学者们在过去几年中陷入了“结构化编程”的泥潭。他们声称,如果程序员使用一些特殊的语言结构和技术,程序会更容易理解。他们并不都同意具体使用哪些结构,当然,他们用来展示自己观点的例子总是能在某个晦涩期刊的一页纸上找到——这显然不足以说服任何人。当我毕业时,我认为自己是世界上最好的程序员。我能写出无敌的井字棋程序,使用五种不同的计算机语言,并创建 1000 行能正常工作的程序。(真的!)然后我进入了现实世界。我在现实世界的第一项任务是阅读并理解一个 200,000 行的 FORTRAN 程序,然后将其速度提高一倍。任何真正的程序员都会告诉你,世界上所有的结构化编码都无助于解决这样的问题——这需要真正的才能。关于真正的程序员和结构化编程的一些快速观察:
  • 真正的程序员不怕使用 GOTO。
  • 真正的程序员可以写出长达五页的 DO 循环而不会感到困惑。
  • 真正的程序员喜欢算术 IF 语句——它们使代码更有趣。
  • 真正的程序员编写自修改代码,尤其是当他们可以在紧密的循环中间节省 20 纳秒时。
  • 真正的程序员不需要注释——代码是显而易见的。
  • 由于 FORTRAN 没有结构化的 IF、REPEAT...UNTIL 或 CASE 语句,真正的程序员不必担心不使用它们。此外,当需要时,它们可以使用赋值 GOTO 来模拟。
数据结构最近也得到了很多关注。抽象数据类型、结构、指针、列表和字符串在某些圈子里变得很流行。Wirth(前面提到的可食者)实际上写了一整本书[2],声称你可以基于数据结构编写程序,而不是反过来。正如所有真正的程序员都知道的,唯一有用的数据结构是数组。字符串、列表、结构、集合——这些都是数组的特例,并且可以很容易地这样处理,而不会因为各种复杂性而弄乱你的编程语言。花哨的数据类型最糟糕的地方在于你必须声明它们,而我们都知道,真正的编程语言具有基于(六字符)变量名首字母的隐式类型。

操作系统

真正的程序员使用什么样的操作系统?CP/M?老天爷——CP/M 基本上是一个玩具操作系统。就连老太太和小学生都能理解和使用 CP/M。

Unix 当然要复杂得多——典型的 Unix 黑客永远记不住本周 PRINT 命令叫什么——但说到底,Unix 就是一个华丽的视频游戏。人们不在 Unix 系统上做严肃的工作:他们通过 UUCP-net 在全世界发送笑话,编写冒险游戏和研究论文。

不,你真正的程序员使用 OS\370。一个好的程序员可以在 JCL 手册中找到并理解他刚刚收到的 IJK305I 错误的描述。一个伟大的程序员可以完全不参考手册就编写 JCL。一个真正杰出的程序员可以在不使用十六进制计算器的情况下,在 6 兆字节的内存转储中找到隐藏的错误。(我实际上见过有人这样做。)

OS 是一个真正卓越的操作系统。一个错误的空格就可能导致数天的工作付之东流,因此鼓励编程人员保持警惕。进入系统的最佳方式是通过打孔机。有些人声称 OS\370 上运行着一个分时系统,但经过仔细研究,我得出了他们错了的结论。

编程工具

真正的程序员使用什么样的工具?理论上,一个真正的程序员可以通过给计算机前面板输入程序来运行他的程序。在计算机还有前面板的时代,这种情况确实偶尔发生。你典型的真正程序员能通过记忆以十六进制形式输入整个引导加载程序,并在程序破坏它时重新输入。(那时,内存就是内存——断电后不会消失。如今,内存要么在你不想让它忘记时忘记,要么在你希望它忘记很久后还记得。)传说 Cray I 超级计算机和 CDC 大部分计算机的发明者 Seymore Cray,在 CDC7600 首次通电时,就是从内存中通过前面板输入了第一个操作系统。Needless to say,Seymore 是一个真正的程序员。

我最喜欢的一位真正的程序员是德州仪器的一位系统程序员。有一天,他接到一个用户的长途电话,用户说系统在保存一些重要工作时崩溃了。Jim 通过电话修复了损坏,让用户在前面板上输入磁盘 I/O 指令,以十六进制修复系统表,并通过电话读回寄存器内容。这个故事的寓意是:虽然一个真正的程序员通常会在他的工具箱里包含打孔机和行式打印机,但在紧急情况下,他也可以只用前面板和电话就能应付。

在一些公司,文本编辑不再是十名工程师排队使用 029 打孔机。事实上,我工作的这栋楼里没有一台打孔机。在这种情况下,真正的程序员必须使用“文本编辑器”程序来完成他的工作。大多数系统都提供几种文本编辑器供选择,而真正的程序员必须小心选择一个能反映他个人风格的。许多人认为世界上最好的文本编辑器是在施乐帕洛阿尔托研究中心为其 Alto 和 Dorado 计算机编写的[3]。不幸的是,没有真正的程序员会使用一个操作系统叫做 SmallTalk 的计算机,并且肯定不会用鼠标与计算机交流。

这些施乐编辑器中的一些概念已被整合到运行在更合理命名的操作系统上的编辑器中——EMACS 和 VI 就是其中两个。这些编辑器的麻烦在于,真正的程序员认为“所见即所得”在文本编辑器中和在女人一样糟糕。不,真正的程序员想要一个“你想要什么,就得到什么”的文本编辑器——复杂、晦涩、强大、不容出错、危险。精确地说,是 TECO。

据观察,TECO 命令序列比可读文本更接近传输线噪声[4]。与 TECO 玩的最有趣的游戏之一是输入你的名字作为命令,然后猜测它做什么。与 TECO 交流时,几乎任何可能的输入错误都会破坏你的程序,甚至更糟——在曾经工作的子程序中引入微妙而神秘的错误。

因此,真正的程序员不愿编辑接近完成的程序。他们发现直接修补二进制目标代码要容易得多,使用一个名为 SUPERZAP(或非 IBM 机器上的同等程序)的绝妙程序。这非常有效,以至于 IBM 系统上许多正在运行的程序与原始 FORTRAN 代码毫无关系。在许多情况下,原始源代码不再可用。当需要修复这样的程序时,任何经理都不会考虑让一个不合格的人去做这件事——一个可食的结构化程序员甚至不知道从何开始。这被称为“工作保障”。

一些 **不是** 真正程序员使用的编程工具

  • FORTRAN 预处理器,如 MORTRAN 和 RATFOR。编程界的“Cuisinarts”——非常适合制作乳蛋饼。参见上面关于结构化编程的评论。
  • 源语言调试器。真正的程序员可以读取内存转储。
  • 具有数组边界检查的编译器。它们扼杀了创造力,破坏了 EQUIVALENCE 的大多数有趣用法,并使得用负下标修改操作系统代码成为不可能。最糟糕的是,边界检查效率低下。
  • 源代码维护系统。真正的程序员将他的代码锁在卡片文件里,因为这暗示其所有者无法将重要的程序置于无人看管的状态[5]。

正在工作的真正的程序员

典型的真正程序员在哪里工作?什么样的程序值得这样有才华的个人付出努力?你可以肯定,没有真正的程序员会去写 COBOL 的应收账款程序,或者为《People》杂志排序邮寄名单。一个真正的程序员想要的是具有“震撼世界”重要性的任务(字面意义上的!)。
  • 真正的程序员在洛斯阿拉莫斯国家实验室工作,为 Cray I 超级计算机编写原子弹模拟程序。
  • 真正的程序员在美国国家安全局工作,破译俄罗斯的通信。
  • 正是由于成千上万在 NASA 工作的真正程序员的努力,我们的男孩们才得以在俄罗斯人之前登月并返回。
  • 真正的程序员正在波音公司设计巡航导弹的操作系统。
一些最令人敬畏的真正程序员在美国加州的喷气推进实验室工作。他们中的许多人能熟记先驱者号和旅行者号航天器的整个操作系统。通过大型地面 FORTRAN 程序和小型航天器汇编语言程序的结合,他们能够完成令人难以置信的导航和即兴创作——在太空中飞行六年,在土星附近命中十公里宽的窗口,修复或绕过损坏的传感器平台、无线电和电池。据称,一位真正的程序员设法将一个模式匹配程序塞进了旅行者号航天器中几百字节的未使用内存中,该程序搜索、定位并拍摄了木星的一颗新月。

目前伽利略号航天器的计划是在前往木星的途中利用火星的重力助推轨迹。该轨迹将经过火星表面 80 +/-3 公里处。没有人会信任一个 PASCAL 程序(或 PASCAL 程序员)来进行这种精度的导航。

正如你所知,世界上许多真正的程序员都在为美国政府工作——主要是国防部。这正是应该的。然而,最近,真正的程序员的地平线上出现了一片乌云。似乎国防部一些职位很高的可食者决定,所有国防项目都应该用一个名为“ADA”((C), DoD)的通用语言编写。有一段时间,ADA 似乎注定会成为一种违背所有真正编程原则的语言——一种具有结构、数据类型、强类型和分号的语言。总之,一种旨在扼杀典型真正程序员创造力的语言。幸运的是,国防部采用的语言有足够有趣的特性使其可以接受——它极其复杂,包含与操作系统交互和重新排列内存的方法,而且 Edsgar Dijkstra 不喜欢它[6]。(Dijkstra,我相信你知道,是“GoTos Considered Harmful”的作者——这是编程方法论的里程碑式作品,受到了 PASCAL 程序员和可食者的一致好评。)此外,坚定的真正程序员可以用任何语言编写 FORTRAN 程序。

真正的程序员可能会妥协自己的原则,从事比毁灭人类略微不那么重要的工作,只要有足够的钱。例如,有几位真正的程序员在 Atari 公司开发视频游戏。(但不是玩游戏——真正的程序员知道如何每次都击败机器:那没有挑战。)在 LucasFilm 工作的所有人都算真正的程序员。(拒绝提供五千万《星际迷航》粉丝的资金就太疯狂了。)计算机图形学中真正程序员的比例比正常情况要低一些,主要是因为人们还没有找到计算机图形学的用途。另一方面,所有的计算机图形学都用 FORTRAN 完成,所以有相当一部分人从事图形学是为了避免写 COBOL 程序。

真正的程序员的娱乐

总的来说,真正的程序员的娱乐方式和他工作的方式一样——和计算机打交道。他经常对他雇主居然付钱让他做他本来就会为了好玩而做的事情感到惊讶(尽管他小心翼翼地不把这个观点说出来)。偶尔,真正的程序员也会走出办公室透透气,喝一两杯啤酒。一些识别真正程序员在计算机房外的小贴士:
  • 在聚会上,真正的程序员是那些在角落里谈论操作系统安全以及如何绕过它的人。
  • 在橄榄球比赛中,真正的程序员是那个将比赛与他在 11x14 风扇折纸上打印的模拟程序进行比较的人。
  • 在海滩上,真正的程序员是在沙滩上画流程图的人。
  • 在葬礼上,真正的程序员是那个说“可怜的乔治。他在心脏病发作前差点就完成了排序例程。”的人。
  • 在杂货店里,真正的程序员是那个坚持要自己扫描罐头通过激光结账扫描器的人,因为他从来不能相信打孔操作员能第一次就弄对。

真正的程序员的自然栖息地

真正的程序员在什么样的环境中能发挥最佳水平?这对真程序员的经理来说是一个重要问题。考虑到留住他(或她)的成本,最好将他置于一个能完成工作的环境中。

典型的真正程序员生活在电脑终端前。终端周围是

  • 真正的程序员曾经处理过的所有程序的列表,堆放在办公室几乎所有平面上,大致按时间顺序排列。
  • 大约半打或更多的半满的冷咖啡杯。偶尔,咖啡里会有烟头漂浮。在某些情况下,杯子里会有橙汁。
  • 除非他非常优秀,否则会有打开着特别有趣页面的 OS JCL 手册和《操作原理》副本。
  • 墙上贴着 1969 年的行式打印机史努比日历。
  • 地板上散落着几个花生酱夹心奶酪棒的包装——那种在烘焙坊就做好以便在自动售货机里存放时不会变坏的类型。
  • 抽屉的左上角藏着一堆双层奥利奥,用于特殊场合。
  • 奥利奥下面是前任住户留下的流程图模板。(真正的程序员编写程序,而不是文档。把它留给维护人员吧。)
真正的程序员能够连续工作 30、40 甚至 50 小时,承受巨大压力。事实上,他更喜欢这样。糟糕的响应时间不会困扰真正的程序员——这给了他编译之间小睡片刻的机会。如果真正的程序员没有足够的进度压力,他倾向于给自己增加挑战,在前九周专注于解决问题的一小部分但有趣的部分,然后在最后一周完成其余部分,进行两次或三次 50 小时的马拉松。这不仅会给他惊叹不已的经理留下深刻印象(他曾绝望地认为项目不可能按时完成),而且还为不写文档创造了方便的借口。总的来说:
  • 没有真正的程序员是朝九晚五工作的(除非是夜班)。
  • 真正的程序员不穿领带。
  • 真正的程序员不穿高跟鞋。
  • 真正的程序员午餐时间才上班[9]。
  • 一个真正的程序员可能认识妻子,也可能不知道他妻子的名字。但他确实知道完整的 ASCII(或 EBCDIC)代码表。
  • 真正的程序员不知道如何做饭。凌晨三点杂货店不开门。真正的程序员靠 Twinkies 和咖啡为生。

未来

未来会怎样?对于真正的程序员来说,一个令人担忧的问题是,最新一代的计算机程序员并没有像他们的长辈那样被培养出相同的人生观。他们中的许多人从未见过带有前面板的计算机。如今,几乎没有大学毕业生能在没有计算器的情况下进行十六进制算术。如今的大学毕业生很软弱——被源级调试器、计算括号的文本编辑器和“用户友好”的操作系统保护起来,免受编程现实的侵害。最糟糕的是,一些所谓的“计算机科学家”竟然能在从未学会 FORTRAN 的情况下获得学位!我们注定要成为一个充斥着 Unix 黑客和 PASCAL 程序员的行业吗?

根据我的经验,我只能报告说,世界各地真正程序员的未来是光明的。尽管全世界的 PASCAL 程序员付出了种种努力,OS\370 和 FORTRAN 都没有丝毫衰退的迹象。即使是更微妙的技巧,比如为 FORTRAN 添加结构化编码构造也失败了。哦,当然,一些计算机供应商推出了 FORTRAN 77 编译器,但它们都有一个方法,可以在拔掉一个选项卡时将其转换回 FORTRAN 66 编译器——以上帝应有的方式编译 DO 循环。

即使是 Unix 对真正程序员来说,可能也不像以前那么糟糕了。最新的 Unix 版本具有一个强大的操作系统潜力,足以满足任何真正的程序员——两种不同且微妙不兼容的用户界面,一个晦涩而复杂的电传打字机驱动程序,虚拟内存。如果你忽略它“结构化”的事实,甚至连‘C’编程也能被真正的程序员欣赏:毕竟,它没有类型检查,变量名只有七(十?八?)个字符长,并且还附带了指针数据类型——就像将 FORTRAN 和汇编语言的精华集于一身。(更不用说 #define 的一些更具创造性的用法了。)

不,未来并非如此糟糕。为什么,在过去的几年里,大众媒体甚至还评论过一群崭露头角的计算机书呆子和黑客([7] 和 [8]),他们从斯坦福和麻省理工学院等地方来到“真实世界”。从所有证据来看,真正的编程精神在这些年轻男女身上依然存在。只要有定义不清的目标、奇怪的错误和不切实际的时间表,就会有真正的程序员愿意挺身而出并解决问题,先把文档放在一边。FORTRAN 万岁!

致谢

我想感谢 Jan E.、Dave S.、Rich G.、Rich E. 在表征真正的程序员方面的帮助,Heather B. 提供了插图,Kathy E. 容忍了这一切,以及 atd!avsdS:mark 提供了最初的灵感。


参考文献

[1] Feirstein, B., **“Real Men don't Eat Quiche”**, New York, Pocket Books, 1982。

[2] Wirth, N., **“Algorithms + Data Structures = Programs”**, Prentice Hall, 1976。

[3] Ilson, R., **“Recent Research in Text Processing”**, IEEE Trans. Prof. Commun., Vol. PC-23, No. 4, Dec. 4, 1980。

[4] Finseth, C., **“Theory and Practice of Text Editors -- or -- a Cookbook for an EMACS”**, B.S. Thesis, MIT/LCS/TM-165, Massachusetts Institute of Technology, May 1980。

[5] Weinberg, G., **“The Psychology of Computer Programming”**, New York, Van Nostrand Reinhold, 1971, p. 110。

[6] Dijkstra, E., **“On the GREEN language submitted to the DoD”**, Sigplan notices, Vol. 3 No. 10, Oct 1978。

[7] Rose, Frank, **“Joy of Hacking”**, Science 82, Vol. 3 No. 9, Nov 82, pp. 58-66。

[8] **“The Hacker Papers”**, Psychology Today, August 1980。

[9] sdcarl!lin, **“Real Programmers”**, UUCP-net, Thu Oct 21 16:55:16 1982


真正的程序员也不使用 Fortran!

一篇最近专门讨论编程的**阳刚**一面的文章(“真正的程序员不使用 Pascal”,作者 ucbvax!G:tut)发表了一个直接且未经修饰的声明:

真正的程序员写 Fortran。
也许现在他们是这样,在这个充斥着淡啤酒、手持计算器和“用户友好”软件的颓废时代,但在过去的美好时光,当“软件”这个词听起来很奇怪,而真正的计算机是由鼓和真空管组成的,真正的程序员用机器代码编写。不是 Fortran。不是 RATFOR。甚至不是汇编语言。机器代码。原始的、未经修饰的、晦涩难懂的十六进制数字。直接编写。

为了避免整整一代程序员在对这段辉煌的过去一无所知的情况下成长起来,我觉得有责任尽可能通过代沟来描述一个真正的程序员是如何编写代码的。我称他为 Mel,因为那就是他的名字。

我第一次见到 Mel 是在我去已故的打字机公司 Royal McBee Computer Corp. 工作时。该公司生产 LGP-30,这是一款小型、便宜(当时的标准)的鼓式存储计算机,并刚开始生产 RPC-4000,这是一款大幅改进、更大、更好、更快的鼓式存储计算机。磁芯太贵了,而且总有一天会淘汰。(这就是你没听说过这家公司或这台计算机的原因。)

我被雇来为这台新奇的机器编写 Fortran 编译器,而 Mel 是我了解其奇妙之处的向导。Mel 不赞成编译器。

“如果一个程序不能重写自己的代码,”他问道,“那它有什么用?”

Mel 用十六进制编写了该公司最受欢迎的计算机程序。它运行在 LGP-30 上,并在计算机展会上与潜在客户玩二十一点。它的效果总是很戏剧化。每次展览 LGP-30 的展位都挤满了人,而 IBM 的销售人员则在一旁互相交谈。这是否真的卖出了计算机,这是一个我们从不讨论的问题。

Mel 的工作是为 RPC-4000 重写二十一点程序。(移植?那是什么意思?)新计算机采用“一对一”寻址方案,其中每个机器指令除了操作码和所需操作数的地址外,还有一个第二地址,指示下一个指令在旋转鼓的什么位置。用现代的说法,每个指令后面都有一个 GO TO!让**Pascal**去死吧。

Mel 喜欢 RPC-4000,因为他可以优化他的代码:也就是说,将指令放在鼓上的位置,使得当一个指令完成其工作时,下一个指令正好到达“读头”,可供立即执行。有一个程序可以完成这项工作,一个“优化汇编器”,但 Mel 拒绝使用它。

“你永远不知道它会把东西放在哪里,”他解释说,“所以你必须使用单独的常量。”

我花了很长时间才理解这句话。由于 Mel 知道每个操作码的数值,并且自己分配了鼓地址,所以他写的每个指令也可以被视为一个数值常量。他可以拿起一个早期的“加法”指令,比如,如果它有正确的数值,就乘以它。他的代码不容易被别人修改。

我比较了 Mel 手动优化的程序和由优化汇编程序处理的相同代码,Mel 的总是运行得更快。这是因为“自顶向下”的程序设计方法还没有发明出来,而且 Mel 无论如何都不会使用它。他首先编写他程序循环的最内层部分,以便它们能优先选择鼓上的最佳地址位置。优化汇编器不够聪明,无法做到这一点。

Mel 从不编写延时循环,即使在迟钝的 Flexowriter 需要延时才能正确输出字符时也是如此。他只是将指令放在鼓上的位置,使得每个连续的指令在需要时正好在读头*过去*;鼓必须执行完整的一圈才能找到下一个指令。他为这种程序创造了一个令人难忘的术语。虽然“最优”是一个绝对术语,就像“唯一”一样,但相对地使用它已经成为一种普遍的口头习惯:“不那么最优”或“不那么最优”或“不太最优”。Mel 将最大延时位置称为“最差”。在他完成二十一点程序并使其运行后(“即使是初始化程序也经过优化,”他骄傲地说),他收到销售部门的变更请求。该程序使用一个优雅的(优化的)随机数生成器来洗牌“牌”并从中发牌,一些销售人员觉得它太公平了,因为有时客户会输。他们希望 Mel 修改程序,以便在按下控制台的某个开关时,他们可以改变赔率,让客户获胜。

Mel 拒绝了。他觉得这明显不诚实,而且侵犯了他作为程序员的个人诚信,所以他拒绝这样做。首席销售员与 Mel 进行了交谈,总经理也与他谈了,并且在老板的敦促下,几位同事程序员也与他谈了。Mel 最终妥协并编写了代码,但他把测试弄反了,当开关打开时,程序会作弊,每次都赢。Mel 对此感到高兴,声称他的潜意识是无法控制的道德驱动,并坚决拒绝修复它。

Mel 离开公司去寻找更好的发展后,总经理让我看代码,看看能否找到测试并反转它。我有些不情愿地同意了。追踪 Mel 的代码是一次真正的冒险。

我常常觉得编程是一种艺术形式,其真正的价值只有在精通同一门神秘技艺的另一个人才能欣赏;有可爱的瑰宝和杰出的功绩隐藏在人类的视野和赞美之外,有时是永远的,这是由于过程本身的性质。即使只是通过十六进制阅读代码,你也能从一个人身上学到很多。我认为 Mel 是一位被低估的天才。

也许我最大的震惊是发现了一个看起来无害的循环,它根本没有测试。没有测试。**根本没有**。常识认为它一定是闭环,程序会永远、无休止地循环。然而,程序控制却能安全地通过它,然后出去。

RPC-4000 计算机有一个非常现代化的功能,称为索引寄存器。它允许程序员编写一个循环,在其中使用索引指令;每次循环,索引寄存器中的数字都会加到该指令的地址上,以便它引用系列中的下一个数据。他只需要每次循环递增索引寄存器。Mel 从未使用它。

相反,他将指令拉入一个机器寄存器,在其地址上加一,然后将其存回。然后他直接从寄存器执行修改后的指令。循环的编写考虑到了这个额外的执行时间——当这个指令完成时,下一个指令正好在鼓的读头下面,准备就绪。但是循环里没有测试。

关键线索是我注意到索引寄存器位(位于指令字中的地址和操作码之间的位)被打开了——尽管 Mel 从未真正使用过索引寄存器,而是让它一直为零。当灯亮起来时,它几乎刺瞎了我。

他将他正在处理的数据放在内存顶部附近——指令可以寻址的最大位置——因此,在处理完最后一个数据后,递增指令地址会使其溢出。进位会将 1 加到操作码,将其更改为指令集中的下一个操作码:一个跳转指令。果然,下一个程序指令位于地址位置零,程序愉快地继续运行。

我没有和 Mel 保持联系,所以我不知道他是否屈服于自那时以来席卷编程技术的变革浪潮。我喜欢认为他没有。无论如何,我印象深刻,以至于我停止寻找那个有问题的测试,告诉总经理我找不到它。他似乎并不惊讶。当我离开公司时,如果你打开右边的那个开关,二十一点程序仍然会作弊,我想应该就这样。我不觉得黑入一个真正程序员的代码有什么舒适之处。


历史消息

Subject:  Real programmers (2)
From:     R.D.Eager@UKC         05 Oct 83  16:21:03 BST
To:       J.Darby@ukc
Comments: The stuff we got from UNIX
Msg ID:   <05 Oct 83  16:21:03 BST  060206@2960>


真正的程序员宁愿使用一排拨动开关和读取一排 LED 灯,也不愿使用键盘和 CRT 这样笨拙的设备与计算机交流。Marc

真正的程序员在重新编译之前就修补二进制文件。

真正的程序员用 029 多孔打孔机打出他们的对象卡片。(那是生产卡片;测试运行直接用工程师的控制台开关输入;顺便说一句,ODT 系统是给胆小鬼用的)

这些“真正的程序员”到底在做什么提交新闻文章?他们应该躲在某个角落里写 FORTRAN。

来自:Ron Natalie

但真正的程序员存在于所有邮件列表中,并花费他们每天 18 小时工作时间的头六个小时阅读邮件,并向 Unix-Wizards 和 Info-Micro 发送随意的建议,并为 SF-Lovers、Poly-Sci 和 ArmsD 撰写长篇社论。

来自:Charlie Strom (NYU)

我同意这个团体可能有点得意忘形,但看到那些声称走在计算机技术前沿的人,甚至连简单的单词都拼不对或语法不正确,我感到很恼火。在一方面有专长并不意味着必须在另一方面完全无知,对吗?

我更希望看到一些纠正拼写和用法的消息(硅 vs. 硅,后者才是正确的),而不是十几个关于“真正的程序员”在没人看他们的时候做什么或不做什么的观点!

真正的程序员不进行所有修补二进制文件的开销,真正的程序员直接修补内存。

来自:Jeffrey Shulman

真正的程序员用汇编语言做 AI。

真正的程序员用 Z-80 和 4K 字节内存的 InterLisp 进行数字计算。

真正的 Lisp 程序员从不使用 SETx 或 PROGx,并且完全依赖副作用。

来自:Jerry E. Pournelle

真正的程序员不使用十进制……

真正的程序员用十六进制思考,并且可以在不依赖汇编器或高级语言的情况下对机器进行编程。


Subject:  Real Programmers (4)
From:     R.D.Eager@UKC         05 Oct 83  16:21:30 BST
To:       J.Darby@ukc
Comments: This is even earlier then the Mel one; a short set of definitions.
真正的程序员不写规范——用户应该庆幸能得到任何程序,并接受他们得到的。

真正的程序员不注释他们的代码。如果写起来很困难,那么理解起来也应该很困难。

真正的程序员不编写应用程序;他们直接在裸机上编程。应用程序编程是给那些不能做系统编程的弱者的。

真正的程序员不吃乳蛋饼。事实上,真正的程序员不知道如何拼写乳蛋饼。他们吃 Twinkies 和四川菜。

真正的程序员不写 COBOL。COBOL 是给软弱的应用程序程序员写的。

真正的程序员的程序第一次从来就没能正常工作。但是,如果你把它们放在机器上,可以在“仅几次” 30 小时的调试会话中修复它们。

真正的程序员不写 FORTRAN。FORTRAN 是给管道应力怪胎和晶体学宅男用的。

真正的程序员从不朝九晚五。如果早上 9 点有真正的程序员在,那是因为他们通宵未眠。

真正的程序员不写 BASIC。实际上,12 岁以上的程序员都不写 BASIC。

真正的程序员不写 PL/I。PL/I 是给那些无法决定写 COBOL 还是 FORTRAN 的程序员用的。

真正的程序员不打网球,或任何其他需要换衣服的运动。爬山是可以的,而且真正的程序员会穿着他们的登山靴去上班,以防突然有一座山出现在机器房中间。

真正的程序员不写文档。文档是给那些读不懂列表或对象卡片的傻瓜用的。

真正的程序员不写 PASCAL、BLISS、ADA 或任何那些粉红色的计算机科学语言。强类型是给记忆力差的人用的。


(Message 19)
Subject:  Real Programmers (5)
From:     R.D.Eager@UKC         05 Oct 83  16:21:43 BST
To:       J.Darby@ukc
你可能已经注意到

  • 真正的程序员不浪费时间重新编译;他们修补二进制文件。

并且
  • 真正的程序员不浪费时间修补二进制文件;他们修补内存。

我可以补充以下内容:
  • EMAS 上的真正程序员总是修补内存;那**就是**二进制文件!

这不会被 UNIX 达人所理解;EMAS 文件系统太简单,他们无法理解。

© . All rights reserved.