夜雨聆风学习资料网

ARTICLE · 1200775

7.5万星!阿波罗11号登月源码在GitHub爆火:点开点火程序,注释把全网看傻了

7.5万星!阿波罗11号登月源码在GitHub爆火:点开点火程序,注释把全网看傻了

如果你有机会打开1969年把人类送上月球的计算机源码,你觉得里面会写些什么?

在大多数人的想象里,那一定是一座冰冷、肃穆、精密到毫厘的数学神殿。毕竟,那是人类历史上最伟大的远征每一行代码都关乎三条人命,关乎整个国家的尊严,里头必定写满了外人看不懂的绝密公式与庄严指令。

但只要点开这份代码,扑面而来的反差便令人猝不及防。

里面不仅有1960年代的黑人电台摇滚黑话、有程序员对宇航员的公然吐槽、有莎士比亚戏剧里的毒舌台词,甚至在决定生死存亡的登月下降代码旁,赫然写着一行近乎祈祷的注释:“这只是临时代码,我希望,希望,希望如此(TEMPORARY, I HOPE HOPE HOPE)。”

最近,知名工程账号 World of Engineering 在社交平台 X 上发了短短一句话:“阿波罗11号的源代码已在 GitHub 上公开。”

▲ 引发本轮全网考古热潮的入口帖,短短一句话再次将公众拉回1969年的软件现场

这句简短的提醒,随即在技术圈掀起了一场席卷全球的“赛博考古”。许多年轻程序员满怀敬畏地点进仓库,结果不过几分钟,敬畏便化作震惊,震惊又化作阵阵欢笑。

01神坛下的荒诞:点火程序居然叫“烧吧,宝贝”

眼前这个斩获 7.52 万颗星(Stars)、8200 多次分叉(Forks) 的传奇仓库名为 chrislgarry/Apollo-11。

▲ GitHub 上的阿波罗11号源码仓库,包含指令舱 Comanche055 与登月舱 Luminary099 两大核心目录

按照太空史诗的“标准承诺”,控制火箭发动机点火的核心模块,起码应该叫 MAIN_ENGINE_IGNITION_CONTROLLER 吧?

现实是,麻省理工学院(MIT)仪器实验室的那群年轻工程师,直接把这个掌控生死的登月舱主点火例程命名为:BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc(烧吧,宝贝,烧吧,主点火例程)。

▲ 登月舱主点火例程文件页,极其严肃的航天工程路径下躺着一个极具街头感的文件名

“Burn, baby! BURN!” 是1965年美国洛杉矶著名黑人电台 DJ “华丽蒙塔古”(Magnificent Montague)在播放最热灵魂乐时的招牌口头禅。谁能想到,当阿姆斯特朗和奥尔德林驾驶登月舱在月球轨道上喷射烈焰时,机载计算机底层跑着的,居然是午夜摇滚电台的狂欢暗号。

如果你顺着目录继续往下翻,这种“史诗感与草台班子感”的剧烈反差会一波接一波地冲击你的大脑。

在登月着陆的核心流程文件 THE_LUNAR_LANDING.agc 里,有一段代码负责检查登月雷达天线有没有就位。当系统提示宇航员去调整天线时,程序员在旁边冷冷地写下了一串连续剧般的吐槽:

“宇航员:请把这该死的蠢玩意儿摇到位(PLEASE CRANK THE SILLY THING AROUND)。”

紧接着,当宇航员按下“继续(PROCEED)”键表示自己已经弄好时,下一行代码的注释赫然写着:

“看看他有没有撒谎(SEE IF HE'S LYING)。”

检查通过后,程序跳转到刚才那个 BURNBABY 点火程序,程序员在跳转指令旁潇洒地甩下一句《绿野仙踪》的经典台词:

“出发去见魔法师喽……(OFF TO SEE THE WIZARD...)”

这还没完有网友专门建了一个代码片段合集(Gist),把仓库里诙谐的注释挨个整理出来:装杂项工具的代码块被直呼为 TRASHY LITTLE SUBROUTINES(垃圾小子程序);而在另一段关键逻辑旁边,程序员留下了令无数同行心有戚戚焉的六个单词:TEMPORARY, I HOPE HOPE HOPE(临时的,我希望、希望、希望是这样)。

▲ 网友整理的阿波罗11号源码高能注释合集,每一条都戳中现代程序员的笑点与痛点

原来,“临时代码直接上线跑生产环境”,从人类第一次登月时就是祖传手艺了。

02开源的真相:MIT 档案室里的手工作业,铜线织出的太空密码

看到这里,很多人会产生第二个错觉:既然代码在 GitHub 上这么完整,肯定是 NASA 官方某天大发慈悲,把硬盘里的陈年老文件一键打包上传(Dump)到了网上。

这又是一个被互联网包装出来的美丽误会。

在 World of Engineering 的推文下方,网友 Geoff 详细道出原委:仓库里的代码并非官方直接打包上传,它全凭一群硬核志愿者在 MIT 博物馆里,对着发黄的纸质打印稿一张张拍照、再一行行敲进电脑里的“手工作业”。

▲ 评论区辟谣:源码并非 NASA 直接上传,而是志愿者从 MIT 博物馆纸质档案中逐行转录的成果

为什么要看纸质打印稿?因为1969年根本没有今天意义上的磁盘文件或云端代码库。

阿波罗飞船上搭载的制导计算机(AGC),分别装在指令舱(运行 Comanche055 程序)和登月舱(运行 Luminary099 程序)里。这台机器的硬件参数,放在今天连一张会唱歌的生日贺卡都比不上:CPU 时钟频率只有约 1.024 MHz,可读写的擦除内存(相当于今天的 RAM)只有区区几千个字(约几 KB),只读存储器也不过几十 KB。

那么,当年的只读代码究竟如何存入硬件?答案全凭纺织女工用铜线手工“织”入

这种技术叫“绳式磁芯记忆(Core Rope Memory)”。工程师把写好的汇编代码打印成厚厚的纸质清单,交给工厂里的女工;女工们拿着长针,把铜线穿过一个个微小的磁环,铜线穿过磁环代表数字 1,绕过磁环代表数字 0。

在阿波罗时代,“修改一行代码”远非按下退格键即可搞定,往往需要工人重新穿针引线!硬件被彻底锁死、容错率几乎归零,纸质清单上的每一句注释,哪怕是玩笑、自嘲和祈祷,都成了工程师们在极端高压下核对逻辑、给同伴留下的“救命路标”。

后来,Paul Fjeld 等人把 MIT 博物馆馆藏的纸质代码清单(上面甚至还留着1969年3月28日软件负责人 Margaret Hamilton 的亲笔签字验收记录)扫描成图,研究者 Ron Burkey 等人发起 Virtual AGC 项目将其人工转录成电子文本;直到2016年,前 NASA 实习生 Chris Garry 把它们搬上 GitHub,这批沉睡了半个世纪的“铜线文学”才广泛走进公众视野。

03弹球机与莎士比亚:戴着太空手套,怎么跟几 KB 的电脑聊天?

如果继续深挖这套源码,你会发现第三个更剧烈的反差:科幻大片里酷炫的太空舱操控台,在底层源码里竟然被叫做“街机弹球台”。

在指令舱源码目录里,有一个专门负责显示屏和键盘交互的核心文件,名字叫 PINBALL_GAME_BUTTONS_AND_LIGHTS.agc(弹球游戏的按钮与灯光)。

为什么叫弹球机?因为当年宇航员面前的交互终端 DSKY(读作“dis-key”),长得实在太像1960年代美国街机厅里的弹球游戏机了。

面板上见不到常规键盘与鼠标,取而代之的是 14个黄白相间的状态报警灯、几排发着绿光的 电致发光数字管,以及下方 19个大行程的方形机械按键。之所以设计得这么“傻大黑粗”,是因为宇航员在狭窄的座舱里必须戴着厚重僵硬的加压太空手套,只有这种按下去咔哒作响的大方块按键,才不会按错。

没有26个英文字母,人类怎么指挥飞船点火、变轨、看时间?

MIT 的天才程序员们发明了一套极简到骨子里的交互语言:Verb(动词)+ Noun(名词)。

  • Verb(动词,两位数字)
     代表“干什么”:比如 Verb 06 是显示十进制数据,Verb 16 是实时刷新监控,Verb 37 是切换主程序。
  • Noun(名词,两位数字)
     代表“对谁干”:比如 Noun 36 是飞船时钟,Noun 33 是点火时间参数,Noun 68 是着陆姿态与速度误差。

宇航员想看一眼现在几点了,不能敲命令,而是要像按计算器一样:按下 VERB 键  输入 06 按下 NOUN 键  输入 36 按下 ENTR(回车)。

这套完全由数字组成的“动词+名词”黑话,把当时的宇航员和管理层折磨得够呛。于是,编写 PINBALL 程序的工程师在源码第 181 行,直接抄了一段莎士比亚历史剧《亨利六世》里的台词来自嘲:

“当着你的面就可以证明,你身边聚集着一帮张口就是动词、名词的家伙,这等可憎字句岂是虔诚教徒所能忍受。”

用最古典的莎翁戏剧,吐槽最硬核的太空人机界面。但别看名字叫“弹球机”,这套界面的底层资源争夺却凶险无比。

因为计算机内存太小,宇航员按键和飞船后台程序自动弹窗,共用的是同一块屏幕。为此,程序员设计了严格的“键盘互斥锁”,当系统急着报警时,宇航员必须按下 KEY REL(释放键)交出屏幕控制权。

在1968年人类首次绕月的阿波罗8号任务中,极度疲惫的宇航员吉姆·洛威尔(Jim Lovell)在返航途中想输入 Verb 37 切换程序,结果手指一滑,误输入了 P01(发射台预备对准程序)。

那一瞬间,正在深空狂飙的飞船计算机突然以为自己还竖立在佛罗里达州的发射塔架上!惯性导航平台的坐标矩阵被当场重置,姿态喷管开始疯狂乱喷。最后,洛威尔不得不靠肉眼透过光学六分仪去寻找宇宙中的参宿七与天狼星,再通过这台“弹球机”手动敲入一串串修正指令,才在鬼门关前把飞船姿态拉了回来。

04段子背后的真神:把“临时代码”写成不死之身

读到这里,最核心的问题浮出水面了:既然这套代码里塞满了段子、吐槽,甚至还有 TEMPORARY, I HOPE HOPE HOPE 这种让人心惊肉跳的临时补丁,为什么阿波罗11号没有在月球表面摔得粉身碎骨?

这就是阿波罗源码给现代软件工业留下的最毒辣、也最震撼的启示:局部代码的幽默与松弛,恰恰建立在顶层架构极致的冷酷与强悍之上。

在 Hacker News 的技术深挖帖里,有硬核考据党专门扒出了那句 TEMPORARY, I HOPE HOPE HOPE 的来龙去脉。那其实是在半手动最终下降阶段,为了防止角速度残留而临时加进去的一行 STOPRATE 调用;直到后来的阿波罗14号软件修订版中,这行“临时代码”才随着逻辑重构被正式移除。

▲ Hacker News 社区的技术考据:深扒那句著名的“希望只是临时代码”在后续任务中的真实演进

最终在危急关头保住阿姆斯特朗性命的,是这群写段子的程序员在底层搭建的“基于优先级的异步抢占式调度系统”。

1969年7月20日,当登月舱“鹰号”距离月面只剩几千英尺时,由于交会雷达开关位置不对,海量无用的脉冲信号瞬间涌入那台只有几 KB 内存的计算机。CPU 算力当场过载,DSKY 面板上急促闪烁起 1202 和 1201 程序告警。

如果换成一台普通的顺序执行电脑,此时早就蓝屏死机、机毁人亡了。

但年仅32岁的软件工程负责人 玛格丽特·汉密尔顿(Margaret Hamilton) 和她的团队,早就为这一刻写好了底牌。在 ALARM_AND_ABORT.agc(报警与中止)和 FRESH_START_AND_RESTART.agc(冷启动与重启)的设计下,系统在毫秒之间做出了决断:直接掐断所有低优先级的“弹球机”屏幕刷新和次要计算,把宝贵的算力100%留给最高优先级的发动机点火与姿态控制进程!

▲ 网友一语道破天机:幽默注释只是表象,异步抢占式调度与过载保护才是人类成功登月的定海神针

正是在编写这套代码的过程中,汉密尔顿团队将 “Software Engineering(软件工程)” 这个词推向了世界。在此之前,软件只是附属在硬件身上的“补丁”;在此之后,软件成了一门独立、严谨、能够力挽狂澜的现代工程学科。

半个多世纪过去,如今随手点开的应用动辄消耗数个吉字节(GB),却仍可能在日常操作中毫无征兆地卡死。而当我们重读 GitHub 上那份仅有数十 KB 的阿波罗源码,浏览满纸的“烧吧宝贝”与“看看他有没有撒谎”,跨越时空的深切触动依然令人感慨万千。

字里行间凝结着人类顶尖头脑直面未知挑战时,留给冰冷机器的一抹温情。他们在区区几千字节的螺蛳壳里筑起通往月球的阶梯,随后洒脱离去,在铜线编织的岁月深处,留下一串属于1969年的诙谐鬼脸。

相关学习资料