# 24. XcodeGhost

内核恐慌 · 2015-09-21

<https://lib.pan.icu/fb799ae2-d89c-47fd-bd73-691179e3557d>

本期《内核恐慌》围绕 XcodeGhost 事件展开，指出该事件源于开发者从非官方渠道下载了被篡改的 Xcode 编译器，导致编译出的 iOS 应用植入后门。主持人吴涛和 Rio 认为苹果的单一编译器分发模式加剧了风险，但本质上信任问题是根本——用户无法验证闭源编译器是否安全。节目深入探讨了 Ken Thompson 1984 年的图灵奖演讲《Reflections on Trusting Trust》，其中演示了编译器后门的隐蔽性，并引用 Daniel J. Bernstein 在《Some thoughts on security after ten years of qmail 1.0》中提出的减少代码量、重用系统工具、遵循最小受信代码等安全原则。最终强调，真正的安全需要从硬件到软件的完全自主可控，但现实中只能通过技术手段（如确定性构建、哈希校验）降低风险。

## Questions this episode answers

### XcodeGhost 事件是如何发生的？

开发者因苹果 CDN 下载缓慢，从迅雷等非官方渠道下载了被植入后门的 Xcode 编译器，导致编译出的 iOS 应用携带后门。吴涛和 Rio 指出，类似事件历史上曾发生，如 Delphi 7 病毒和 PuTTY 中文版后门。他们建议通过哈希校验和代码签名确保编译器完整性，但也承认在闭源且单一工具链下彻底信任难以实现。

[51:10](https://lib.pan.icu/fb799ae2-d89c-47fd-bd73-691179e3557d?t=3070000)

### Ken Thompson 的《Reflections on Trusting Trust》提出了什么观点？

Ken Thompson 在 1984 年图灵奖演讲中揭示，他曾向 Unix 的 C 编译器植入后门，该后门能通过编译器自举过程隐藏，极难检测。吴涛和 Rio 借此说明，即便源代码可见，编译器本身也可能被篡改，因此无法完全信任任何非亲手创建的代码，甚至硬件也可能存在后门。

[1:43:07](https://lib.pan.icu/fb799ae2-d89c-47fd-bd73-691179e3557d?t=6187000)

### Daniel J. Bernstein 在 qmail 1.0 十周年的安全思考中提出了哪些原则？

在《Some thoughts on security after ten years of qmail 1.0》中，DJB 提出减少代码量以降低 bug 数，减少受信任代码，并认为异常处理机制不如直接处理错误，追逐攻击者（头痛医头）和最小化权限并不解决根本问题，性能不应牺牲安全。吴涛和 Rio 详细讨论了这些原则并推荐该论文。

[1:09:05](https://lib.pan.icu/fb799ae2-d89c-47fd-bd73-691179e3557d?t=4145000)

## Key moments

- **[0:00] 开场**
  - [0:46] 吴涛带着父母游览自己学习生活过的德语区，完成他们第一次出国旅行。
  - [1:34] Rio 调侃吴涛父母首次出国是“不肖子孙”。
  - [2:05] 吴涛家距离天津爆炸现场直线30多公里，幸免于难。
  - [2:54] 吴涛和 Rio 谈论《生化危机》伞公司梗，吴涛说自己的车贴会放“Arbiter science”。
  - [4:13] Rio 说苹果 MacBook Air 广告中贴满 sticker 的画面，认为苹果迟早会卖 sticker。
- **[6:01] 听众反馈**
  - [6:01] 吴涛遗憾新款 12 英寸 MacBook 不再有发光的苹果 logo。
  - [6:31] 吴涛纠正上期节目口误：应该是 clean room，不是 white room。
  - [7:47] 听众来信：中老年程序员工作五六年后的焦虑，被 Rio 和吴涛触动。
  - [9:34] Rio 引用 Backblaze 博客：不必总追求十亿美元公司，lifestyle business 也是成功。
  - [11:40] 吴涛认为成为大牛更靠天赋，没有智商提高手术，如同颜值无法改变。
  - [13:18] Rio 已告别专业程序员，迎来人生新阶段。
- **[26:10] 新闻联播**
  - [26:31] 新闻：John Carmack 的 10 岁儿子 Ryan 使用 Scheme 开发了一款 Flappy Bird 风格游戏 Fly。
  - [28:23] 吴涛感叹自己从没写过 Flappy Bird，而 10 岁小孩已经做到了。
  - [31:42] Rio 惊讶 Ryan 在游戏开发中学会了使用 Blender 和 Audacity 等工具。
  - [33:45] 10 岁的 Ryan 在个人主页列出喜爱的 RPG 游戏并研究 DND 阵营，吴涛和 Rio 讨论小孩玩分级游戏是否合适。
  - [35:53] Homebrew 作者 Max Howell 因在白板上写不出翻转二叉树被谷歌拒绝，随后加入苹果并发布自拍。
  - [37:47] React Native for Android 发布，实现一套 JS 代码同时在 iOS 和安卓渲染原生界面。
- **[49:35] 编译后门**
  - [49:37] 引入本期正题 XcodeGhost，讨论非官方 Xcode 编译器植入后门事件。
  - [52:06] Rio 问苹果对 XcodeGhost 有责任吗？吴涛认为技术上苹果无责，但集中式工具模式是根源。
  - [56:26] Rio 提出信任问题：用户必须选择相信官方编译器，但无法保证其未被篡改。
  - [57:59] 吴涛举例 Seagate 硬盘固件后门，说明即使大公司也可能被迫植入恶意代码。
  - [59:40] 吴涛指出 2009 年 Delphi 病毒曾感染 IDE，使编译出的程序携带病毒，但因用户少影响有限。
  - [1:01:15] Rio 提出技术手段防止 Xcode 被篡改，如验证哈希值和使用代码签名。
- **[1:50:28] 结尾**

## Speakers

- **Rio** (host)
- **吴涛** (host)

## Topics

安全

## Mentioned

Apple (company), Delphi (product), PUTTY (product), Xcode (product), XcodeGhost (product), qmail (product)

## Transcript

### 开场

**吴涛** [0:00]
欢迎收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。 我们又回来啦 ！ 我们号称 Hardcore，但是也没有干货 ， 想听的人听 ，不想听的人就别听 。

本节目的网址是 ipn.li/kernelpanic， 我们推荐大家使用 Podcast 客户端订阅节目 ， 详情请访问 ipn.li/faq。 欢迎你为本节目捐款 ， 捐款地址是 ipn.li/kernelpanic/donate。

捐款金额随意 ， 只要是 8 的正整数倍就可以了 。 捐款不会为你带来什么 ，不捐也不会让你失去什么 。

我们的口号是 ： Trust no one, even your compiler. 呼 ， 好久没有念这句话了 。

**Rio** [0:40]
还可以 ， 挺流畅的 。 所以那个 ， 你这个一个月玩得可好 ？

**吴涛** [0:46]
呃 ， 还不错 。 带着带着爸爸妈妈去了一趟我

呃学习过 、 生活过 、 工作过 、 战斗过的地方 ， 然后去了些我觉得叫 ， 呃 ， 怎么说呢 ， 德语区还比较满 、 还比较漂亮的一些地方 ， 没有去更远的地方 。

**Rio** [1:06]
OK， 所以这也算是什么 ， 重走长征路 ？

**吴涛** [1:10]
对 ， 就是因为过去的这 ， 我来德国有 9 年了吧 ， 然后过去 9 年里面一般都是他们只能从电话或者是照片里面知道我曾经在什么地方待过 ， 然后这次可以身临其境地看一看 ， 我觉得还是挺有意义的 。

**Rio** [1:26]
就他们过去从来没去过是吧 ？

**吴涛** [1:28]
对 ， 这是第一次来 ， 甚至之前二老连护照都没有 ， 所以这是第一次出国 。

**Rio** [1:34]
哇 ， 你也是不肖子孙啊 。

**吴涛** [1:37]
哈哈哈 ， 所以所以令尊令堂是去过加拿大吗 ？

**Rio** [1:40]
啊 ，其实也并没有 。

**吴涛** [1:41]
那他们也没有护照 。

**Rio** [1:44]
哈哈哈 ，不过他们有有比较忙嘛 ， 所以也不太可能走得开现在 。

**吴涛** [1:50]
嗯 ， 我父母也是 ，其实刚刚才退休 ， 所以也是刚刚闲下来 。

**Rio** [1:56]
嗯哼 ， 这也挺好的 。 哎 ， 上次那个 ，因为你家在天津嘛 ， 所以还是要关心一下， 那个爆炸对你家影响怎么样 ？

**吴涛** [2:05]
呃 ， 我们家距离爆炸现场的直线距离是 30 多公里 ， 所以呃算是幸免于难嘛 ，但如果和其他各位比起来的话 ， 那还是比较近的 。

然后之前也是比较担心说如果有泄露的毒害物质在外面 ， 呃 ， 要不要考虑先去 ，因为我们家是浙江人 ，其实就是要要不要先回老家避一避风头 ， 所以但目前看来还好 。

然后我爸妈又特别 ， 我也不知道 ，他们两个都是化工嘛 ， 所以不把这个当事 ， 总觉得无所谓 。

那那暂时也没有什么特别的影响 。

**Rio** [2:47]
所

所以这个时候你需要那个 ， 特别需要那个伞公司的保护 。

**吴涛** [2:54]
Umbrella， 你说 ？

**Rio** [2:56]
对 ， 就是那个 。

**吴涛** [2:58]
What？ 幻形阵 ？

**Rio** [3:00]
Preserving the health of the people。

**吴涛** [3:02]
OK。

**Rio** [3:03]
The umbrella's motto。

**吴涛** [3:07]
Arbiter science。

**Rio** [3:09]
啊 ， 那个也可以 。 啊 ， 这个是一个什么 ， 呃 ， 前面那个伞公司是那个生化危机的梗哈 ？

**吴涛** [3:17]
对 。

**Rio** [3:18]
啊 ， 那个还挺挺奇怪的 。 呃 ， 那个 ，因为我现在在深圳嘛 ， 我经常在路上， 我今天看到两次别人在那个车上贴了伞公司的那个标识那些 。

**吴涛** [3:30]
这是某种 cult 吗 ？ 就是邪邪教吗 ？

**Rio** [3:34]
就我还我还我还挺挺吃惊的 ， 说咦 ， 这个还还有真爱遍地在 。

**吴涛** [3:41]
还有人在搞这个梗是吧 ？

**Rio** [3:42]
哈哈哈 ， 没错没错 。

**吴涛** [3:45]
回头我去贴一个 ， 回去我去贴一个 Arbiter science 在车厢后面 。

**Rio** [3:49]
哈哈哈 ，其实是个蛮好的点子 。 嗯 ？ 可以买得到啊 ， 你可以直接买来贴在车上就好了 。

**吴涛** [3:56]
对 ，而且 VAV 好像还有 T 恤之类的卖 。

**Rio** [3:59]
全全套主题都有是吧 ？

**吴涛** [4:01]
对 。 哎 ，不对 ，是 Jinx，Jinx.com 在卖那个 portal 相关的主题 。

**Rio** [4:07]
这就是你之前买你那个那个那叫什么 ， 贴笔记本 ？

**吴涛** [4:12]
对对对 ， 没错 。

**Rio** [4:13]
那那个东西有学名吗 ？ 就是贴那个笔记本电 ， 笔记本电脑背壳那个表面那个纸 。

**吴涛** [4:20]
就是 sticker 那个 。

**Rio** [4:21]
就叫 sticker 嘛 ， 没有什么其他的 。

**吴涛** [4:23]
没有什么特别的 ，因为能贴笔记本电脑的表面 ， 还可以贴别的 ， 就也可以贴别的东西的表面 。

**Rio** [4:30]
啊 ，因为那个之前苹果出过一个那个系列广告片 ， 一个广告片嘛 ， 就是它的那个 MacBook Air 上面就是 。

**吴涛** [4:38]
贴了一大堆 sticker。

**Rio** [4:39]
一大堆 sticker， 然后它每一个做了一个 ， 这个叫什么 ， 这叫 slow motion？ 哎 ，不叫 slow motion， 这个叫什么来着 ， 那个专门的数理这种拍法 。

**吴涛** [4:46]
粘土动画嘛 。

**Rio** [4:48]
啊 ， 对对对 ， 粘土动画 ， 就是它每一张拍一个 ， 然后做成一帧一帧 ， 然后串起来播这样 。

**吴涛** [4:53]
对 。

**Rio** [4:54]
还挺有意思 。

**吴涛** [4:54]
我看过 ， 对 ，但是呃 ， 那个

苹果官网不卖 sticker 真的太贵了 ， 我觉得看了那一周我好想买 。

**Rio** [5:04]
哈哈哈 ，不过我觉得这个是迟迟早的事吧 ，他们都已经卖做做手机壳了 ， 下一步不就是 sticker 了 ？

**吴涛** [5:12]
嗯 ， 这个很难说啊 ， 我觉得其实一般公司是不太愿意让呃 sticker 去修改自己的 logo 了 ， 就好像那个提供改装车选项的车厂不会让你把它的 logo 弄成别的颜色一样 。

**Rio** [5:29]
它它这个 sticker 那个还不算修改吧 ， 它只是说就在那个边缘做一些发挥了 ， 发散 。 比如说我特别印象深一个那个 ， 那钢铁侠的手上不是有个那个亮灯的那个喷东西的那个东西吗 ？

**吴涛** [5:42]
凶神 。

**Rio** [5:42]
对 ，他就那直接把它装到那个 ， 用那个苹苹果那个那个图标 ，他在那个 MacBook Pro 上是可以发光的嘛 。

**吴涛** [5:50]
对 。

**Rio** [5:51]
还挺有意思的 。 不过现在那个新出的那个 MacBook 12 寸的就没戏了 。

**吴涛** [5:57]
为什么 ？ 太小了 ？ 哦 ，不发光 。 哎 ， 真的 ， 这还蛮遗憾的 。

### 听众反馈

**Rio** [6:01]
哎 ， 对啊 。 好吧 ， 那个我们做一下上一期 ，也就是差不多一个多月以前的 follow up 吧 。

**吴涛** [6:08]
对 。

**Rio** [6:09]
呃 ， 当时说什么来着 ？

**吴涛** [6:12]
我好久我又不记得上一期说过什么 ， 怎么觉得 。

**Rio** [6:15]
对 ， 我也忘了说什么 。

**吴涛** [6:16]
我把我把 notes 写在那里 ，但是我一直想不起来是怎么一回事了 ，但就提到这么一个这个概念 ， 我想起当时说是一个什么近视开发嘛 ， 就是应该是叫做 ， 应该英文叫做 clean room 的方法 。

**Rio** [6:31]
干净的房子里面 。

**吴涛** [6:32]
当时我记得莫名其妙说成了这个 white room。

**Rio** [6:34]
Clean box，white room。

**吴涛** [6:36]
对 ， 后来想想应该是和那个 black box 混在一起 。

**Rio** [6:41]
对 ， 比较久 。anyway。

**吴涛** [6:44]
OK， 小口误 ， 无所谓 。 嗯哼 。 呃 ， 然后有几位热心听众给我们写来了来信 ， 然后嗯

， 择其中几段念一下吧 。 就呃 ， 首先要为一位不愿透露姓名的朋友道个歉 ， 就是有一次我们呃念了他的信 ， 虽然他写信强烈要求不要念 ，但我们还是念了 ， 然后某种意义上讲我们侵犯了叫什么著作权法是吧 ？

嗯 ，在这边给你道个歉 ， 非常对不起 。 不过我觉得还那封信写的还是蛮好的 ，不念真的挺可惜的 ， 这就是一个借口 。

**Rio** [7:25]
所以你去那个知乎上那个问题下面自己负荆请罪吧 。

**吴涛** [7:29]
嗯 ， 我已经我已经答了 ， 我觉得就是他问的啊 。

**Rio** [7:33]
OK， 好吧 。

**吴涛** [7:34]
Yeah。 OK， 然后呃 ， 上一期节目之后有一位读者写信来说这期节目还是老样子 ， 软就软吧 ， 刚刚说到一点让我心动的内容就戛然而止了 。

看来中老年程序员是得认真关注一下自己的前列腺问题了 。 这内容便是吴涛说的 ， 中老年程序员工作了五六年是所处的境地 ， 我个人就处在这样一个境遇里 ， 积累不好 ， 很难有突破 ， 又不想转管理 ，不上不下 。Rio 又说要可能要告别专业程序员了 ， 更是让我内心难以平静 。

这样的桑苏都觉得自己距离大牛太遥远 ，是自取其辱 。 我等鼠辈还怎么苟活下去 。 祝两位一切顺利 ， 吴涛有个好假期 。

**Rio** [8:22]
桑苏是谁 ？

**吴涛** [8:23]
啊 ， 桑苏是

， 我想想 ， 如果没理解错的话 ， 指的是非常有成就的人物 。

**Rio** [8:31]
啊 ？

**吴涛** [8:31]
就是 。

**Rio** [8:33]
这是说我们吗 ？

**吴涛** [8:35]
嗯 ， 说你 ， 确切的说 。

**Rio** [8:37]
天呐 。

**吴涛** [8:38]
桑苏 。

**Rio** [8:39]
这是什么语言先 ？ 好想好想知道 。

**吴涛** [8:42]
不知道啊 ， 这难道是 ， 这难道是什么这个 。

**Rio** [8:45]
日语 ？

**吴涛** [8:45]
古古文里的梗吗 ？

**Rio** [8:48]
又又凸显我们暴露自己没有文化 ， 怎么办 ？

**吴涛** [8:54]
不知道 。

**Rio** [8:55]
Anyway。

**吴涛** [8:56]
没有了 ，不重要了 。

**Rio** [8:57]
反正这个我觉得就哎 ， 对自己的资质有一个正确的认识吧 ， 我觉得 。 但是呢 ， 我觉得这个世界也不一定非要就大牛才才需要那个嘛 ，不然正常人的生活该怎么过呀 ？

**吴涛** [9:11]
这就好像那本叫什么 Rework 讲那个 startup 的书 ， 或者有网就在讲什么讲工作方法的书里面提到说 ， 你不一定要成为一个呃了不起的企业才算成功 ， 如果你能成立一个小的能够自己维持下去并且活得很好的小公司 ， 同样是一种成功 。

嗯 ？ 对吧 ？

**Rio** [9:34]
对 ， 这刚好刚好前面有一个 ， 就前几天那个 Backblaze 的博客发了篇文章嘛 ， 叫做好像 Don't build a billion billion dollar company 还是什么来着 。Backblaze 就是现在我在用的一个备份软件 ， 之前经常在给他们打广告 ， 就是他的那个客户端写的非常不错 ， 然后也很便宜那个 。他就说其实因为现在很多这个风投模式 ， 就是说你一定要成为一个就是 the next big thing 对吧 ？

**吴涛** [10:03]
你一定要成为 Unicorn。

**Rio** [10:05]
对对 ，不然就没有意思了 。 当然从风险投资的角度来说确实是这样子的 ，但是你可以考虑开一个叫做叫 lifestyle business， 就是不一定要拿风投的钱 ， 然后只要能够营收平衡 ， 做一个简简单单的这个生意 ，其实也是可以的 ， 作为一个职业或者人生的选择吧 。

就不是一定要奔着那个什么市值 10 亿 、100 亿 、1,000 亿美元的公司去这种情况 。

**吴涛** [10:35]
是话是这样说吧 ， 就是我们当然永远可以说在这个世俗的呃衡量成功的观念里面 ， 你只有做到最大最强才是最成功的 ，但同与此同时 ，其实你做一个能够自谋其利的这个 。

**Rio** [10:53]
自自食其力 。

**吴涛** [10:54]
自食其利的自谋职业好像也不错 。

**Rio** [10:57]
对对对 。

**吴涛** [10:58]
但是我觉得在程序员这个群体里面 ， 可能呃 ， 就因为普遍来说都不会太笨 ，因为智商是个做写程序的门槛对吧 ？

那可能在聪明人里面会更有这样一种追求 ， 追求去去试着要追寻让自己的事业变得最了不起 ， 或者是啊非大公司不进 ， 或者是非大的这种点子不去想的一种倾向 ， 这种倾向是切实存在的我觉得 。

**Rio** [11:35]
据说这是雄性荷尔蒙分泌过剩的结果 。

**吴涛** [11:40]
呃 ，也就是说如如如果我们找一个因为某种原因失去了这个激素分泌器官的程序员 ，他就不会有这样的倾向是吧 ？

**Rio** [11:54]
这很难说 ， 这只是一个说法 ， 我觉得也很难去去去证明它了 。 但是我觉得就好像不是所有的成功都是一定要什么所谓出人头地 ， 你能有一份安稳的生活 ， 开心的工作 ， 然后这个叫什么 work life balance， 就生活工作平衡都都很好 ，其实我觉得也是一种选择 ， 就不一定真的要像那个说的一样要成为在某一个领域 ， 或者是在某一个人生阶段令令人望其项背的大牛 ，其实这

也不是大多数人的选择吧 ， 我觉得 。

**吴涛** [12:26]
嗯 ， 呃 ， 我觉得可能成为大牛更多的是凭借天赋 ， 就 。

**Rio** [12:33]
以及努力 。

**吴涛** [12:34]
如果如果你真的能够成为大牛的话 ， 你就不会去费力想要成为大牛了 。 而如果你不能成为大牛的话 ， 那你不如就接受自己的命运 ， 那有什么办法呢 ？

就好像颜值一样 ， 颜值就是没有别人高 ， 你又能有什么办法呢 ？

而且这世界上这世界上有整容手术 ，但没有智商提高手术 。

**Rio** [12:56]
呃 ，不过也不一定 ， 据说有一些这个叫做呃呃一些药物可以提高智智商 ， 据说 。

**吴涛** [13:04]
是刺激脑细胞发展吗 ？ 还是 。

**Rio** [13:06]
The the the smart drug 这之类的东西 ，但我我不知道这个靠谱程度怎么样哈 ， 就代代考 。

**吴涛** [13:13]
OK， 节目录完了你告诉我哪里有麦 。

**Rio** [13:16]
那你就不用了吧 。

**吴涛** [13:18]
哈哈哈 。 所以 Rio 现在不仅仅是可能要告别专业程序员了 ，Rio 目前已经真的告别专业程序员了 ，Rio 迎来了他人生中的另一个新的阶段 。

那么你要不要谈一谈感想 ？

**Rio** [13:34]
哎 ， 我就想说每个行业都不容易 。 哈哈哈 。

**吴涛** [13:39]
就这么简单吗 ？ 没有别的吗 ？

**Rio** [13:41]
嗯 ， 没有了 ，因为也刚刚开始做嘛 ， 就是还是有一个我还有一个学习的过程 ， 我觉得 。

**吴涛** [13:47]
所以你现在的工作是完全不用写代码 ？

**Rio** [13:50]
其实也不是 ， 我还是希望说 ， 就我我现在是这么想的 ， 我觉得写程序这一点可以帮助我提升在其他领域的工作效率 ， 比如说别人要苦哈哈的做一点事 ， 我可以写一些小程序 ， 可以帮助我能够更好的完成我的工作 ， 这还挺开心的其实 。

**吴涛** [14:08]
那你会觉得自己之前过去这十年， 有十年吧 ， 你接受到了编程专业的科班的编程教育 ， 对你接下来的工作有什么影响吗 ？

**Rio** [14:20]
嗯 ， 还蛮蛮有影响的 ， 起码可以和程序员聊得来 。 哈哈哈 。

**吴涛** [14:25]
OK， 这是一个比较大的 part， 就是程序员在很多时候是不愿意跟不愿意写程序的人聊天的 ， 尤其是同性 。

**Rio** [14:34]
对 ，因为思维方式不一样嘛 ， 聊不到一块去 。 所以至少我觉得以我以我现在的这个知识储备和这个套词的能力 ， 应该还能啊 ，在别人没有发现我这个是个彻底的门外汉之前 ， 能够今天撑一会 。

**吴涛** [14:52]
你怎么可能是彻底门外汉呢 ？ 你在主持这样一档节目 ， 然后说自己是一个彻底门外汉 ， 你不怕你不怕这个听众的要求吗 ？

**Rio** [15:00]
刷一耳机就不听了是吧 ？

**吴涛** [15:02]
对啊 。

**Rio** [15:03]
好吧 。

**吴涛** [15:04]
哎 ，anyway， 好吧 ， 那接下来念下一封信 。 嗯哼 。 呃 ， 如果有幸被念求不念出名字和邮箱地址 ， 多谢 。

吴涛和 Rio 你们好 ， 终于有机会提起电脑写一些反馈 。 之前许多次听节目有感 ， 甚至做了笔记准备回复 ， 无奈下一次播出的时候才想起来未还未曾写成 。

**Rio** [15:24]
这也是拖延症 。

**吴涛** [15:26]
哈哈哈 。 听了这一次程序员之路 。

**Rio** [15:29]
治病得治 。

**吴涛** [15:31]
别这样了 ，不要再逼人家了 。

**Rio** [15:33]
好吧 ， 开玩笑 。

**吴涛** [15:34]
听了这一次程序员之路很有感慨 。 我的情况可能跟 Rio 有点相似 ， 本科修外语和金融 ， 无奈真的放不下对计算机的热爱 ， 曾经自学 Java， 尝试过科技媒体 ， 终觉不够深入 ， 于是决定考研 CS。

呃 ，也考虑过把计算机当做兴趣爱好 ，但实在是放不下， 加上头脑发热选的专业不尽如人意 ， 语言就不用讲了 ， 我学的还可能是最令人最令人民讨厌的语言 。

嗯 ， 什么语言最让最令人民讨厌 ？

**Rio** [16:07]
日语咯 ， 那就是是不是最令人民讨厌的语言 ？

**吴涛** [16:13]
阿拉伯语吧 。

**Rio** [16:15]
为什么会人会令人民讨厌呢 ？

**吴涛** [16:18]
最令人民讨厌的语言 。 嗯 ，不知道 。

**Rio** [16:21]
好气 。

**吴涛** [16:23]
印地语 。

**Rio** [16:25]
你看两个还跟你拼命 。

**吴涛** [16:27]
哈哈哈 ，sorry。Anyway， 金融越觉得呃 ， 金融越学越觉得这玩意也好意思叫科学 ，不知道 Rio 放弃商科有没有类似的原因 。

右击翻转二叉树 ，是说交换二叉树所有子树的左右节点 ， 这是一道很简单的题 ，在考验题里也算常规题 ，但就像吴涛说的 ， 会墨写快排又对开发有什么用呢 ？

针对 Rio 说的商科只教计算器 ， 我们金融有一门课 ， 全程教用 Excel 模拟交易组合模型 ， 期末考试是用 Excel 模拟期权组合 ， 可能情况也在变吧 ，但是这里也可以问一句 ， 这又能有什么用呢 ？

特别是在有现成工具的情况下 。 我想这两个问题的答案可能只是简单的帮助理解 ， 会不会会不用参考的墨写一段程度 ， 呃 ， 会不用参考的墨写一定程度上代表着透彻的理解吧 ， 特别是对于初学者来说 。

只是这个需要透彻理解的原理和只需要记住如何使用工具和参考的界限 ，是随着时代领域乃至于工具的获取成本而不断变化的 。

毕竟没有人不允许你只用乘法啊 ，不用用乘法只用加法的不是 。

这句话什么意思 ？

**Rio** [17:43]
就是乘法加法 。

**吴涛** [17:46]
毕竟没有人不允许你用乘法只用加法的不是 。

**Rio** [17:50]
就乘法可以用加法来实现嘛 。

**吴涛** [17:52]
是的是的 。 最后不管 Rio 如何选择未来的路 ， 祝好 。 吴涛听起来生活很舒服 ， 同样祝生活有趣 ， 希望贵节目生生不息 。

这个这个这个是暗示我们要换主持人了是吧 ？

**Rio** [18:06]
哈哈哈

。 呃 ， 这个特别有意思啊 ， 就是我刚才我讲有一点 ，他他那个其实挺挺挺挺好的 ， 就说起码在初中上， 我认为说能够在黑板上墨写出来 ， 就就就基本可以等同于你是透彻的理解 ， 这个我觉得还是有一定的道理的吧 。

就是说有些事情如果你理解它的原理 ， 你是可以叫做推敲出来的嘛 ， 就是从一个嗯基本的原则推敲出来一些它要让你实现的功能 。

但是哎 ， 怎么说呢 ，也不是所有人都能真的有这个能力 ， 我觉得 。

**吴涛** [18:46]
说的也是 ， 就其实我觉得呃 ， 先不说前面那个用用什么墨写快排之类的 ， 就是你在写一段程序的时候 ， 如果一个函数呃 ， 你记住的函数的

用途以及函数的签名越多 ， 你写程序的时候被打断的概率就越小 。

**Rio** [19:10]
呃 ， 这句话我要再念再说一遍 。

**吴涛** [19:11]
就是你你的你 ， 如果你在写程序的时候不停要去查一个函数的用法以及这个函数的签名的话 ， 那你流畅写程序的过程就会被打断 ， 对吧 ？

**Rio** [19:24]
这不就是 IDE 大放光彩的时候吗 ？

**吴涛** [19:27]
呃 。

**Rio** [19:29]
Autocomplete。

**吴涛** [19:31]
但即便如此 ，

呃 ，IDE 我还真的没有办法反驳 。

**Rio** [19:41]
哈哈哈 ， 尽无言以对 。

**吴涛** [19:43]
对 ， 我尽人无言以对 ，但是可能是因为目前的状况 ， 就是我基本上不会用 IDE 来写需要写的东西 ， 所以会有这样的感觉 ， 就是如果我可以减少去看呃文档的次数的话 ， 我写程序的效率会变快 。

**Rio** [20:01]
对 ，其实就是说这里就是两个层次的一个一个用法吧 ， 像我们这种苦行僧 ，他就说记住这个函数 ， 下次你写的时候就不会忘记它了 ， 对吧 ？

但也有说那个像 object c 里面的那个函数名那么长 ， 我就算记住了 ， 我我我光打字也要很久啊 ， 这个时候 autocomplete 还是挺有用的 。

**吴涛** [20:22]
对 ， 当然这个问题如果深究下去的话 ， 还是会和语言和呃具体所使用的环境 ，以及你开发的程序的复杂程度相是是无疑是有关系的 ， 就好像建宗和弃宗的差别 ， 对吧 ？

就我们可能会觉得呃 ，因为是做后端或者是做一些不需要特别复杂的东西的 ， 呃 ，不不需要 ，不会不需要使用特别啰嗦的语言的时候 ， 你会觉得记一些函数 ， 常用的函数以及它们的用法其实是很自然的事情 。

但是如果你处理的东西的复杂程度真的摆在那了 ， 然后你又不可能脱离 IDE 的话 ， 那可能不去记也是也是一个理性的选择吧 。

**Rio** [21:10]
嗯 ， 对 ， 下一条 。

**吴涛** [21:12]
一位叫做 Jerry Lin 的朋友说 ， 呃 ， 提到高能物理 ， 我就默认是高能实验物理 。 实验高能物理 ， 我们什么时候提到过高能物理 ？

**Rio** [21:23]
嗯 ， 我也忘了 ，有点有点年份了 。

**吴涛** [21:26]
对 ， 真是过了一个月怎么就

呃忘了这么多了 。 然后他提到了 CERN， 就是欧洲原子能中心 CERN， 呃 ，CERN 肯定都很熟悉 ， 毕竟是在欧洲 ，而且同时又是呃 WWW 的发源地 。

呃 ， 括号 WWW 某种意义上说是为了解决高能物理的分布式计算而发明的 。 嗯 ， 这个倒是第一次听说 。

呃 ，CERN 有一个叫做 Root 的 CPP， 呃 ， 计算框架 ， 同时带有 Interactive 的环境 ， 类似于 iPython， 这个框架有各种数据处理和 plotting 的功能 ， 还蛮好的 ， 就是文档比较 shit， 呃 ， 配合他们最近的数据开放项目还是蛮有趣的 。

呃 ， 我还真的不知道 WWW 是为了解决高能物理的分布式计算而发明的 。

**Rio** [22:22]
就我就记得是写论文 ，他们要引用东西嘛 ， 然后这个呃 ， 等一下 ，他说是 WWW 不是 HTML 是吧 ？

**吴涛** [22:30]
可是 WWW 不就的基本要素不就是一个 Web 服务器吗 ？ 就我去我去过 CERN， 我去过 CERN 参观 ， 然后我还见到了那一台电脑 ， 然后我还去去了那个呃 ，Timberley 的那个他开发出 Web 的那个实验室是在地下， 很难想象是在地下的一个实验室里面 。

**Rio** [22:54]
OK。

**吴涛** [22:54]
啊 ， 然后我印象里面它只是为了把 hypertext 呈现给大家以便翻阅 ，而研发出在 SGML 的基础上开发出了 HTML， 然后把它做成了一个呃 Web 服务器 ， 这样所有人都所有其他人都可以去访问它的页面 ， 大概这个样子 。

**Rio** [23:19]
嗯 ， 你这么一问我也卡住了 ， 这个追根溯源到底是为了啥 ？ 哈哈哈 。

**吴涛** [23:25]
嗯 ， 总之这个划时代的东西 ， 歪打正着的就在 CERN 的一台呃 Next 电脑上被研发出来了 。 嗯哼 ， 然后 CERN 现在有这样一个叫做 Root 的 CPP 计算框架 。

嗯哼 ， 嗯 ， 可以去研究一下 ，不过 CPP 你有你有兴趣吗 ？

**Rio** [23:44]
Nope。 哈哈哈 。

**吴涛** [23:45]
OK， 所以这一封来信的我们的反馈就是 good no。

**Rio** [23:51]
不是 。

**吴涛** [23:52]
呵呵 。

**Rio** [23:53]
哈哈哈 。

**吴涛** [23:55]
呵呵太有贬义了 ， 我觉得 。

**Rio** [23:57]
没有吧 ， 呵呵是中性的 。

**吴涛** [23:59]
你确定吗 ？ 为什么我总觉得 。

**Rio** [24:03]
好吧 ， 那可能我理解不太对 。

**吴涛** [24:05]
我总觉得呵呵的语义是呃 ， 哦 ， 嗯 ， 我知道了 ，但是就所以呢 ，也没有什么兴趣 ， 所以就呵呵了 。

**Rio** [24:17]
所以它是中性的 ， 没错啊 。

**吴涛** [24:20]
而且呵呵更多的时候被使用的场合是呃 ， 你这种想法真蠢 ， 我懒得跟你辩论 。

**Rio** [24:29]
哈哈哈 。

**吴涛** [24:31]
比如说什么对方说 PHP 是最好的语言 ， 然后你说呵呵 。

**Rio** [24:35]
哈哈哈 。

**吴涛** [24:36]
You know， 就那种不屑的感觉 。

**Rio** [24:39]
哈哈哈 ， 好吧 ， 懂了 。

**吴涛** [24:42]
对 ，OK。

**Rio** [24:43]
那就我们不呵呵 。 嗯 ， 谢谢 。

**吴涛** [24:45]
谢谢 。

**Rio** [24:46]
Good， 那个是 good to know 嘛 ， 就是谢谢咯 。

**吴涛** [24:49]
嗯哼 。

**Rio** [24:50]
因为其实 plotting 这个事情其实还要讲一下， 我觉得 ，因为之前我上学的时候还经常用那个叫什么 ？New Plot。

**吴涛** [25:00]
啊 ，OK。

**Rio** [25:00]
然后通过那个那个就自己写个 Python， 自己输出那个点嘛 ， 然后去用 Good Plot 去东西画 ，但是画出来的那个真是惨不忍睹 。

**吴涛** [25:13]
可是你都在用 Python 了 ， 为什么不用那个叫什么 Math Plotting，Math Plotly 还是叫什么那种那个 ？

**Rio** [25:22]
我忘了是为什么 ，因为当时好像那个在那个 Linux 上面有吗 ？

**吴涛** [25:29]
有啊 ， 这是一个跨平台的库 。

**Rio** [25:31]
OK， 那可能当时比较幼稚 ， 就就只知道用那个 Good Plot。

**吴涛** [25:37]
OK。

**Rio** [25:37]
然后用的还用过那个 ， 还考虑过用过那个呃呃呃 Metapost 来来做 plotting， 我也是蛋碎了 。

**吴涛** [25:47]
Metapost 好古老啊 ， 我已经有三年没有听到过这个名字了至少 。

**Rio** [25:52]
因为这些已经淘汰 ， 基本上没有什么人在用了嘛 ， 所以哪怕是在 Latec 这个社区 ， 大家也转用那个什么 pijf、tikz 去画图了 ， 所以 Metapost 这种比较落后的东西就让它过去吧 。

**吴涛** [26:07]
随风而去吧 。

**Rio** [26:09]
嗯哼 。

### 新闻联播

**吴涛** [26:10]
OK， 呃 ， 然后是新闻环节 。

**Rio** [26:14]
本期的新闻环节 。 这个时候应该插入那个新闻联播的音效 。

**吴涛** [26:17]
这些都有 。

**Rio** [26:19]
嘣嘣嘣 ， 嘣嘣嘣 。 哎 ， 我好久没看电视了 ， 那个音效改了吧 ？

**吴涛** [26:25]
我好怀念这个音效 ， 我已经好多年没听过了 。

**Rio** [26:29]
对对 。

**吴涛** [26:31]
呃 ， 观众朋友们 ， 我们本期播报第一则新闻是看看别人家的小孩 。 其实这些都不是新闻了 ， 这些新闻都已经过去了 。

**Rio** [26:38]
上个月的事 。

**吴涛** [26:40]
三三到五周了至少 ， 然后感兴趣的朋友们其实都已经都已经都已经听过了 ， 所以我们就算是最近发生的要闻的评论吧 。

**Rio** [26:50]
嗯哼 ， 好 ， 今年第一则新闻是今年 10 岁的 Ryan 是 Doom 和 Quake 的主程序员 ，Oculus Rift CTO John Carmack 的儿子 。 好 ， 上次节目我们说到了那个 John Carmack 准备在他那个 Oculus VR 的开发环境里面使用 Scheme 作为脚本语言 。

**吴涛** [27:09]
嗯哼 。

**Rio** [27:10]
然后作为一个 eacher on dogfoot 的实践家 ，他让自己的 10 岁的儿子开始学这个 Scheme， 然后用在这个 Rakei 这个开发环境里面写了一款游戏 ， 叫做 Mr.BarB dot Q and Angry Face。

**吴涛** [27:31]
呃 ，不 ， 应该是是他这款游戏叫做 Fly， 然后这个 Fly 的主角一看就没玩嘛 ， 你这这 。

**Rio** [27:40]
我玩了 ， 我玩了 ， 我还没过呢 。

**吴涛** [27:44]
就是他那个这个主角就是里面那个飞行的小人叫做 Mr.Barbecue。

**Rio** [27:50]
嗯 ， 听出来了哈 。

**吴涛** [27:51]
然后 Barbecue， 呃 ， 然后他其实这个游戏就是可能那个对烧烤哥 ， 就是你控制烧烤先生在云里面飞 ， 如果撞到好像逻辑是撞到云就死是吧 ？

**Rio** [28:04]
反正撞到或掉下去都是死了 。

**吴涛** [28:06]
对 ，其实就是一个 Flappy Bird 的 copy，但是无论如何让人惊讶的是 ， 这是一个小孩写出来的 。

**Rio** [28:13]
10 岁的小朋友写的 。

**吴涛** [28:14]
对 ， 一个 10 岁的小朋友写出来的 Flappy Bird。 我我一生中都没有写过一个 Flappy Bird。You know，而且 。

**Rio** [28:23]
你这人生太不完整了 ， 你就写一个吧 。

**吴涛** [28:26]
哈哈哈 。

**Rio** [28:28]
不 ， 真的 ， 那个我感觉这个 Flappy Bird 这个游戏就好像呃 ， 你做游戏的话就好像它的一个 Hello World 一样 。

**吴涛** [28:37]
做游戏的 Hello World 不应该是摩托车方块吗 ？ 你没有学过摩托车方块吗 ？

**Rio** [28:41]
呃呃 ， 好吧 ， 做手游的 Hello World。

**吴涛** [28:45]
嗯 ， 好吧 。

**Rio** [28:46]
哈哈哈 ， 宁可无言以对 。

**吴涛** [28:50]
哈哈哈 。

**Rio** [28:50]
贪食蛇呀 ， 贪食蛇也比哦 Flappy Bird 应该比贪食蛇简单一些 。

**吴涛** [28:55]
嗯 。

**Rio** [28:56]
也难说 。

**吴涛** [28:57]
难说 ， 差不多吧 。

**Rio** [28:58]
我觉得我还是觉得贪食蛇更简单一些 ，因为现在贪食蛇如果你做一个静态场景 。

**吴涛** [29:04]
图形那块会简单一些吧 。

**Rio** [29:06]
逻辑也简单呀 ， 贪食蛇有什么逻辑啊 ？ 贪食蛇基本上就是贪食蛇不用考虑场景生成的问题 ， 只需要随机生成一个苹果就可以了 。

**吴涛** [29:16]
好吧 。

**Rio** [29:18]
但不过不过 ， 所以不管怎么说 ， 这个 10 岁的小孩写出一个 Flappy Bird 的 copy 也是非常非常了不起的 。

**吴涛** [29:25]
对 。

**Rio** [29:25]
它用那开发开发环境也挺有意思的 。Rakei 你用过吗 ？

**吴涛** [29:28]
用过呀 ， 就没记错 ， 类是类 Scheme 类 Lisp 嘛 ，不是嘛 ？

**Rio** [29:34]
呃 ，Rakei 是 Scheme 的一个实现 ， 对 ， 它叫 r6 什么 s 几我忘了 ， 还有一个版本号挺奇怪的 。

**吴涛** [29:44]
OK。

**Rio** [29:45]
对 ， 我就是只是指的那个 reference 的版本号 ， 然后他把那个 reference。

**吴涛** [29:49]
对对对 ， 就 Rakei 是用它一个具体的实现 ， 然后现在它有一个叫做 Doctor Rakei 这么一个一套套件吧 ， 里面包含了各种工具 。

它那个比较方便 ， 就是可以直接生成一个跨平台的应用 ， 就是可以生成这个啊 ，Linux 和 Windows 和 Mac 都可以运行的这个 Binary。

**Rio** [30:07]
哎 ， 为什么他这个呃 Ryan 没有把 Linux 平台的包释出来 ？ 他之前只放出了 Mac 和 Windows 版本 。

**吴涛** [30:18]
好问题 ， 我也不知道 ， 可他不用吧 。

**Rio** [30:22]
对 ， 然后他写的这个 Flappy Bird 的呃 ，他写的这个 Fly 的游戏里面有三种模式 ， 一种是 Granny 模式 ， 就是非常非常慢 ， 然后是 。

**吴涛** [30:33]
然后好像是 。

**Rio** [30:34]
脑 ， 呃 ， 老奶奶模式 ， 好困难 。

**吴涛** [30:40]
祖母模式 ， 然后是正常模式啊 ， 还有一个专家模式 ， 好像还有一个叫什么 Hypersonic 模式 ，Hyper Mode， 就是那个 Mode 里面基本上如果你选择以那个 Mode 开始游戏的话 ， 呃 ， 一开场你就会死 。

**Rio** [30:54]
那个中翻译成中文叫做是男人就坚持 10 秒模式 。

**吴涛** [30:59]
哦 ，OK， 我可能 0.5 秒都坚持不了 。

**Rio** [31:02]
哈哈哈 。

**吴涛** [31:03]
因为一上来你只有两个选择 ， 按空格键或者不按空格键 ，不按空格键的话就会撞到下方的云 ， 按空格键的话就会撞到上方的云 ， 所以 。

**Rio** [31:11]
OK，you know。 所以所以你对这事情怎么看 ， 这个小朋友 ？

**吴涛** [31:17]
呃 ， 前浪死在沙滩上 。

**Rio** [31:21]
已经死了是吧 ？

**吴涛** [31:23]
就我也不知道 ， 这可是 10 岁写游戏是非常了不起的事情吗 ？

**Rio** [31:32]
我不知道 ，但是他的这个就是我们先不说这个品 ， 就是这个这个效果怎么样 ，但是我觉得完成度和这个流程还是挺挺让我吃惊的 。

因为你看到他他有个介绍 ，他说他怎么会写这么一个游戏 ，他让他弟弟还是哥哥帮他做什么配乐啊 ， 那些乱七八糟的 。

**吴涛** [31:50]
OK，他们有个 team 是那个那个 Angry Face， 就是他他之前的另外一款游戏里面的那个 Angry Face 的这个小笑脸 ， 就或者说怒脸是他妈给他画的 ， 然后他他用他用 Gimp 把那个笑脸抠出来 ， 我觉得这个很了不起 。

**Rio** [32:11]
而且他而且他还学这这个做这个游戏中学会了用那个 Blender 做 3D 模型 。

**吴涛** [32:18]
哦 。

**Rio** [32:18]
还学会用那个还用那个 Audacity， 就是我们你也用那个来编辑音频吧 。

**吴涛** [32:23]
对 ， 我此刻正用 Audacity 来录音 。

**Rio** [32:25]
对 ， 游戏的那个声音真是太强了 ， 这是 10 岁的小孩啊 。

**吴涛** [32:32]
这个是这个的确是应该承认的确很强 。

**Rio** [32:35]
所以那个什么基因好还是不一样是吧 ？

**吴涛** [32:39]
对 ，有家父熏陶啊 。

**Rio** [32:41]
关键是这个小孩长得逆天的可爱啊 。

**吴涛** [32:44]
哦 ， 这倒是 ， 就是打开打开主页的话 ， 颜值真的是逼人的 。

**Rio** [32:50]
爆表简直 。

**吴涛** [32:51]
嗯 。

**Rio** [32:51]
他的那个网址我一直没想明白是什么意思 ， 它的网址是 ek31， 就是数字 1 啊 ， 字母 k， 数字 3， 字母 c 点 com， 我不知道什么意思 ，1,003c？

**吴涛** [33:03]
因为四个字母和数字组合的网址是非常非常难找的 ， 我有点怀疑这个网址其实没有 。

**Rio** [33:10]
对啊 ， 四个字母还是蛮常见的啊 。

**吴涛** [33:13]
不 ， 已经卖光了 ， 就现在你去注册 。

**Rio** [33:16]
三个的三个的卖光了 ， 我觉得四个应该还有吧 。

**吴涛** [33:20]
你确定吗 ？ek3c。

**Rio** [33:24]
哦 ， 它是 .com，OK， 啊 ，maybe。

**吴涛** [33:26]
对啊 。

**Rio** [33:26]
有可能 ，因为我我有一个三个字母的 .net，.net 好像不太值钱吧 。

**吴涛** [33:30]
哈哈 ， 对 。

**Rio** [33:32]
Anyway， 嗯 ， 好啦 ， 这就是

这个什么大人口中别人家闪闪牛逼的闪闪发光 ， 让你呃无限自卑的小孩啊 ， 到此结束 。

**吴涛** [33:45]
不过他爹毕竟是做游戏的 ， 然后 。

**Rio** [33:48]
不不不 ， 这个这个描述太太那个了吧 。他爹毕竟是一个做游戏的始笔祖 ， 所以他在这个 About Me 的界面里面也写到了他特别喜欢玩 Dung， 呃 ，Dragon Dungeon， 然后还列出了自己的阵营 。You know， 就你会觉得我靠 ， 一个 10 岁的小孩已经开始研究阵营之类的 。

不过也难说 ， 我相信 70 年代的时候 ，DND 作为纸游 ， 就桌面纸游最流行的时候 ，也许 。

**吴涛** [34:23]
那时候的小孩也是这样的 ， 就还会自己做树树脂卡呀 ， 自己去算那些莫名其妙的 。

**Rio** [34:30]
就好像我小时候玩那个什么黑白棋 ， 五子棋之类的那种常态 。

**吴涛** [34:35]
豁免检定啊之类的 ，而且他还列出一大堆自己喜欢玩的游戏 ，其中包括 Minecraft， 呃 ，Monster Hunter， 呃 ，Destiny， 还有 Summoners War。 可是我有点奇怪 ， 就是呃 ，Destiny 难道不是一个至少是 Team 的游戏吧 ？

就他他没有到那个年龄啊 ，他这样赤裸裸的列出来 ， 那如果有人去告他爹说你你让这个小孩玩不符合他年龄的游戏 ， 那怎么办 ？

**Rio** [35:05]
游戏有分级吗 ？

**吴涛** [35:07]
有啊 ， 我靠 ， 天呐 ，Rio， 你之前是生活在一块石头下面吗 ？

**Rio** [35:14]
哈哈哈

， 我生活在一块石头上面 。

**吴涛** [35:19]
我天呐 ，OK。 嗯 ，不管怎么说 ， 刚才就是别人家小孩的故事 。

**Rio** [35:27]
嗯哼 。 下一则新闻是特别搞笑的 ， 就是上周上一次节目我们提到那个 Homebrew 的作者叫做 Max Howell 去谷歌面试 ，由于未能在白板上手工完成翻转二叉树的算法 ， 被谷歌拒了 。

**吴涛** [35:44]
对 ， 我相信谷歌招他的人一定觉得 What the fuck， 然后他自己也说 What the fuck。

**Rio** [35:49]
哈哈 ， 然后他就去了苹果 。

**吴涛** [35:53]
对 ，他恶狠狠的说了一句此处不留爷 ， 自有留爷处 ， 然后就去了苹果 。

**Rio** [35:58]
他在 Twitter 上发了一个图 ， 呃 ， 背景是那个苹果的总部 ， 叫做那个 What Apple Campus at One Infinite Loop， 然后写了两个字 First Day， 然后贴了个自己的半半个脸 ， 然后我也不知道什么意思 ， 反正我觉得这个事情还挺有意思的 ， 给大家分享一下 。

所以你猜他最近要做什么 ？

**吴涛** [36:21]
不知道 ， 搬家吧 ，因为 you know，他在回复别人的那个问题的时候说你最近怎么样啊 ？ 不是是你是通勤啊还是搬过去了呀 ？

然后他回说呃 ，Had to move， 所以应该是忙着搬家吧 。

**Rio** [36:37]
所以他肯定是入职了搬过去了嘛 ， 然后我在想他去难道再写一个苹果的就是 The Official uh Package Manager for OS10。

**吴涛** [36:49]
那不是 App Store？

**Rio** [36:50]
呃 ，yeah，也有可能 ，不知道 。

**吴涛** [36:53]
问题是我觉得就是这样一个人， 你把他拉到苹果去 ，他你即便让他继续在那做呃 ， 叫什么 Third Level Support， 就是为程序员解决程序员的需求 ，也已经非常有有意义了 ，不是吗 ？

就是你哪怕只在苹果内部 ， 让他为苹果内部的程序员服务 ， 已经就他不需要去开发什么面向于最终用户的产品 。

**Rio** [37:18]
嗯哼 ， 没错 。 嗯 ， 好吧 ， 这个小新闻也就到此为止 ， 还有一个最后一则小新闻是 React Native for Android 最近发布了 ， 然后有一个呃跨时代的理想可能终于要实现了 ， 就是在同一台电脑上编改写一套 JS 的代码 ， 然后同时在 iPhone 和安卓上渲染出两个原生的界面 ， 这个还是蛮酷的 。

**吴涛** [37:47]
一次编写到处运行 ， 为什么感觉像 Java？

**Rio** [37:51]
Script， 哈哈哈 ，Java 和 JavaScript 最终殊途同归了 。 呃 ，他们之前不是问 Java 和 JavaScript 的区别是什么吗 ？

**吴涛** [38:03]
就像雷锋和雷锋塔的区别 。

**Rio** [38:05]
其实我觉得没有那么远 。

**吴涛** [38:07]
呃 ， 怎么说呢 ， 我觉得这 Java 当初搞 Swing 和另一套叫什么 ？

**Rio** [38:15]
嗯 ， 那个 JavaFX 还是什么 ？

**吴涛** [38:19]
哎 ， 之类的吧 。 对 ，其实也是想要跨平台啊 ，但

最终历史的选择是

有限度的接受他们 ，但是很大程度上还是抛弃他们 。

**Rio** [38:35]
对 ， 现在那个 React Native 这套方法其实在我看来好像

不好说 ， 你说它是 Write Once Run Everywhere， 好像也说得过去吧 ，不过他们自己的官方口号是 Learn Once Write Everywhere， 所以 hard to know。

**吴涛** [38:53]
对啊 ， 我相信这就是这个技术所解决的一个痛点 ，是开发人员的痛点 ，但并不是市场的痛点 。 每一个平台的用户都希望自己使用的 APP 是最快的 ，是最经过优化的 。

**Rio** [39:11]
对 。

**吴涛** [39:12]
嗯 ， 只有呃 ， 这个资金和时间不足的公司才会想要通过这种一次书写呃 ， 到处运行的方式来完成用户交互的部分 。

那 。

**Rio** [39:29]
不过我觉得他这个有一个好处哈 ， 就是说至少可以如果按一个经典的 MVC 的结构来讲 ，他至少可以实现 Model 和 Controller 可以用同一套 JS 代码来做 ， 然后 View 的话就是各平台用各自平台自己原生的那些接口了 。

**吴涛** [39:46]
嗯 。

**Rio** [39:47]
啊 ， 还好吧 ， 反正 。

**吴涛** [39:50]
OK， 就我也很难说 ， 就是我觉得我觉得内心里是抗拒这种东西的 ，但是如果跨平台的需求一直在那 ，也就是换换句话说 ， 如果 Android 和 Apple 阵营的这种互相竞争 ， 互相良性竞争的状况还能持续 ， 比如说 10 年， 那这一套东西还是大有所谓的 。

但是任何一方如果流露出了被打败的姿态 ， 那我觉得这种跨平台的技术也很快就要也很快就失去它的价值了 。

**Rio** [40:30]
所以说只能走着瞧 。

**吴涛** [40:33]
对 ，但但不管怎么说 ， 它的学习成本至少不是那么高 ， 所以学一学也没什么太大的问题就是 。

**Rio** [40:43]
OK， 好 ， 今天最后一则新闻是也是前两天才发生的事吧 。

**吴涛** [40:50]
对 。

**Rio** [40:50]
就美国有一个叫做 Achmed 的小男孩做了 。

**吴涛** [40:55]
Achmed， 听这个听这个名字就知道他是中东后裔 。

**Rio** [41:00]
对 ，他做了一个用那些什么各种零元零器件元器件做了一块表 ， 电子表 。

**吴涛** [41:11]
穷玩车富玩表 。

**Rio** [41:13]
哈哈哈 ， 放在这里忽然觉得好违和 。 然后他把这个表带到学校去玩 ， 然后被老师认为是一个炸弹 。

**吴涛** [41:24]
对 ， 被老师误认为是一个炸弹 ， 然后叫了警察 ， 然后他被在一个看守所里面待了一段时间好像 。

**Rio** [41:31]
对 ， 然后这个新闻就报道出来了 。 哦 ，他叫 Achmed 是他的名 ，他姓 Mohammad。

**吴涛** [41:40]
Ahmed Mohammad， 这是一个很典型的回教名字 。

**Rio** [41:44]
就是一 。

**吴涛** [41:45]
但是说的是 。

**Rio** [41:46]
伊斯兰就穆斯林的名字 ， 对 ， 非常典型的 。 然后这个事情在美国就引起了轩然大波啊 ， 各种各样的事 。

我我之前看到的最新消息是那个 Zuckerberg 已经给他说亲自邀请他说你可以来 Facebook， 然后说好像又最近又接受什么奥巴马总统的邀请又布拉布拉了 ， 反正这个是个挺搞笑的事 。

美国政治我们就不去评头论足了哈 ， 这个是我们 。

**吴涛** [42:13]
对 。

**Rio** [42:14]
啊 ，IPN 旗下最近开了一档节目选美的事情 。

**吴涛** [42:18]
对 。

**Rio** [42:18]
啊 ，但是而且这事情挺好玩的 ， 就如果这个这个事情在中国发生会怎么样 ？

**吴涛** [42:25]
你说好玩吗 ？ 我觉得其实是很让人哭笑 ， 让人让人想要苦笑的一件事情 。 就在这个星球上， 这种当然这这种说法非常左派啊 ， 我就就是就是这种这种族裔和血统带来的问题居然会影响到你再再去做这种呃 ， 完全跟政治活动无关的 hobby 行为的行为 ， 会居然会影响你做这件事情 。

就你因为你的肤色或者是你的姓名或者是你的长相 ， 会导致你在做某件特定事情的时候 ， 嗯哼 ， 呃 ，

就突然蒙受这种不白之冤 ， 我觉得还是挺挺让人悲伤的一件事情 。

**Rio** [43:17]
对 ， 这件事情其实我刚才我说这个事情 ， 你一听起来可能是阿拉伯人或者是穆斯林 ， 感觉离我们挺远的 ，其实这件事情离我们并不远 ，因为前段时间刚好有另外一个事发生了 ， 就是美国有一个我忘了是大学教授还是一个什么样的研究员 ， 一个很资深的一个人 ，他被这个 CIA 就中央情报局指控为是中国的间中国政府的间谍 ， 就在窃取帮中国政政府窃取美国的这个研究或者

机密研究机密吧 ， 后来证明他其实是无罪的 。 啊 ， 所以其实那 CIA 的指控无非很多时候也是基于这个呃 ， 种族和肤色 ，其实也有一点这个种族歧视的成分在里面 。

嗯 ， 就我不知道哈 ， 这件事情在中国发生会怎么样 。

**吴涛** [44:11]
我觉得中国没有这么敏感吧 ， 就其实并不是哎 ， 只是说你可能没有太留意到 ， 比如说我举个很简单的例子 ， 大家就你们听到这句话 ， 你自己在中国的人想一下， 你在晚上街头碰见一个黑人， 你会怎么样 ？

**Rio** [44:32]
呃 ， 我在晚上好吧 ， 如果我没出国的话 ， 一定会觉得有点恐怖 。 哈哈哈 ， 出了门会更加恐怖 。

**吴涛** [44:44]
出国还要看在哪吗 ？ 比如说如果是在巴黎的话 ， 那可能也会觉得 。

**Rio** [44:48]
在皇后区 ， 纽约的皇后区还是布鲁克林 。

**吴涛** [44:52]
这个太正常了吧 ， 就还是要跟你你得你你会就我们这种呃 ， 结合当前的场景来去做出 stereotype 的能力 ， 实际上是一种生存的本能 。

就如果我们在呃 ， 动物园的那个观鸟区看到一只老虎 ， 那肯定会吓到死 ，但是在老虎区看到老虎就会觉得是正常的 。

所以你你会觉得这个地方是危险的地方 ， 所以这个地方出现一个危险的人物 ， 那代表我会可能会产生危险 。

这是一这是一个很自然的反应 。

**Rio** [45:34]
所以你这是会不再为种族主义开脱了 ？ 哈哈哈 。

**吴涛** [45:39]
嗯

， 我只能说我理解种族 ， 就就我能理解种族主义为什么会存在 ，但是并不代表着我就赞同这种

呃 ， 根据肤色来划定其潜在可能性的方法 。 嗯哼 ， 这个我也说不好 ， 就其实就穆斯林这件事情来说 ， 德国目前开放大量难民呃 ， 涌入境内 ，其实里面也是以穆斯林为压倒性多数啊 ，但不能就因此会认为说这个会冲击到德国的呃 ， 宗教组成或者说影响治安之类的事情 。

这即便你有这样的恐慌 ， 这样的担忧 ，但是这种事情确实不一定会发生的 。 对 ， 我觉得这这这个这个跟我 。

**Rio** [46:37]
本节目扯得有点远 。 不过我刚才我说那个 Achmed 这个这个这个案子是影响挺另外一个事 ， 就说就是一般中国有两个含义啊 ， 一个是说这个一个有种族这个明显种族特征的一个小孩在做这么一件事 ， 你这就被认为是危险的事 ， 会认为会怎么样 。

另外一个就是说其实哪怕是一个就正常的中国小孩 ， 自己用那个电子元器件做了一块表 ， 被带到学校去 ， 大家会认为他是一个炸弹吗 ？

**吴涛** [47:05]
肯定不会 。

**Rio** [47:07]
我觉得其实会被在中国反而是会被鼓励的 ， 我觉得动手能力强啊 ， 什么什么的 ， 对吧 ？

**吴涛** [47:12]
会被打的吧 ， 你不写作业搞这些破玩意 。

**Rio** [47:15]
哈哈哈 ， 你这是什么样的童年 ？

**吴涛** [47:19]
哈哈哈 ， 你不是吗 ？ 我觉我觉得我小时候想要做一点跟考试无关的事情 ， 基本上都是会被说的 。

**Rio** [47:26]
不是啊 ， 我觉得我我感觉我小时候的学校还是挺 ， 就是至少父母也好 ， 老师也好 ， 还是挺鼓励这种呃 ， 发明创造啊 ， 动手能力的 。

虽然说在这个绩效考核上 ，他们并不是真的是这么想的 ，但是起码在新就在舆论上 ，他们还是会坚持这么说 。

所谓绩效考核就是期末考试了 。 哈哈哈 。

**吴涛** [47:50]
哈哈 ， 说的也是 。 我想想还有是有一次我小时候去航模组 ， 然后呃 ， 我是把飞机的尾巴粘到了还是什么 ， 反正粘一架什么飞机 。

**Rio** [48:02]
嗯 ？

**吴涛** [48:03]
B29 之类的一个飞机 ， 然后我把它尾翼给粘到了 ， 就是 。

**Rio** [48:08]
嗯哼 。

**吴涛** [48:08]
呃 ， 然后航模老师说了很长一段话 ， 说什么大意是你在这件事情上花费的时间太多了 ， 什么还是要好好去学习啊 ， 乱七八糟 。

**Rio** [48:20]
嗯哼 。

**吴涛** [48:20]
然后同样的事情在我上高中的时候又发生了一遍 。 我高中的时候在那个围棋社还是什么地方 ， 应该是围棋社 ， 跟老师下棋 ， 然后有一个嗯 ， 同学来找我去什么物理奥赛组还是什么 ， 然后我就说我下完棋再去 ， 然后那个下棋老师非常惊讶 ， 瞪着我说奥赛比较重要 ， 你怎么能摊摊着下棋不去不去参加奥赛玩呢 ， 赶紧去 。

就他是教围棋的老师啊 ，他都说出这样的话来 ， 我觉得 。

**Rio** [48:51]
所以他们在人们心目中还是下意识的给这个行当分了个三六九等哈 。

**吴涛** [48:57]
对 ， 然后其实人种也是 ， 就是或者说族裔也是 ， 就莫名其妙被分出了三六九等。

**Rio** [49:05]
哎 ，其实我们看来离真正的自由还挺远的 。

**吴涛** [49:09]
对 ， 左派还需要努力啊 ， 这事情 。

**Rio** [49:12]
哈哈哈 。

**吴涛** [49:14]
左棍上去努力 ， 右棍还是牢牢的把持着这个世界 。

**Rio** [49:19]
嗯哼 。

**吴涛** [49:20]
虽然我也是个右棍吧 。

**Rio** [49:23]
今天的那个我就不讨论我们的政治倾向了哈 ， 我们今天的新闻环节新闻联播到此结束吧 ， 科技新闻联播到此结束 。

**吴涛** [49:33]
科技社会新闻到此结束 。

**Rio** [49:35]
啊 ， 今天的正题是什么 ？

### 编译后门

**吴涛** [49:37]
嗯 ，其实今天的正题是我们没有正题 ， 就我觉得应该是时候把这个兔子从帽子里面揪出来了 ， 我们的 。

**Rio** [49:46]
这个这个这个这个我有个梗 ， 我有个梗 。

**吴涛** [49:49]
啊 ？

**Rio** [49:51]
Ghost in the Xcode。

**吴涛** [49:52]
啊 ，come on。 呃 ，不 ， 我刚才想说的是 ， 从本期节目开始 ， 我们不会再专门的找一个

呃 ， 编程领域里面的话题 。

**Rio** [50:07]
就不会刻意找 ，但是有的话也可以讲 。

**吴涛** [50:09]
来来来贯穿整个节目 ， 就我们之前找话题找的非常辛苦 ， 所以也造成了呃 ， 我们在录节目的时候每次都非常的

， 应该怎么说呢 ， 觉得投入和产出不成正比吧 。

**Rio** [50:25]
就是那个跟报以前那个报纸编辑不一样嘛 ， 一个选题会嘛 ， 对吧 ？

**吴涛** [50:31]
对 。

**Rio** [50:31]
就我们已经这个什么无狼才尽了 。

**吴涛** [50:35]
为什么是无狼才尽 ？

**Rio** [50:36]
嗯 ， 你是说套狼才尽 ？

**吴涛** [50:38]
所以你是你你是还没才尽是吧 ？

**Rio** [50:42]
没没没没没 ， 就我我是捧啊 ， 所以你你你是主啊 。

**吴涛** [50:46]
我记得我记得我听谁说有人在 IT 公论的 ， 好像是那次现场吧 ， 说呃 ，IT 公论是 Lawrence 的节目 ，Rio 只是一个捧哏的 。

**Rio** [50:58]
嗯哼 。

**吴涛** [50:58]
呃 ， 那我觉得 IT 公论不 ， 内核恐慌其实是 Rio 的节目 ， 然后我是一个捧哏 。

**Rio** [51:03]
反了反了反了 ，the reverse is true。

**吴涛** [51:06]
Come on。

**Rio** [51:08]
哎 ，不扯这个了 。

**吴涛** [51:10]
好吧 。

**Rio** [51:10]
啊 ，其实这个事当然大家呃 ， 今天我们哦 ， 上午录的那个 IT 公论已经大概讲过了哈 ， 就是那个 XcodeGhost 这个安全事故吧 。

**吴涛** [51:20]
嗯 。

**Rio** [51:20]
呃 ， 来龙去脉就不交代了 ， 大家呃 ， 听到这个词如果你不明白是什么 ， 估计也就没有必要再呃 ， 你可以去深究 ， 你可以去先看一下报道 ， 我们就接着往下讲了 。

**吴涛** [51:33]
对 。

**Rio** [51:34]
嗯 ， 简单来说就是 Xcode 有人下了一个什么啊 ， 这点就好 ， 我还是又讲了 。 简单说就是 Xcode 就因为苹果那个 CDN 不给力 ， 很多开发者顺手下了一个从什么迅雷下了一个 Xcode 回来 ， 然后发现编译出来的软件被搞了 ， 被装了后门 ， 究其原因是因为下的编译器有问题 ，Xcode 被搞过 。

**吴涛** [51:59]
对 。

**Rio** [52:00]
嗯 ， 所以这件事情我们先先纠一下吧 ， 你觉得苹果有问有责任吗 ？

**吴涛** [52:06]
呃 ， 我觉得从技术上来讲 ， 苹果关苹果屁事啊 ，但是从嗯 ， 从一个比较

metaphysical 的角度来讲 ， 苹果采用的这种模式导致了会有今天这个下场 。

**Rio** [52:27]
所以这个它的问题在哪里 ？

**吴涛** [52:29]
就是 centralized 呃 ， 就是这样一种独此一家的工具 。

**Rio** [52:37]
嗯 。

**吴涛** [52:38]
导致了这种情况的发生 ， 我觉得就是这种情况为什么会不会在其他的事世界里发生 ， 就是因为其他世界 ， 比如或者说为什么不会在比如说 C 世界里面发生 ，是因为 C 世界里面呃 ， 你有很多编译器可以选择 ，而且你也有很多下载点可以选择 。

**Rio** [52:58]
不对啊 ， 我觉得这个是这个问题 ， 就是说正确正确答案是不知道 ， 你不知道其他地方有没有类似的问题 ， 就他们好像就很多人说 ， 那你们下的这个安卓的开发环境会不会有这个问题 ， 没有人知道 。

**吴涛** [53:11]
哦 ， 安卓是另外一件事情 ， 就是呃 ， 安卓的情况其实要比苹果严重很多 ，因为安卓的比如说钓鱼平台 ， 呃 ，不是什么钓鱼平台 ， 支付平台是你强制你要去 ， 或者也不是强制 ， 就是呃 ，在安卓里面 ， 如果你把一个支付平台连入你的 APP 的话 ， 你是完全可以去读写说这个支付平台里面到底输入了什么信息的 。

**Rio** [53:36]
我去 。

**吴涛** [53:36]
但是对 ， 就是因为你你在安卓的上面别说画对话框了 ， 你只需要去 ， 你甚至都不需要去钓鱼去画一个假的对话框 ， 你可以直接去读那个跳出来的支付平台的那个对话框里面写了什么 。

**Rio** [53:50]
它没有那个进程分离吗 ？

**吴涛** [53:52]
它不 ， 你都把对方的支付平台的 SDK 集成到你的 APP 里面了 ， 你要去搞什么进程分离啊 。

**Rio** [53:59]
那这个是这个是那个是应用内部的问题 ， 那这个我觉得这个没有办法 ， 肯定是是是是这样子的 。

那如果你都不信这个没有问题啊 ，但我我我的问题就是说 ， 你怎么知道你用的这个安卓的编译器也好 ， 或者 C 的编译器也好 ， 没有被人搞过呢 ？

**吴涛** [54:17]
我没有办法知道自己的安卓的编译器 。

**Rio** [54:20]
所以我觉得这个这个事情苹果和其他厂商是一样 ， 就跟他的分发法 ， 跟他的分发法就是这个组织方式是没有关系的 。

**吴涛** [54:28]
我我的我的理解就是假如是在其他的 ， 比如说一个我们想象另外一种呃 ， 软件分发的方式 ， 就是嗯哼 ， 呃 ，在那个苹果这边 ，他只给出一个呃 ， 编辑器的 specific 编译器的 specification， 然后每个国家或者说每一个不同的厂商都可以写出自己的为 Xcode 不 sorry 为 iOS 开发程序的编辑器和编译器 ， 然后你可以任选其中一家来写出自己的程序来 。

就比如说现在在 Windows 上面 ， 你要给你要写一个 Windows 程序 ， 除了微软的 VirusView 可以用之外， 你还有很多一大堆其他东西可以用 。

呃 ，其实在 90 年代的时候这个状况是非常好的 ， 就是百家百家齐放等等 ， 叫什么来着 ， 百家称名 ， 对 ， 就是什么 Boland 呀 ， 什么 Code Warrior 啊 ， 什么嗯哼 ， 呃 ，Turbo C 啊之类的 ， 你可以用各种各样的编辑器和编辑器和编译器来书写一个平台上的呃应用 。

**Rio** [55:33]
没有啊 ， 我觉得你并没有解决这个问题 ， 你只是把这个问题的皮球踢给了另外一拨人， 就是说你说不会有一个编译器出了问题所有人都中招 ，而是说因为有 10 个编译器可能只有 3 个有问题 。

**吴涛** [55:48]
这不已经是很好的了吗 ？

**Rio** [55:49]
不是 ，但我觉得这并不是从根本上解决这个问题啊 ， 所以我我觉得 。

**吴涛** [55:53]
这个问题是没有办法从根本上被解决的呀 。

**Rio** [55:55]
哎 ， 为什么你会这么认为呢 ？

**吴涛** [55:59]
我有什么办法去验证一个闭源的单一发布者的编辑器 。

**Rio** [56:07]
嗯 。

**吴涛** [56:08]
的编译器是安全没有问题的呢 ？

**Rio** [56:12]
但至少你可以说你相信如果这个编译器是苹果原就是原始 ， 就是苹果官方的那一个 ， 你可以至少相信他不会来搞你 ， 对吧 ？

**吴涛** [56:23]
所以你还是要选择相信嘛 ， 你刚才还是使用了相信这个词不是吗 ？

**Rio** [56:26]
对 ， 所以所以就底层的信任 ， 你还是说你至少要信任一家 ，不管是信任哪一家也好 。 现在的问题就是说这个开发者因为下载 ，因为都有这个网络的问题或者 CDN 的问题 ，他不能从苹果的官方服务器直接下载到这个原始的版本 ， 或者说他下载过程中不是用的 HTTPS，而是用的 HTTP， 然后被上次我们的节目一样 ， 被那个缓存服务器那个那个运营商

的缓存搞了 ，他也不能保证他下载到的一定就是苹果发布的那一个 。 所以这里面其实我觉得唯一可以就唯一可以做的就是验证那个这个那个哈希验证嘛 。

**吴涛** [57:05]
呃 ， 好吧 ， 所以其实我们两个有点就是在不同的层次上讨论这个问题 。 我是觉得如果你要既然你 。

**Rio** [57:15]
你要分而治 。

**吴涛** [57:17]
对 ， 你要分而治 ， 就你你既然选择一个单一发布商的话 ， 你无论如何是会面到面对这个问题的 。

因为你就像你刚才说的 ， 你你只是选择相信苹果而已 ， 你没有办法确认说苹果就没有在自己的编译器里面也做手脚 ， 对吧 ？

**Rio** [57:32]
当然我觉得苹果对这个他在自己编辑器做手脚对他没有好处啊 ， 对吧 ？

**吴涛** [57:37]
对 ， 呃 。

**Rio** [57:40]
就我们从利益的角度去出发去想这件事情 ， 我们至少说相信他从这个 incentive 方面 ，他不会去给自己的编译器做手脚吧 ？

**吴涛** [57:48]
但是就是事情总有一个但是 ， 对吧 ？ 就好像当初我你无论你还是我都不会相信西杰会在自己的硬盘的 BIOS 上面放一个木马的 ，不是吗 ？

但迫于 CIA 的淫威 ，他就是这么做了 ， 你有什么办法吗 ？

**Rio** [58:04]
对对 ， 所以从一个从一个我也不知道 ， 你作为一个非常 paranoia 的人， 你居然会选择说我就是相信 Brian 没有办法 ， 这其实是一个很分裂的行为 ，不是吗 ？

对 ， 这个这个就是这我觉得这个就是问题所在了 ， 就是说在呃 ， 存在这种的 close source program， 呃 ， 这个 program 的形成 ， 就是闭源代码的情况下， 我觉得这个东西都是没有办法去就是彻底相信的 。

就好像上次我们讲的 ， 我记不记得是在哪里讲的一样 ， 如果就像 Richard Stallman 的说法嘛 ， 如果这个软件不是你从头到脚写起来的 ， 如果这个硬件里面跑到所有的固件不是开源的 ，不是从头到尾被验过的 ， 这个都是不可以被信任的嘛 ，不可以被彻底信任至少 。

**吴涛** [58:49]
好吧 ， 就如果我们在 RMS 和一个完全对计算机一无所知的 Granny 之间画一个 scale 的话 ， 那我觉得在这一点的看法上， 我是比你更接近 RMS 的 ， 就是哈哈哈 ，you know， 我觉得如果真的要彻底解决这个问题 ， 那你只能说所有人的就就你必须为呃编平台的编译器市场 ， 你必须开放平台的编译器市场做到一个呃 。

**Rio** [59:19]
就至少有一个至少有一个开源的实现 ， 对吧 ？

**吴涛** [59:22]
对 ， 然后才可以保证说如果出现了类似的事情 ， 你所影响的只是选择了那一个编辑器的这些人。 然后其实类似的事情早就出现过了 ， 就是这并不是什么第一次出现这种非常狗血的事情 。

呃 ，以前在 09 年的时候曾经有一个病毒叫做 Win32indocA， 我查到了 ， 对 ， 这个这个病毒的机理就是感染 Delphi，2009 年的时候 Delphi 还有人用 ， 对 ， 呃 ， 它感染 Delphi5 到 7 版本的 IDE， 然后它会使得这个使用呃被感染的 IDE 所写出来的程序都带有一个带有这个病毒本身 ， 应该是就但是为什么这个病毒没有造成任何今天还有人想起来的伤害 ， 就是因为呃用 Delphi 的人在 09 年的

时候已经非常非常少了 ，而且 5 到 7 也是一个相对来说比较古老的版本 。

**Rio** [1:00:25]
对 。

**吴涛** [1:00:26]
但但假如苹果在苹果平台上你除了 Xcode 还有别的选择的话 ， 那我觉得可能这件事情闹得没有那么大 。

**Rio** [1:00:35]
对 ， 至少你说波及面会小一点点是吧 ？

**吴涛** [1:00:38]
对 ， 没错 。

**Rio** [1:00:39]
嗯 ， 对 ， 这点我也我也同意哈 ， 只是说我觉得还是不能至少从我的角度来讲去相信这件事情 ， 我觉得还是要有一些技术手段 ，因为你刚才说只是一个呃怎么说政治手段来保证它减小它的波及面嘛 ， 就通过这个分分割的方法 ，但是我觉得其实有一些技术手段是可以探讨的 ， 比如说最简单的方法就是假设我们相信苹果不会给自己的编译器添漏

， 主动添添加这个后门的情况下， 那我们说说怎么保证我们拿到的这个 Xcode 编译器是苹果发布的那一个 ， 那其实最简单我们方法都有 ， 对吧 ？

做一个那个 SharedOne 的那个哈希 ， 然后对比一下苹果官方发布通过一个安全的平台 ， 安全就是 HTTPS 的方法去发呃发布一个这个某一个固定版本的 X 这个 Xcode 的哈希 ， 然后去去去去那个就好了 。

还有就是说他苹果那个上面不是有那个 CodeSign 嘛 ， 就是代码签名嘛 ，他也就是可以说啊代码签名 ， 然后运行的时候苹果系统会报错 ， 就签名失败的这些都是不被执行的嘛 。

**吴涛** [1:01:46]
对 ， 我记得以前我下载 Python 的时候还一定要去看那个下载下来的安装包跟官网上提供那个 hash 是不是一样的 。

**Rio** [1:01:55]
嗯哼 。

**吴涛** [1:01:56]
现在已经早已不会去做这件事情了 。

**Rio** [1:01:58]
对对 ， 这个你看就像你你你我这么狗血的人也不是所有的时候都要去做这件事情的嘛 ， 所以我觉得这里面还是有一个机制或者习惯的培养的过程吧 。

然后但话又说回来 ， 另一方面就假设哪怕我们能保证我们下载的那个 Xcode 也好 ， 还是其他的编译器也好 ， 都是这个就通过一个安全的可靠的管道 ， 从某一个来源和就是正确来源下载到的原始没有被搞过的版本 ， 我们还得保证我们机器本就是开发用这个机器本身啊 ， 它是没有病毒和后和后门的或者其他木马的 ，因为这样的话你装上之后你的那个

编辑器也是可以被就改写的嘛 。

**吴涛** [1:02:45]
好吧 ， 从其实从一个比较极端的角度来讲 ， 你只能相信你使用你所做的这些措施会保证你的开发机器是没有受到影响的 ，但是真实的情况是你永远查不过来 。

**Rio** [1:02:56]
嗯哼 ，但但但其实我还是就是想哈 ， 就说其实有没有任何方法一些可以做这件事情的 ， 就我觉得还是会有一些机制可以就你就最简单我们目前的一个一个要点就是说防篡改嘛 ， 对吧 ？

就防篡改有个很简单的机制就可以做了 ， 比如说你我们用那个叫做哈希树的方法来做嘛 ， 比如说因为嗯你任何一个软件放在那个磁盘里面都是在文件系统里面的嘛 ， 对吧 ？

**吴涛** [1:03:26]
嗯哼 。

**Rio** [1:03:27]
那么我怎么保证 ， 当然最最最根到底整个操作系统的也是一个巨大的这个文件树嘛 ， 整个磁盘文件系统上的磁盘文件树 ， 那其实我们是可以因为因为像软件就是这些应用程序 ， 它有一个特质 ， 就是说它基本是一个 immutable 的东西 ， 就是它它不应该就安装好以后， 它的绝大部分是不应该就是程序那一部分 ， 我们把程序和数据分开好 ， 你你你要修改的

东西肯定是属于数据那一部分嘛 ，但是这个编译器本身就那 compiler 本身那些那些东西它应该是不变的 ， 它不应该被改变 ， 除非你升级 ， 对吧 ？

那么我们可不可以说对每一个不变的部分 ， 就程序的那部分的文件做一个这个做一个哈希 ， 然后我们按文件树的结构去组织这些哈希 ， 然后我们再在就是在每一个目录那一层 ， 再对那个目录里面的文件的哈希做一次哈希 ，以此类推 ， 会得到一条根 ， 这个这个 root 就是这个这个树的根部的一个哈希 ， 然后我们知道一旦这个哈希被改变了的话 ， 说明这

个文件系统中的某一部分是被改变了 ， 咱们可以沿着这个哈对比每个每一个这个 root 结就每一个这个这个这个叫什么 ，因为每一个树的根都可以是一个 root 嘛 ， 对吧 ？

我们对比一个 root 的哈希可以找到哪一个文件被改变了 。

**吴涛** [1:04:52]
嗯哼 。

**Rio** [1:04:53]
对吧 ？ 其实通过这种方式我们就可以完全能够呃探知得到你的程序有没有被被叫未授权篡改过 。

**吴涛** [1:05:06]
怎么感觉像 git 啊 ，git 其实不就是 。

**Rio** [1:05:09]
对 ， 没错 ， 本质上就是在做这件事情 ，不过说 git 它是一个链状的结构 ， 然后这个文件的哈希 ， 这文件树的哈希是一个树状的结构 ，而这一点恰恰是在一些比较高级的文件系统里面已经实现了 ， 就像这个 ZFS 里面的 ， 它是但它不是为了保证说这个你的文件不会篡改 ，而是说它是要保证因为那个硬那个硬盘本身可能会发生一些硬件错误 ， 导致你的文

件被篡改 ， 它需要能够侦测得到这个篡改 ， 然后同时其实是一样的东西 。 对 ， 那它的这个这个算法和这个逻就是这个思路上是一致的 ， 就通过一些方法能够能够呃能够记录一些啊 ， 能生成一一堆数据的指纹 ，而且并且能够能够快速的探测到通过这些指纹能够快速的探测到哪些啊 ， 哪一个文件的哪一部分是被就是不经意的修改过了 ， 发生了这

个呃变动 ， 对吧 ？ 所以其实从这种角度来讲 ， 我觉得是完全有技术措施啊 ， 可能虽然当然要花费一点这个计算能力 ， 就是 CPU 要要多算一会哈 ，但是其实是完全是有能力去实现说啊 ， 这个文件呃就这个软件是就是至少是按照原原始意图来的 。

呃 ， 当然这个另一方面就是这次这个 OS 10 升级以后 10.11 Captain 里面自带了一个功能叫做 Routerless，Routerless 什么意思呢 ？

就是说因为以前就刚才讲那个问题嘛 ， 苹果就是苹果的操作系统里面一些那些系统的核心部件的文件是可以被啊超级用户所更改的 。

**吴涛** [1:06:45]
对 。

**Rio** [1:06:45]
然后大家虽然说我们有这个速度 ， 这个超级用户和普通权限就普通权限用户隔离 ，但是因为很多这个使用实际使用的原因 ， 大家还是用速度用的比较烂嘛 ， 对吧 ？

经常要速度这样速度那样 。

**吴涛** [1:07:00]
有些很蠢的事情就是你在你要试图用你的你在试图装一个软件 ， 然后这个软件的那个安装指南上赫然写着速度这个速度那个 。

**Rio** [1:07:09]
对对 。

**吴涛** [1:07:10]
然后叫你堂而皇之的叫你输入管理员密码 ， 就基本上对 ， 这从来不会告诫你说你这样做可能会对你的系统产生危害 。

**Rio** [1:07:19]
呃 ，但也告其实告诫了也没有用 ， 就好像那个 Windows 吧 ， 好像是从 XP 还是 Windows Vista 开始 ， 就它每次这个要就有程序或应用要做出对系统修改的时候 ， 它会弹出一个框问你要不要做这个 ， 要不要做那个 。

**吴涛** [1:07:37]
哦 ， 对对对 ， 叫什么 UAC 之类的还是什么 。

**Rio** [1:07:39]
对对对 ，但是你你提示做了之后用户也就疲劳了 ， 这东西对这种东西也是 。

**吴涛** [1:07:44]
10 个用户有 9 个会试图在第一时间让这个对话框赶紧消失 。

**Rio** [1:07:48]
对 ， 没错 。

**吴涛** [1:07:49]
根本不会去读上面写的什么 。

**Rio** [1:07:51]
所以所以其实你看这个东西你靠提示用户是没有用的 ，因为首先用户并不呃一定具备这个啊这个能力去判断这个到底是可以还是不可以 ， 对吧 ？

它不具备它不是那个 technical 的一个一个一个知识 ，而且说即便是对于这种具备这种知识这种能力和知识的用户 ， 你也不可你也可以你也不可能每次都去问他 ，因为这个会反人会产生疲劳的嘛 。

就是说你问他 100 次 ，他肯定不会再想这个事情了 ， 对吧 ？

**吴涛** [1:08:22]
对 。

**Rio** [1:08:22]
所以我觉得这不是一个就是如果你的你如果你解决这个权限问题的方案是是是询问用户的话 ， 你就其实已经已经认输了 ， 你就说啊这个问题我解决不了 ， 你们你自己想办法吧 。

但是其实是我觉得是完全通过通过设计是可以改变一些 ， 就可以做出更好的设计的嘛 ， 比如刚才讲的那个哈希树的方法 ， 你可以精确的告诉说文件出非哪个文件出了问题 ， 这样可能会有什么后果 ， 对吧 ？

**吴涛** [1:08:48]
对 。

**Rio** [1:08:49]
可以去做一些事情 ， 然后就是说啊 ，在这个设计系统的时候 ，不应不是不是我们目前那种非黑即白的这种比较简单粗暴的权限的方式是不太不太够用的 。

然后这里就涉及到我们要讲的一个非常啊重要的一个人了 ， 这个人叫 Daniel J. Bernstein。Bernstein。

**吴涛** [1:09:15]
伯恩施伯恩施坦先生 。

**Rio** [1:09:16]
对 ， 就是他缩写叫 DJB。 如果这个时候你都你听到这三个字 ， 你看到那三个字母缩写名字的时候 ， 你都没有一种如雷贯耳的感觉的话 ， 说明你的安全知安全知识还不太到位 。

对啊 ， 先普及一下 VDJB 是那个它有一个个人网站叫做 crypto，是 cr.yp.to， 你去可以看一下它能做一些什么样的事 。

**吴涛** [1:09:43]
Crypto 这个单词分裂成三半 ， 就有点像当初那个 deletious。

**Rio** [1:09:47]
对对 。

**吴涛** [1:09:49]
它是它是哪个爱丁堡大学的还是 ？

**Rio** [1:09:52]
啊 ，不是 ， 它是这个伊利诺伊斯大学芝加哥分校的教授 。 对 ，OK，是在数学统计和计算机科学系 。 哇 ， 你这好长啊 。Anyway， 就它有一些啊著名的作品 。

最简单的大家可能比较红火的一个叫 NACL 的这个库 ， 叫做 The Networking and Cryptography Library。 然后还有一些像这个这个 library 的重要程度是怎么样子呢 ？

就基本上今天互联网一些应用的基石是依赖于这个库的 ， 就是安全的安全的网络通信的基石是依赖于这个库的 。

**吴涛** [1:10:30]
为什么他的 CV 上写了他是德国人嘿 ？ 他的 citizenship 就是他是他跟我是同一年生的 ， 首先哈哈 ，10 月 2010 月 29 日出生 ，他出生在美国纽约 ，但是他的 citizenship 写了呃 USA 和 Germany。

哈哈 ， 这是为什么 ？

**Rio** [1:10:50]
哈 ， 好问题 ， 我也不知道 。

**吴涛** [1:10:53]
哎呀 ，OK， 你接着说 ， 我刚才沉浸在他的美国双国籍 ，有可能他是这个 ，他是 by birth 就是拜血缘关系的德国公民嘛 ，因为他父母一方是德国人。

然后他在美国出生 ， 然后 by birth 又是美国人， 就落落地嘛 ， 落地在美国 ， 所以又是这个美国公民了 ， 就是他是有这个双重公民身份 。Anyway，他还有一些其他的作品呢 ， 比如说 DNS curve。

**Rio** [1:11:20]
OK。

**吴涛** [1:11:21]
对吧 ？

**Rio** [1:11:22]
DNS curve。

**吴涛** [1:11:22]
DNS curve 是干嘛的呢 ？ 就是一个啊 ， 嗯 ， 这个说起来比较麻烦 。

**Rio** [1:11:31]
加密的加密的 DNS 吧 ， 可以这么讲 。

**吴涛** [1:11:34]
对 ， 加密的 DNS 协议可以这么说 。 然后呃 Linux 或者 Unix 上面用户可能用的比较多的这个 Demon Tools。

**Rio** [1:11:42]
嗯哼 。

**吴涛** [1:11:43]
这是他写的 ， 哈哈 ， 好 ， 然后其他的 。

**Rio** [1:11:47]
Qmail 也是他写的 。

**吴涛** [1:11:48]
嗯哼 。 啊 ， 对 ， 所以当然我都说了嘛 ， 如果你就没觉得这 DJB 三个字母如雷贯耳的话 ， 你可能就要反思一下自己了 。

啊 ，他在 2007 年的时候发表了一篇论文 ， 叫做 Some thoughts on security after ten years of qmail 1.0， 就是啊写 qmail 1.0 十年后关于安全的一些想法 。

**Rio** [1:12:17]
对 ， 虽然标题里面没有关于安全这件事情 。 哦 ，有 ，sorry。

**吴涛** [1:12:21]
Some thoughts on security。

**Rio** [1:12:22]
On security, yeah。

**吴涛** [1:12:23]
对啊 ， 里面他用了大概多少啊 ， 五个章节吧 ， 讲了一下他在写 qmail 这款以安全著称的邮件的这个 demon，demon 中文翻译成什么我又忘了 。

**Rio** [1:12:40]
呃 ， 守护进程 。

**吴涛** [1:12:42]
守护进程的的的这么这么一套工具的一些想法和和这个措施吧 。 就简单来说 ， 嗯 ， 怎么去写出一个安全可靠的软件 。

这篇论文我们会贴在这个本期节目的 notes 里面 。 哎 ， 我强烈推荐 。

**Rio** [1:12:59]
不是很长 ， 如果不去看 reference 的话 ， 基本上只有八页纸的样子 。

**吴涛** [1:13:05]
对 ，而且它里面其实 technical detail 其实并不多 ， 大部分其实是在一些讨论一些啊 ， 就是思路和这个架构的问题 。

**Rio** [1:13:15]
原则上， 原则上的 。

**吴涛** [1:13:16]
对 ， 就是对 principle。

**Rio** [1:13:18]
对 。

**吴涛** [1:13:19]
啊 ，他说怎么写一个安全的程序呢 ？ 有一些通常的思路叫做首先我们要就是减少 bug， 对吧 ？ 因为这是安全漏洞 ， 通常就所有的安全漏洞都是 bug， 所以我们怎么样解决这个 bug。

然后第二个第二个思路就是说啊 ， 如果我们假定这个出 bug 的概率是相对来说差不多的 ， 那么这个程序的代码量越少 ， 它的 bug 的总量是不是可能就越低了 ？

就一个复杂的程序总是可能比一个啊简单的程序 ， 就就其他情况一定的情其他条件一定的情况下， 肯定是一个更复杂的程序可能还有更多的 bug， 对吧 ？

**Rio** [1:14:03]
没错 。

**吴涛** [1:14:03]
对 ， 然后第三个一个措施就是说啊 ， 叫做什么来着 ？

**Rio** [1:14:09]
减少被信任的代码 。

**吴涛** [1:14:10]
对 ， 这里提到有有一个概念 ， 就是什么叫做信任的代码和不被信任的代码 ， 就是说信任的代码可以做一些更高权限的事 ， 然后不被信任的代码就必须只能做一些很低权限甚至不需要权限的事 。

然后这样的好处是什么呢 ？ 就说哪怕不被信任的代码出了 bug， 它的结果也不会导致系统出现安全漏洞 。

对 ， 所以如果我们能够把代码分成这个可信任的部分和不可信任的部分啊 ，并且把不可信任的部分放在一些特特殊的受限制的环境里面去执行 ， 比如说沙盒模型 ， 对吧 ？

**Rio** [1:14:45]
对 。

**吴涛** [1:14:45]
那么这样可以也可以在一定程度上啊 ， 减低这个这个这种就是安全漏洞的隐患 ，因为因为这个情跟前面那个情况一样嘛 ， 就是因为受信任的代码 ， 就是受信任代码 ， 就是需要运行在更高权限级别的代码的总量减少了嘛 。

然后如果我们假设这个代码出现啊漏洞的概率是差不多的话 ， 那肯定代码总量也会减 ， 就是至少安全漏洞的隐患会减少了 ， 对吧 ？

**Rio** [1:15:11]
嗯哼 。

**吴涛** [1:15:12]
当然还有一些就是他认为是没有什么 ， 就是燃病软的 ， 就并没有什么用处的呃呃就提升软件安全的办法 。

对 ， 第一个方法就是 。

**Rio** [1:15:26]
第一个是 chasing attacker。

**吴涛** [1:15:27]
对 ， 叫跟着就啊应该是叫被攻击者牵着鼻子走 。

**Rio** [1:15:32]
追逐攻击者 。 对 。

**吴涛** [1:15:33]
我觉得这个翻译好一点 。

**Rio** [1:15:35]
哈哈哈 。

**吴涛** [1:15:35]
被就简单来说就是我们说的中文叫做头痛医头医头 ， 脚痛医脚的方法 ， 就是说攻击者过来了 ， 发现哪里漏了 ， 就扑过去把那个漏洞补上， 然后他攻击者又攻击另外一个地方了 ， 你又扑上去把这个漏洞堵上， 就始终是处于一个相对被动的方法 ， 就是这个 DJB 认为呢 ， 这个是呃不靠谱的 ，因为不从没有从根源上解决问题嘛 。

**Rio** [1:16:01]
对 ，他又顺便黑了一下 Firewall， 然后什么防病毒软件啊 ， 或者什么 intrusion detection system 之类的东西 。

**吴涛** [1:16:10]
对 。他觉得这些东西都是燃病软 ， 当然这个地方我觉得还是可以反对一下， 就至少 intrusion detection system 可以让你对于正在进行的攻击有所反应 ， 这已经是一个至少你在维护一个维护一些不可能被啊修正的漏漏洞的时候 ， 会这个东西还是很有用 。

比如说 DDoS，DDoS 本质 DDoS 攻击本质上是没有跟本质上根本跟漏洞没有关系 ， 对吧 ？ 它就是就就是这是一个物理条件所导致的一个安全隐患 。

你在这种情况之下有一个 intrusion detection system 还是很有用的 。

**Rio** [1:16:48]
嗯哼 。

**吴涛** [1:16:49]
我当然对这个在软件工程的环节上是的确是可以像他说的一样 ， 做这种东西是没有什么是的确是没有什么卵用 。

**Rio** [1:16:58]
对 ，因为它本质上并没有修正 ， 就是就改变这个系统是一个千疮百孔的事实 ， 对吧 ？

**吴涛** [1:17:06]
对 ， 没错 。

**Rio** [1:17:07]
对 ， 然后下一条他觉得燃病软的方法叫做减少权限 。

**吴涛** [1:17:13]
Minimize privilege。

**Rio** [1:17:14]
对 ， 这个其实可能可能跟很多这个就是刚才我们讲的那个速度这个情况有点关系啊 ， 就是说你降低权限的这个就是或者权限分离的这个其实在他看来并没有什么用 。

**吴涛** [1:17:27]
没错 ， 这其实有点呃叫什么 contrary to popular belief， 就是 minimize privilege 在他看来是没有太多用处的 ，因为呃毕竟你有你再怎么 minimize privilege， 那个 privilege 如果你需要的话还是需还是还是在那的 ， 对吧 ？

**Rio** [1:17:48]
对 。

**吴涛** [1:17:49]
呃 ， 你只有说我要把这些所有就是需要被 trusted code 减到最少 ， 你这个 minimize privilege 才有那么一丁点的用 。 但如果你在 minimize privilege 的同时没有去减少需要被 trusted code， 那你只要给你那一点点 privilege， 你就已经可以为所欲为了 。

**Rio** [1:18:10]
对 ， 所以其实逻辑上他觉得这个减少权限的这个一个并不解决实际问题的根本原因 ， 就是因为减少权限只是说减少了啊一旦出现软件 bug 或者是安全漏洞造成的损失 ，而并没有并没有解决安全漏洞本身 。

**吴涛** [1:18:31]
对 。

**Rio** [1:18:31]
对 ， 所以其中这个我觉得他的这个思路是正确的 ，因为确实确实并没有减少这个软件漏洞的数量本身嘛 ，他只是说减减少减少了这个软件漏洞产生的可能产生的影响 。其实这个这个事情是值得说的 ， 比如说很简单一个例子 ，他说你说 minimize 就是减少权限 ， 比如说现在很多这个这个这个 iOS 的应用也好 ， 还是安卓应用也好 ，他会说哎 ， 我要你的这

个通讯录访问权限 ， 对吧 ？ 但其实你知道他是会有可能会把这个偷偷上传到他的云端 ， 然后去去做一些这种打着你的旗号去骚扰你的朋友的事 。

**吴涛** [1:19:12]
对 。

**Rio** [1:19:13]
这个时候你有两种做法 ， 你要不就拒绝他 ， 对吧 ？ 你拒绝他显显示那个 ， 然后那个时候就就减小了权限了嘛 ， 这样哪怕他是一个恶意的程序 ，他也不会说拿到你的通讯录怎么怎么样 。

但是假设这个软件刚好有这么一小撮功能 ，是必须得访问通讯录才能正常使用的 ，但这个只是随便举个例子啊 ， 你又不得不授权他的时候 ， 这个时候你就很纠结了 ， 你说啊 ， 那我到底选择要不要为了这个功能选择相信他呢 ？

这个我觉得就是一个挺考验人心的时刻 。

**吴涛** [1:19:43]
没错 。

**Rio** [1:19:44]
嗯 ， 对 。

**吴涛** [1:19:45]
呃 ， 我觉得其实 minimizing privilege 并不是一个错的举措 ， 至少你至少在你做 ， 比如说你是个呃 IT administrator， 然后你必须给不同的用户分配权限的时候 ，minimize privilege 是一个非常正确的策略 。

**Rio** [1:20:00]
嗯哼 。

**吴涛** [1:20:01]
但是我相信作者的意思只是说 minimize privilege 并不能减少软件中的 bug。

**Rio** [1:20:07]
对 ， 所以就是两个层面的问题啊 ， 我们还是要把这个分得清楚了 。 一个是说就解决减少软就软减少软件 bug 这个事情的本身来讲 ， 确实减少权限并没有什么鸟用 ，但是就但我们毕竟在实践中还是说不可 ，因为不可能保证所有的 bug 都被修复 ， 所以我们只能说除了在在通过措施减少 bug 同时， 还要尽量矫正 ， 尽量保证如果 bug 发生也要减少它的可能

产生的负面影响嘛 。

**吴涛** [1:20:40]
对 ， 所以就是从一个是从工程学的角度来讲来解来理解的 ， 另外一个则是从这个 administration 的角度来讲 。

**Rio** [1:20:48]
对 ， 然后他说第三条并没有什么呃 ， 这这不叫并没有什么并没有什么用 ，而是说一个一个很常常见的因素会导致大家会放弃对这个软件安全的追求啊 ， 这个理由通常就是性能或者叫速度 。

**吴涛** [1:21:05]
对 。

**Rio** [1:21:05]
因为我们可能为了追求软件的性能或者是一些速度 ， 去采用一些不那么安全靠谱的这个方案 ， 或者说这个写法 。

**吴涛** [1:21:16]
嗯哼 。

**Rio** [1:21:16]
一个最简单的例子 ， 我可能这么对比比较好 ， 比如说呃 ， 这个当然我们是自己举的例子啊 ，并不是他文章说的一个例子 ， 我们说进程和线程的关系吧 ， 啊 ， 就通常在可能 Linux 上这是不成立啊 ， 比如在 Windows 上面 ， 你开一个新的线程比开一个新的进程是要开销来的低的嘛 。

**吴涛** [1:21:36]
对 。

**Rio** [1:21:37]
没错吧 ？ 对 ，但是线程之与线程之间并不能实现内存隔离 ， 对吧 ？ 因为它线程之间是共享内存区域的 ，不受操作系统的其他保护 。

这样的话 ，在一个线程里面出现的软件 bug 或者是漏洞 ， 使得它可能呃造成这个共享的内存区域泄露 ， 然后这样的话 ， 一个线程的 bug 会波及到其他线程 。

但是如果你不为了这个性能或者方便的考虑 ，而采用进多进程的模型的话 ， 进程与进程之间的通信是一个明确接口的嘛 ， 然后它进程之间如果不除非你做特殊的操作 ，不然你是没有办法共享内存的嘛 。

所以一个进程的这个被 compromise 是不会影响到另外一个进程的安全性的 。

**吴涛** [1:22:28]
对 。

**Rio** [1:22:29]
对 ， 这就是为什么沙盒模型可然后进程隔离能够呃使得一些比较失败的程序所产生的一些灾难性的后果 ，不会扩散到其他呃运行的程序上面的原因 。

**吴涛** [1:22:47]
嗯哼 。

**Rio** [1:22:48]
他他还举他在文章中举的倒是一个例子 ， 我觉得挺有意思的 ， 就是说可以用一个解释器的方法去实现一个简单的这个呃限制性的环境去做一些基础的处理啊 ，而不是说你直接用 ， 比如说用 C 语言写一个这个邮件地址的解析呃器 ，因为这样的话你很容易 ，因为 C 是这种就是什么内存不安全的语言 ， 很容易 。

**吴涛** [1:23:13]
很容易轰掉脚的语言 。

**Rio** [1:23:14]
对 ， 很容易叫做 shoot yourself in the foot， 就是拿把枪把自己脚给打了一枪 。 对啊 ，因为因为由于这个内存越界啊 ， 导致各种各样的问题 ，是使得啊你可能会出现错误 ，但是如果你写一个简单的这个编译这个解释器 ， 就是一个很简单的虚虚拟的呃迷你语言去做这个地址解析的话 ， 可能会好一些 ， 对吧 ？

但是这样很多人会觉得这完全是什么杀鸡用牛刀啊 ， 何必呢 ？ 对吧 ？

**吴涛** [1:23:48]
没错 。

**Rio** [1:23:49]
所以为了这个性能或者实现效率来讲 ， 就采取了一些没有那么安全的方法 。

**吴涛** [1:23:56]
嗯 ， 反正这篇论文是非常具有研究价值的 ， 我觉得如果任何一个因为这件事情 ， 或者是因为之前乃至将以后将会发生的其他事情 ， 想要让自己写的东西比较安全的朋友的话 ， 一定要读一读读一读这篇文章 。

**Rio** [1:24:14]
嗯哼 ，其实他这篇文章我觉得它最有价值的是那个叫做第四部分和第五部分 。

**吴涛** [1:24:20]
嗯哼 。

**Rio** [1:24:21]
第四部分叫做第四部分叫做就如何减少代码量 ， 这个是我最喜欢干的事 ，因为我总觉得哈 ， 现在我们很多人写这个代码的习惯就是呃越多越好 。

就他其实有有一个概念 ， 我觉得非常就是当然它不是他自己原创的 ，而是那个 Dexter 说的 ， 就是说呃呃叫什么愚蠢的软件经理 ， 通常用这个程序员的生产效率去衡量一个呃一个程序员的这个呃通通常用这个 。

**吴涛** [1:24:53]
用代码量去衡量 。

**Rio** [1:24:53]
专写的代码行程 。

**吴涛** [1:24:55]
生产效率 。

**Rio** [1:24:55]
对对对 ， 用一个代码的对哎 ， 这句话再说一遍啊 ， 就是一个愚蠢的软件的这个经理 ， 或者这个产品项目经理 ， 会用这个代码行数去衡量一个程程序员的生产力 。

也就是说浅猜的含义就是说代码写的越多 ， 这个程序员越高效 ， 或者说更越高产 ， 对吧 ？

**吴涛** [1:25:15]
对 。

**Rio** [1:25:15]
越高产肯定是有产出的嘛 ，但其实上这个概念是完全错误的 ， 应该是用消耗的代码量去衡量一个代码 ， 这个程序员的呃这个生产力 。

就是说呃一个为了实现同样的功能 ， 或者同样的 specification， 程一个程序员用的代码量越少 ， 它应该是越好的 。

但这句话也不太对哈 ，因为毕竟还是要考虑到这种这个什么可维护性啊 ， 易读性啊 ， 怎么怎么样 ， 对吧 ？

这个深究的我觉得这个是 ，但起码他提出这个概念 ， 就是编写的代码量和消耗的代码量是一个两个完全不同的呃这个思路去看这个问题 。

**吴涛** [1:25:54]
没错 。

**Rio** [1:25:54]
对 ， 所以当这个这个第四节里面 ， 这篇论文讲了一个很好的一个几个点哈 ， 就说我们如何去消消减代码的量 。

第一个就是说呃就是把重复的部分做成一个通用的函数喽 ， 哪怕它再小再 trivial， 对吧 ？ 你要用的重复次数过多够多的话 ，也是也是值得的 。

当然这东西也是有一定的副作用的哈 ， 就说在一些这种比较愚蠢的语言里面 ， 你调用的函数过多 ，其实是会影响你的性能的 ， 对吧 ？

它不会帮你去依赖这些东西 。 当然这个就跟刚才提到那个为了为了为了这种微不足道的性能去牺牲的这个呃其他东西 ，是是点了芝麻丢了西瓜 。

对 。

**吴涛** [1:26:37]
没错 。

**Rio** [1:26:38]
然后这个 4.2 它提到一个就是说呃如何去处理这个临时错误 ， 这个是非常重要的 。其实所有的程序里面最麻烦的就是错误处理 ，而是说很多人会能很多人这个 ，但这个回到我们之前说的那个就是 exception 机制的问题哈 ， 就是 exception 机制 。

**吴涛** [1:26:56]
这好像我们第一期的内容 。

**Rio** [1:26:57]
对对对 ，exception 机制是假设这个程序的正常逻辑是一个呃这个什么正常运行的 ， 然后这个错误是或者说呃这个异常是需要特别处理的 ，但是其实应该是反过来的 。

我觉得就是说 。

**吴涛** [1:27:12]
你默认这个程序是跑不了的 。

**Rio** [1:27:14]
对 ， 默认程序是会各出各种各样的问题的 ， 你只能一步一步去处理的问题 ， 然后你当你把所有的呃可能出错的地方都覆盖到了 ， 你这个这个程序才是安全无错的嘛 ， 对吧 ？

所以为什么要为什么说用这个 exception 机制 ， 从本质上来说是不是一个非常靠谱和安全的一个一个一个方法 。

**吴涛** [1:27:32]
听到这里 ， 这个高程序员和 C 程序员一定会觉得非常有理 ， 然后其他所有程序员都觉得我靠 ， 这是在说什么邪教 。

**Rio** [1:27:41]
哈哈哈 ， 我也不知道 。 我觉得有时候你使用的这种语言的错误处理机制 ， 会会让你产生某种特定的性格 ， 就是我觉得写 C 的人一般都会比较悲观 ， 觉得这个东西是很有可能失败的 ， 就是不管干什么都会说这个玩意错了怎么办 ， 错了怎么办 ， 错了怎么办 。

然后写 Java 的可能就不会想那么多 ， 总是会假设说这个世界会完美运行 ， 出了错再去想它应该怎么办 。

**吴涛** [1:28:13]
没错 。

**Rio** [1:28:14]
啊 ，anyway， 就这个 4.3 节他讲了另外一个我觉得挺重要的事 ， 就是还是叫重用网络工具 。 嗯 ，但这里举举到的一个例子 ，其实是我一直很想吐槽的 ， 就是还有一个另外相关的事情 ， 我们可以在这里聊一聊 ， 就是他聊到一个例子 ， 就是 Unix 系统里面有以前有一个很通用的工具叫做 I1， 叫做 InetD， 就是 Internet Demon。

这个这个 Demon 什么用呢 ？ 就是它的那个作用很简单 ， 它会去嗯监听一个这个端口 ， 或者几个端口 ， 然后去帮去接受连接 ， 然后一旦它接受指定端口有没有指定连接 ， 它会启动一个进程 ， 然后把这个进程的输入套到这个连接上， 然后输出套到这个连连接的 ， 就你看它就是有输入输出嘛 ， 对吧 ？

**吴涛** [1:28:57]
对 。

**Rio** [1:28:57]
它把这个跟那个程序的输入输出对接起来 ， 这样的话啊 ，其实这个程序本身就不用考虑它的这个输出是从哪里来的 ， 它只用考虑去处理这个输出就好了 。

就其他网络的事情也好 ， 还是说从一个管道过来的也好 ， 对这个程序来说是透明的 ， 这样它可以把它就可以重用这个 InetD 里面已经实现过的那些网络的机制了嘛 ， 对吧 ？

当然他也说了一下原因 ， 为什么其他的一些程序不能直接使用这个方法 ，但是其实仔细看来 ， 就是通可以通过某些方法去去就从架构上的改进是可以重用这一点的 。

就想到我这这个当然这个 InetD 现在用的也不是特别多哈 ， 我我想说的是另外一件事 ， 就是现在不是有那个什么 Systemd 和之前在 Ubuntu 里面用的比较多的那个叫 Upstart。

**吴涛** [1:29:47]
嗯哼 。

**Rio** [1:29:47]
他们本身有一个功能叫做就 demonization 这件事情 ，其实是一个非常诡异的事情 ， 就是你要让一个程序成为一个守护进程 ，在 Unix 系统里面你要做很多事情 ， 对吧 ？

你要把它输入输出 ， 跟它调好那个那个 。

**吴涛** [1:30:02]
写脚本 ， 写一大堆脚本 。

**Rio** [1:30:03]
你还得 double fork， 对吧 ？ 防止这样 ，因为这个 。

**吴涛** [1:30:07]
要存 PID。

**Rio** [1:30:07]
被收割掉什么之类的事情 ， 然后然后也是因为这个 ， 所以那个 DGP 才写了那个 demon tools 这套工具去完成这个事情 ， 这个事情嘛 ， 对吧 ？

但其实这个事情是完全没有必要去做的 ，因为在现代的操作系统里面 ， 基本上都有这种自带的工具去帮你做这个进程的监控和这个这个这个管理 ， 使得你根本其实不需要写一个传统传统意义上的 demon 进程 ， 就是这个守护进程就不需要驻留后台 ， 你就让这个程序驻留前台就可以了 。

然后这个前台的程序会被像 Systemd 啊 ， 还是像 Upstart 啊 ， 这种这种这种管理工具去管理 ， 使得它能够实现 demon 进程同样的功能 ， 甚至更好的实现这个功能 。

所以应该把这个东西交出去 ， 让更专业更专注的工具来完成这个事 ，而不是说所有的人写一个呃那种 server 的时候都需要去做一个 double fork， 都变成 demon 这种形式 。

**吴涛** [1:31:03]
对 。

**Rio** [1:31:04]
对 ， 这个是我要吐槽的一个事情 。 然后 4.4 节讲了另外一个可以重用的部分 ， 叫做 access control， 就是这个访问控制 。

就在一般的这个 Unix 系统里面 ， 这个文件的权限去系统是一个比较简单和常用的这个访问控制的基础嘛 。

当然也有很多人说那个一个简单的这个用户组和其他这种分类的方法并不能呃解决所有的问题 ， 所以也后来了一个叫做 ACL 嘛 ，access control list 这种更高级的方式来做 。

但是 。

**吴涛** [1:31:34]
Access control list 其实现在在 Windows 里面 ，在 Unix 在类 Unix 里面已经不比 Windows 里面少了 。

**Rio** [1:31:40]
对 ， 只不过很多人还是 。

**吴涛** [1:31:41]
OSTen 就是用的这个嘛 。

**Rio** [1:31:43]
对 。

**吴涛** [1:31:43]
嗯 ，但 anyway， 就这个这个是具体这个实现的问题啊 ， 就是说这个要点就是说 ， 如果系统已经有一个这个 access control 的工具了 ，不管是文件系统权限也好 ， 还是 ACL 也好 ， 就我们应该尽可能去重用它 ， 就是因为没有编写的代码是最少的代码 ，因为如果一个代码量是 0 的话 ， 它的 bug 量肯定是 0 的 。

**Rio** [1:32:05]
对 。

**吴涛** [1:32:05]
对吧 ？ 所以怎么去重用它就是一个非常要紧的事情了 。 就很多人就愿意去重新发明轮子 ， 要自己搞一套这个自己的用户账号或者权限系统 ，但其实往往是啊 ， 适得其反的 。

**Rio** [1:32:18]
没错 。

**吴涛** [1:32:19]
然后 4.5 提到另外一个重用 ， 就是文件系统 。 就很多人说我要自己写一个自己的这个 storage layer， 就存储层怎么怎么地 ， 要做什么什么事 ，但其实现代的文件系统就可以做非常非常多的事 ， 就完成一些基本的存储功能都是没有问题的 ， 没有必要啊 ，在这个特别早期 ， 或者这个没有那么明确性能瓶颈的时候 ， 去开发自己的这个文件存储的系统 ， 对吧 ？

**Rio** [1:32:47]
对 。

**吴涛** [1:32:48]
所以能够就是总体来说 ，4.4 的一个核心要务就是说如何降低代码 ， 刚才讲的那个就是重用这个重用 ， 就如何就简单如何重用代码或者重用功能嘛 ， 比如说用这个函数去去写通用的功能 ， 然后重用网络工具 ， 重用这个访问权限控制 ， 重用这个文件系统 ， 对吧 ？

这都是一些 。

**Rio** [1:33:09]
对 ， 基本上都是在教你怎么样怎么样不要去重新发明轮子 。

**吴涛** [1:33:13]
没错 。

**Rio** [1:33:14]
然后第五节其实还是挺有意思的 ， 就刚才讲的我们讲的那个叫做如何去减少这个 trusted code 受限代码的部分 ， 这当然就是从一个架构的方法来做了 。

嗯 ， 这里又细节比较多 ， 我们就不就一一过了 。 有兴趣的朋友就可以去看一下里面的细这个这个细节 ，因为这篇文章总体来说还是不难懂的 ， 然后你只要具备一些基础的这个 Unix 相关的知识 ，是能够看个八九百分之八九十的 。

**吴涛** [1:33:41]
嗯哼 。

**Rio** [1:33:42]
然后我相信看了这篇文章以后， 对你以后编写程序也好啊 ， 做这个系统架构也好 ， 会有一个非常大的改观吧 。

**吴涛** [1:33:51]
对 。 呃 ， 另外我觉得也可以从软件用户的角度来讲 ， 来谈一谈怎么样才能避免再中类似于 XcodeGhost 这样一种 。

**Rio** [1:34:03]
嗯哼 。

**吴涛** [1:34:04]
这样这这样的落陷入这样一种窘境里面 。

**Rio** [1:34:08]
嗯哼 。

**吴涛** [1:34:08]
嗯 ， 我觉得最重要的一点就是远离国产软件 ， 或者远离远离国内的互联网环境 。 你说这件事情中招的人， 最大的一个问题不就是贪便呃图省事吗 ？

**Rio** [1:34:25]
啊哈 。

**吴涛** [1:34:26]
当然一方面也跟也跟这个墙的存在不可分离 ， 就是在网速非常慢的情况下， 你要连美国的一个服务器下载东西的确是很痛苦这件事情 。

我记得在呃 ， 好像不是升级 Xcode，而是在升级那个新的呃 ，在下载一个新的 iOS iOS 10 升级包的时候 ， 呃 ， 两个推友同时给出了那个下载升级包的截图 ， 一个在国内 ， 一个在国外 。

然后在国内那个就是还有 4 个小时， 然后在国外这个在国外的这个就是还有 2 分钟 。

**Rio** [1:35:02]
这其实这个我觉得反而是苹果的责任 ， 就是说因为它毕竟是要在中国市场这个长期这个存在的一间公司嘛 ， 它为什么不在中国市场多 。

**吴涛** [1:35:15]
在中国搞个 CDN 是吧 ？

**Rio** [1:35:17]
它是有 CDN 的 ， 就是我我的好我好奇在于为什么在有 CDN 的情况下还这么慢 ，

就这个是我觉得是不能够接受的 。

**吴涛** [1:35:27]
这难道不是 CDN 的责任吗 ？

**Rio** [1:35:29]
那这这个是 CDN 的责任没错 ，但是这个 CDN 是苹果买的 ， 或者它它去去去花钱找的请的服务 。 当然你可以说这个啊 ， 中国的网络就是是不如美国 。

**吴涛** [1:35:40]
中国的网络环境的确是非常复杂的 ， 你说中国的网络投放做的好的厂家 ，其实也只有那几家真正的巨头能做好 。

**Rio** [1:35:49]
但是就是找那些巨头合作吧 ， 这个有什么关系呢 ？ 对吧 ？ 我觉得是这个是苹果的责任 ， 它应该把这件事情做好的 ，但是它并没有做好嘛 。anyway， 这个我们就不去吐槽政策 ， 我们毕竟是一个技术性的节目 。

啊 ，其实有有一件事我觉得还可以探讨一下， 就是说刚才我们讲了一些啊 ， 常见的一些技术手段去解决这个问题啊 ，但其实有一个细节是在今年的早些时候 ， 我在那个 Golang 的语言组里面问过那个问题 ， 就是说我我问你这么一事 ， 就给定你同一个编译器 ， 就是这个 binary 是一样的 ， 然后给定你同一套这个源代码 ， 你能否保证在不同的机器上去执行同样

的这个编译器 ， 编译同样源代码得出来的那个结果是叫做叫 byte to byte identical， 就是每个字节都是相同的 ， 就叫我叫做 deterministic build 嘛 ， 就是可预测的 build。

**吴涛** [1:36:52]
这跟编译器的 policy 有关吧 ？ 有些编译器是不可能给出这样 ， 哪怕你在同一台机器上只相差一微秒去编译 ， 它也不一样 ， 就它会打着 stampstamp 在里面 。

**Rio** [1:37:04]
对 ， 这就是问题所在了 。 就是说因为首先说我我先说一下， 为什么我我觉得这个是一个就 deterministic build， 是一个非常好的特性 ，因为我们可以很负责任 ， 就是就在 reproducible 嘛 ， 就是我可以重现这件事情 。

因为我说嗯 ， 就如果我的同一套源代码 ， 就源代码本身可以用 git 的刚才我讲的那个 hash 的方式去验证它的这个等同性嘛 ， 对吧 ？

**吴涛** [1:37:30]
对 。

**Rio** [1:37:30]
但是我我并不知道 ， 如果我每次同一套源代码 ， 同一个编译器编出来的结果都是不可 ， 都是不可 ， 都不一样的话 ， 我是没有办法建立源代码和编译出来结果之间的一个一一一色的关系的嘛 ，因为它有很多其他变量是不在这个这个这个这个这个函数的描述中的 ， 对吧 ？

**吴涛** [1:37:51]
嗯哼 。

**Rio** [1:37:52]
所以说啊 ， 后来我就去琢磨 ， 我去去做了一个叫做很不全面很不靠谱的小调查 ，其实大部分的编译语言或者工具都不能都不能做到这一点 。

当然原因也刚才讲了 。

**吴涛** [1:38:05]
对 ，因为我是你要实现你的说这个呃 deterministic compiling 的功能的话 ， 那你需要就是任何一个 compiler 的设计者都需要在设计的初期把它当做一个 fundamental 的呃 goal， 就是一个一个设编译器的设计目标来来做 ， 才可以在最终的呃编辑器的结果上实现这个 。

因为我觉得实现这一个实现这个目的的呃有一个很明确的要求 ， 就是要明确的区分哪些是可变的呃 ， 哪些是可变的编译条件 ， 另外一些哪些是不可变的编译条件 。

就是它在编译的时候 ， 它必须确定说 ， 比如说啊 ， 比如说我给出一个优化的 flag，O1 还是 O0 还是 O3， 呃给出 O0 的时候所包含的会被编译的部分和 O3 会被编译的部分其实是不一样的 ， 对吧 ？

**Rio** [1:39:06]
呃 ， 这个问题我能够理解 ，但是我觉得这个就是可能要加一个限制条件 ， 就是说编译的参数和编译的环境得是相同的 ， 对吧 ？

我如果我们把这个编译的过程想想象成一个数学的函数叫做 f 的话 ， 它的输入应该包含哪些部分 ， 我们可以想一下 ，是包括源代码 ， 对吧 ？

**吴涛** [1:39:26]
但是最大的问题就是这个函数里面所要给出给入的这个变量实在是太多了 ， 然后你必须在设计函数的时候就明确的知道哪些变量是可以被呃包在一个额外的信息里面 ， 作为整个最终所要递交的这个 binary 的源信息给出去的 。

比如说编译时间 ， 编译时间你可以不包含在那个最终的 binary 里面 ， 你只把它放在一个 binary 的呃附加包里面给用户 。

**Rio** [1:40:01]
嗯哼 。

**吴涛** [1:40:01]
呃 ， 对啊 ， 就要求你上面要明确的区分哪些是可变的 ， 哪些是不可变的 。

**Rio** [1:40:08]
对 ， 所以我觉得我就我就想说这件事情 ， 我觉得在技术上应该是可以做到的 。 就是如果我们不做不做 ， 就哪怕是我们对这个源代码做一些比较疯狂的这个这个 transform， 就是就是变形 ， 应该也是可以做到 。

因为只要就就我说嘛 ， 如果我们把编译过程想想成一个定义为一个函数的话 ， 它的那个输入一个函数的输入应该是什么 ？

应该是这个源代码 ， 比如它是一个就是就是文本的形态 ， 我们可以直接通过算哈希的方法算出它的一个 ， 就可以比较它的一个就不变性嘛 。

然后是说各种编译的参数 ， 我们可以按一个方法给出 ， 就是编译参数应该是相同的 ， 然后就是编译环境的 ， 然后环境其实在某种程度上就但那个就就扯得比较远 ，因为可能会牵涉到这个整个操作系统是不是应该一个是可以叫做 immutable 的系统 ， 对吧 ？

**吴涛** [1:40:59]
嗯哼 。

**Rio** [1:41:00]
理论上如果我们不考虑时间的因素的话 ， 呃 ，是有办法把这个编译过程做成一个函数的 ， 是一个所谓一个函 ， 这个是一个数学意义上的函数 ， 就是它的给定一个输入 ， 它的输出是恒定的 ，而输出是恒定 ， 就是 f(x) 一定等于 f(x)。

**吴涛** [1:41:14]
它是一个函数编程意义上的函数 。

**Rio** [1:41:16]
对对对 ， 它它不是一个我们 programming 的函数 ，而是一个 mathematical function， 对吧 ？ 然后这这个这我的这个问题在那个 Golang 的那个 groups 里面就还挺多人在下面回复的 ， 然后后来是说呃有一个这个就是 Go 的这个开发 ， 就 Go 语言的开发者 ，他说他其实在尝试做这件事 ，但是我不知道后来啊怎么样了 ，但他的说法不是用的那个那个那个描述叫 deterministic build，而是说叫做啊 repeatable build。

所以这件事情我觉得还是蛮期待的 ，不知道他们会在一点几还是二点几里面把这件事情变成现实 。

**吴涛** [1:41:57]
好吧 ， 这是一个这是一个其实来我觉得是一个相对来说比较小众的需求 ， 或者说它是一个很明确的需求 ，但是相对于编译器所要完成的许多其他需求来说 ， 嗯 ， 没有那么高优先级的一个需求 。

**Rio** [1:42:16]
但如果你是说啊 ， 你对这个安全有追求呢 ？

**吴涛** [1:42:20]
你从安全角 ， 你从安全专家的角度来讲 ， 这个需求毫无疑问是非常重要的 。

**Rio** [1:42:25]
对 。

**吴涛** [1:42:26]
可是如果你 。

**Rio** [1:42:29]
市场不是那么不市场不是这么决策的是吧 ？

**吴涛** [1:42:33]
对 ， 比如说你是一个写 shader 的人， 或者是你是一个写 whatever UI 的人， 你可能会觉得这些事情没有那么重要 。

**Rio** [1:42:40]
嗯哼 。

**吴涛** [1:42:42]
速度啊 ， 或者是优化程度啊 ， 才是乃至于什么呃前端后端的清晰分离啊 ， 静态分析啊 ， 才是编译器最重要的部分 。

**Rio** [1:42:53]
对 ，不过 anyway， 我们这里还是要提一篇跟刚才那个没关系啊 ， 跟提一个神级一样的论文哈 ， 这个是 Ken Thompson 在 1984 年发表的一篇简短的一个 。

**吴涛** [1:43:07]
他他 1984 年得了图灵奖 ， 然后他在图灵奖的呃颁奖典礼上说了这些 。

**Rio** [1:43:13]
对 ， 这是一段一个小的 paper 吧 ， 只有很少三页纸 ， 非常简单 。他讲了这么一个事 ， 就是说因为 Ken Thompson 这个人可能还是要 ， 如果大家名字 ， 如果这个名字你们没听过的话 ， 你如果你是程序员的话 ， 应该有概去面壁思考 。

**吴涛** [1:43:29]
哈哈哈 ， 如果你是 Windows 程序员的话 ， 情有可原 。

**Rio** [1:43:34]
哪怕是 Windows 程序员 ， 我觉得都不是情有可原 ，因为这是 C 的鼻祖嘛 。 啊 ， 对 ， 好吧 。 那 Ken Thompson 是 Unix 的作者之一 ， 当年在贝尔实验室的时候哈 ， 然后他当然也是 C 的这个作者 ， 然后到现在他在 Google 是 Go 语言的作者之一 。

啊 ， 对 ， 就这么多官话我觉得已经够够那个了 ， 就不用再说别的了 。

**吴涛** [1:44:03]
对 。

**Rio** [1:44:04]
他写这一篇其实其实这个篇比刚才那篇论文就就更加基础性了 ，因为有没有几个比较 tricky 的一些概念 ，其实我到现在为止还不是不是特别理解 ， 要不吴涛你来解释一下吧 。

**吴涛** [1:44:16]
就是啊 ，XcodeGhost 的这件事情其实并不是什么特别新鲜的事情 ， 就比如说往回朔游一在啊 ，2012 年的时候有一个有一件事件 ， 就是 PuTTY 的中文版 ， 你看又是中文版 ， 再被人植入了后门 ， 就是你在使用这个中文版的 PuTTY 的时候 ， 呃 ， 你的 SSH 的呃公钥和私钥都会被上传到一个服务器上， 然后呃你要连接的机器也会被上传到这个服务器上 。

所以就如果你使用了这个被感染的版本的 PuTTY， 那也就等于把你自己的那个服务器的呃钥匙拱手送给了那个感染者 。

然后更古早的就是我们之前提到那个 Delphi 7 的 virus， 然后而这一切其实在早在 80 年代 ，在 84 年在那个 Ken Thompson 的论文里面就已经呃提到这件事情 ， 就是他那一年他去呃接受 ASM 的图灵奖 ， 然后他在图灵奖上就讲了自己在这个当时的 C compiler，也就是 CC 在那个 Unix 的 CC compiler 里面植入后门的这件事情 。

所以这实际上是一件非常古老的事情 。 然后嗯 ，有兴趣的同学也可以去看一看这个 Ken Thompson 的这篇论文 。

**Rio** [1:45:44]
非常短 ， 就三页 ，但是 。

**吴涛** [1:45:46]
对 ，因为他毕竟他只是一个讲话嘛 ， 对 ，他只是从这个讲话上来的 。

**Rio** [1:45:51]
嗯 ，其实那篇论文的最后结尾那一段其实还挺有意思的 ， 就是他在 80 年代对这个安全和这个法律啊 ， 还有这个责任的鉴定 ，其实跟我们现在的一些想法还都比较超前嘛 ， 至少说 。

**吴涛** [1:46:07]
嗯哼 。

**Rio** [1:46:08]
嗯 ， 那这个具体就不再去这个描述了 ， 大家可以自己有兴趣看这篇文章好了 。

**吴涛** [1:46:13]
对 ，而且很有趣的是 ，他在那个文章里面还提到说 ，其实这也不是他原创的这种啊 ， 这这样这样一种这样一种手段 ，他最开始读到这件这种可能性的攻击的是在一个空军的呃杂志上面 ， 就是一个 unknown 的未知的空军的文档上面 ，他读到了这样一种呃攻击的可能性 。

所以可能整个来整个事情的想法还要比我们所知道的追溯的更早 ，但直到今天这样一种这样一种怎么说呢 ， 呃安全漏洞还是在被害容 。

**Rio** [1:46:57]
就他他那句话 ，他那个文章的标那个论文的标题叫做 Reflection on Trusting Trust 哈 ， 就是其实可以对应到刚才我们节目开始的时候 ， 就就关于这个讨论开始的时候 ， 你提到那个问题 ， 你如何真的信赖你的这个工具呢 ？

他那边最后结尾的那一段的那个章节的第一段话是这么说的哈 ， 叫做啊 。

**吴涛** [1:47:23]
You can't trust code that you did not totally create yourself.

**Rio** [1:47:26]
对 ， 就这其实 。

**吴涛** [1:47:28]
RMS 嘛 ， 这就是对 。

**Rio** [1:47:29]
就是 RMS 是一样的 ， 所以也比较巧了 。 那他还提到有一个就是我们到其实到我到现在认为就是说这没有就刚才你说嘛 ， 如果你真的偏激一点的话 ， 真的是没有真正的安全的 ，因为叫做比如说这个 a well-installed microcode bug will be almost impossible to detect.

就是那个安装的非常精巧的这种就是微代码 ， 微代码就是像这个呃什么这个硬件里面驱动某一个呃小硬件的这个驱程 ， 或者是一个驱动的那个 bug， 基本上不可能被发现的 ，因为实在是太难太底层了 ， 就越底越底层的 bug 越难发现 。

**吴涛** [1:48:07]
如果你更进一步更进一步的话 ， 那在硬件层面上植入的病毒或者是后门的其实不可能被 。

**Rio** [1:48:15]
在 IC 电路板级别的 bug 是吧 ？

**吴涛** [1:48:18]
对啊 。

**Rio** [1:48:18]
这个据说是有的 ， 听说那个但是小道消息没有也没有经过确认 。 英特尔的芯片里面据说是只有这个 NSA 的后门的 ，但是我不知道到底怎么如何实现这一点 。

**吴涛** [1:48:30]
对啊 ， 所以其实有时候我们嘲笑一些就是龙芯或者是国产 CPU 计算机国产化的知识专门 ， 会说这简直是毫无道理 。

**Rio** [1:48:44]
哈哈哈 ， 对 ， 为什么说这么强调自主知识产权 ，其实也说的本质上就自己这么一件事嘛 ， 就是说他说 you can't trust software you didn't write yourself.

那你也不可能说你就如果你不能信任不是你自己写的软件 ， 当然更不可能信任不是你自己造的硬件了 ， 对吧 ？

**吴涛** [1:49:04]
没错 ， 所以从这个这一点上来说 ， 这个计算机国产化是有其意义的 。

**Rio** [1:49:11]
或者说按照那个那个话来说 ， 如果你对你的软件安全足够介意的话 ， 你一定要从硬件造起 。

**吴涛** [1:49:20]
对 ，而如果你要足够在意你的国家安全的话 ， 那你必须要注意你的信息安全 。

**Rio** [1:49:27]
哈哈哈 ， 好吧 ， 那个今天的节目就到此为止了 ， 感谢收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。

我们号称 hardcore，但是也没有干货 ， 想听的人听 ，不想听的人就别听 。 你可以为本节目捐款 ， 捐款地址是 ipn.li/kernelpanic/donate， 捐款金额随意 ， 只要是能被 8 整除的正整数就可以 。

捐款不会给你带来什么 ，不捐也不会让你失去什么 。 我们的口号是 no hard feelings。

**吴涛** [1:50:04]
喂 ， 主本期口号不是这个 。

**Rio** [1:50:06]
哦 ， 对 ， 本期口号是 trust no one even your compiler and your computer and your CPU chip and your government 哈哈哈 and yourself and yourself。 如果你有任何反馈 ， 可以发电子邮件到 kernelpanic@ipn.li。

同时也欢迎您收听 IPN 旗下其他的其他几档节目 ：IT 公论 、 未知道 、 太依赖了 、 流行通讯 、History、 博物主题节目 、 博物志 、 美国大选主题节目 ， 这是新开的啊 ， 叫做选美 。

### 结尾

**Rio** [1:50:43]
我们下期节目再会 。

**吴涛** [1:50:45]
对 ， 我们下期节目一定会来的 ， 虽然这一次停了两周 ， 然后让很多听众朋友们也觉得非常的呃 ， 用一个什么形容词难过 ， 或者是觉得 。

**Rio** [1:50:58]
翘首以盼 ， 翘首以待 。

**吴涛** [1:51:01]
哈哈哈 ， 对 ，其实这期节目差点就没录成 ， 兄弟们呃 ， 各位听众 ， 就是我本来今天是要去慕尼黑的 ， 然后我女朋友说如果不录节目的话就不让我出门 ， 所以我只好在这里录了这期节目 。

**Rio** [1:51:17]
感谢吴涛女朋友大无畏的牺牲 ， 让本期节目死灰复燃 。 不对 ， 对 ， 如果没有他的话 ， 各位可能还要再等两周 。

**吴涛** [1:51:27]
对 ， 好吧 ， 那我们虽然这一期也没有那么精彩 ，但

嗯 ， 我们还是会继续录下去 。

**Rio** [1:51:38]
哎 ，其实这期我们发现一个挺好的把节目做下去的方法 。

**吴涛** [1:51:42]
什么方法 ？

**Rio** [1:51:43]
每期找一篇论文来讲啊 。

**吴涛** [1:51:46]
哦 ， 倒也是可以 ， 反正不是有什么什么计算机程序员必读的 20 篇论文之类的文章 ， 我们可以我们可以去下载这样一这样就讲那么深度吗 ？

**Rio** [1:52:00]
哈哈哈 ， 还是可以的吧 ， 就基本上如果听完我们这 20 期节目的话 ， 就可以完成一个叫什么呃呃含呃 。

**吴涛** [1:52:10]
函授课程 。

**Rio** [1:52:11]
对 ， 函授课程 。

**吴涛** [1:52:12]
电大的水平 。

**Rio** [1:52:13]
对 ，其实我最近刚刚开始了一门那个开源的课程 。

**吴涛** [1:52:19]
哦 。

**Rio** [1:52:19]
而且是每写完一个 quiz 就要拍一张照片 ， 然后要呃敲一段字来证明是你刚刚做这个 quiz。

**吴涛** [1:52:28]
是是是 。

**Rio** [1:52:29]
什么方向 ？

**吴涛** [1:52:31]
呃 ，data science。

**Rio** [1:52:32]
哈哈哈 ， 哎 ， 这个是哪哪一块 ？

**吴涛** [1:52:36]
呃 ，是 。

**Rio** [1:52:37]
具体叫做什么 ？

**吴涛** [1:52:38]
是 Coursera 出的 ， 叫呃 data analyze and statistical inference， 就讲数据分析 。

**Rio** [1:52:49]
所以你是重修统计学了 ？

**吴涛** [1:52:51]
呃 ，有一点吧 ， 就我对它感兴趣主要是因为它它会讲那个 R， 然后我们公司的产品里面也会就也支持了 R， 所以我想反正可能将来用得上就不如学一学 。

而且这个最后是有证书的 ， 如果你 。

**Rio** [1:53:07]
就学完这个你就可以给自己标贴个标签叫做 I'm a data scientist。

**吴涛** [1:53:12]
那这还是离太远了 ， 要真正成为 data scientist 的话 ， 可能要上另外几门比较深的课 。 这这门课非常浅显啊 ， 感觉至少 。

**Rio** [1:53:23]
它会讲些什么内容呢 ？ 大概就提纲是什么 ？

**吴涛** [1:53:26]
Objective 是一上来是讲呃 intro statistics。

**Rio** [1:53:33]
嗯哼 。

**吴涛** [1:53:34]
然后后面会讲什么 scatter plot， 然后后面会讲什么 experimental design， 就是如果你要设计一个 experiment 来来验证一些统计学上的观点的话 ， 会需要会需要注意什么 。

**Rio** [1:53:51]
OK。

**吴涛** [1:53:52]
然后会有什么呃就是使用 R 里面的那个各种各样的 plot 功能来来来建立图表啊 ， 来建立 bar plot 呀 ， 然后告诉你各种 plot 有什么样的方法 。

**Rio** [1:54:05]
嗯哼 。

**吴涛** [1:54:06]
其实比较 intro 里面可能 。

**Rio** [1:54:08]
嗯哼 ，不错 。其实我想想起上次是谁说的 ， 说这个我们这个高中大学数学学那么多什么微积分 ，其实并没有什么鸟用 ， 对这个日常生活反而是应该把这个函数统计学统计学数理统计数理统计做教的比较深刻 ， 反而对日常生活 。

**吴涛** [1:54:28]
慕瑶说的吧 ， 这是 。

**Rio** [1:54:29]
应应该是吧 ， 应该是慕瑶说的 ， 对 。

**吴涛** [1:54:32]
对 。

**Rio** [1:54:32]
我我我在此深刻表示认同 。

**吴涛** [1:54:35]
嗯哼 ， 呃 ， 好吧 ， 所以这门课刚刚开了两个礼拜 ， 如果你们有兴趣的话也还是可以跟进来 ， 然后还挺有意思的 。

**Rio** [1:54:45]
跟吴涛一起学习进步 。

**吴涛** [1:54:49]
对 。

**Rio** [1:54:50]
哈哈哈 ，OK， 那就到这吧 。

**吴涛** [1:54:53]
啊 ， 刚好两周 。

**Rio** [1:54:54]
我们两周之后再见 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
