# 21. Debugging

内核恐慌 · 2015-07-12

<https://lib.pan.icu/37dc12d5-5c66-4b8b-ab80-a090cd52bc6f>

本期《内核恐慌》聚焦程序调试，两位主持人从密码管理习惯（吴涛的三层密码策略与Rio的随机密码+不同邮箱）切入，随后讨论Hacking Team被黑暴露Flash零日漏洞、Atom 1.0发布、卡马克计划在VR中用Racket构建脚本环境等新闻。在调试主题中，他们介绍了debug一词源自Grace Hopper的飞蛾故事，对比了打印调试法（printf）、命令调试器（GDB/PDB）、图形化调试器（DDD）及IDE集成调试的优劣，并提及Valgrind等profiling工具。吴涛分享了在博彩公司遇到的iOS Chrome用户有极低概率看到他人账户的诡异bug（最终未能重现，只能屏蔽该浏览器），以及索尼PS游戏因手柄干扰晶振导致记忆卡损毁的经典案例。节目强调先确定边界条件再编码的良好习惯比调试技巧更重要。

## Questions this episode answers

### Rio和吴涛在播客中分享的密码管理方法各是什么？

吴涛采用三层密码策略：最底层是弱密码，在无关紧要的网站共用；第二层每站不同，基于网站网址派生出部分固定的密码；最高层用于网银等，每站独立且与网站无关，每两个月更换一次，并启用两步验证。Rio则使用密码管理器，为每个网站生成随机密码，并配以唯一邮箱，很少更换密码，选择信任苹果公司的安全性。

[2:52](https://lib.pan.icu/37dc12d5-5c66-4b8b-ab80-a090cd52bc6f?t=172000)

### 2015年Hacking Team被黑事件泄露了哪些重要的安全漏洞？

意大利安全公司Hacking Team被黑客入侵，泄露了400GB数据，其中包括一个Flash zero-day漏洞。该漏洞允许攻击者在用户访问含Flash的网站时，以管理员权限在受害设备上执行任意代码，严重威胁用户数据安全。漏洞曝光后，Adobe发布了紧急补丁，但在此前已被暗中交易和使用。

[26:37](https://lib.pan.icu/37dc12d5-5c66-4b8b-ab80-a090cd52bc6f?t=1597000)

### 吴涛曾遇到的最令人头痛且未能解决的bug是什么？

他在一家博彩公司工作时，发现一个极难重现的bug：使用iOS Chrome登录网站的用户，有万分之一到十万分之一的概率看到其他用户的账户信息。团队耗时多日分析session replicate、内存dump甚至请专家排查，始终未能定位原因，最终只能通过屏蔽iOS Chrome访问来规避。这个bug至今未解。

[1:09:16](https://lib.pan.icu/37dc12d5-5c66-4b8b-ab80-a090cd52bc6f?t=4156000)

## Key moments

- **[0:00] 开场**
- **[2:44] 密码管理**
  - [3:49] Q: Rio为何不用1Password了？改用iCloud钥匙串
  - [4:47] 吴涛建议用中间人攻击自家路由器来检测密码管理器的安全性
  - [5:32] 吴涛因极度多疑而不使用任何密码管理器
  - [6:47] 要完全信任一个系统，需从硬件到软件逐层审计，如同Richard Stallman的做法，但现实中不切实际
  - [7:10] Rio信任苹果是因为其商誉损失高达数十亿美元，一旦被发现恶意行为将代价巨大
  - [8:45] 吴涛选择不相信任何人，认为世界上没有绝对可信的东西
- **[26:23] 泄密事件**
  - [26:48] Hacking Team公司遭黑客入侵，400GB机密数据泄露
  - [27:12] 讽刺：名为Hacking Team的安全公司自己反被黑
  - [29:40] 泄露数据中包含严重的Flash零日漏洞，可让攻击者以管理员权限执行任意代码
  - [31:13] 吴涛对安全漏洞交易市场上数据的海量规模感到吃惊
  - [33:12] Rio将泄露的漏洞利用工具比作原子弹图纸被公开
  - [34:13] Rio希望苹果能迅速成立专门小组修补Hacking Team泄露的漏洞，但不确定是否会做
- **[41:09] Atom 1.0**
  - [41:19] Atom 1.0发布，历经7年开发和155次发布
  - [42:59] Atom 1.0宣传视频模仿1960年代家用电脑预测视频的风格
  - [44:10] Atom、Nucleus和VS Code都基于Electron（Web技术）构建
  - [45:13] Q: Atom 1.0能打开20兆的文件吗？可能仍然不行
  - [45:56] VI和Emacs等古老编辑器因内存占用少而长盛不衰，而Electron应用动辄500MB
  - [46:19] Lawrence说“Web app is for animals”
- **[49:39] VR编程**
  - [49:43] John Carmack计划用Racket（Scheme方言）为VR构建脚本环境
  - [51:16] 吴涛将Carmack的VR脚本环境比作3D版LOGO海龟绘图
  - [52:23] Scheme语言可在运行时修改代码的特性，有望实现在VR中增量式修改
  - [53:24] HoloLens实际视野狭窄，吴涛修正了之前过高的期望
  - [54:48] HoloLens的视野就像眼前摆了一台显示器，而非环绕式的穹顶体验
  - [55:39] 微软展示HoloLens在医院中查看3D跳动心脏等用例
- **[57:21] 调试初探**
  - [57:34] Rio在调试上花费约20-30%的时间
  - [58:23] 吴涛引用文章：先思考再编码的程序员效率是边调试边编码者的10倍
  - [59:43] 一位60岁只用两个手指打字的程序员，思维清晰，编写代码正确高效
  - [1:00:51] 同事声称完成80%但剩余20%细节调整耗时80%时间，实为大量重写
  - [1:02:02] 写代码如同写文章，应先思考构思再打开IDE
- **[1:04:16] Bug故事**
  - [1:04:16] “debug”一词起源于Grace Hopper从继电器中取出飞蛾的故事
  - [1:05:51] “debug”一词在Hopper之前就用于工程领域，直到1960年代才在计算机界普及
  - [1:06:47] IPN串台bug无法复现，因只在特定运营商网络偶发
  - [1:09:16] 吴涛经历：会话复制bug导致iOS Chrome用户万分之一概率看到他人账户，最终屏蔽Chrome
  - [1:15:11] Quora上最难bug：PS游戏存盘时晃动控制器导致记忆卡全毁，因晶振干扰控制器芯片
- **[1:20:16] 调试方法**
  - [1:20:21] 大多数bug其实很简单，比如忘记花括号
  - [1:21:44] 吴涛曾帮助两个学生解决因缺失花括号导致的4小时debug
  - [1:22:35] Heartbleed漏洞就是一个简单双return错误，却多年未被发现
  - [1:23:31] IDE的静态分析功能可帮助捕捉低级的编码错误
  - [1:24:13] Printf调试法：古老的printf语句调试
  - [1:26:20] Printf的三层境界：检测控制流、打印变量值、条件调试输出
- **[2:10:13] 前后端**
  - [2:10:51] Google App Engine引入“云调试”以应对分布式系统调试挑战
  - [2:11:26] 事后调试（postmortem）如同法医尸检，通过core dump还原崩溃现场
  - [2:13:14] 大数据调试可能需等待数小时甚至数天重跑作业
  - [2:14:05] Erlang支持热代码替换，无需重启即可调试和更新
- **[2:16:10] 性能分析**
  - [2:16:10] Valgrind等性能分析器可帮助定位内存泄漏
  - [2:17:19] Xcode的profiler可显示内存使用变化，用于检测泄漏
  - [2:17:31] 调试时可能跳入汇编，掌握基本汇编知识有助于定位问题
  - [2:19:12] 吴涛总结：良好的编码习惯比调试技巧更重要

## Speakers

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

## Topics

软件开发

## Mentioned

Atom (product), C (product), C++ (product), Chrome (product), DDD (product), Eclipse (product), Electron (product), Emacs (product), Firebug (product), GDB (product), Java (product), PyCharm (product), Python (product), Sublime Text (product), TextMate (product), Valgrind (product), Vim (product), Visual Studio (product), Visual Studio Code (product), Xcode (product)

## Transcript

### 开场

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

内核恐慌的网址是 ipn.li/kernelpanic。 我们推荐大家使用 Podcast 客户端订阅我们的节目 ； 如果您不知道该用哪个客户端 ， 欢迎访问 ipn.li/faq。

同样欢迎您为我们的节目捐款 ， 捐款地址是 ipn.li/kernelpanic/donate。 捐款金额随意 ， 只要是能够被 8 整除的正整数就可以 。

捐款不会为你带来什么 ，不捐也不会让你失去什么 。 我们的口号是 "No hard feelings"。

唉 ， 好了 ， 嗯 ， 今天是第 21 期节目 。 呃 ， 您嗓子怎么样 ？

**Rio** [0:50]
还凑合 ， 现在 。 你怎么样 ？

哈哈哈 ， 这段不是故意加的吧 ？

**吴涛** [0:58]
这段 ， 这段千万要抹掉 。 嗯 ， 呃 ， 我在女朋友的悉心照料之下， 现在已经好了九成 。 但是剩下的一成 ， 总是在 、 总是一直困扰着我 。

就是说几句话还是会咳嗽一下， 然后就会产生那种 ， 呃 ， 第一句话前面说得比较平缓 ， 后面越说越急 ， 说完之后就开始咳了 。

**Rio** [1:18]
没气了 ，是吧 ？ 对 ， 我 、 我发现有这个状况 。 就上次感冒的好像其实只有这个 ， 叫什么来着 ， 支气管炎 ， 对吧 ？

**吴涛** [1:25]
对 ，其实就是咽炎转化 ， 转化成支气管炎 。

**Rio** [1:29]
这怎么说 ， 怎么算 ？ 同病相怜 ？

**吴涛** [1:31]
嗯 。

**Rio** [1:32]
还是说什么隔空传染 ？

**吴涛** [1:34]
哈哈哈 ， 对 ， 这病毒现在已经可以电子化了 ， 然后数据 ，digitalize， 然后传到你那边 ， 或者你传给我 。

**Rio** [1:43]
Real virus spread across the cybernet.

**吴涛** [1:46]
Yeah.

**Rio** [1:47]
嗯哼 。

**吴涛** [1:50]
不知道生物能不能真的有一天以数字化的形式存在 。

**Rio** [1:55]
理论上可以吧 ， 就是那边探测一下 DNA， 然后这边合成一下 ，不就出来了吗 ？Maker movement， 对吧 ？ 搞个 3D 打印机 ， 直接打印病毒出来 。

**吴涛** [2:05]
你说的是传输生命 ？ 我 、 我 、 我想的是能不能就让生命就这么生活 、 生存在网络上， 就不用再转化为一个实体 ， 能不能 ？

**Rio** [2:15]
这个 ， 就那天我们还在那个 IT 公论里面聊这个事情 ， 说要 、 要实现这一点 ， 我们先要解决一些哲学上的问题 。

什么叫生存 ，是不是 ？ 对吧 ？

**吴涛** [2:27]
嗯 。

**Rio** [2:27]
然后什么叫意识 ， 对不对 ？ 现在 、 现在其实这个 、 这个问题有 、 有答案了吗 ？ 我现在还 、 还没有看到有一个什么确切的 、 靠谱的解吧 。

**吴涛** [2:35]
不知道 。 我觉得下次你们可以请那个 ， 呃 ， 脑科学博士赵晨上一次你们的节目吧 。

**Rio** [2:41]
哈哈哈 ，OK。

**吴涛** [2:44]
对啊 。 好吧 ， 那我们先 ， 呃 ， 讲一下上一期的反馈 。

### 密码管理

**Rio** [2:52]
嗯 ， 好 ， 我有一个反馈 。 有一位叫做 Danmark 的朋友在微博上给我们留了个言哈 。他这个消息这么说的 ： 有个问题想问 Rio，在看不到源码的情况下， 如何知道 1Password 不是一个密码专业盗窃器呢 ？

以上期测试的语言来说 ， 我们只能把程序当作一个黑箱 ， 给一些输入来观察输出 ，但是我们并不能证明 （ 打引号 ） 它是可信的 。

也就是说 ， 实质上是我们选择相信 1Password。 想请问 Rio， 是一句 " 哪些因素认为 1Password 可信的呢 ？" 然后他的第二个问题是说 ， 呃 ，是否 Rio 只在 1Password 存储安全等级较低的密码 。

那我能 、 能问一 、 就是 ， 那能问一下安全等级较高的信息 ， 比如财务相关的 ，Rio 会数字化吗 ？ 如果会的话 ，Rio 的方案是什么 ？

呃 ， 这里集中解答一下哈 ， 就是首先 ， 我已经不用 1Password 了 。其实我也很没用 ，其实我也没怎么用过 。

它就是当时就有 、 有 、 有买 ， 还是很久以前了吧 ， 对 ， 还是它的 2.0 还是 2. 几的版本 ， 我买过 ， 然后用了一下， 觉得还凑合吧 。

然后后来那个 、 那个苹果的 KTrain 不是出了那个 iCloud KTrain 吗 ？ 就是可以跟那个 iCloud 通过同步到你的其他的 iOS 设备或者是 Mac 上面吧 。

然后选择全部都存在那个 KTrain 里面 。 然后呢 ， 我的绝大部分信息都是数字化的 ， 然后比较一些比较机密的 ， 什么银行卡 、 账号密码之类的 ，也是存在那个 KTrain 里面的 。

所以刚才那个问题是说 ， 如果没有源码的话 ， 你怎么去选择相信这个 1Password 或者是 KTrain 的安全性呢 ？ 呃 ， 正确答案是你没法确信 ，因为你没有源代码 ， 对吧 ？

**吴涛** [4:47]
也 、 也不 、 不尽然吧 。 你可以 、 你可以自己弄一个中年人攻击啊 ， 你可以把自己的路由器 、 你可以嗅探自己的路由器 ， 然后看它到底在和哪些网站联络嘛 。

**Rio** [4:59]
通信 ， 对吧 ？

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

**Rio** [5:00]
对 ， 这个还是当作黑盒来处理 ， 去观察它的输入输出 ， 或者说你做得再彻底一点 ， 你去反编译它的那个 、 那个可执行文件 ， 看它有在哪些地方调用网络 ， 然后你足够牛逼的话 ， 应该能反解出来说它在哪些地方时候 、 哪些时候传输了 ， 让这个传输之前做了些什么东西 。

但是我相信绝大部分理智的正常人是不会做 、 不会去做这件事情的 。

**吴涛** [5:23]
如果你足够多疑的话 ， 那就如果你 paranoia 到这个程度的话 ， 那基本上你肯定不会使用任何密 、 密码管理软件了 ， 比如我 。

哈哈哈 。

**Rio** [5:34]
不是 ， 应该是说如果你需要这个层级的这个确信的话 ， 要么你就学那个 Richard Stallman， 就是你要么用到所有软件 ， 我知道就是所有软件 ， 包括像那个硬件的 BIOS 啊 ， 那个就是那个什么 ， 这包其他的中间都不说了 ， 什么操作系统啊 、 应用程序啊 ， 都必须要是开源的 ， 你才能够去确保每个东西 。

然后 、 然后你对硬件的要求也是有高要求 ， 你必须用那种所谓的 ， 就是 open hardware， 就是不要有那种藏有私有代码的那种硬件 。

就包括某一个 ， 比如说现在很多这个用硬盘或者 SSD， 上面不会有很多芯片吗 ， 对吧 ？

**吴涛** [6:11]
嗯 。

**Rio** [6:12]
你对那些芯片的要求 ，也是要求它们能 、 能开源的 ， 能知道你它在里面在做什么 。 你这个时候你才可以 ， 就是你在有所有的源码的基础下， 你才可以确信地说这个 、 这个机器没有做你 、 你不想让它做的事情 。

但是我觉得 。

**吴涛** [6:27]
那 Richard Stallman 是用 Happy Hacking Keyboard 吧 ？

**Rio** [6:31]
呃 ， 对 ，他接一个那个 。

**吴涛** [6:33]
如 、 对 ， 如果是的话 ，Happy Hacking Keyboard 的 controller 是闭源的 。

**Rio** [6:37]
是吗 ？

**吴涛** [6:38]
是啊 。

**Rio** [6:38]
OK， 所以这又 、 又 、 又存在一个漏洞了 ， 对吧 ？ 你不确定它那个 、 那个 、 那个键盘里面有没有那个 key logger， 就是键盘记录器 ， 对吧 ？

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

**Rio** [6:47]
啊 ， 这 、 这又是一个不确定因素 。 所 、 所以其实你看 ，在现代这种情况下， 你要求说每个步骤都是被 、 可以被 audited， 就是可审计的 ， 基本是不现实的 。

**吴涛** [6:57]
对 ，是非常非常难的一件事情 。

**Rio** [6:59]
对 ， 所以这个时候怎么办呢 ？ 那你只能选择相信一些人， 或者是 ， 呃 ， 一个人了 。 这个时候就可以 ， 你可以选择说 ， 说你相信苹果呢 ， 还是相信 1Password 呢 ？

当然你选择相信 1Password， 你刚好跑的又是 Mac 系统的话 ， 你最终还是得选择相信苹果 ， 对吧 ？ 所以我的策略就比较简单了 ， 那我就相信苹果好了 。

**吴涛** [7:20]
那叫 leap of faith。

**Rio** [7:22]
对 。

**吴涛** [7:22]
就像信上帝一样的 。

**Rio** [7:24]
没错 。 苹果叫嘛 ， 那个一拜一拜 。

**吴涛** [7:26]
对 。

**Rio** [7:27]
啊 ， 就是这个时候你就只能选择相信 。 然后为什么我选择相信苹果呢 ？ 这个理由也很简单 ，因为这个什么 ，他已经把这个牛逼吹出去了嘛 ， 对吧 ？

就是我们不 、 不 、 不销售这个用户隐私 、 隐私信息 ， 我们也不植入后门 ， 我们也不做一些什么对用户有害的事情 。

因为我比较确信的点是 ， 如果被人爆出来说苹果有意在那个 KTrain 里面 ， 或者其他 Mac 里面做了什么手脚 ， 最后被人发现的话 ，他对他的这个叫做商誉啊 ， 就比方说 ， 呃 ， 我们这个在 、 这个在会计上是有这么一个概念 ， 叫做商誉 ， 叫 goodwill， 就是公司的品牌啊 ， 这个东西的 、 这些东西的价值 。

如果苹果被发现它故意 ， 比如说因为 AIS 给它下了 、 给它什么 、 给它什么秘密法令 ， 让它在电脑里面做什么手脚 ， 如果它真的这么做了 ， 我相信对它商誉是非常损 、 非常大的损失 。

那这个损失通常是以多少 ？Billion dollars， 就是十亿美元为单位来计价的 。

**吴涛** [8:26]
Billion dollars。

**Rio** [8:27]
对 ， 所以 、 所以这个时候我 、 我相信在如此大的这个 、 呃 ， 压力下 ，以及从他们这么多年坚持下来的道德观念来看 ， 我觉得我相信他们是可以的 。

但至于说你信不信 ， 请你自己做自己的选择和判断 。

**吴涛** [8:45]
对 ， 比如说我就选择不信 ，因为这世界上没有什么东西是可信的 。

**Rio** [8:51]
哈哈哈 。

**吴涛** [8:52]
我不是故意跟你开玩笑 ，但是 。

**Rio** [8:55]
Richard、Richard Folk Stallman， 你好 ， 我们来问一个 。

**吴涛** [8:58]
哈哈哈 。 嗯 ， 对 ， 我反正我也顺便说说自己的选择吧 ， 就我 、 呃 ， 我是不用任何密码管理软件的 。

**Rio** [9:07]
嗯哼 。

**吴涛** [9:08]
然后 。

**Rio** [9:08]
所以你的密码是靠一套机制来实现的是吧 ？

**吴涛** [9:11]
对 ， 我 、 我有一套比较详尽的密码存储和管理机制 ， 然后 。

**Rio** [9:16]
你的大 、 大脑自带密码生成器 。

**吴涛** [9:19]
对 ， 我曾经在知乎上写过一个答案 ， 反正简单的来说就是密码要分三层 。

**Rio** [9:25]
嗯哼 。

**吴涛** [9:25]
呃 ， 最基本的密码是一个大概一两年换一次的密码 。

**Rio** [9:30]
嗯哼 。

**吴涛** [9:31]
然后这个密码可以是在所有这些网站上都一样的 ， 比如说什么 ， 啊 ， 你 、 你去你想要下载一个 SQL Developer， 从 Oracle 网站上下一个 SQL Developer， 你可以 、 你可以 ， 它强迫你注册 ， 然后你此时你可以选择去下一个什么 BugbeeNotes 之类的 、 呃 ， 浏览器插件 ， 它自动帮你填一个那个已经有人注册过的 、 呃 ， 弱密码 。

**Rio** [9:57]
嗯哼 。

**吴涛** [9:58]
呃 ， 另外一个选择就是你自己维护一个非常弱的密码 ， 然后基本上最底的 、 最低级的这一层密码我就是用一个 、 一直用一个最一样的 。

**Rio** [10:07]
嗯哼 。

**吴涛** [10:08]
呃 ， 第二层密码是每个网站不一样 ， 呃 ，而且但是有一部分是一样的 。 呃 ， 这个是比如一些比较重要的网站 ， 比如像什么知乎呀 ， 或者是微博啊之类的 ， 这种跟你的 identity 相关的东西 。

**Rio** [10:27]
嗯哼 。

**吴涛** [10:28]
呃 ， 然后这些密码有一套生成机制 ， 就是我看到它的网址 ， 或者是一般是看到网址的时候会想到这密码应该是怎么构建的 。

**Rio** [10:37]
嗯哼 。

**吴涛** [10:38]
然后第三层密码就是什么网银的密码呀 、 信用卡的密码呀 ， 或者是 ， 啊 ， 什么报税的 、 税务局的密码之类的 。

这个密码是每个网站都不一样 ，而且跟网站本身没有关系 ，而且我自己 、 自己有时候必须去看一个 reminder 才能看出来 ， 才能 、 才能想起来 。

**Rio** [10:57]
所以你还是记录了密码在某一个地方 ， 对吧 ？

**吴涛** [11:00]
但我只是写 ， 等于我只记录了这个密码的 salt， 你可以理解为 。

**Rio** [11:05]
呃 ，hint 吧 ， 应该是 。

**吴涛** [11:07]
呃 ，salt 就是那个 ， 就是看到这个 、 看到这一串东西我才能够重新构建出那个密码的这么一个 。 对 ， 可以说的是 。

**Rio** [11:18]
对对对 ，salt 是你已经有一个密码 ， 然后你通过加这个 salt 这个盐 ， 变成一个新密码去输入的 ，是吧 ？ 你是这么一个过程 。

**吴涛** [11:27]
OK， 你说的对 。 对吧 ？ 好吧 ， 我 、 我因为我在那个纸上写了 salt 这个词 ， 所以我一直叫它 salt。 你说的没错 ，是只能说是一种 。

**Rio** [11:37]
是一个 hint， 对 ， 是一个提示 ， 让你想起来密码是什么 。

**吴涛** [11:40]
对 ， 然后最重要的是 ， 呃 。

**Rio** [11:42]
比如说什么飞流直下三千尺 ，是不是 ？

**吴涛** [11:45]
哈哈哈 ， 没有那么弱 。 我 、 我或者说我文学素养没有那么高 。 呃 ，但最重要的是 ， 就是第二层和第三层密码要比第一层密码换得更勤快一些 ， 就是 。

**Rio** [11:57]
OK。

**吴涛** [11:57]
每套密码可能两个月就要换一次 。

**Rio** [11:59]
OK。

**吴涛** [12:00]
这个是比较重要的 。 但是这是一个 paranoia 的人才会需要做的事情 。

**Rio** [12:05]
嗯哼 。

**吴涛** [12:07]
呃 ， 另外就是所有能够采用两 、 呃 ， 二步 、 嗯 ， 叫什么 ， 呃 。

**Rio** [12:11]
两步验证 。

**吴涛** [12:12]
对 ， 两步验证的网站一定要启用两步验证 。

**Rio** [12:16]
两步验证是手机上做的是吧 ？ 用那个什么 Google Authenticator 还是用什么 ？

**吴涛** [12:20]
呃 ， 对 ， 我是用 Google Authenticator， 然后 Battle.net 有一个 ， 然后， 嗯 ， 对 ， 然后部分德国银行会给你一个卡 ， 这卡上可以按那个 。

**Rio** [12:30]
啊 ， 那个是 。

**吴涛** [12:31]
还蛮爽的 。

**Rio** [12:32]
叫做密码器嘛 。

**吴涛** [12:34]
对 。

**Rio** [12:34]
对对对 ， 中国很多现在银行也有了 。

**吴涛** [12:37]
嗯 ， 我觉得那个其实是比较安全的一个 、 一个选择 。

**Rio** [12:40]
对对对 。 呃 ， 我的那个密码管理方法上， 我在 、 在同一个知乎问题下我也有打好 ， 我们都有在那里回答 ， 到时候把那个链接贴出来吧 。

我的就是比我的比你更机器化 ， 然后更做得更绝 ， 就是所有的策略都是一样的 ， 每个网站都是随机生成的密码 ， 我自己都不知道 ， 必须用密码管理器看的 。

**吴涛** [12:58]
哈哈哈 。 但此时就是你 、 你可能会选择在省 、 你必须在省心和 、 呃

，有安全感之间找到一个 、 找到一个 balance。 就我的方法肯定不适合任何人 ，但 。

**Rio** [13:15]
对 ， 我的也肯定不适合任何人 ，因为太麻烦了 。 但是我是不介意麻烦的 。 然后， 呃 ， 然后你 、 你刚才说是你是有些网站是共享一个密码的嘛 ？

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

**Rio** [13:29]
或者是每个都是不同的密码的 ？

**吴涛** [13:31]
嗯 ， 对 ， 从这个角度讲你比较 、 你要比我安全一些 ，但 。

**Rio** [13:35]
没错 ，而且我连每个 、 每个的邮箱账号都是不一样的 ， 就每个注册账号的邮箱都是不一样的 。

**吴涛** [13:40]
对 ， 我觉得这个是 Rio 最变态的一点 。他 、 他有一个自己的 Google、 是 Google Apps，是吧 ？

**Rio** [13:47]
对对对 。

**吴涛** [13:48]
然后他给每一个网站都有一个自己不同的用户名 ， 然后导致有时候我会想要在这个网站上跟 、 给他分享一个什么东西 ， 然后他告诉我说 。

**Rio** [13:56]
他得先问我是哪个账号 。

**吴涛** [13:58]
那个网站的 、 那个网站用户名是另外一个 ， 然后我就 。

**Rio** [14:01]
对 ，因 、 因为为什么要这么做 ，其实除了在一个安全上， 还有一个就是那个 、 那个匿名性的问题嘛 。 就是很多现在很多那个网站 ， 它是可以通过你使用同一个账号判断出 ， 诶 ， 你在那个网站用了另外一个什么服务 ， 对吧 ？

就我不希望这样被他们这个通过这个交叉比对账号的方法 tracking 到 。 因为有很多这个 ， 就其实我们可以讲一下那个之前很多人账号被泄露出去的原因 ，也比较简单 ， 就是很多人都是用同样一个账号 ， 比如你就某一个固定的邮箱地址 ， 或者是你的手机号码 ， 或者是某个人固定一个 ID， 对吧 ？

然后一个一套固定的密码 ， 注册多个账号 ， 就是刚才你说的那个第一层那种不 、 不怎么安全的东西 。

然后其中某一个服务被人偷库了 ， 就是所谓他的那个密码用户账号的那个 、 那个数据库那张表被人爆出来 。

这样的话 ， 别人拿到这个信息之后 ，他可以挨个去试嘛 ， 常见的网站上， 你同一个账号 、 同一个密码 ，有没有注册其他同类的服务 ， 对吧 ？

就可以一次连带攻陷你的好多这种东西 。 所以我这个就可以从根源上阻断这一点 。 第一个 ， 你没有办法把我的那个不同的网站的账号能够串起来 。

第二个就是你就算你发现我的这个账号是这个人用的这个账号 ，是等于那个人在那个账号上面去 ， 你 、 你从用同一个密码去试也是不行的 ，因为每个密码都是不一样的 。

**吴涛** [15:23]
嗯 。

**Rio** [15:24]
然后， 呃 ， 我跟你有一点不一样 ， 就是我不怎么去更换密码 。 就是我不会说隔三差五就换它一轮 ， 就是比较不频繁吧 ，也换 ，但是不是非常频繁 。

因为我的理念是这样子的 ， 就是照按照我这种用法和注意事项的结果 ， 如果这样密码被泄露 ， 一般是因为对方网站被偷库了 。

这个时候你换不换密码是没有 、 没有任何区别的 。

**吴涛** [15:51]
呃

，也有的确是有道理 ，但是 。

**Rio** [15:55]
对 ， 然后就我已经很麻烦了 ， 我就不想再给自己添更多的麻烦 。 啊 ， 然后关于两步验证 ， 我也是就说基本上就是重要的服务 ， 就其实提供两步验证的基本上都是重要的服务 。

对 ， 然后就基本上有两步验证的我都开了 。 然后我在 、 呃 ， 那个 iOS 上装了一个叫做 Authy 的一个应用 。

呃 ， 之前有用那个 Google Authenticator， 我发现它不太好使 ， 就是那个界面也比较糟 、 糟糕嘛 。 然后 Authy 会稍微好一点点 。其实当年最主要的原因是 Authy 有一个那个 、 呃 ，Mac， 就是 OS 10 的一个 、 一个应用 ， 它理论上是可以通过蓝牙和你手机上那个 Authy 连接 ， 这样的话你就不用打开手机 ， 呃 ， 就能通过电脑上那个 Authy 的插件直接把那个 、 那个一般是一个六位数的数字嘛 ， 读出

来 。 后来我发现其实不行的 ， 就是那个 、 那个是要求手机上那个 Authy 是在工作状态才可以的 。 所以最终你还是得开一个那个 、 呃 ， 手机上的 Authy， 然后再开电脑上那个 Authy 去跟它蓝牙共享 ， 这样比较麻烦嘛 。

最后这样还是就直接在手机上翻 ， 六位数也不是特别 、 不是特别麻烦 ， 对吧 ？ 就是可以输一下还可以 。

然后后来那个 iOS 8 还是 7 不是有那个叫做 Notification Center 嘛 ？ 不是 ，有的那个 Today、Today、Today 什么 ？Today Extension 还是叫什么来着 ？

就是从顶上 。

**吴涛** [17:24]
Today View。

**Rio** [17:25]
对对 ，Today View， 对 ， 从顶上拉下来 。 然后 Authy 它加了这么一个功能 ， 就是它可以直接在里面加个快捷 、 快捷访问嘛 ， 就可以直接拉下来翻到 Authy 的那一栏 ， 然后点击某一个账号进去 ， 再输一下这个密码或者验一下指纹 ， 就可以直接取到那个六位数的那个验证码了嘛 ， 对吧 ？

所以这样的话就是还是 、 还是比较方便的 。

**吴涛** [17:46]
然后还有一种方式 ， 呃 ， 就是用一个硬件的 USB 设备 ， 呃 ， 一个 。

**Rio** [17:53]
这个国内 。

**吴涛** [17:54]
叫什么 ？

**Rio** [17:55]
国内大家都很熟 ， 叫 U 盾嘛 。

**吴涛** [17:57]
对 ，U 盾 。

**Rio** [17:58]
那个银行的那种 。 它其实还有好几种形式哈 ，不光是有 U、USB 的 ， 就 USB 的都有好几种 。 第一种是最传统的那个 ， 我记得当年是工行吧 ， 我看办的第一个 U 盾 ， 就插上去 ， 它里面是其实就是内 、 内置一个 、 呃 。

**吴涛** [18:14]
密码 。

**Rio** [18:14]
私钥啦 。

**吴涛** [18:14]
私钥 ， 啊 ， 对 。

**Rio** [18:15]
不是 ， 它是一个私钥 。

**吴涛** [18:16]
私钥生成器 。

**Rio** [18:17]
它是一个 ， 这就是一个内置的私钥 。

**吴涛** [18:19]
嗯 ？ 没有密码生成器吗 ？

**Rio** [18:21]
没有密码生成器 ， 它是验证那个系统用的 。 我如果我理解没错 ， 应该是这样子 。 它 、 它就是给签名用的嘛 。

然后那个私钥它是一个叫做 HSM 啊 ，Hardware Security Module， 应该是叫这个名字 。

**吴涛** [18:35]
OK， 我 、 我 OK。 因为我们当时有一个同学在研究这个 ，他说里面是一个 ， 或者他的意思是每次给出来的私钥只是 ， 呃 ， 所有可能私钥之中一种 ， 就是 。

**Rio** [18:48]
哦 ， 这么高级 。

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

**Rio** [18:49]
OK。

**吴涛** [18:50]
Anyway。

**Rio** [18:51]
反正 、 反正 anyway， 就是逻辑上应该这样 ， 就是它里面是一个只有那个硬件本身才知道的一个秘密 ， 然后这个秘密是不能通过 USB 接口读取的 。

它只能说你提供一个东西给它帮你验证 ， 帮你做一个签名 ， 然后这个签名再返回到你电脑里面 ， 这样再传输给对方网站 。

然后那个 ， 呃 ， 应该是 ， 对 ， 然后那边可以通过这个签名验证 ， 确实是经过这个私钥 、 呃 ， 签名过的东西 ， 大概是这么一个过程 。

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

**Rio** [19:18]
然后还有一种是 USB 的 ， 哎 ，不是 USB， 就是那个刚才你说那个密码器啊 ， 就是一个它不需要 、 不 、 不需要通过 USB 接口来插的 。

它就是一个那个叫 RC 嘛 ， 那个美国那间公司 ， 它有一个小 、 小的一个挂钥匙串上一个小东西 ，有个小屏幕 ， 它就是 、 就是那个 Authy 的硬件版本 。

它每隔可能 15 秒 、30 秒它会换一个数字 ， 然后这个数字它那个顺序 ， 这个 sequence， 就是那 、 那串数字的顺序是既定的 ， 然后就可以通过那个当前的时间来 、 来判定 ， 就 、 就可以对方服务器上也知道说这个时候是不是这个数字 ， 就这个 sequence， 就可以通过这个 ， 就是一个随机数列嘛 。

**吴涛** [20:01]
对 ，其实我刚才想说的就是另外一种形式 ， 就是要求你一定要插入电脑里面 ，而不是一个 。

**Rio** [20:07]
就 USB 的那个就是 。

**吴涛** [20:09]
对 。

**Rio** [20:09]
就是 key。

**吴涛** [20:10]
就是要求你一定要插入电脑里面 。

**Rio** [20:11]
对 ，但这里有个问题 ， 就是现在不是很多这个 、 呃 ， 手机了嘛 ， 没有 USB 接口怎么办 ？ 后来上次我看他们有一种另外的一些方案 ， 就是那个是可以插 USB 口 ，也可以通过一个那个音频的接口啊 ， 就是那个耳机线 、 耳机插 、 耳机插线 ， 然后插到手机上， 然后它那个银行软件做了一个什么特殊的协议 ， 通过这个播放一个声音 ， 就是就猫 、 就猫嘛 ， 那个大

家记得那个以前那个播放商的猫吱吱吱那个声音嘛 ， 对吧 ？

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

**Rio** [20:41]
它就是说通过那个东西来 、 通过那个 、 呃 ， 语音来编码一串那个数字信息嘛 。 然后它这个就是用了一样的原理 ， 就通过那个 、 那个手机的耳机那个接口去输入输出一 、 一段声音 ， 然后那个声音是包含一些特殊的编码过的这个私钥的那个认证的信息的 。

**吴涛** [20:59]
嗯 。 然后德国还有一种方法 ， 就是它会在屏幕上不停地闪烁一组 、 呃 ， 二进制的纹样 ， 然后你用它的那个密码生成器上背后有一个类似摄像头 ， 或者说应该是不是摄像头 ， 就是一个感光元件 。

**Rio** [21:14]
OK。

**吴涛** [21:14]
然后你 、 你把那个感光元件 hold 在屏幕的上方 ， 然后等一会儿之后这个 、 这个 。

**Rio** [21:21]
它就可以识别出来嘛 。

**吴涛** [21:22]
识别出来 ， 然后生成一个密码给你 。

**Rio** [21:25]
What？ 这个好神奇 。 好啊 ，但这样不是很费电吗 ？ 那个密码器 。

**吴涛** [21:30]
密码器就像我说的 ， 它只是一个感光元件而已 。 就是它要求 。

**Rio** [21:34]
就是密 、 密码器需要 、 需要有 、 有供电才可以识别那个 。

**吴涛** [21:37]
对 ， 密码器是装电池的 。

**Rio** [21:38]
对啊 ， 这样电池不就废得很快 。

**吴涛** [21:40]
还好吧 ， 我前 、 嗯 ， 四年前申请的一个 scanner 现在还能用 。 而且这个 scanner 要求你当时要把银行卡插进去 。

**Rio** [21:50]
哈哈哈 。

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

**Rio** [21:52]
好吧 。 那个 RC 那个 、 那个 、 那个密码器也是就是一个小电池可以用好几年的这样 。

**吴涛** [21:57]
嗯 。

**Rio** [21:58]
但是过了几年它就会 ， 它有一个有效期嘛 ，expire， 就是过了 。

**吴涛** [22:01]
嗯 。

**Rio** [22:01]
就跟那个什么 SSL 证书一样 ，有个有效期过了就作废了 。

**吴涛** [22:07]
瑞士银行发的那个密码生成器也是 ， 就是一张信用卡 ， 然后信用卡里面有个肯定有一块电池 ，因为它上面可以显示一个数字 。

然后我估计那个电池可以一直用到这个卡作废为止 ， 所以 。

**Rio** [22:18]
对啊 ， 一般就是什么三五年这样子 。

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

**Rio** [22:21]
呃 ， 上次那个就是 RC 这间公司不是被黑了吗 ？ 就是好多那个国内的企业也因为那个要全部换一轮那个 、 那个发出去的生成器嘛 ， 我记得好像有这么一个事 。

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

**Rio** [22:34]
所以安全还是挺难的一件事情 。

**吴涛** [22:37]
对 ， 一会儿新闻环节里面我们也要聊一聊最近的这个 Hacking Team 被 、 被 、 被抓的事情 。

**Rio** [22:43]
对 ，其实那个说到这个也顺便聊一下， 就是你用那个登录服务器 、SSH 登录服务器 ， 你是用密码还是用那个证书 ？

**吴涛** [22:52]
用证书呀 。

**Rio** [22:53]
用 、 呃 ，不是证书 ，key， 就是 。

**吴涛** [22:55]
啊 ， 你就用 private key 嘛 。

**Rio** [22:56]
对对对 。 然后我基本上我的那些服务器的话都是禁掉密码登录 ， 然后用 key 的 。

**吴涛** [23:02]
我只有 root 是这样的 。

**Rio** [23:03]
其实我觉得 ， 哎 ， 只有 root 是这样 。 好吧 ， 你还有其他账户吗 ？

**吴涛** [23:06]
有 ， 我平 、 你难道平时用 root 账户登录吗 ？

**Rio** [23:09]
不是不是 ， 就你其他账户可以用密码登录吗 ？

**吴涛** [23:12]
我其他账户可以用密码登录 ，因为有时候比如说临时抓了一个 iPad 必须 SSH 连上去 ， 怎么办 ？

**Rio** [23:20]
呃 ， 那个 ， 那你其他账户可以 sudo 吗 ？

**吴涛** [23:23]
呃 ， 可以 。

**Rio** [23:24]
那 、 那你跟 root 没有 。

**吴涛** [23:26]
Unfortunately。

**Rio** [23:26]
有什么区别呢 ？

**吴涛** [23:28]
说的也是 。

**Rio** [23:29]
对吧 ？ 你说那个 iPad 那个方案可以在 ， 就是正确的用 key 的 ， 就是密钥的认证的方法是每一个设备有自己的一个私钥公钥嘛 ， 一套 。

**吴涛** [23:40]
对 ，但有时候是拿不到这样一个设备怎么办嘛 。

**Rio** [23:43]
呃 ，也是 ， 还是给现实给跪了是吧 。

**吴涛** [23:47]
对 。

**Rio** [23:47]
嗯 ，其实我觉得私钥公钥这套方法是挺方便的 ，因为用私钥解决了这个密码和认证两个问题 ， 就身份认证和密码登录两个问题嘛 。

就是你现在那个你去一个这个开一个 、 一个普通的网络服务注册一个账号 ， 它还得让你输账号 ， 还得输密码 ， 对吧 ？

多麻烦 。 你用那个私钥就直接给它公钥就好了 ，而且它永远不知道你的私钥是什么 。

**吴涛** [24:13]
没错 。

**Rio** [24:14]
所以其实之前有很多尝试 ， 像那个什么最近一次应该是 Mozilla 搞那个叫什么 ， 嗯 ，SecureID 还是什么之类的东西 ， 还是 Persona， 我忘了 ， 忘了名字了 ， 反正就是想把这个这类 、 类的比较方便和安全的系统去替换掉这个密码 。

但是这个我觉得可能对大多数人来讲 ， 理解起这个私钥公钥加密这么一个过程 ， 或者说任何一套其他非密码的这么一个替代方案可能还是有点成本的 ， 所以并没有大规模推动起来 。

不过倒是在一些什么程序员的一些社区里面 ， 啊 ，其中也不多 ， 很少用 。 我觉得最显著的是那个 ， 你知道有一家那个专门生成 、 给人生成免费那个 SSL 证书的网站 ， 叫那个 StartSSL 嘛 。

**吴涛** [25:05]
好像听过吧 。

**Rio** [25:07]
它的那个就是它是要登录账号才能有一个 、 有一个账号系统的嘛 。 它那个就是通过那个客户端的那个证书来实现的 ， 它没有一个账号密码的这么一个概念 。

好像这是我用的唯一一家通过这种客户 、 那浏览器证书的方式来实现登录的 。

**吴涛** [25:26]
嗯 ， 这个其实我只能说我觉得要一个人接受抢口令和 、 呃 ， 验证码这件事情有时候已经很难了 。

我不知道 ，因为咱们接触的人可能平时都比较 tech savvy，但有就是其实很多很多用户都不知道验证码到底是拿来干什么用的 。

**Rio** [25:45]
你 、 你说哪 、 哪个验证码 ？

**吴涛** [25:47]
就是那个防止 ， 就是图灵测试验证码 。

**Rio** [25:50]
啊 ， 那个人机测试那个验证码 。

**吴涛** [25:52]
对 ，在这种情况下你要向他解释什么是公钥私钥以及它为什么更安全 ，其实是 。

**Rio** [25:56]
是的 ， 所以还是一个那个教育的问题 。

**吴涛** [25:59]
对 ，也许我觉得可能过两三代人会觉得公钥私钥是一个非常天经地义的概念 ， 就好像钥匙和锁一样 ， 那就非常容易理解 。

**Rio** [26:08]
你既然这么乐观 ， 过两三代人就可以了 。

**吴涛** [26:11]
两三代还不够吗 ？Oh my god。

**Rio** [26:13]
不 、 不要高估群众的智商 。

**吴涛** [26:16]
你这个 、 你这个 、 这句话太精英主义了 ， 要不要抹掉 ？

**Rio** [26:21]
不要 ， 让他们来批我吧 。

### 泄密事件

**吴涛** [26:23]
好吧 。 好 ， 那我们接下来就进入新闻环节吧 。 嗯 ，不如 、 不如就接着刚才的话头说这个最近这一次比较严重的一个那个 、 嗯 ， 一个安全事件应该说 。

这个事件严重到 、 严重的程度就是它关乎你我 。

**Rio** [26:44]
哈哈哈 。

**吴涛** [26:46]
怎么说呢 。

**Rio** [26:46]
先 、 先介绍一下怎么回事吧 。

**吴涛** [26:48]
对 。 好 ，有一个 、 有一个安全公司 ， 它这个公司的名字叫做 Hacking Team， 就好像 。

**Rio** [26:54]
什么黑客小分队 ？

**吴涛** [26:55]
对 ， 要有 、 有一家客栈 ， 它的名字叫做有家 、 有间客栈一样 。 然后这个安全公司这个 Hacking Team 就叫做 Hacking Team。

然后 Hacking Team 这家公司呢被黑了 。

**Rio** [27:07]
哈哈 ， 多讽刺 。 它 、 它不叫 Hacking Team 嘛 ， 叫 Hacked Team。

**吴涛** [27:12]
对 ， 然后 Hacking Team is hacked。 对 ， 然后首先这家公司是以什么为生呢 ？ 呃 ，他们其实就是专门搞破解 ， 呃 ，但是它搞了破解之后不会 、 不会告诉那些被破解了的 、 或者说被黑了的网站或者公司说你们的产品有问题 ，而是把这些漏洞藏起来 ， 呃 ， 放在他们货架上 。

**Rio** [27:35]
放起来卖是吧 ？

**吴涛** [27:36]
对 ， 放在他们货架上， 然后包起来卖给这些比如说 NSA 啊 ， 或者是还有也许中国人也有他们的客户 ， 或者是一些商业间谍啊 ， 会说啊 。

**Rio** [27:47]
就是世界各国政府和这种大机构嘛 。

**吴涛** [27:52]
对 。

**Rio** [27:53]
哎 ， 等一下 ，他们不是直接卖这些 、 这些破解吧 ？ 它是卖这个打包的服务好像是 。

**吴涛** [27:58]
对 ， 它有部分漏洞是会卖出去的 。 就是如果你只买服务的话 ， 你会需要 、 你付的钱少一点 ，但是如果你要把整个这个怎么说 ， 知识产权加以后 。

**Rio** [28:08]
买药方 。

**吴涛** [28:09]
对 ， 那是要花很大很大一笔钱的 。

**Rio** [28:12]
没错 。

**吴涛** [28:12]
然后他们靠这个赚钱攒了 400GB 的数据 。 当然后来有 、 有消息说这个 400GB 里面有很多很多都是 email， 就没什么用 。

**Rio** [28:24]
没有啊 ，email 很有用的 。

**吴涛** [28:27]
啊 ， 好吧 。

**Rio** [28:28]
各种机密都在 email 里面暴露出来了吧 。

**吴涛** [28:30]
在数据方面 ， 啊 ， 它就是这 400G 里面有很多只是数据 ，而真正和方法相关的部分可能只有 、 只有几百兆 。

但是无论如何这里面全都是非常非常机密的信息 。

**Rio** [28:41]
嗯哼 。

**吴涛** [28:42]
啊 ， 然后这些数据全都被黑了 ， 然后被放在了网上 。 就现在你我他都可以去搞下来 。

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

**吴涛** [28:52]
这是 。

**Rio** [28:52]
所以 、 所以你下载了吗 ？

**吴涛** [28:54]
没有啊 。 何必呢 ？400G 我硬盘都装不下 。

**Rio** [28:59]
400G 现在随便一个小硬盘都能可以啊 。

**吴涛** [29:01]
我 。

**Rio** [29:02]
除非你是 MSSD。

**吴涛** [29:04]
我 、 我的 SSD 是装不下 。 我 SSD 就 512， 然后还装了一堆游戏 ， 所以 。

**Rio** [29:09]
买个那个什么吧 ， 那个外置硬盘 。

**吴涛** [29:11]
外置硬盘有啊 ，但 。

**Rio** [29:13]
何必装那没用的东西是不是 ？

**吴涛** [29:15]
装了很多觉得自己会看但其实根本不会看的东西 。

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

**吴涛** [29:20]
不要想歪了 ， 我是说电子书 。

**Rio** [29:22]
哈哈哈 。 好吧 。

**吴涛** [29:26]
对啊 。 嗯 ， 然后在所有这些已经被下载 、 已经被破解 、 被爆出来的工具里面 ，有一个比较严重的漏洞是在 Flash 上面 ， 就是臭名昭著的 Flash。

**Rio** [29:38]
竟然只有一个 ， 我也很吃惊 。

**吴涛** [29:40]
或者说目前被发现的只有一个 ， 是一个非常严重的 Flash zero day。 然后它最大的问题是它可以让任何网站 ， 这个网站上面有 Flash， 呃 ， 的话 ， 可以让你在访问这个网站并且运行这个 Flash 的时候 ， 呃 ，在你的机器上以管理员权限执行任何它想要执行的代码 。

是一件就你可能听起来没有什么 ，但你硬盘上所有的短信 、 邮件 、 验照 。

**Rio** [30:13]
总之你就裸奔了 。

**吴涛** [30:15]
对 ， 全都跟把就全都跟那个就像陈冠希 ， 呃 ， 无辜的把他的电脑交给了修理电脑的人一样 ， 暴露在这个网站下面 。

嗯 ， 然后当然紧急的 bug、 紧急的 、 呃 ，patch 也已经出来了 ，但是我相信很多人还是没有装 。 所以如果你听节目听到这里的话 ， 最好赶紧去装一下 。

**Rio** [30:38]
嗯 。

**吴涛** [30:39]
真的是为了自己好 。

**Rio** [30:43]
嗯 ， 所以这件事情怎么说呢 ？ 就是说就之前大家都知道说这些安全漏洞是可以私下买卖交易 ， 然后可以用来去 、 去黑进别人电脑 。

当然可能大家都抱着一个侥幸心理 ， 觉得没事 ， 谁来搞我 ， 我又不是什么重要人物是吧 。

**吴涛** [31:02]
对 ，但我觉得这次暴露就是让我吃惊的是原来可以有这么 、 这么多 、 这么惊人的

海量的数据可以供人购买 。 我以前总觉得 。

**Rio** [31:18]
对啊 ， 所以大家都以前觉得只看到个冰山一角是吧 ？ 现在看到 ， 哎 ， 看到冰山的半截 。其实上面还有 、 还有更庞大的生态链我们是看不到的 。

**吴涛** [31:28]
不小心扔了一个深水炸弹 ， 然后哇靠 ， 浮上居然浮上来这么多啊 ， 破碎的冰 。 对 。

**Rio** [31:34]
嗯 ，但是呢 ，有什么问题呢 ？ 就是这些还是有公开就用的 ， 就在它做成这个商业化的产品的之前已经有很多人受害了 ， 只是你不知道而已 。

我们 、 我们也就我也我可能这个时候我们在录音对吧 ？ 是不是有点谁在监控 ， 我们也 、 也很难讲 。

**吴涛** [31:55]
对 ，在爆出来的数据里面 、 爆出来的资料里面有据称 Hacking Team 有在所有的 、 几乎所有的 Windows 客户端上安装远程桌面的方法 ， 包括 Windows Phone。

就是你在用手机 ， 你手机上显示什么 ， 可能已经有人可以去看了 ， 只不过他从来 、 从来没有看过而已 。

**Rio** [32:15]
还没来得及看是吧 ？

**吴涛** [32:17]
对 ，但前一阵子那个 Wikileaks 爆出来 ， 从施罗德到梅克尔 ， 所有每一任德国总理全都被 NSA 窃听了 。

**Rio** [32:26]
政府要人肯定是逃不掉的 ， 这点什么不用想 。 只是说我们现在关注 、 关注我们这种什么小老百姓对吧 ？

**吴涛** [32:33]
对 ， 然后其里面可能也有一部分的手段就来自于这次被爆出来的 Hacking Team 所 、 所 、 所开发的技术 。

**Rio** [32:42]
对 ， 这都是综合性的工程嘛 。 就是说它就是可能 Hacking Team 它掌握了一部分的这么一些漏洞对吧 ？ 还有一些其他的更什么资深或藏得更好的这种 、 这种组织或者个人， 比如说 NSA 啊 ， 对吧 ？

他们自己有一套手上的所有的什么核武器是不是 ？

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

**Rio** [33:01]
这种东西 。 然后这次这些东西爆出来的危害在哪里呢 ？ 就好像怎么说呢 ， 突然有一个人告诉你说 ， 就大家过去都不知道这个原子弹怎么造对吧 ？

然后现在他 ， 哎 ， 我告诉你原子弹是这么这么这么早 ，而且造这个原子弹不怎么麻烦 ，不怎么费钱是吧 ？

你只有有了图纸就可以 、 就可以上了 。 不像说你真的造一个原子弹 ， 你有了图纸你可能不一定有那个什么离心机 ， 你可能还 、 还提炼不出来那么纯高纯度的什么放射性物质对吧 ？

嗯 ， 像这种软件的原子弹 、 核武器拿来就可以用了 。

**吴涛** [33:35]
没错 。

**Rio** [33:35]
对 ， 所以反正就是大家就最近后这段时间就只好自求多福了 。 因为爆出来之后公 、 公开了这些东西之后， 啊 ， 好人坏人都会用它的 ， 然后你也不知道谁会对你有利 ， 谁会对你不利 ， 对不对 ？

**吴涛** [33:51]
没错 。

**Rio** [33:52]
所以我觉得这次出来的最我最关心的一件问题就是 ， 比如说我用苹果这个系统对吧 ？ 我就关心 Apple 它会不会专门派一个什么专门搞一个小组的人去研究这里面爆出来的这些公开的漏洞 ， 马上把它跟它相关的东西修好啊 。

**吴涛** [34:10]
这也是个 lipful face， 你永远不知道啊 。

**Rio** [34:13]
不 ， 就是我觉得作为一家正 、 正常的公司 ，不是 ， 它应该做的就是把这个事情作为它的一个 、 一个叫什么 ， 它一个核心要务吧 ， 提上议程 ， 马上去做 。

**吴涛** [34:25]
你的意思是他们会重视起来 ， 那肯定会 。

**Rio** [34:26]
对对 ，但不确定啊 ， 你现在还不知道 ，他没有 、 他没有知声嘛 ， 对吧 ？

**吴涛** [34:30]
这是我的 lipful face。

**Rio** [34:32]
就我 、 我 、 我是 I hope they'll do that，但是 、 但是不一定嘛 。 所以就看最近这个你而且他们修那个 ， 就他们去分析一个这个漏洞 ， 然后去修打补丁 ， 还要测试再放给大众 ， 中间还有这么一长 ， 至少可能有这么一两周或者一两个月的那个过程吧 ， 对吧 ？

所以在这段时间内大家还是都处于在 、 呃 ， 裸奔的状态 。

**吴涛** [34:55]
裸奔 。

**Rio** [34:56]
对对 ， 所以啊 ， 真的是安全是很难 、 很难的 。 就从 、 从某种意义上来说 ，以后的这个所谓的真正意义上的安全就只能是少部分什么 、 呃 ， 特权阶级或者特别有钱的人能够享受的服务了 。

因为你看有这么多人花钱来搞你对吧 ？ 那怎么办 ？ 你怎么花钱 ？

**吴涛** [35:15]
因为有钱付得起私人兵才 、 私人雇佣军才可以 。

**Rio** [35:19]
对对对 ， 上次那个谁 ， 呃 ，是希拉里 · 克林顿 ， 她不是在竞选美国总统吗 ？ 嗯 ， 然后她后来就有就很多报道去 、 去 、 去扒她的那个过去嘛 ， 说她在当那个 ， 哎 ， 她当国务卿还是什么来着 ？

反正是 Secretary of State， 应该是国务卿吧 。

**吴涛** [35:36]
国务卿 ， 对 。

**Rio** [35:37]
对 ， 然后期间她竟然在自己家里地下室搞了一个 mail server， 邮件服务器去跑她自己的私人邮件 。 然后她的目的也比较简单 ， 就是避开 ，因为如果她用公那个政府就白宫的邮件服务器的话 ， 她是不是那个 Viced 杂志肯定的 ， 它会被 archive， 会被存档 ， 然后以后可能会 、 会被翻出来做出一些对她不利的东西吧 。

所以她就搞了个自己的私 、 私服 ， 然后自己的一些邮件 。

**吴涛** [36:06]
上面跑传奇 。

**Rio** [36:07]
哈哈哈 ， 自己在邮件上面玩一些东西 。 然后后来就说卧槽 ， 那还得了 ， 你想白宫的那些邮件服务器得怎么 ，NSA 得专门派一小队人在那里帮她盯着嘛 ， 对吧 ？

好歹还好一点 。 她放自己家里谁给她盯着 ？ 嗯 ， 所以我还是蛮震惊的 ， 竟然还有这种玩法 。 嗯 ，不过还好 ， 一般通过邮件交流的也不是什么特别 、 呃 ， 要紧的国家机密那种 ， 会用专门专线嘛 ， 所谓的对吧 ？

还 、 还凑合 ，但是这种知道这种消息还是挺 、 挺不容易的 。 这就回到了那个什么 ， 刚才我们开场我提到那个你到底相信谁是吧 ？

**吴涛** [36:47]
对 。

**Rio** [36:47]
呃 ，其实正确答案是 trust no one。 哈哈 ，但是做不到嘛 。

**吴涛** [36:52]
这是 X 档案里面那个主角叫什么 ？Ted Fox，FoxTed， 那个啊 ，他叫什么来着 ？Murder。Murder 他的开机密码就是 trust no one。

**Rio** [37:06]
哈哈哈 ， 你现在知道了啊 。 就是你正确的方法是 trust no one，但是其实做不到嘛 。 我相信这个星球上 99.9999999999 都做不到 。

因为你要 trust no one 的话 ， 就像刚才我说的 ， 从 、 从硬件底层开始 ， 每一个步骤都要经过你自己的验证对吧 ？

**吴涛** [37:26]
对 。

**Rio** [37:27]
其实不现实的 。 所以只能选择相信一帮人了 。 然后至于说你想选择相信他之后会发生什么 ， 那就只能天知道了 。

**吴涛** [37:40]
对 ， 当然也我觉得也不用特 、 特别过分的去怀疑 ， 呃 ， 怀疑 、 怀疑这些人吧 ， 或者怀疑一品公司 ， 或者说怀疑 Whatever 那个人。

因为你 、 你活在现代社会里面 ， 完全不相信任何人 ，其实只是一个美好的愿景和假象 ， 你是做不到的 。

**Rio** [37:59]
我觉得这个 ， 嗯 ， 我觉得这件事情是这样子的 ， 就是这个现在这些系统已经太复杂了 ， 你没有可能从一个比较高的可行度的情况下确保这个体系不出任何问题 。

这就是不现实的 。 就好像你说指望啊 ， 我要这个软件没有 bug。 哎 ，不太现实 。 嗯 ， 啊 ， 这个时候怎么办呢 ？

你只能说就选择相信咯 。

**吴涛** [38:26]
对 ， 我觉得复杂度是固然是一方面 ， 另一方面是你在生活中已经 ， 你在现代社会里面已经选择相信很多人了对吧 ？

或者说无条件的去信任很多人， 甚至是很多人你根本就不认识 ， 根本就不知道他叫什么 。 比如说 ， 啊 ， 你 、 你上公车 ， 你搭乘飞机的时候 ， 你就把生命交给了机长的手里不是吗 ？

然后你在银行存钱的时候 。

**Rio** [38:47]
不光是机长啊 ， 还有什么各种航空公司 。

**吴涛** [38:50]
对 ， 地勤人员 。

**Rio** [38:51]
制造差 ， 然后雷达 、 天气 ， 还有什么上帝不会砸个鸟过来撞死你是不是 ？

**吴涛** [38:58]
对 。

**Rio** [38:58]
这类的 ， 对 。

**吴涛** [38:59]
所以活着就要有时候就是被迫要盲目相信一些人。

**Rio** [39:04]
Life is risky。

**吴涛** [39:06]
Yeah。

为什么忽然觉得好沉重 ？

**Rio** [39:11]
没有啊 ， 就是大家都知道嘛 ， 就是这个人生就是有风险 。 你坐家里还指不定天上掉个东西什么把你房子砸垮 ， 顺便把你砸死对吧 ？

**吴涛** [39:20]
就好像今天 ， 哎 ， 刚刚我今天中午吃饭的时候 ，Apple Watch 忽然震了一下， 然后我抬起手腕了一看说 ， 呃 ， 我 、 我住的这个地方叫 Franken， 说 Franken 地区有一个有一个枪发生了枪击案 。

然后我说 what， 然后赶紧进去看 、 看细则 ， 就在离我 50 公里的地方 ，有一个有一个人 ，他开着一辆银色的 Mercedes 的 ， 呃 ，Cabrio， 敞篷跑车 。

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

**吴涛** [39:51]
啊 ，在路边停下， 问路边一个老太太 ，82 岁老太太一些事 ， 问完之后老太太往回走的过程中 ，他掏出枪来把老太太打死了 。

**Rio** [40:01]
What？ 神经病啊这是 。

**吴涛** [40:03]
然后我不知道啊 ， 然后他开了大概 10 公里左右 ， 又杀死了一个在路边骑自行车的人。

**Rio** [40:10]
所以他是什么反社会人格是吧 ？

**吴涛** [40:12]
我 、 我 、 我不知道这是今天才发生的事情 ， 所以我可能一会儿看下新闻才知道具体发生了什么 。

但怎么说呢 ， 就是飞来横祸不是吗 ？ 而且离 、 离你这么近 ， 就离我这么近 50 公里之外 。 我是有每天 ，是不是每天 ，但以前往返于 ， 呃 ， 某地和某地之间 ， 每天会 ， 呀 ， 好 ， 为什么总要说每天 ， 经常会经过这么一个地方 ， 就是看着高速公路上的牌子记着这个名字 ， 然后忽然今天那儿发生了一次枪击案 ， 就是这种感觉 。

**Rio** [40:40]
所以就是嘛 ， 就是你可能什么出门被车撞死 ， 然后遇到个疯子把你给崩了 ， 然后什么喝水可能被淹死 ， 就呛死之类的 。

就是反正你只要做任何事情 ， 就不管你做还是不做任何事情 ， 你总是会有机会遇到这种小概率事件的 。

**吴涛** [40:57]
对 ， 所以其实信息方面的 ， 呃 ， 信息安全方面的风险还是必须要承担一点的 。

**Rio** [41:02]
对 ， 没有不是不当的 。 你想你这么想一下你就可以觉得你就安心了 。

**吴涛** [41:06]
释然一点 。

**Rio** [41:07]
哈哈哈 ， 没错 。

### Atom 1.0

**吴涛** [41:09]
OK， 那我们过渡到下一条新闻 。 啊 ， 这条新闻比较振奋啊 ， 就是 。

**Rio** [41:15]
这是老闻了吧 ？ 就已经上两周前的了 。 对 。

**吴涛** [41:19]
对 ， 开发了 ， 嗯 ， 门大马算其实有 7 年， 但是去年 2 月 26 日才 public beta 的这个 ， 呃 ， 来自于 GitHub 的 Atom， 呃 ， 编辑器 ， 今天 ， 呃 ，不是今天 ，6 月 25 日终于发布了 1.0 版 。

**Rio** [41:38]
嗯 ， 这也是个什么 1.0 就是一个里程碑了 。

**吴涛** [41:42]
对 ， 当然这是 GitHub 这种比较负责任的公司 ， 会把 1.0 版这么 、 这么及时的释出来 。 你像当初 Google Mail beta 了多久啊 ？

**Rio** [41:55]
好多好多好多年 。

**吴涛** [41:56]
哈哈 ， 对 ，10 年有没有啊 ？

**Rio** [41:59]
差不多吧 。

**吴涛** [42:00]
嗯 ， 难以相信 。 对 。

**Rio** [42:02]
所以 1.0 版有什么特别的 ？

**吴涛** [42:05]
其实也没有什么特别的 。 我仔细看了一下， 就是他们 ， 呃 ， 从 public release 一直到现在 ， 历经了 155 次 release， 就是过去的这一年多一点里面有 155 次 release， 每一次都有 changelist。

然后现在就是他们整个 ， 呃 ， 编辑器的核心那个可以扩展的那一部分 ， 就是 API 那一部分已经被正式确定下来了 。

这也是它发布 1.0 版本的主要原因 。 然后其实我想说的是 ， 就是它有一个视频很有意思 ， 它 ， 呃 ， 用一台用那种 60 年代的手法 ， 就是如果你看过一个视频叫做 ， 啊 ，Prediction of Home Computers 之类的这么一个 60 年代做的 ， 啊 ， 未来关于未来家用电脑的展望视频的话 ， 这个视频跟那个视频是相呼应的那种感觉 。

**Rio** [42:58]
哈哈哈 。

**吴涛** [42:59]
对 ， 那个 60 年代的视频里面说已经假想了将来的人们回家一回家就会开电脑 ， 然后可以在多个显示器上处理表格 ， 然后可以通过一个巨大的电视屏幕一样一样的东西和一个滚轮 ， 呃 ， 滚球应该说之类的 ，以及旋钮之类的东西来在线购物 。

那个时候已经全都想到了这些 。 然后这个 ， 呃 ，Atom 1.0 的宣传视频就是拍了的也不算吧 ， 就是用那种风格拍了一个 ， 呃 ， 一家人围绕着这么一个专用的 Atom 控制台上面写代码的过程 ， 还蛮值得一看的 。

**Rio** [43:39]
哈哈 ， 这个什么程序员的恶趣味是不是 ？

**吴涛** [43:42]
没错 。 然后可以顺便提一下就是那个 Visual Studio Code 也发布了 0.5 版 。

**Rio** [43:49]
哎 ，其实这几个我一直搞不清楚啊 ， 就是 Facebook 最近之前不是也搞了一个叫 ， 啊 ，Nucleus 对吧 ？

**吴涛** [43:59]
Nucleus 是基于也是基于 Electro 的吗 ？ 不是吗 ？

**Rio** [44:04]
对对对 ， 就是基于那个核那个什么电子 。

**吴涛** [44:08]
对对对 ， 就是对 。

**Rio** [44:10]
一套东西 ， 就反正就是基于 Web 技术做了三款浏览器了 。Atom 是一个什么算是第一个正统吧 ？

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

**Rio** [44:17]
还有那个 Nucleus， 然后有那个 Visual Studio Code。

**吴涛** [44:22]
还有什么 ？

**Rio** [44:23]
最近是今年出的 。

**吴涛** [44:24]
还有什么 Slack， 嗯 。

**Rio** [44:27]
Slack 是什么东西 ？

**吴涛** [44:28]
Slack 是那个什么协同软件吧 ？

**Rio** [44:31]
啊 ， 它也是那个那个基于那个核写的啦 。

**吴涛** [44:35]
对 ， 一个也是怎么说 ，他自己好像叫自己 messaging messaging app， 就是一个团队协作软件 ，但实际上它也是从那个 Electro 改的 。

我记得 Lawrence 还给给咱俩发过 invitation 相当于我不知道 。

**Rio** [44:50]
我 、 我有装 ， 我 、 我有装那个 Slack。

**吴涛** [44:52]
OK， 我没装 。

**Rio** [44:52]
对 ， 用了一下 。 就其实你一看就知道 ， 哎 ， 这其实是一个 Webview 封装起来的壳子 ， 比那个过去的 Webview 可能做的要稍微原生一点 ，但是毕竟还是不改它那个本质嘛 。

**吴涛** [45:05]
对 。

**Rio** [45:06]
因为当然这些本质是什么呢 ？ 比如说 ， 啊 ， 我先问一下，Atom 1.0 能打开一个 20 兆的文件吗 ？

**吴涛** [45:13]
哈哈 ，不知道 ， 我还没装呢其实 。

**Rio** [45:16]
那似乎还是不行是吧 ？

**吴涛** [45:17]
OK。

**Rio** [45:18]
虽然虽然也不太可能有 20 兆的一个程序的代码 ，但是 ， 嗯 ， 吧 ， 毕竟还是有这么一个限制的 。

**吴涛** [45:26]
嗯 。

**Rio** [45:27]
然后这些东西都有一个问题 ， 就是比较臃肿 。

**吴涛** [45:33]
对 ， 就比较占资源吧应该说 。

**Rio** [45:36]
对 ， 虽然说现在什么硬件资源比较丰富 ，但是我总觉得哈 ， 就这么浪费好像也不是一个特别好的事 。

**吴涛** [45:45]
嗯 ，但 。

**Rio** [45:46]
做一个编辑器竟然要 500 兆的内存才能跑起来 ， 觉得就有点过了 。

**吴涛** [45:55]
是 。

**Rio** [45:55]
对 。

**吴涛** [45:56]
这就是为什么一些古老的用 C 写的编辑器可以一直活到今天 。

**Rio** [46:03]
什么 VI 啊 。

**吴涛** [46:05]
Emacs 啊 。

**Rio** [46:05]
Emacs 啊 ， 对 ， 还挺好 。 哎 ， 所以那个其实你看好这一类的东西吗 ？ 就是把那种 Web 的技术跑在客户端 ， 跑在那个原生的皮里面 ， 然后假装自己是原生应用 。

**吴涛** [46:19]
嗯 ，其实 Lawrence 前两上一期节目里面说什么 Web app is for animals 的时候 ， 我就想 ， 哈哈 ， 那把这个 Web app 封装成一个原生 app 的这种东西 ， 又又又又应该怎么讲 ？

**Rio** [46:32]
不 ， 这这个我觉得跟 Web app 可能还就我们传统意义认为的 Web app 可能还不太一样 。 就是传统意义上的 Web app 可能还是在浏览器里面 ， 然后， 啊 ， 它的其实我觉得这个界限主要在哪里呢 ？

就是它的那个在离线状态下的行为 。 就起起码这些几个应用都是说它的本本初是为单机或者离线状态自己运行的 ， 呃 ， 这种情况设计的 。

它不牵涉到说很多 Web app 它没有做这个叫做 app cache 和这个 offline mode 的情况下， 那完全没法用的那种情况嘛 。

就这个我觉得还是有很大区别的 。

**吴涛** [47:09]
好吧 ， 我觉得最大区别还是在于那个 Chrome， 就是在于那个外边那个框架什么 。 你在用 Web app 的时候 ， 你会有一个明确的心理预期说我正在浏览器里面使用一个东西 ， 这个东西不是 native 的 ，不是 native 的 ，不是 native 的 。

因为我觉得至少我会有这样一种默默的心理暗示 。 但是我觉得这也就是为什么 Google Google 要把那个 ， 呃 ，Chrome Apps 单独拎出来放成一个 ， 呃 ， 独立于浏览器之外的 ， 呃 ， 窗口 ， 放在一个独立于浏览器之外的窗口里面 ， 让用户来用 。

呃 ， 我觉得它就是试图打破这种 Chrome，但是 。

**Rio** [47:51]
像一戳枷锁嘛 ， 对吧 ？

**吴涛** [47:52]
对 ， 效果还是不是很好 。

**Rio** [47:54]
但所以你看到像那个 Atom 这种编辑器的时候 ， 你用的时候你会觉得它是一个非原生的东西吗 ？

**吴涛** [48:00]
我觉得这种感觉已经非常淡化 。 就因为我为了准备这一期的节目又打开那个窗户 ， 最新版的 Visual Studio Code， 然后用了一下， 就感觉还是 。

**Rio** [48:12]
就你感觉不到它除了在那个 UI 风格上， 呃 ， 跟你的系统格格不入之外哈 ， 啊 ， 你你感觉不到它是一个网页应用对不对 ？

**吴涛** [48:24]
也格格不入也没有吧 ， 我必须说 ，但 。

**Rio** [48:28]
它风格很不一样哦 。

**吴涛** [48:31]
哎 ， 或者说我在用 Visual Studio 的时候 ， 心里面心里面就带着这个这样一个预期 ， 我就说这是 Verra 做的东西 ， 它它风格 。

**Rio** [48:39]
本来就不一样是吧 ？

**吴涛** [48:40]
对 ， 它不可能一样 。

**Rio** [48:41]
OK。

**吴涛** [48:42]
但但当然你说的有道理 ，但话说回来 ， 风格风格跟原生的 app 不一样的原生 app， 风格跟默认的苹果风格不一样的原生 app 其实也很多 。

**Rio** [48:55]
对嘛 ， 所以其实说到底就是说 Web， 呃 ， 叫什么来着 ，Web app 本身并不代表一个比较糟糕的体验 ，是这个意思吗 ？

就是它用的一些技术是是可以实现出一个比较原生的体验的 。 当然说我们资源占用上这个事情先不讲哈 ， 就是说在交互上， 还有包括这个给人的感觉上是可以做到比较好的 。

就之前说说这个 Web app 不好用 ， 纯粹是因为他们做的不够好嘛 。

**吴涛** [49:25]
OK， 那我们可以 ， 嗯 ， 暂时把这个浏览器的新闻放在一边 ， 将来如果 Visual Studio Code 也出了 1.0 的话 ， 我们再来后续报 。

**Rio** [49:36]
哈哈哈 ，OK。

### VR编程

**吴涛** [49:39]
好吧 ， 那下一条新闻这是你你写的吧 ？

**Rio** [49:43]
对 ， 这个这个事情还挺有意思的 。 就是之前我们讲那个那个阿里公论里面经常讲的那个叫 Oculus Rift 那个 3D 的虚拟现实眼镜嘛 ， 然后它那个它那个开发者叫做 John Carmack， 这个大家都应该比较熟悉了哈 。他在应该是上周还是前周吧 ，也也是差不多 ，也是上个月二十几号的时候 ，在 Google 那么讨论组里面发了这么一条信息 ， 就是他在琢磨着用 Racket，Racket 是一个 scheme

语言的一个实现吧 ， 然后 scheme 是一种 Lisp， 它是 Lisp one， 对 ， 然后他决定用这个 Racket 或者是 scheme 这个语言给这个 VR 环境里面做一个怎么说呢 ， 就语叫做教学语言吧 ， 可以这么讲 ， 教学环境应该是 ， 叫它叫做 scripting environment， 就是脚本环境 。

什么意思呢 ？ 就是你可以在通过写这个 scheme 代码 ，在那个虚拟世界里面构建出一些组件出来 ， 比如说可以看到什么打就像打积木一样啊 ， 做一些事情 。

然后他发了一篇非常长的文章去讲他就想就为什么会选择这个 scheme 啊 ， 还有一些什么其他关于搭建这个 ， 呃 ， 环境的一些事情 。

我把那个链接放到那个 shownotes 里面吧 ，但我觉得这个事情大家还挺好挺有意思的 ， 大家可以去看一下 。

啊 ， 具体内容就先不剧透了 。 对 ， 啊 ， 我不知道你你你怎么想这件事 。

**吴涛** [51:16]
我其实我脑子里面第一想到的是当初我在那个电视上面用 ， 呃 ，Apple II 和 Logo 语言操纵那个海龟的时候 ， 那个那个场景就是 。

**Rio** [51:30]
哎 ， 对 ， 差不多 。他想的应该是类似的应用 ， 只不过是做到那个 VR 就是虚拟现实的环境里面去 。

**吴涛** [51:37]
对 ， 然后我想就是因为 Logo 本身也是一个比较有意思的 functional programming language， 然后， 呃 ，也许将来的孩子们可以戴着 VR 眼镜 ， 然后用一种这样类似于 Logo 的教学式的 scripting language 在一个 3D 的世界里面操纵 3D 的海龟 ， 或者说一个海龟这个 metaphor 这么一个东西 ， 然后去画一些比如说 3D 的分形图形啊 ， 或者是啊 ， 对 ， 画 whatever 什么东西 ， 感觉很 exciting。

**Rio** [52:11]
哈哈哈 ， 所以所以这个你你在 scheme 用 scheme 在虚拟环境里面画这种物件 ， 你觉得会怎么样 ？

**吴涛** [52:21]
应该蛮酸爽的吧 。

**Rio** [52:23]
哈哈哈 ， 你记不记得上次我给你发过一个应该有两个链接吧 ，是 YouTube 的视频 ， 就是有人在那个 VR 眼镜里面 ， 就 VR 那个虚拟世界里面实时的通过编辑应该是 JavaScript 的代码来去操纵里面的物件的那些虚拟的物件的变化 。

**吴涛** [52:43]
改变周遭环境什么的 。

**Rio** [52:45]
对对对对对 ， 你还记得那个视频吗 ？ 而且这个应该这个过程还是蛮蛮有意思的 。 它那个不太好的一方一点就是它要它要就如果它要改变这个环境 ， 它得 reload 那个它这得刷新那个脚本 ， 然后整个整个重绘一遍嘛 ， 整个环境 。

嗯 ， 然后我不知道用 scheme 的话 ， 它可不可以做到一个增量的一个修改 ，因为大家之前那个你知道 Lisp 它刚才说的那个最牛逼的功能就是可以在它运行中动态修改代码 ， 然后再部分的执行嘛 ， 对吧 ？

**吴涛** [53:14]
对 ， 数据和代码部分增量 。

**Rio** [53:16]
没错没错 ， 所以这个还是蛮值得期待的 。

**吴涛** [53:20]
嗯嗯 ，

对 ，其实这里可以顺便说一下， 就是我今天在

The Verge 还是什么上面 ，不对 ，Ask Technic 上面看到了一个 ， 呃 ， 微软最新的关于 HoloLens 的视频 ， 然后里面就有那个一个怎么说类似于第一人称视角的 ， 呃 ， 告诉你说你戴上 HoloLens 之后能看到的这么一个区域 。

然后对 ， 然后我就感受到了 Lawrence 的戴了 HoloLens 之后那种失落感 ， 就哈哈哈 ， 真的差挺多的 。 就是之前我不知道你 ，但是我 。

**Rio** [54:02]
对 ， 我我脑补的这个 HoloLens 是戴上之后你可以全市场看到的 ， 然后当人们对 ， 当人们告诉我说这个市场其实很窄的时候 ， 我没有一个主观印象它到底有多窄 ，但只有只有直到看了那个视频之后我才意识到我靠原来这么窄 。

这这个差别就是我之前想象的是一个留一个一个显示器大到把你包起来 ， 你你坐在一个属于你自己的微型天文球里面这种感觉 ，但实际上它只不过是把一台显示器摆到你面前 ， 就是在你眼镜前面就大概那么大的地方 ， 这实在是差别太大了 。

**吴涛** [54:40]
是的 ，但也不能说这个什么取下显示器 ， 然后整屏都是这个编辑器窗口的这么一个愉快的想法了吧 。

对 ， 我所以我我必须收收回自己说 Lawrence 那个什么期待太高了 ， 这这这个实际的实验效果连我都受不了好吗 ？

**Rio** [54:59]
哈哈哈 ， 所以所以所以他有说是因为什么原因实现不了 ，是因为这个光学元件的物理限制 ， 还是说只是因为为了降低 ，因为他那个是戴在头上是整一体机嘛 ， 没有一个单独插线的外接的设备 ， 所以他要考虑这个什么供电啊 ， 续航的问题吧 。

**吴涛** [55:18]
对 ， 我觉得其实就是技术还不成熟 ，但是那个视频主要是宣传这个 HoloLens 在一个医院里面的一些用例的 ， 比如说医生可以拿 HoloLens 直接看骨头断裂的情况 ， 就可以你可以看到那个屋子中间有一个心脏 ， 然后心脏在跳 ， 然后你可以转着看这个心脏跳动的状况之类的 。

所以他没有解释说市场为什么这么窄 ，他只是怎么说呢 ， 可能觉得自己之前吹的有点猛了 ， 所以用用这个视频让大家明白一下 ，其实看到的效果只不过是这样 ， 你们不要那个就是期待太高那种感觉 ，有一点点 expectation control management 的一个一个一个感觉 。

**Rio** [56:03]
微软现在来做这个又有什么用呢 ？ 他他之前自己把那个东西吹得那么好 ， 当时那个第一次出那个视频的时候 ， 就是他发了发布了两次嘛 ，其实就说感觉这个比喻要吹破了 ， 哈哈 ， 这个比喻画太大对吧 ？

现在看果然画太大了 ，不过还是好 ， 总比没有强吧 ， 这个毕竟是第一代产品 ， 所以让他们迭代两年再说吧 。

**吴涛** [56:28]
对 ， 黑黑微微软的话 ， 你们留到 IT 公论里面说 。

**Rio** [56:32]
没有没有 ， 我没黑 ， 经常有人说我黑 ， 经常有人说我黑 ， 然后其实我给他们还是蛮蛮高兴的 。

**吴涛** [56:38]
我觉得你刚才的话 ， 你刚才的话在软狗耳朵听起来就已经是非常不爽 。

**Rio** [56:43]
就是黑他们是吧 ？

**吴涛** [56:44]
对 ， 好吧 ， 那那你倒是拿出一个让我们惊艳的东西来看 。 他们会说 blah blah 黑科技 blah blah， 微软做的事怎能叫 blah blah。

**Rio** [56:56]
从来都停留在什么 Microsoft Research 里面 ，不会拿出来的 ， 那有什么用呢 ？ 嗯 ，不不 ，其实从那个完成 ， 从那个完成度来讲 ， 我觉得其实这个已经蛮高的了 ， 就是 HoloLens 一代嘛 。

所以其实我我还是挺挺乐观的 ， 就是到他们在 ， 就希望他们能够保持这个速度往前去迭代好 。

**吴涛** [57:21]
OK， 那我们接下来可以进入正题了 。 今天的话题是 debugging， 用中文说就是除错与调试 。 嗯 ， 我不知道 Reo 你你你经常 debug 吗 ？

### 调试初探

**吴涛** [57:34]
或者说你觉得 debug， 你觉得你写代码的时候里面是 debug 时间多 ， 还是真正写代码的时间多 ？

**Rio** [57:44]
呃 ， 还好吧 ， 我 debug 时间不算多 ， 对 ， 可能是两三成的样子 。

但是主要是因为我写的东西也不是特别复杂 ， 就还还凑合 。

**吴涛** [57:59]
你太谦虚了 ， 你可以直接说你写的东西就是 bug free。

**Rio** [58:04]
就是什么 ？

**吴涛** [58:06]
就呃 ， 前两天我在呃一个网站叫什么 ， 讲什么的 ， 就讲白板编程啊 ， 讲面试应该是 ，他讲说呃应该怎样去做白板面试 ， 我回头会把这个链接放在 shownotes 里面 。

但是我印象里面比较 ， 我印象比较深的一句话就是它里面说呃程序员可以分为两种 ， 一种是会先确认前条件 、 终止条件 、 边界条件以及不变的那一部分 ， 然后写出正确的代码 。

呃 ， 另外一种是先编写代码 ， 然后通过各种用力调试测试对程序进行调整 ， 最后得到似乎正确的代码 ， 就是可以分成 。

**Rio** [58:50]
那不就 TDD 吗 ？

**吴涛** [58:51]
哈哈哈 ，TDD 是哪一种 ？ 第一种还是第二种 ？

**Rio** [58:56]
就是后者啊 。

**吴涛** [58:57]
不 ， 第二种他说先编写代码 ， 然后通过用力 。 啊 ，TDD 应该是第一种 ， 对 ，TDD 应该是一个一个的去确立呃边界条件 。Anyway， 然后他里面说他个人估计 ， 呃 ， 保守估计前者的开发效率至少是后者的 10 倍 ，因为前者不需要浪费大量时间在编码调试编码这个极其耗时的循环上面 。

我觉得说的有用到 。

**Rio** [59:25]
写代码之前敲键盘之前先动脑子想是不是 ？

**吴涛** [59:29]
对 ， 就包括在一些刚学编程的人身上也会发现一个问题 ， 就是发现一种现象 ， 就是他认为呃写代码的速度跟敲键盘的速度相关 ，其实并不是这样的 。

就呃 ， 我可以举两个例子 ， 一个是我前呃上上家公司里面一个 60 多岁的程序员 ，他可能是从 Cobalt 时代就写写程序 ， 然后到 60 多岁还在做那个呃高级顾问 ， 众所周知德国的退休年龄是 67 岁 ， 所以比 60 岁的高龄还在写程序 ， 然后他和很多德国人一样 ， 只会用两个指头敲键盘 。

你你很难想象吧 ， 一个写了 30 年程序的人只会用两个指头敲键盘 ，但他的效率不比任何人慢 ， 或者说他写出来的呃编码的 ，他写出来的程序的可靠性和效率并不比任何人差 。

嗯 ， 然后反过来另外一个例子就是我上一家公司里面有一个呃 ， 哎 ， 就不透露他的肤色了吧 ，但就有这么一个朋友 ，他经常会说呃 ， 每天开会的时候他就会说啊 ， 我还有一点点就完了 ， 我 80% 已经写完了 ， 只剩下 20% 只是一些呃细节需要调整一下 。

但是如果你仔细看他这个细节的调整到底是在干嘛的时候 ，他其实在大量的改变自己的代码 ，因为他里面很多东西虽然写得很快 ，但根本就是写错了好吗 ？

所以这所谓的 20%，其实占用了他整个开发的 80% 的时间 。他总觉得自己可能明天就可以写完 ，但其实明天会发现我靠还需要后天和大后天 。

嗯 ， 对 ， 所以我觉得 Reo 其实你刚才暗示了你是第一种 。

**Rio** [1:01:20]
哈哈 ， 好吧 ， 我我我其实我是就起码我希望是第一种吧 ，不知道这是不是真实 ，但是尽量呗 。 就有这么一个 ， 就刚刚我说那个写代码之前先先动脑子 ，但这个不是说来玩玩 ， 就是就我看到有很多人写代码的时候先反正先敲几行再说 ， 再来想怎么弄是吧 ， 怎么改 。其实我看到很多那种所谓大神级程序员 ，其实他是要先先写代码之前 ，他是

要想好久好久在脑子里面构建一个大框架 ， 步骤怎么样 ，有些什么样 ， 至少要注意的点 ，他会想的比较清楚 ， 然后才会动笔再动 ， 动笔动动键盘 ， 慢慢慢慢的去敲 。

对 。

**吴涛** [1:02:02]
对 ，其实这跟写作文差不多 ， 写文章差不多吧 ， 就是并不是说你要写东西 ， 就是你要一定要坐在书桌前面 ， 然后打开稿纸 。

呃 ， 就好像你要写程序 ，并不是一定要先赶紧打开你的 IDE， 然后新建一个项目 ， 然后写个写个 main 函数出来 ， 然后盯着它发呆 。

你要想写什么东西 ， 你先在各种各样的时候去想你要写什么东西 ， 比如洗澡的时候 ， 刷牙的时候 ， 走路的时候 ， 跟跟女朋友聊天的时候 。

但是这个最后最后这种是非常不推荐的 ， 我吃过苦好吗 ？ 呃 ， 哈哈哈 ，在这个时候你都你已经可以在构想你要你要写什么了 ， 然后等到你真正有一定把握的时候再再出来写 ， 这样要比你直接上来就噼里啪啦敲键盘其实效率要高 ， 我觉得 。

**Rio** [1:02:47]
嗯哼 ， 没错 。 所以所以以后你就是如果比如说咱我去开一间这个软件公司是吧 ， 要要在那个什么 ， 除了标配那些什么办公桌啊 ， 什么椅子之外， 还得做一个冥想室 。

**吴涛** [1:03:03]
嗯 ， 像那个 CC 程曾经晒过他们公司有那个 power nap， 呃 ， 椅子你可以躺着睡觉的 ， 睡觉时候可以写程序吗 ？

**Rio** [1:03:13]
不能啊 ， 睡着睡着了得冥想 ，在那打坐那个禅宗的那种 。

**吴涛** [1:03:19]
OK， 哈哈哈 ， 我我我相信 ，但我是觉得至少我写程 ， 我写构思程序的时候 ， 基本上都是在动的时候 ， 就是身体一定要在做什么事情 ， 比如说开车或者是骑自行车 ， 或者是走路之类的 ， 就躺着在一个地方静静的待着 ， 我是嗯想不好事情 。

**Rio** [1:03:40]
对 ，但所以其实从这个角度来讲 ， 我觉得那个叫什么 literate programming， 哎 ， 这怎么讲 ， 文化变成又来了 。 嗯啊 ， 挺好的 ， 就是它可以强迫你在写第一行代码之前 ， 先把这个什么前因后果 ， 背景 ， 对对对 ， 先把这个整体思路讲写出来 ， 然后你再顺着一个思路写一行代码 ， 顺着一个思路写一行代码 ， 这样 。

**吴涛** [1:04:02]
对 ， 呃 ，但是呢 ，不管怎么说 ，不就或不 ， 或者说不管多强悍的程序员 ，他写出来程序终究是没有办法避免会有 bug， 所以这时候就需要 debug。

呃 ， 我们不妨先来解释一下这个 debug 这个词是怎么来的 。 就其实有一个美丽的都市传说 ， 我相信可能大部分听众此时也都会呃说出来 ， 说 debug 是曾经有这么一位呃女程序员 ， 她的名字叫做呃 Grace Hopper， 格丽丝霍普这么一位呃美国海军准将 ， 哈哈 ， 准将程序员 。

### Bug故事

**吴涛** [1:04:43]
她曾经在呃 1950 年代的时候开发呃应该是哈佛的一个大型计算机项目的时候 ， 去检测一个计算机的故障 ， 然后她发现故障的原因是呃一个蛾子 ， 一只蛾子卡在一个继电器上面 ， 然后这个继电器没有办法正确的被放下来 ， 就是接触不良了 ，因此导致了呃整个计算机不工作 ， 然后她把这个蛾子取出来 ， 然后把这个蛾子粘在了那一天的这个故障记录

上， 然后写说这只 MOS 导致了整个机器故障 ， 然后我 literally 把它 debug 了 。 对 ， 这是这个 debug 这个词的由来 。

但 。

**Rio** [1:05:30]
就真的真正的除虫 。

**吴涛** [1:05:32]
对 ，但但实际上呢 ， 虽然呃 Grace Hopper 使用了 debug 这个词 ， 呃 debug 这个词作为作为排除故障的指代 ， 早在 1940 年代左右就已经在其他领域 ， 就是尤其是电子和机械领域 ， 就已经其实已经被人使用过了 。

所以 debug 这个词其实并不是呃 Grace Hopper 的发明 ， 然后 debug 这个词真正成为一个排除错误的一个同义词 ，也是一直要到 1960 年代左右才真正的在计算机界推广开来 。

就是我记得好像是 Wikipedia 上是文章说 ， 直到 65 年还是哪年才有一篇论文的第一页直接使用了 debug 这个词 ，而且没有注释说这个 ， 没有加引号 ，也没有注释这个词到底是什么意思 。

所以直到这个时候 ，debug 才真正的进入了计算机界的主流 。

**Rio** [1:06:30]
嗯 ，OK， 我们又卡了一下鼓 ， 哈哈哈 。

**吴涛** [1:06:35]
对 ， 呃 ，不如说一说你遇到过的比较有意思的 bug， 或者说你你遇你呃遇到过什么比较困扰你 ， 或者比较有意思的 bug。

**Rio** [1:06:47]
就上次我们那个串台啊 。

**吴涛** [1:06:49]
啊 ， 哈哈哈 ， 对对对 ，IPN 串台 bug 也是一个比较有意思的 bug。 这我记得很多人猜测过为什么我们要换很多 ， 换了很多次呃 podcast 的 server， 然后为什么要折腾来折腾去 ，有时候支持这个 podcast 客户端 ，有时候不支持那个 podcast 客户端 ，其实都是我们在试图解决这个 bug，不明白为什么会串台 。

**Rio** [1:07:15]
对 ， 然后为什么不能解决这个 bug， 主要是因为我们没有办法重现它 。 这个是一个很很很重要的事情啊 ， 就是说你要去除一只虫 ， 首先你得看到这只虫 ， 对吧 ？

你得找到这个虫在哪 ，是怎么发生的 ， 那个生成的机制是怎么样的 ， 什么条件下会触发它 ， 对吧 ？

然后凡是那些你想找找不着 ，不知道怎么触发 ，不知道什么时候出现 ， 你没有办法重现的东西 ， 我们基本上叫做 phantom bug 吧 ， 就是影虫 。

**吴涛** [1:07:46]
影虫 。

**Rio** [1:07:47]
上次那个那个串台的 bug 之所以那么久都没有找到原因 ， 一个最主要的问题就是我们两个都没有办法重 ，不 ， 应该是我们三都没办法重现它 ，因为这个东西是要在特定的运营商的网络里面 ， 就是就是长程宽带啊 ， 才会出现 。

然后然后偶尔在某些这个这个什么呃移动啊 ， 联电信的运营商里面偶尔也会出现 ，但是好像这个就是跟那个电信或者这个他们的网络的结构有点关系的 ，因为它不似乎不是一个全国统一的一个结构 ， 所以就比较麻烦了 。

**吴涛** [1:08:28]
没错 ， 就有人定义过说呃 debug 的过程其实就是呃 it's a process of confirming the many things that you believe are true until you find one which is not true.

就我们首先有两个障碍 ， 第一个是我们呃我们 believe true 的东西太实在是太多了 ， 呃另外第二个就是我们没有办法通过一次事例就就决定说这个东西肯定是 true 的 。

就我们自己都下载过了无数次 podcast，但是没有一次是可以呃重现这个 bug，因为对 ，而且对 ，而且即便你是用长程宽带 ， 你也不是每次都会遇到这个 bug， 这也是最让人头疼的一个问题 。

**Rio** [1:09:15]
没错 。

**吴涛** [1:09:16]
Yeah， 呃 ， 那我来说一个我遇到过的一个比较痛苦的 bug 了 ，而且很遗憾的是这个 bug 直到今天我都没有解决它 ， 我就离职了 。

呃 ， 哈哈哈 ， 来说一下这种心头心心里的一个一个一个一个痛 。 嗯 ， 我的上一家公司是做博彩的 ， 呃 。

**Rio** [1:09:43]
不用不用说这么高雅 ， 就是赌球嘛 。

**吴涛** [1:09:46]
对 ，是赌球的 ， 然后赌球的公司比较重视的一件事情就是客户的呃 ， 就怎么说呢 ， 就是客户会把钱存在我们公司的网站上， 可以这么理解 。

呃 ，但是有时候有一些使用 iOS 设备的 Chrome 用户 ， 就是如果一个用户使用 iOS 上面的 Chrome 访问我们公司网站 ， 然后登录我们公司的服务器 ， 大概有呃万分之一到十万分之一的概率 ，他会看到另外一个人的账户 。

**Rio** [1:10:24]
啊 ？

**吴涛** [1:10:25]
这是非常非常非常非常恐怖的一件事情 ，不是吗 ？ 就你你登录了你自己的账号 ， 结果看到另外一个人的账号 ， 此时你就会难道你心里不会产生一丝恐慌 ， 就是我靠 ， 那我的账户不是也被别人用了吗 ？

然后 。

**Rio** [1:10:40]
对啊 ， 对啊 ， 还是里面有钱哎 。

**吴涛** [1:10:42]
对 ，而且里面有钱 ，而且而且有感觉 。

**Rio** [1:10:45]
你登录哪哪天换了那银行 ， 哎 ， 这个银行也经常出现 ， 说什么去那个 ATM 机取钱 ， 一看操 ， 查一下看存款后面有 8 个 0。

**吴涛** [1:10:55]
对 ， 赶紧全都存出来 ， 对吧 ？ 赶紧全都取出来 ， 对吧 ？ 但这是非常恐怖的一个 bug。 然后但是我其实遇到了跟 IPN 串台问题一样的问题 ， 一样的困境 ， 就是我们我自己没有办法重现这个 bug， 只是有大概呃 4 到 5 个比较有良知的用户呃遇到这种情况 ， 立刻截了图 ， 然后退出那个账户 ， 然后把截图发给我们 ， 说有这么一个有这么一个 accident 在 。

然后第一件事情出现的时候 ， 呃基本上就已经鸡飞狗跳了 ， 然后后面又出现了三次 ， 然后大概有那么四五个人连续不断的去尝试重现这个 bug， 没有做到 ， 然后又开始尝试着分析这些人的账户 ， 呃他们的登录过程有什么异常之处 ，也找不到 。

而且 OK，而且比较悲惨的是 ， 这些人一旦把这个 bug 报进来 ， 我们就必须立刻先把他们公司先把他账户给封了 ，因为生怕他又对 ， 又生怕他又再一次登录到同一个账户 。

然后一个可能的猜测是 ， 这个 bug 是由呃我们的 session replication server 引起的 ，因为服务器是一个集群嘛 ， 呃你要在这个服务器上登录 ， 然后你的 session 信息需要被复制到另外一个服务器上的话 ， 需要一个专门的 dedicated session session replication service， 然后这个 service 使用了一个比较老旧的呃那个库叫什么 ， 一时想不起来了 ， 是一个 Java 的 session replication， 一个 Java 的 in-memory database 的库 。

然后我们怀疑是这个库有问题 ， 然后专门请了这个库的德国的这个库的公司德国分部的人来排查 ，也没弄出来 。

然后又把又然后又在一个呃用户报这个 bug 的时候 ， 把整个 server 的那个 heap dump 弄下来 ， 然后开始分析 ，也没分析出来 。

最后实在实在实在实在没有办法 ， 我出了一个馊主意 ， 就是呃嗅探那个用户的浏览器 agent， 如果发现他是在 iOS 上使用 Chrome， 就不让他用我们的网站 ， 说请你使用 Safari，因为 Safari 没有这个问题 。

呃 。

**Rio** [1:13:14]
所所以 Safari 用户没有出现过这个问题 ， 只有 iOS 就是 Chrome 和 iOS 有这么一个问题 。

**吴涛** [1:13:20]
对 ，Chrome 上的 i 呃 iOS 上的 Chrome 有这么一个问题 ， 所以问题也有可能出现在 Chrome 上面 ， 对吧 ？ 但

。

**Rio** [1:13:29]
但你不知道 ， 你没法 。

**吴涛** [1:13:30]
我没有办法解释 ， 对 ， 这是一直困扰到我今天的一个一个一个 bug。

**Rio** [1:13:36]
就不是连接层的问题吗 ？

**吴涛** [1:13:39]
我不知道啊 。

**Rio** [1:13:41]
对 ， 这个是没有办法去确切的回答的问题 。

**吴涛** [1:13:44]
我不知道啊 ， 对 ，而且怎么说呢 ， 就是其实大部分 bug 都是你搜一搜就可以搜到的 ， 对吧 ？ 就那再怎么隐秘的 bug， 你你很很少有可能你是第一个碰到它的人。

但是我搜一下， 从没有看到过任何一个人有类似的这么一个问题 ， 就这实在是太非常非常伤感的这种感觉 。

**Rio** [1:14:08]
所以到现在为止你也没有解决 ，他也不知道为什么 。

**吴涛** [1:14:11]
没有解决 ， 没有 ，不知道为什么 。 然后到现在为止 ， 这个网站 ， 这公司的网站还是不允许使用 Chrome 呃登录呃 iOS 上 Chrome 登录 。

我觉得时间一久 ， 可能过上三五年， 如果没有人去看文档的话 ， 没有人会意 ， 没有人会知道为什么要这样做 ， 为什么要单单要把 iOS 上 Chromeblock 掉 。

**Rio** [1:14:33]
哈哈哈 ， 好吧 ，one of the greatest mysteries。

**吴涛** [1:14:40]
这是这是我人生最悲伤的一个 bug。

**Rio** [1:14:43]
哈哈哈 ， 然后这个链条太长了 ， 你你确实很难去 ，而且这个样本又不多 ， 对吧 ？ 只有 3 例 ，是吧 ？

**吴涛** [1:14:51]
对 ， 就 3 到 4 个 ，4 个用户受到影响的吧 。

**Rio** [1:14:55]
对啊 ， 你这个是 。

**吴涛** [1:14:56]
或者说我们知道的只有 4 个 。

**Rio** [1:14:59]
也很有可能什么一个宇宙事件打到你们那个服务器上， 然后翻转了一个内存里面的一个比特位 ， 然后导致这个 session 复制的过程中出现了错误 ， 你也很难说啊 ， 对啊 。

**吴涛** [1:15:11]
是 ，也许对 ， 最后发现 bug 出在太阳黑子上面 ， 我我能把它怎么样 。

**Rio** [1:15:18]
哈哈哈 ， 好吧 。

**吴涛** [1:15:20]
然后我在准备这一期节目的时候 ， 专门去搜了一下呃有哪些呃最奇怪或者最有趣的 bug。 呃 Quora 上面有这样一个问题 ， 就是 what's the hardest bug you have ever debugged?

然后排名第一的答案是呃一个在一个给索尼第一代索尼开发游戏的一个人 ，他遇到了这么一个 bug， 就是呃这个游戏在你储存的时候 ，有非常小的几率会让你那个 PS 的存储卡上面的数据呃被被损坏 。

就是你存这个游戏的盘的时候 ，有非常小的概率会导致你那个 memory card memory stick 上面所有的存档资料都消失掉 。

对 ， 这真的是 。 对 ， 那个年纪比较小的呃听众们可能不知道我在说什么 ， 就是早期的 PlayStation 上面是有这么一个小小的像 USB 插盘的呃 USB 盘的这么一个东西 ， 呃叫做 memory stick， 你把它插进 PS。

**Rio** [1:16:26]
索尼自家的 U 盘接口 ， 呃不是 U 盘 ，是那个 SD 卡的型号的接口 ， 对 。

**吴涛** [1:16:32]
对 ， 然后你把它插到你的 PlayStation 上面 ， 才可以把你的游戏存盘 ， 然后这个存盘文件是你是你可以自己带在身上的 。

然后这个游戏有可能把这个存盘就整个盘给毁掉 ，也就意味着你不管玩什么游戏 ， 你所有存盘文件都不见了 。

这是很恐怖的一件事 。 然后他们的呃随着这个 deadline 逐步逼近 ，他们的程序员非常恐慌 ，因为那个时候的 PlayStation 是没有 PlayStation network 这种东西的 ， 就是你最终压了盘 ， 然后这个盘出去 ， 所有人玩如果有 bug， 那是没有办法通过在线升级来来解决这个 bug。

然后他们恐慌 ， 非常恐慌 ， 然后就开始一点点排排除错误 。 最后他们把游戏精简到了就是几乎什么都不干 ， 就是唯一的功能就是呃登录游戏 ， 呃然后存盘 。

即便在这种情况之下， 还是有一定几率会有会可能损坏掉那个记忆卡 ， 然后他们就疯了 。 呃直到直到有一天 ， 呃他发现一个人， 就是他们的一个美工在呃他当时比较生气 ， 然后他可能训斥了那个美工 ， 然后那个美工比较呃 nervous 的去摆弄手柄的时候 ， 游戏正在存盘 ， 然后此时记忆卡被 crop 掉了 。

然后他说什么 ， 你 do it again。 然后就是他们发现 ， 如果你在存盘的时候下意识的或者说无意识的摆弄了那个手柄 ， 你的记忆卡就会被抹除掉 。

最后他们发现这个这个故障是来自于嗯 ， 怎么说呢 ， 就是呃他们的他们的游戏在打 ，他们的游戏在运行的时候 ， 会把呃 PS 主机上面的一个晶振 ， 就是一个硬件的晶振 ， 设成比较高的一个频率 ， 然后在这个特定频率之下 ，有可能这个晶振会呃干扰到主机上面的另外一个呃和手柄传输波导率相关的一个芯片 ， 然后使得这个芯片产生一个特定的 bug， 然后这个

bug 会导致记忆卡损毁 。 这是对 ， 这是看起来非常曲折 ， 然后让人捏了一把汗的一个故事 ， 推荐大家去读一读 。

**Rio** [1:19:01]
你说你要遇到 ， 你说我们现代程序员要遇到这种级别的 bug 怎么办 ？

**吴涛** [1:19:07]
我觉得真的就就一头撞死算了 ， 我觉得呃就好像类似的 bug 其实在呃游戏论坛里面 ， 游戏开发者论坛里面也经常可以看到 ， 比如说曾经有过一个 bug 是嗯

，在第一个场景里面 ， 如果你把如果你用手柄把相机视角转到呃角色的身后， 整个游戏就会 crash， 然后他们顶着这个 deadline 的压力测试了一个月都没有测出来到底是为什么 。

最后他们的解决方法就是在第一个场景里面编程强制说呃相机只能保持在侧边的角度 ， 然后一直到跑到安全的地方 ， 才让用户可以把那个视角转到背后 。

对 ， 你像这种 bug 你你没有办法解决的时候 ， 你就真的只能绕开它 ， 如果你有压力的话 。

**Rio** [1:20:03]
你之前也不也干了吗 ？ 你直接进了那个 Chrome for iOS 一样的 。

**吴涛** [1:20:09]
对 ， 这是这是一些比较 drama 的 bug，但大部分时候我们遇到的 bug 其实没有那么没有那么复杂 。

### 调试方法

**Rio** [1:20:16]
那真真的是因为自己蠢了 ，不能怪别人， 不能怪社会 。

**吴涛** [1:20:21]
没错 ， 对 ，其实嗯 ， 大部分 bug 都可以通过一些比较基本的手段被发现了 。其实最基本的一个就是 read code， 就是把你刚刚写下的东西仔细读一遍 ， 很多时候就已经可以发现这个 bug 到底何在了 。其实不一定哎 ，因为像会形成那个思维定式嘛 ， 让你反而一直你反复读也看不出问题在哪里 。

比较经典就是那个就是那个叫什么来着 ，因为这像 C 啊 ，C++ 啊这种 ， 它不是那个叫做缩进式无影响的嘛 。

对 ， 然后你写了一个 if， 忘了打花括号 ， 然后你觉得你缩进的后面一排一个 block 代码 ， 就应该说这个应该在这个 if 这里面啊 ， 结果一看没有花括号 ， 最后第一行被执行 。

没错 ， 哎 ， 我其实在研究生当呃助教的时候 ， 呃遇到过一模一样的 ， 遇到过这样一个案例 ， 就是我当时在写那个写就反正写我项目 ， 然后呃我写梦写项目的地方是学校的一个计算机实验室 ， 然后有两个德国小孩在那 ，不是小孩 ， 就反正两个德国本科生在那边写程序 ， 别人都走了 ，他们两个还坐在那搞 ， 然后最后他们终于忍不住了 ， 问我

说你能过来看一看我们程序到底什么问题吗 ？ 然后看了一下， 看了大概

3 分钟 ， 就说这里缺一个花括号 ， 然后他们两个疯了 ， 说我们在这做了 4 个小时， 就是因为这个花括号 。

**Rio** [1:21:53]
哈哈哈

， 所以所以就遇遇到这种情况 ， 就是说啊 ，有先不说这个缩进敏感是不是件好事吧 ， 至少你像那个 Go 语言 ，他不是有个那个自带个叫 Go format 那个工具吗 ？

可以帮你说标 ， 就是把代码重排成一个标准样式 ， 这样可以一眼看出这种比较愚蠢低级的错误嘛 。

就上次那个你知道那个 heart 呃 heart bleed， 就是那个 OpenSSL 那个大 bug 出现嘛 ，其实也是因为类似的原因嘛 ， 还有个什么好像是一个 double return 吧 ， 好像是 。

嗯哼 ， 然后没有没有没有看到 ， 就发现那个检查都根本就没有 ， 从来这么多年过去了 ， 从来没有执行过那个安全性的检查 ， 白搞了 。

就是其实也是可以 ， 就是其实如果你自己自己看那个代码的原始的形状 ， 你你不仔细去想 ， 就我不告诉你这里有个明显的问题的话 ， 你怎么也想不到那里会有这么一个状况 ， 对不对 ？

那个代码在公公开 ， 就是它是开源的嘛 ， 光天化日下存在了那么多年都没有人发现 。 所以我觉得 read code 是最低效率的除虫的手段 。

**吴涛** [1:22:59]
嗯 ， 当然我觉得这个点可能是说 ， 如如果你有一个比较啊好的写一小段就回去 review 一下的习惯的话 ，其实是对于杜绝这样的 bug 出现是比较有有有意义的 。

当然不是每个人都有这个习惯 ，但可能这也就是为什么一些比较呃好的 IDE 会动用静态分析器或者 static analyze 这种东西来 ， 就是说在某种意义上是它帮你读你刚刚写下的代码 。

**Rio** [1:23:31]
嗯哼 ， 就判断一些就行呃模式嘛 ， 或者行为之类的 。

**吴涛** [1:23:36]
没错 ， 呃反正基本的问题解决了 。 对 ， 大家喜欢 IDE 的原因之一也就是它会呃除了于法高量之外， 会告诉你说这个地方看起来好像是不对的 。

嗯嗯 ， 就比如说那个 Xcode 的 playground，其实就是在不停的静态分析你的代码 ， 然后甚至动态的运行它 ， 然后可以帮你及时发现自己写的代码哪里不对 。

**Rio** [1:24:04]
然后我们说这个什么最其实蛮常用的一个除虫的手段就是打印除虫法 。 哈哈哈 。

**吴涛** [1:24:13]
对 ，the good old printf。

**Rio** [1:24:18]
哈哈哈 ，printf 是一个 C 本系的系统标准函数嘛 ，C 里面标准函数打一个字符串 ， 对吧 ？ 然后一般的做法怎么样子 ？

这就是你在你觉得可能会出问题的那个那个区间 ， 打印一个你认为它应该是某一个数值或者是一个一个变量 ， 然后看它是不是在那个时候确实是如你所料的那个数字 ， 然后你可以让一次插多个打印点 ， 或者是打印多个这个变量 ， 或者是这个什么结构体之类的 ， 然后看是否如你预期嘛 。

就是其实刚才王老说了啊 ， 就就整个过程就是说你形成一个假设 ， 就假设代码在这里出了问题 ， 然后你去验证那个假设是否成立 ， 然后逐一排查的过程嘛 。

然后这个打印除虫法就是做了一个最最原始的方法 ， 就是这么一个一个过程 。

**吴涛** [1:25:09]
对 ， 打印除虫法的第一步是测试这个打印除虫法的 ， 我是一个打印除虫的大师 。 哈哈哈 ， 呃打印除虫法的第一层境界是呃检测这个代码分支会不会运行到 。

哈哈哈 ， 比如说我经常会在 JavaScript 里面写 console log 1， 然后下面一个分支写 console log 2， 然后再下面一个 console log 3， 然后运行 ， 哎 ， 然后去 console 里面看说 123 是不是都打出来了 。

如果没打出来的话 ， 哦 ， 这段代码根本就没有被运行啊 。

**Rio** [1:25:40]
这个是最基本的叫做什么 control flow 嘛 ， 控制流的检验 。

**吴涛** [1:25:43]
对 ，retriability。 然后第二层境界才是打印一个代码的值 ， 打不打印一个变量的值 ， 写 PHP 的时候或者什么 whirl dump 之类的 。

**Rio** [1:25:55]
数值除虫法 ， 对 ， 打印数值除虫法 。

**吴涛** [1:25:59]
对 ， 没错 。 然后第三层境界可能就是在 printf 的时候 ， 第三层境界就是带 debug 的 printf， 就是在呃代码里面定义一个红 debug，if debug then printf， 然后这个东西 printf 就就此生成为了最终代码的一部分 。

**Rio** [1:26:20]
哈哈哈 ， 你说你知道那个打印除虫法的那个抓狂状态是怎么样的吗 ？ 就是 printf 括号开啊 ， 那个引号开 ，what the fuck why didn't this run here。

哈哈哈 ， 然后问号五个感叹号 ， 然后关关关引号关括号 。 哎 ， 还忘了个分号打上去啊 。

**吴涛** [1:26:40]
对 ， 早如说早期 Windows 的 Windows NT 还是 95 的原代码报出来之后， 发现里面有很多的那个 printf 的段落 ， 都是在诅咒编译器 ， 说傻逼编译器这里又弄错了 ， 希望我受控了 ， 做什么什么什么 。

**Rio** [1:26:55]
但其实打印除虫法的最麻烦的一点就是它需要你重新 ， 就如果是静态语言哈 ， 它需要你重新编译一遍 ， 编译重新重新 ， 就是就是什么 ， 你你插入一个打印语句之后你得保存 ， 然后编译 ， 然后再执行 ， 就每次要重新跑一遍 ，是比较这个过 。

如果你那个那个什么工程项目比较大 ， 然后那个编译时间比较长的话 ， 哈哈 ， 你就哭死吧 。

**吴涛** [1:27:22]
没错 ，其实刚才说的三层境界都是非常不非常不推荐的 ， 尤其是第三层境界 ， 就是你如果你真的需要检测 printf， 或者说检测一个程序的输出来验证它是否正确的话 ， 呃 ， 嗯 ， 比较比较 methodology 的方法是用一个比如说 log for j 这样的库来输出比较呃正统的嗯记录资料 ， 然后你可以使用一些比较相对来说比较比较高端的功能 ， 比如说区分这个 log 的等级是 warning

是 info 还是 debug 还是还是 error， 嗯 ， 然后可以记录下时间 ， 然后可以记有选择性的记录 ， 比如说嗯 ， 当时的这个站的情况呀 ， 或者是呃堆的情况 ， 或者是乃至于一个一个一个变量的值 ， 可千万不要简单的用 if debug 然后 printf 这种这种比较愚蠢的方式 。

**Rio** [1:28:25]
哈哈哈 ， 对

。 嗯 ， 所以比较高级的方式是什么 ？

**吴涛** [1:28:33]
嗯 ， 我们可以一项一项来来来总结了啊 ， 最简单的就是 ， 或者最最最具有早期黑客精神的除虫除错工具 ， 就是呃其实叫 DB 了 ，debugger，DB 这么一个小工具 ， 嗯 ，有点类似于 DOS 时代的那个 debug.com， 嗯 ， 还是 debug.com 还是 debug.exe 的程序 。

嗯哼 ， 就早期 DOS 下面有一个可以让你直接输入汇编来写程序 ， 乃至于调试其他程序的小小程序的 debug.com。

我不知道你有没有你有没有印象 ， 你有没有用过 。

**Rio** [1:29:19]
呃 ， 没什么 ，DOS 上面真的没有什么编程的经历 。

**吴涛** [1:29:24]
OK， 就比这个 debug.com 的鼻祖 ，其实就是早期 Unix 下面的一个工具 ， 工具叫做 DB，也就是 debug 的缩写 。 后来 GNU 出了一个 GNU DB，也就是现在最广为使用的 GDB。

呃 ，GDB 简单来说就是这么一个程序 ， 它可以你可以让这个程序替你运行你的程序 ， 然后在这个程序在运行的时候 ， 一上来会会暂停 ， 或者说呃 ， 根据你调用它的方式不同 ， 它你可以让它一上来就暂停 ， 然后告诉它说这个程序运行到某一个特定行的时候 ， 请你停下来 ， 然后我要看一看这个程序现在的状况是什么样 。

呃 ， 然后 GDB 也是在命令行下运行 ， 嗯 ， 运行的方法就是你用你先写 GDB， 然后后面跟你比如说你刚刚编译好的一个 C 程序 ， 然后 C 程序的源码和 C 程序的那个中间的调试信息也全都在存在当前目录之下， 然后你用 GDB 调用你呃写好的程序 ， 然后告诉 GDB 你要在哪断点 ， 然后在哪调试 ， 所有的指令都是通过键盘输入的 ， 然后你比如说你停 ， 你要

设定的设定点 ， 你要说 break at line 31， 比如说 ， 然后为了简化 ， 你可以把整个没有意义的呃 ， 没没有歧义的指令简化为一个字母 ， 比如说 B31， 就是说在 31 这个地方放一个断点 ， 然后它运行到 31 的时候会告诉你说啊 ，31 有了什么 ， 我已经运行到 31 了 ， 接下来要干什么 ， 比如说你可以说啊 ， 嗯 ， 打印出某一个计算器的值之类的 ， 整个过程有点像玩 Mod， 我

哈哈哈 ， 或者应该反过来说 ， 玩玩 Mod 的过程就有点像这个呃 ， 使用一个命令行的这种编辑器 ， 就你输入一个指令 ， 可以看到你周围有什么 ， 然后你再输入一个指令 ， 可以决定说你要做什么 。

**Rio** [1:31:22]
就是所以我觉得用这个方法比那个什么打印除虫法最大最大的优点就在于 ， 它不用每次去重新编译一对于你的这个程序去加一个打印语句 ， 然后又重新编译跑一段进入到那个出错的那个那个环节 section， 然后再来判断 ， 就是它这个是可以在等于是在程序运行过程中动态的去查看它运行的环境 ， 然后是否符合你的假设嘛 ， 对吧 ？

**吴涛** [1:31:48]
没错 ， 所以有了这样的工具 ， 我们就实现了一个非常重要的软件开发的原则 ，separation of consent， 就是你写下来的代码应该只是用于实现你真正想要实现的那些东西的 ，而不是其中有一部分的功能是用来让你检测这个程序是不是在正确运行的 。

嗯 ， 这就是一个调试工具的意义 。 然后 GDB 其实直到今天都还有人用 ，而且在其他所有的语言里面 ， 几乎几乎所有的语言 ，Java 的语言里面都有这么一个命令行下面调试的工具 ， 比如说 Python DB 叫做 PDB， 然后还有嗯 ，iPython 也有这么一个专门让人用来做交互式的命令行下的呃 ，debug 工作的一个库叫做 ipdb， 这些都是相当好的工具 。

嗯 ，Rio 你用过吗 ？ 就你你你写 Python 会会用 debugger 吗 ？

**Rio** [1:32:50]
呃 ， 偶尔用那个 。

**吴涛** [1:32:52]
只有 20% 的时间里面 。

**Rio** [1:32:54]
对 ， 偶尔会用 PDB，但 。

**吴涛** [1:32:56]
你觉得好用吗 ？

**Rio** [1:32:58]
嗯 ， 看情况吧 ， 它有些情况是用不了的 。 我印象中就是它得插入一个 ， 就 PDB 它在启动的时候 ， 它得在某一个地方插入一个断点 ， 引入 PDB， 然后自执行那个那个你会进入那个 PDB 那个环境那个点嘛 。

完了之后你又回到那个正常运行了嘛 ， 然后就是你要如果就不能比较灵活的换到其他的那个断点里面去检测另外一堆的状态 。

**吴涛** [1:33:26]
嗯 ， 我觉得其实对我来说 ， 呃 ， 命令行调试工具 ， 包括不管是 PDB 也好 ，GDB 也好 ， 嗯 ， 最大的问题是都太难记了 ，因为 。

**Rio** [1:33:39]
太什么 ？

**吴涛** [1:33:41]
太难记 ， 就是所有的指令都太难记住了 ，而且就每次用的时候都要打开一个 manual 在那边查 ， 说啊 ， 接下来我要干嘛 。

**Rio** [1:33:49]
显然 ， 那显然是因为你用的还不够多嘛 。

**吴涛** [1:33:52]
对 ， 我我可能跟你差不多 ， 就是有最多有 20% 的时间在 debug， 然后在 debug 的时候我就啊 ， 可能大学的时候好稍微好一点 ， 大学的时候还能记住一部分指令 ，但是到现在真是 ， 尤其尤其是在用一门已经很长时间没有用过语言的时候 ， 然后要用要去用一个命令行下面的 debug， 真的是要了亲命了 。

所以 。

**Rio** [1:34:16]
这个时候你知道你需要什么吗 ？ 这个时候你需要 cheat sheet。

**吴涛** [1:34:22]
啊 ，OK。

**Rio** [1:34:24]
作弊纸啊 ， 你得打印一张那个常用快捷键的东西 ， 贴墙上， 贴那个屏幕周围 ， 能够一眼看得见什么时候该按哪个指令了 。

**吴涛** [1:34:35]
我以前其实桌子上专门有一个文件盒 ，是专门拿来放各种 cheat sheet 的 。

**Rio** [1:34:41]
对啊 。

**吴涛** [1:34:41]
什么 SQL 的 cheat sheet， 呃 ，regular expression 的 cheat sheet，Vim 的 cheat sheet， 然后还有对各种各样 IDE 的 cheat sheet。 现在这所有这些纸应该都已经发黄了吧 ， 效果并不是非常理想 。

**Rio** [1:34:57]
对 。 我我我是有一个呃 ，在桌面上有个快捷方式 ， 一个文件夹叫 cheat sheets， 然后里面各种各样的常用的一些呃 ， 工具的一些 cheat sheets， 包括什么编辑器的快捷键啊 ，HTTP 这个什么 status code 啊 ， 还有这个 。

**吴涛** [1:35:14]
这个文件夹我一直都有

。

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

**吴涛** [1:35:17]
而且这个文件夹被我这个文件夹被我命名为 flight manual。

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

**吴涛** [1:35:25]
飞行手册 ， 对 。

**Rio** [1:35:26]
哈哈哈 。 这个不错 ， 这个不错 。

**吴涛** [1:35:31]
对 ，但是怎么说呢 ，并没有什么卵用 。 哈哈哈 。 呃 ， 最终我还是转向了 ， 至少在 debug 这件事情上， 我还是转向了图形界面的 debugger。

**Rio** [1:35:46]
OK， 然后有些什么高级的介绍一下 。

**吴涛** [1:35:50]
也不算高级吧 ， 就是至少比如说我们刚才介绍的这个鼻祖级的 GDB，其实它有一个嗯 ， 图形化界面叫做 DDD。DDD 对 ， 是一个 Xwindow 的呃 ，Xwindows 的 GDB 的前端 。

**Rio** [1:36:07]
嗯哼 。

**吴涛** [1:36:08]
然后嗯 ， 我上次用 DDD 可能也是在上读研究生的时候 ，因为研究生毕业就再也没有写过 C 程序了 。 嗯 ， 当时觉得 DDD 最大的一个卖点就是它可以把一些比较常用的数据结构呃 ， 用图形化的方式表现出来 ， 比如说你写了一个单向链表 ， 呃 ， 它分析了之后可以把你的链表用一个一个的方框画出来 ， 然后告诉你说哦 ， 这个链表的指针指向指向了那一个 ， 呃 ， 这个链表

上的节点的指针指向了另外一个节点 ， 然后诸如此类 。 呃 ， 当然大部分时候它还是被拿来用呃 ， 做那个 debugger， 就是至少 DDD 上面你可以用鼠标点了 ， 你说我想在这一行设一个断点 ， 你点那一行 ， 然后点一下设的设断点就可以了 ， 终于可以不用去记那些单个指令的这些 debugger 的命令了 。

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

**吴涛** [1:37:05]
这是 DDD 最大的一个卖点 。

**Rio** [1:37:07]
所以其实你看到哈 ， 这些情况下就怎么说呢 ， 就用的没有像编辑器那么勤快的功能 ，有一个图形的方式去让你不用记住快捷键还是挺好的 。

**吴涛** [1:37:20]
对 ， 我觉得其实一个独立的有图形界面的 debugger， 配合一个专一的用来写程序的编辑器 ， 是一个挺好的组合 。

就呃 ，Linux 的呃 ，Unix 的哲学之一不就是呃 ， 做一件事情 ，而且对 ， 把这件事情做好了 ， 那我用一个编辑器专门来写程序 ， 然后用另外一个 debugger 专门来 debug，其实也挺好的 。

嗯 ， 包括很多人会说嗯 ， 我想要把我的 Vim 打造成一个 IDE，但这其实在某种程度上就背离了 Vim 当初被开发出来的一个应用场景 ， 呃 ， 你不如就好好的把它当做编辑器来用 ， 然后等你真正需要去调试的时候 ， 你跳到另外一个程序里面去调试就好了嘛 ，因为在 Vim 里面你跟命令行的距离其实就只有一个 Ctrl 加 Z 而已 。

**Rio** [1:38:17]
不是 。 对 。

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

**Rio** [1:38:21]
哎 ， 说到这个 Vim， 我最近做了一个比较疯狂的事情 。

**吴涛** [1:38:25]
说来听听 。 我我已经系好安全带了 ， 说来听听 。

**Rio** [1:38:29]
我把那个就之前不是很多 ， 就是那个就代代码颜色高亮嘛 。

**吴涛** [1:38:35]
嗯哼 。

**Rio** [1:38:36]
我把它调到最基本的模式了 ， 就只会标出啊 ， 注释 ， 用的斜体 ， 然后那个叫字符串 ， 用的是一个另外的颜色 ， 对 ， 然后其他的那些高亮的颜色都关掉了 。

**吴涛** [1:38:56]
哈 ， 靠呀 。

**Rio** [1:38:57]
哈哈哈 。

**吴涛** [1:38:59]
Vim 里面是不是有一个默认的 theme 叫做呃 ，green， 还是叫什么 ， 就是它对它用不同灰度的绿色来显示关键字 。

哎 ， 对 ， 我想问一问 ，Vim 默认的主题叫什么 ， 就叫 default 吗 ？

**Rio** [1:39:17]
对 ， 就叫 default。

**吴涛** [1:39:18]
啊 ，OK。 我记得早期学到的比较重要的一个一个 trick， 就是在呃 ， 某些情况下你可能呃 ，SSH 到另外一台主机上面的时候 ， 发现那台主机和你的终端模拟器的配色不匹配 ， 然后你终端模拟器里面可能紫色特别特别的暗 ， 或者是呃 ， 蓝色特别特别的暗 ， 根本看不清楚那个远端服务器上这个代码到底是什么的时候 ， 呃 ， 就在 Vim 里面打 set 呃 ，color theme f lord， 就是

精灵精灵领主这个这个字 ， 然后在 99% 的情况之下， 它会使得你能够看清楚呃 ，在 default 的 theme 之下看不清楚的代码 。

这是一个 trick。

**Rio** [1:40:10]
这什么原理 ？

**吴涛** [1:40:12]
没有什么原理 ， 就是 。

**Rio** [1:40:14]
配置了吗 ？

**吴涛** [1:40:14]
就是 f lord 这个 theme 的所有的颜色都比较鲜艳 ， 可能是这个原因 。

**Rio** [1:40:21]
啊 ，OK。

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

**Rio** [1:40:22]
明白明白 。

**吴涛** [1:40:23]
然后没有那些就是 dark blue 之类的这种颜色 ， 会使得你的终端模拟器如果那个色彩模式没有调对的话 ， 会会会把那个远程服务器上的蓝色显示的特别暗 。

**Rio** [1:40:37]
我我到现在为止还没找到那个单色的 ，不过反正我现在就是基于一个叫做 e-ink 的这个色 ， 就 color scheme 改的 ， 就是 。

**吴涛** [1:40:47]
OK。

**Rio** [1:40:47]
啊 ， 这个代码注释会是一个灰色的 ， 就是浅一点的颜色 ， 会浅灰色 ， 然后是斜是斜体的 ， 然后那个字符串会是斜体的 ， 然后其他都是都是一个默认的黑色的字 ， 没有其他颜色 。

**吴涛** [1:41:03]
哈 ， 靠呀 。

**Rio** [1:41:05]
你说它叫 e-ink 嘛 ， 你还是有原因的 。

**吴涛** [1:41:08]
嗯 ， 就有电子墨水的效果 。

**Rio** [1:41:12]
哎 ， 说说到这里 ， 你用的什么配色啊 ？

**吴涛** [1:41:16]
啊 ， 我配色是一个经过改动的 mono kite。

**Rio** [1:41:23]
Mono kite 是不是很鲜艳那个版本 ？

**吴涛** [1:41:25]
呃 ， 还好吧 。 我我其实不是很清楚这个编辑器配色的鲜艳的标准是什么 ，但我反正现在用的是一个自己改过的 mono kite。

**Rio** [1:41:37]
OK， 然后 mono kite 是一个暗暗的暗色背景的是吧 ？

**吴涛** [1:41:42]
是暗色背景 。 我以前一直在用 solarize， 就是那个呃 ， 号称 。

**Rio** [1:41:47]
科学配色法 。

**吴涛** [1:41:48]
科学配色的 solarize，但是 。

**Rio** [1:41:50]
对 。

**吴涛** [1:41:51]
嗯 ， 怎么说呢 ， 就用过一段时间之后， 我发现在墙 ，在那个侧面受到的光线比较强的情况之下， 会很容易看不清楚 。

**Rio** [1:42:03]
对 ， 它的那个 contrast 就是对比度是不高的 。

**吴涛** [1:42:06]
对 ， 对比度比较 ， 它对比度比较低的 。 我觉得太注重美感了 ，有点漂亮是漂亮 ，但是用多了是感觉不是很好 。

然后 solarize 还有一个问题 ， 就是它在 256 色的情况之下， 嗯 ， 表现不是非常好 。 呃 ， 我试过很多很多种方法 ， 试图让 Vim 在呃 ，terminal 模式之下使用比较正确的或者比较养眼的 solarize 的的配色 ， 然后发现要改很多很多东西 。

首先你的呃 ，terminal 的那个呃 ，term 这个字符要改 ， 这这个这个场环境变量要改 ， 然后啊 ，Vim 里面的 theme 要改 ，color theme 要改 ， 然后有可能你还要在 bash 一上来的时候运行一个脚本来设定某些我不是非常清楚它到底干了什么的一些一些一些 tricks， 才可以把颜色设定的比较正确 ， 这挺痛苦的 。

**Rio** [1:43:07]
哎 ？

**吴涛** [1:43:07]
Mono kite 有没有这个问题 ？

**Rio** [1:43:10]
呃 ，solarize 它那个的主要问题是它它默认的那个就是 terminal 那个 console 的色盘会跟其他的非常不一样 。

**吴涛** [1:43:19]
对 ， 它会逼着你去改那个色盘 ， 你会把前 16 色改成完全另外一种场景 。

**Rio** [1:43:26]
对 ， 然后改了之后会有个问题 ， 就是兼容别的那种非 solarize 的色盘的话 ， 就会有点问题 ， 经常可能看那个字就看不见了 。

**吴涛** [1:43:35]
没错 ， 就比如说你装 ， 如果你用 solarize 的官方解决方案 ， 把你的那个 item 2 的调色盘改了 ， 此时你再用比如说 brew，brew 有时候会用不同颜色来告诉你说这个 package 是下载完了呀 ， 还是出错了呀之类的 ， 此时你会发现所有这些颜色都变了 ， 就可能本来是一个绿色的对勾 ， 现在变成了白色的 。

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

**吴涛** [1:44:00]
对 ， 非常不舒服 。 嗯 。

**Rio** [1:44:04]
哎 ， 所以其实说到这里要哎 ， 刚才问那个你你用暗色背景的话 ， 你在那个文档和这边之间切换的时候 ， 眼睛不会觉得那个突然一一明一暗吗 ？

**吴涛** [1:44:15]
嗯 ， 只有在夜里会有这个问题 ， 就是就是在深夜里面写代码的时候会有这个问题 。

**Rio** [1:44:20]
不对啊 ， 白天其实这个问题更更严重 ，因为其实你看白天周围环境都是亮的嘛 。

**吴涛** [1:44:27]
我觉得夜里比较夜夜里这种切换的场景的时候 ， 你眼睛会疼 ，但是白天就还好 。 如果你的背景足够亮的话 ， 白天这个问题就没有那么突出吧 ， 我觉得 。

**Rio** [1:44:39]
对 ，但是你你如果背景比较亮的话 ， 你那个叫什么 ， 你看那个黑色代码区就很成问题了 ，因为你这个时候是要放大你的瞳孔去 focus 到那个 ，因为暗色底的话 ， 它字是是白的嘛 ， 字是亮色的嘛 。

**吴涛** [1:44:56]
嗯 。

**Rio** [1:44:57]
它的光线是比较少的 ， 这个时候你要放大瞳孔才能够接受到足够的光去辨识它 ，但与此同时呢 ， 你的这个环境的光照是很高的 ， 这个是有很多这种周围的环境余光射到你的瞳孔里面去 ，其实对这个是挺眼睛是挺伤的 。

**吴涛** [1:45:14]
对 ， 会会会会引发眼部疲劳 。 我同同意你的观点 ，不过呃 ， 我可能另外一个原因就是我对这个事情不是特别敏感的 ， 就是我有两个显示器 ， 然后那个文档放在一个显示器上， 编辑器在另外一个显示器上， 编辑器永远是黑的 。

**Rio** [1:45:31]
OK。

**吴涛** [1:45:32]
就还就还好吧 。

**Rio** [1:45:34]
啊 ， 所以其实这点那个 solarize 的一个好处就是它是有暗色和亮色两个版本的 。

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

**Rio** [1:45:41]
我的当时的方案就是 。

**吴涛** [1:45:44]
我会切换 。

**Rio** [1:45:44]
你会切换是不是 ？ 我我的方案有点就是我当时想的就是说 ， 如果我环境很暗 ， 我就用那个暗色版本的 ， 环境很亮我就用亮色版本 ， 后来发现基本上都是很亮的环境 ， 所以就一直是用那个亮色版 ， 就 light 那个那个版本 。

**吴涛** [1:45:58]
我也我也在 Vim 里面绑定过快捷键 ， 就是按一下快按个 F9 吧 ， 我记得还是什么 ， 对 ， 可以在亮色模式和暗色模式之间切换 ，但后来觉得还是觉得蛋疼 ， 就算了吧 。

**Rio** [1:46:12]
哈哈哈 ，OK。 啊 ， 所以还有刚才就是那个吐槽那个那个颜色的问题 ， 这也不其实你不觉得现在那种 terminal 或者 console 这种东西 ， 它处理这个色彩的这种方式都非常呃 ，ancient， 非常原始吗 ？

**吴涛** [1:46:32]
都是历史遗留问题吧 。 我觉得就我们今天还在使用 terminal simulator 这件事情 ，其实仔细想想就很不可思议了 。

啊 ， 每个人都 。

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

**吴涛** [1:46:44]
对 ， 每个人都知道 common line 非常非常重要 ， 或者至少在目前 common line 的呃 ， 还是没有被人扔到历史垃圾堆里 ，但从来没有一个人能够成功的重新发明一面轮子 ， 然后把把 CLI 做得好一点 。

**Rio** [1:47:01]
对 ， 就那个命令行本身我觉得是问题不大 ，但是就是我们现在那个实现方式真是太古老了 ， 比如说刚才你说要实现那个文字 ， 要通过那个输出字符字符来各种转译 ， 然后甚甚至连最底层的你在那个啊 ，在 Linux 上面去去做一个这个 console 接口 ， 接到一个什么虚拟的什么 TTY 设备 ， 哇 ， 真是 。

**吴涛** [1:47:22]
对 ， 我其实我指的就是那件事情 ， 就是我们居居然还在使用这么古老的可以追溯到 1970 年代的啊 ，terminal simulator， 这我可能这个地方还是可以给这个对历史不是特别当 ， 我也不是很熟悉的呃 ， 听众们介绍一下， 就是我们现在使用的那个黑黑的可以敲文字进去的学学编程 ， 莫名其妙一定都要用到这个 terminal，其实是在模拟 70 年代的电传打字机 ， 如果你一定要追溯到远就是

源头啊 ，在就是说在显示器这个东西出现之前 ， 呃 ， 计算机是通过打印机就直接连在一个打印机上， 往纸上输出东西 ， 然后这个东西这这个东西的最基本的运作机理 ， 比如说 ASCII 码之类的这种东西 ， 一直都原封不动的被继承到了今天 ， 然后当显示器出现了之后， 一开始也是只能像电传打字机一样一次编辑一行的内容 ， 然后这一行的内容

编辑完了 ， 你按一下回车 ， 呃 ， 才会把这一行的内容出现出现输出在显示器上， 直到就是我们现在习惯的这种 Vim， 你打开 Vim 之后， 光标从呃 ，wait a second， 光标还是在左上， 对 ， 光标从你当前行跳到左上 ，并且你可以跳到任意一行 ， 只要你多按几次回车 ， 你就可以跳到任意一行 ， 然后再跳回来 ， 这种这种特性都已经是非常高端的特性了 ，在在这个

呃 ， 单色显示器的时代 ， 就你可以想象说早期单色显示器的时代 ， 那些电脑键盘上是没有方向键的 ， 为什么呢 ？

因为你按下方向键没有没有什么卵用啊 ， 你根本不可能把光标跳到上面一行或者下面一行 ，因为你你的电脑就只理解当前行的内容 ， 呃 ，而我们现在使用的这样一个小的 terminal simulator 这么一个 APP，其实是在原封不动的模拟这些 70 年的技术 ，而我们对此也都是司空见惯的 ， 就从来没有人想过要把它 ， 当然好吧 ， 我必须承认说呃 ，Plan 9 其实是已经解决了这个问题

了 ，但是就像我们知道的 Plan 9，因为它太好了 ， 所以它不可能流行起来 ， 我们就 。

**Rio** [1:49:44]
这是一个悲伤的歌 。

**吴涛** [1:49:46]
对 ，doomed to live in this ancient world。

**Rio** [1:49:50]
对 。

**吴涛** [1:49:51]
啊 ， 吐了好多槽 。

**Rio** [1:49:53]
这个这这个绕的有点远 。

**吴涛** [1:49:56]
对 ， 还是得把圈子兜回来 。 嗯 。

**Rio** [1:49:59]
接着讲那个 debugging 的事情 ， 这个我们之后有时间再再来这个探讨这个问题 ， 我其实还有挺多有意思的事情可以可以去讨论 。

**吴涛** [1:50:08]
呃 ， 可能从另外一个方侧面讲说 ， 为什么 terminal simulator 这么多年以来一直没有进展 ， 呃 ， 一个原因也就是 Windows 或者说图形化界面实在是发展的太快了 ， 人们没有时间能停下来回过头去呃 ， 把好好好好的把这个呃 ， 命令行界面的承载的容容器改变一下 ，因为如果你要去问这个世界上到底是使用 IDE 的写程序的人多 ， 还是使用命令行写程序的人多 ， 我觉得

一个比较合理的推断是肯定是用 IDE 写程序的人多呀 ， 就是使用一个 。

**Rio** [1:50:48]
压倒性多数吧 。

**吴涛** [1:50:49]
对 ， 压倒性 99% 以上吧的人是在用 IDE 写程序的 。 想反驳这件事情的人， 首先要想到有很多人他不是专业的程序员 ，但他仍旧必须通过某种工具来编程序 ， 你让他们去使用命令行是非常不人道的好吗 ？

比如说呃 ， 刚才节目一开始提到那个研究脑科学的赵赵晨博士 ，他是他你为什么要逼他去用命令行写程序呢 ？

对吧 ， 或者是一些呃 ， 乃至广义上的写这个 office 里面的 Verbasics VB script 的人都可以在一种对使用比较他所使用的工具都可以一种都可以当做一种广义上的 IDE 来看待 。

**Rio** [1:51:33]
对 ， 没错 。

**吴涛** [1:51:35]
对 ， 那什么是 IDE 呢 ？ 呃 ，有一个解法就是 integrated debugging environment，也就是 IDE 这个工具最重要的功能之一就是帮助你 debug， 呃 。

**Rio** [1:51:49]
提升出错环境是吧 ？

**吴涛** [1:51:51]
对 ， 它把它把你的 editor 和呃 ， 项目管理工具和呃 ， 版本控制工具以及以及最重要的这个 debugger 结呃 ，debug 工具集成在一起 ， 才孕育出了这么一个非常好用的 IDE 环境 。

嗯 ， 所以 Rio 你是即便现在也是会不呃 ， 会在公司里面也不用 IDE 的吗 ？

**Rio** [1:52:19]
呃 。

**吴涛** [1:52:19]
问题有点绕 ， 就是你现在仍旧哪怕是在工作的时候也不用 IDE 吗 ？

**Rio** [1:52:25]
我自己是不用 IDE 的 ，但我看有些其他的人他们会用一些东西去写 ， 当然你不要现在因为现在我们写 APP 是显学嘛 ， 对吧 ， 就是各种应用显学 ， 这个时候你就不得不用这个什么 ， 比如说 Xcode， 对吧 ， 你逃不掉的 。

**吴涛** [1:52:42]
对 。

**Rio** [1:52:42]
然后 。

**吴涛** [1:52:43]
Xcode 当然是一个比较极端的例子 ， 就是它逼迫你用这个 。

**Rio** [1:52:48]
对 ，但其他你也没得没得太多选 ， 比如说你写你写这个 Java 应用 ， 你跑不掉 Eclipse 或者 JetBrains 之类的 ， 对吧 ？

**吴涛** [1:52:56]
不 ， 我觉得 Java 的可选的 IDE 还是蛮多的呀 ， 就 Netbeans。

**Rio** [1:53:00]
但是可选的 IDE 是很多 ，但是他们都是用 IDE 写的 ， 很少见用 Vim 写 Java 的人。

**吴涛** [1:53:08]
啊 ，OK， 用 Vim 写 Xcode 的人呢 ？ 因为是是比较少 。

**Rio** [1:53:14]
对 ， 然后还有就是那个 Visual Studio 这个系列的啊 ， 基本上也是比较少用这个纯编辑器写的 。

**吴涛** [1:53:23]
对 ， 我在知乎上看到过一个说法 ， 就是说呃 ，C# 和 Java 之类的都是叫什么呃 ， 面向 IDE 的编程语言 ， 就是他们从设计之初就是考虑到这个语言一定要在 IDE 里面被写 ， 才比较才比较正常 ， 所以他们才不会去考虑什么呃 ， 那个方法的名称太长啊 ， 或者是关键字太长啊之类的问题 。

**Rio** [1:53:50]
对 ， 反正有自动补齐嘛 。

**吴涛** [1:53:53]
没错 ， 比如说 integer 一定要写成 integer，不像不像 C 里面写个 int， 或者是呃 ，C 里面比如说一开始说到那个 printf， 就刚学编程的时候你想过 f 代表什么吗 ？

**Rio** [1:54:08]
哈哈哈 。

**吴涛** [1:54:10]
就是你你刚才说的时候 ， 你说呃 ， 这个函数是是系统的一个函数 ， 它可以输出一个字符串 ， 当时其实我想纠正你说不对 ， 输出字符串是 put s， 那个 s 才代表 string，而呃 ，printf 的 f 代表的其实是 format， 就是 printf 这个函数最大的功能是让你输出一些内容 ， 然后这个内容是呃 ，有一个特定的 format， 所以它叫呃 ，printf。

但是如果是一个面向呃 ， 编 IDE 的编程语言的话 ， 那此处此处一定会不吝吝呃 ， 字符数的呃 ， 把这个方法命令呃 ， 命名为呃 ，output string with format。

对 ，yeah。

**Rio** [1:54:56]
哈哈哈 。

**吴涛** [1:54:58]
与此类似的 ， 比如说还有什么 sprintf， 第一个 s 代表什么呢 ？ 代表 string， 就是把把 format 的内容输出到另外一个字符串里 。其实这些早期的黑客们为了节省时间以及呃 ， 没有 IDE 的种的的状况 ， 导致于导致他们开发了这么一套非常简略的语言 ，也对早期学编程的人造成了很一定的障碍 ， 就是有些人他可能不是呃 ，不习惯那种一上来说啊 ， 我给你个例子 ， 你先

别管 3+2=1， 你把它敲出来 ， 然后做别的一步一步学下去再说 。他可能一上来就会说 ， 就会想要明白说啊 ， 这个 main 到底是干什么 ， 这个 int 到底是干什么 ， 然后这个 printf 的 f 代表到底代表什么 ， 然后如果他在一上来学的时候 ， 这些在他看来非常基本的细节都找不到答案的话 ，他很快就没有没有没有兴趣了 。

我觉得我早期就是这样 。

**Rio** [1:56:01]
嗯 ，有点那个看起来有点 cryptic 那个那个代码 。

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

**Rio** [1:56:07]
密密文刚才有点漏说了 ， 就是那些命名那么短 ， 除了有没有 IDE 的这个自动补齐的功能以外， 还有一个更很重要的原因 ， 刚刚我们讲的扯了那堆的那些 terminal 有关系 ， 就是早期的那些 console 宽度比较有限 ， 嗯 ， 只有什么 80 个字符或者是 60 个字符这样 ， 它如果那个方法名特别特别长的话 ， 它那一行就就悲剧了 ， 一行可能就写一个函数还写不掉用 ，

还写不完 。 对 ， 就这么一个考虑在里面 。 然后后来有了 IDE， 都是在这个 GUI 环境 ， 就是图形界面情况下， 那个宽度就可以比较有限 ， 就有这个富余了 。

而且像现在那个什么用的那个开发用的屏幕动则什么 1920 宽甚至更多 ， 对吧 ， 所以这个完全不是问题 。

**吴涛** [1:56:52]
没错 ， 呃 ， 另外一个原因就是早期的电传打呃 ， 那个不是电传 ， 早期的终端是一个呃 ， 就是等于是一只有一个键盘和一个显示器 ， 然后你按一个键 ， 这个键要这个键按下去的电讯号要先先传到服务器上， 然后再传回来 ， 才会在你的终端显示器上呃 ， 显示一个字符出来 。

这个过程是比较慢的 ， 如果你把一个函数设计的太长的话 ， 你可能敲到一半发现自己敲错了一个字符 ， 然后要按数着自己按回车的那个次数 ， 然后算自己按到哪一个 ， 自己应该删到哪个字符停下来 ， 这个过程是非常缓慢 。

所以 。

**Rio** [1:57:34]
这个其实在现代我也能也能体会到哎 ， 就这个过程 。

**吴涛** [1:57:38]
哦 ， 对 ，有时候你在使用终端显 。

**Rio** [1:57:41]
你就那个 SSH 的时候嘛 ， 你说连一个 ， 比如说你现在在这个德国 ， 你连一个假设新西兰的服务器 。

**吴涛** [1:57:50]
我有一段时间那个呃 ， 服务器在日本 ， 就这个状况非常明显 。

**Rio** [1:57:55]
哈哈哈 ， 就你会发现打一个字等一秒才出现 ， 再打一个字又等一秒才出现 ，也是因为这个 SSH 这种工具啊 ， 还是就刚刚讲吧 ，是来自于历史这种这种交互方式 ， 就是你想就按我们正常一个想法 ， 你在本地打个字 ， 为什么会要等到服务器传过来确认你才会会把它显示出来呢 ？

对不对 ， 就很奇怪 ，但是这就是来自那些 legacy 的东西 。

**吴涛** [1:58:22]
对 ， 早期的一些智能终端也就有了这么一个呃 ， 所谓的 local echo 的这么一个功能 ， 就是你按了一个键 ， 它先在本地帮你把它显示在服显示器上， 然后等到那个服务端传回来确认字符的时候 ， 你这边已经看到了结果了 。

这已经是早期的一个终端模拟器的卖点了 。

**Rio** [1:58:45]
哎 ， 对对 ， 说到这里 ， 就在这里安利一个挺好用的工具啊 ， 就是 Mosh。

**吴涛** [1:58:50]
Mobile SSH。

**Rio** [1:58:52]
Mobile SSH， 就它能够解决刚才说的那些问题 。

**吴涛** [1:58:55]
对 ，是 。

**Rio** [1:58:56]
它是通过一个叫什么来的 ？

**吴涛** [1:58:58]
MIT 做的吧 ？

**Rio** [1:58:59]
对 ，MIT 的一个学生做的 。 然后它这个工具就比较好去搞 ， 就解决那种在高延迟连接情况下， 你用 SSH 那个刚才那个打一个字等半天才会出现的那个问题 。

它通过一些叫做本地的 predictive 的算法 ， 就是预测性的算法 ， 先把那些字给你打出来 ， 然后等服务器来响应 。

然后服务器如果响应出来没错 ， 它就按那个就不用改嘛 ， 对吧 ？ 然后如果不响应出来有问题 ， 它可能再再更新成服务器那个东西 。

所以有时候你会遇到会跳 ，但是说你至少能够保证你在输入这个命令的过程中是比较流畅的一个体验吧 。

**吴涛** [1:59:34]
对 ，而且它还还很屌的一点 ， 就是你用 laptop 办公 ， 然后你呃 ， 打到一半把 laptop 的盖子合上了 ， 然后再打开 。

比如说你在咖啡馆 ， 你要挪个座位 ， 然后如果你用普通的 SSH 的话 ， 此时你就已经断掉了 ， 对吧 ？

但如果你用 Mosh 的话 。

**Rio** [1:59:52]
那 TCP 连接已经没有了嘛 。

**吴涛** [1:59:53]
对 ， 如果你用 Mosh 的话 ， 它会哎 ， 自动帮你帮你重新连起来 ，是非常非常爽的一件事 。

**Rio** [1:59:59]
对 ，因为它底层是用那个 UDP 来实现 ， 它是一个无连接的 。

**吴涛** [2:00:04]
无连接的 。

**Rio** [2:00:04]
通信协议嘛 ， 这样的话就可以让你就 roaming 嘛 ， 就所有的漫游就可以换 IP 啊 ， 换哪些都可以实现的 。 然后就整个特特别是在现在这个什么 ，有些人在外面用 4G 办公 ， 就可能会遇到这种状况 ， 就在 4G 和 WiFi 之间切换的时候 ， 会遇到这种情况比较久 。

**吴涛** [2:00:22]
对 ， 所以 in case you haven't 一定要用用它 。

**Rio** [2:00:27]
一定要去 ， 就是跟大家强烈强烈安利 。

**吴涛** [2:00:31]
嗯

， 呃 ， 所以你的同事们有在用 IDE 的吗 ？ 除了 Xcode 之外 。

**Rio** [2:00:40]
嗯 。

**吴涛** [2:00:42]
那等等 ， 你现在写什么 ？Python 吗 ？

**Rio** [2:00:45]
我现在写 Go 啊 ， 写 Go 的话一般还是用编辑器的多 ， 用那个 IDE 的还是比较少 。

**吴涛** [2:00:52]
所以 Go 语言现在是没有一个钦定的 ， 官方钦定的 IDE 了吗 ？

**Rio** [2:00:59]
没有没有没有 。

**吴涛** [2:01:00]
OK。

**Rio** [2:01:00]
有 ，有那个那个叫那个 RoPack 自己那个编辑器叫 Acme。

**吴涛** [2:01:05]
啊 ，Acme 就我们介绍过的 ，也是 Planetarium 的一部分 。

**Rio** [2:01:09]
对对对 ， 然后这个算是就算吧 ， 这个算是亲儿子吧 ，但是其实除了他和那个以前 Planetarium 那个 ， 就 Bayer Scientist 那几个人在用这个字 ， 好像外面的人用的比较少吧 ，因为他那个确实比较诡异 。

**吴涛** [2:01:23]
比较 hardcore。

**Rio** [2:01:25]
对对对 ， 你看我讲他是首先没有那个语法高亮 ， 然后他是一个 proportional font， 就是等就非等宽字体的一个环境 ， 就是上次我们讨论过这个问题嘛 ，是比较奇怪的 。

**吴涛** [2:01:37]
然后还要记住左键右键中键点起来是什么感觉 。

**Rio** [2:01:42]
哈哈 ， 对对对 ， 没错 。 啊 ， 之前我在知乎的时候 ，因为知乎之前很多是用那个 Python 写的嘛 ， 之前我发现有有几个同事是用那个叫做 PyCharm。

**吴涛** [2:01:53]
对 。

**Rio** [2:01:54]
这算是一个 Python 的集成开发环境吧 ， 就是 IDE 了 。 它是 JetBrains 的吧 。

**吴涛** [2:02:01]
算是 。

**Rio** [2:02:01]
对 ， 它就对那些什么 debugging 的时候好像做的还可以 。

**吴涛** [2:02:06]
没错 ，PyCharm 最好用的地方就是 debugging， 应该说在 PyCharm 出现之前 ， 呃 ，Python 的官方

和 Python 的 de facto 的最好的 IDE 是什么呢 ？ 有吗 ？

**Rio** [2:02:23]
哈哈哈 ，是啊 ，有吗 ？ 没有吧 。

**吴涛** [2:02:27]
Cyp， 呃 ，Cyp 也也只是一个编辑器而已 。

**Rio** [2:02:32]
对啊 ， 它不算不算 IDE， 没有 IDE， 没有 ， 就动态语言基本上用 IDE 的会比较少 。

**吴涛** [2:02:39]
对 ， 感觉那个时候大家都只是在用某种某种能够组织一系列文件的 ， 比如说像那个啊 ， 一时想不起来名字 ， 就是在那个 sublime 出现之前 ， 大家都喜欢用啊 ，Textmate。

**Rio** [2:02:56]
呃 ，Textmate， 对 。

**吴涛** [2:02:57]
对 。

**Rio** [2:02:57]
啊 ， 还有那个 Mac 上很老的那个 bbbbedit。

**吴涛** [2:03:02]
啊 ，OK， 你说那个 。

**Rio** [2:03:03]
那个我从来没有 ， 从来没有用过 。

**吴涛** [2:03:06]
OK， 我我其实刚学 ， 我刚学 Python 的时候用的是 editplus， 就是我曾经跟你说过的一个小红记事本的一个 icon 的 Windows 上的编辑器 ，不知道现在还在不在 。

**Rio** [2:03:20]
OK。

**吴涛** [2:03:21]
对啊 。

**Rio** [2:03:23]
嗯 ， 然后就其实你看吧 ， 像比如说现在你用写 JavaScript 的话 ， 好像没什么 IDE 可以用吧 。

**吴涛** [2:03:32]
JavaScript， 呃 ，Visual Studio Code 其实就是一个很少的很好的 JavaScript 的 IDE。

**Rio** [2:03:39]
不 ，他他那个算 IDE 吗 ？ 还是就是算一个编辑器 。

**吴涛** [2:03:43]
啊 ， 好吧 ， 呃 ，Xcode 我觉得其实 Visual Studio Code 是一个介于嗯 ，IDE 和编辑器之间的东西 ，因为 IDE 能做的事情它基本上都能做 ， 比如组织一堆文件 ， 然后设定一个呃 ， 项目被执行时候的各种参数 ，以及 debug。

呃 。

**Rio** [2:04:07]
对 ，其实现在我觉得你现在它出了一些很多比较新型的编辑器 ，其实都有或多或少带有一定的那个 IDE 的属性了吧 。

**吴涛** [2:04:16]
没错 ， 就这种强化的编辑器 ， 就它是某种介于纯粹的文本编辑器和 IDE 之间的状态 ， 我觉得这挺好 ， 就轻量级的工具挺好 。

**Rio** [2:04:27]
嗯哼 ， 没错 。

**吴涛** [2:04:29]
对啊 。

**Rio** [2:04:30]
怎么怎么我们又扯到 IDE 上去了 。

**吴涛** [2:04:34]
因为 IDE 是一个很重要的 debug 工具嘛 。

**Rio** [2:04:37]
啊 ，OK。

**吴涛** [2:04:38]
对 ， 然后呃 ， 刚才说到 JavaScript，其实大部分时候呃 ， 给 JavaScript debug 的最好的工具就是浏览器本身 。

**Rio** [2:04:49]
那个开发者工具栏 。

**吴涛** [2:04:52]
没错 ， 就在 。

**Rio** [2:04:54]
我在 IE 里面按 F12 是吧 。

**吴涛** [2:04:57]
没错 ，在 IE，IE 是从 9 代才有 F12 的吧 ，在 。

**Rio** [2:05:03]
嗯哼 。

**吴涛** [2:05:04]
在 9 代出现之前我们都只能按 F5。

**Rio** [2:05:07]
哈哈哈 ， 哎哎 ， 算等一下， 那个 F5 算是网页版的打印储存方法吧 。

**吴涛** [2:05:17]
没错 ，F5 其实就是一个叫什么 。

**Rio** [2:05:19]
刷新键 。

**吴涛** [2:05:20]
哦 ， 对 。

**Rio** [2:05:22]
哈哈哈 ，reload。

**吴涛** [2:05:25]
对 。

**Rio** [2:05:26]
就跟那个什么加入打印语句之后， 重新 reload 一下， 看那个地方到底会不会出现那个东西嘛 。

**吴涛** [2:05:32]
没错 。

**Rio** [2:05:33]
然后这个网页里面就是把那个 JavaScript 或者是 CSS 去那么改一下， 看一下哎 ，是不是在那个长如如如意料之内长出现一个那个位置 ， 然后打了那个东西出来 。

**吴涛** [2:05:45]
对 ， 乃至于像什么 Liveguard 这种呃 ， 帮你按 F5 的工具 ， 就是你只要存了盘 ， 它就帮你按下 F5。

**Rio** [2:05:53]
哈哈哈 ， 这这个还叫什么 ， 这个还挺高级的一个工具 ， 叫什么 autorefresh 是吧 。

**吴涛** [2:05:58]
对 ，其实这个就是老的那个 。

**Rio** [2:06:00]
就是老的那个 。

**吴涛** [2:06:00]
Programming 的一种一种形式嘛 。

**Rio** [2:06:03]
对 ， 我上次忘了说那个什么是 Angular 还是 React 还是什么一个 ， 反正现在那个前端工具的框架 ， 它竟然还就是现在就流行说自带一个叫做呃 ，autoreload 的 server， 就是一个 Node.js 写的一个呃 ， 一个一个一个 server， 然后它会插往你那个网页里面代码插入一些一个一段特别的 JavaScript 代码 ， 然后它会维持一个啊 ， 叫什么来的 ， 呃 ，WebSocket 或者是 HTTP 的长长连接 ， 然后探测到你那边保存了那个东西

之后， 它会通过那个长连接通知服务器 ， 手动通知那个你的浏览器自动刷新那个代码 。 我我这个方法我看了一下， 我也是对了 。

**吴涛** [2:06:45]
啊 ，brackets 吧 ， 就是你说的是 bracket 吗 ？ 就是那个写前端的 。

**Rio** [2:06:49]
就很很多 ，有有好几个都是这种 ， 都是这个这个框架的一些帮助的工具 ， 都是通过这种方式来实现的 。

**吴涛** [2:06:57]
嗯 ，Espresso 也是这样的 ， 我记得 。

**Rio** [2:07:02]
对 ， 没错 。

**吴涛** [2:07:03]
我好像还装了一个叫什么 codekit， 我已经好久没有打开过了 。

**Rio** [2:07:07]
嗯 ， 然后后来是什么 ， 那个 Chrome 还是那个横空出世 ， 带了一个叫做 console 吧 ， 对 ， 这个工具 。

**吴涛** [2:07:16]
对 ， 这其实是 bracket 的一个工具 ， 对 。

**Rio** [2:07:18]
对 ， 叫做 inspector 吧 ， 最早的那个东西 。

**吴涛** [2:07:21]
对 。

**Rio** [2:07:22]
然后就可以什么 ， 就像那个 debugger 那样 ， 可以动态修改网页中的某个结构 。

**吴涛** [2:07:29]
对 ，而且可以让你停在某一行代码上 。

**Rio** [2:07:32]
没错 ，而且不用 reload。

**吴涛** [2:07:34]
这个下段点实在是太人情化了 。

**Rio** [2:07:36]
哈哈哈 ， 没错 。

**吴涛** [2:07:39]
对 ， 我觉得我记得当初切换到 Chrome 可能也就是因为这个 inspector 的功能实在是要比啊 ，Firebug 强太多了 ， 然后就 。

**Rio** [2:07:50]
其实现在也是吧 ， 现在那个 Chrome 的那个开发者工具 ， 就 inspector， 应该是在目前为止是在像 Safari 啊 ， 还有 Firefox 这些这个你们之间最强大的一个吧 。

**吴涛** [2:08:02]
嗯 ， 我觉得是这样 ，但是肯定有听众觉得不是这样的 ，但但我反正最近也没有怎么用过 。

**Rio** [2:08:09]
肯定是这个 Firefox 那个 Firebug 的 Firebug 的死忠 。

**吴涛** [2:08:13]
哈哈 ，不 ， 现在 Firefox 其实内自带一个 debug 工具了 ， 就不再依 。

**Rio** [2:08:20]
就是那个 ， 它就是把那个 Firebug 整合进去了嘛 。

**吴涛** [2:08:24]
OK， 哦 ，是这么来的 。

**Rio** [2:08:25]
我记得对对 ，是是这样的 ， 我没记错 ，因为当时就是说开发者都不愿意那个用那个 Firefox 的 ， 就是因为那个 Chrome 的开发者那个 inspector 工具实在太好用了嘛 ， 然后他们说我这样就感觉到危机了呀 ， 赶快把那个 ，因为之前 Firebug 以前以前都是一个非官方第三方的插件嘛 ， 对吧 。

**吴涛** [2:08:46]
对 。

**Rio** [2:08:47]
就是它毕竟不是亲儿子嘛 ， 做起来还是没有那么顺手 ， 然后后来不行 ， 看不下去了 ， 还是整合进来吧 。

**吴涛** [2:08:54]
没错 。

**Rio** [2:08:55]
然而并卵 。

**吴涛** [2:08:57]
对 ， 为时已晚 。 现在应该是 。

**Rio** [2:08:59]
并没有 。

**吴涛** [2:08:59]
Webkit，Webkit， 呃 ， 呃 ，以 Webkit 为基本的为基础的 browser 市占率强过 Gecko 吧 。

**Rio** [2:09:08]
对对对 。 嗯 ， 现在不是还有那个 ， 你看那个叫做上次我们前几期讨论过那个 React Native 这种逆天的玩意儿 ， 它竟然能够在那个 Chrome 的那个 inspector 里面去实时修改跑在 iOS 上面的一个应用 ， 你敢信吗 ？

**吴涛** [2:09:26]
对 ， 实在是太 awesomeness，full of awesome。

**Rio** [2:09:31]
对 ，因为以前那个那个 iOS 那个还要重新 reload， 还要再传一下， 传到那个真机里面才可以重试嘛 ， 对吧 。

它就可以通过远程的方法直接修改 Chrome 的里面一个状态 ， 然后能够同瞬间同步到 ，不叫瞬间同步 ， 它就是直接是那个怎么理解呢 ， 就是 iOS 上面那个应用渲染的结构是来自于 Chrome 里面这个 inspector 的结构 。

**吴涛** [2:09:56]
对 。

**Rio** [2:09:58]
反正挺黑科技的 。

**吴涛** [2:09:59]
没错 ， 总之前端开发者实在是太幸福了 ， 相比之下你看这些做服务端的人就 debug 的是实在是没有这么趁手的呃 ，debug 工具 。

**Rio** [2:10:13]
嗯 。

### 前后端

**吴涛** [2:10:13]
当然也跟也跟问题的领域有关 ，因为前端的东西是比较容易所见即所得的 ，而后端的东西很多时候是没有什么东西是可以直观可见的 ，不是吗 ？

就你你做了一个 。

**Rio** [2:10:26]
没有能力呀 。

**吴涛** [2:10:27]
对 ， 你做了一个呃 ， 高并发 ， 可以及时适应用户暴涨的这么一个服务 ， 你你怎么把它所见即所得 ， 就是整个测试过程是没有办法 ， 整个 debug 排查的过程是没有办法用一个只需要按一个键就可以完成的工具来来来实现的 。

**Rio** [2:10:51]
对 ，而且现在很多这种大的这种应用 ， 它都是跨系统的嘛 ， 就不是一个单一进程的东西 ， 就叫什么来的 ， 呃 ， 那个 Google 那个 App Engine， 你知道吗 ？

那个跑的云服务那个平台嘛 。

**吴涛** [2:11:03]
对 。

**Rio** [2:11:04]
当时不是最 ， 好像今年吧 ， 出了一个什么叫做好像是叫做 cloud debugging， 叫做云除虫 ， 就是说你的当你的应用程序跑在不止一台机器 ， 甚至不止一个数据中心的情况下， 你怎么去统筹多个进程 ， 多台机器啊 ， 协作产生才能产生的一个 bug， 对吧 ，其实想想还是挺蛋疼的 。

**吴涛** [2:11:26]
嗯 ， 非常蛋疼 。 而且呃

，有时候一个程序崩溃了 ， 前端只需要简单的把程序再跑一遍就可以了 ， 可是后端你可能唯一能拿到的东西就是一个 ， 就是一个 dump，也就是这个程序它它挂掉的时候的那个车祸现场 ， 然后你要像一个像一个法警一样 ， 呃 ， 法医一样 。

**Rio** [2:11:53]
还原真相是不是 ？

**吴涛** [2:11:54]
就试图通过现场的一点点蛛丝马迹还原出这个案情是怎么发生的 ， 然后只只能做一个术语叫什么 postmortem， 就是死后的这样一个尸检 ， 你没有办法让整个车祸再发生一遍 ， 这是这也是非常痛苦的 ，而且耗时的一件事情 ，因为 core dump 不管是 core dump 还是 heap dump 还是整个环境的 memory dump 都是非常巨大 ，而且需要非常

敏锐的观察力和精力才能搞定这件事情 。

**Rio** [2:12:28]
没错没错 ，而且你遇到那种就是你还不能用那什么打印除虫法 ，因为第一个你没法打印到某一个具体的地方去 ， 你可能就是什么 syslog 要汇总 ， 那个顺序都是错的 ， 然后那各个机器上的时间它也不一定是完全同步的 ， 对吧 。

**吴涛** [2:12:45]
对 ， 根本就没有什么卵可以打 。

**Rio** [2:12:49]
对 ， 再然后就是如果你重启一个服务 ， 可能它那个如果你是一个小就是 microservice，有微服务的价格可能还行 ， 你重启一个服务问题不是很大 ， 你要像现在很多什么写那个啊 ， 游戏的那种 server， 就是游戏的服务器 ， 它可能光预热那个数据集可能就要好几分钟重启一次 。

**吴涛** [2:13:11]
对 。

**Rio** [2:13:13]
那你就哭吧 。

**吴涛** [2:13:14]
没错 ， 或者那些搞大数据分析的人， 你说他们怎么才能测试自己写的这个东西对不对 ， 这个算法可能有一些非常难以解决的问题 ，他们可能要等上几个小时乃至几天的时间把整个数据再跑一遍 ， 就这是唯一的方法 ， 就没有别的可以动态去调试的方法 。

**Rio** [2:13:36]
对 ， 所以其实最最理想的那个状态是那个什么 rline 的那些那套东西嘛 ， 就 rline 里面它那些每个它的小的子线子进程是可以独立重启的 ， 然后可以它可以动态登录到那个程序运行态里面去动态修改局部代码 ， 然后局部重启 ， 就是不用不用重启整个那个程序 ， 你局部可能可能更新一个函数啊 ， 更新一个子进程 ， 呃 ， 子进程 ， 然后再跑起来 ， 非

常非常方便 ， 非常牛逼的 。

**吴涛** [2:14:07]
OK， 听起来不错 。 所以你我是对 rline 没有任何了解好像 ，而且不知道为什么也没有任何兴趣 。

**Rio** [2:14:18]
因为它那个其实运营那个是叫所谓的这个运营商级别的一个环境嘛 ， 就是它运营商 ， 比如说你你不可能说我这个电话交这个交换系统坏了 ， 我得把整个停机然后来检修 ， 然后重启 ， 然后尝试看有没有除虫错 ，不可能 ，因为你你电话停机了 ， 那就是什么会造造成重大社会危机的 。

**吴涛** [2:14:41]
没错 。

**Rio** [2:14:41]
对吧 。

**吴涛** [2:14:42]
Rline 是谁搞出来的 ？ 爱立信还是 ？

**Rio** [2:14:45]
爱立信啊 ， 对 ，Arc's Language 嘛 。

**吴涛** [2:14:48]
嗯 。

**Rio** [2:14:51]
这个也是应该是最好的一个除可以除虫的环境吧 ， 这其实像大部分的其他的这个语言写的代码都是不可以那种局部除虫的嘛 ， 就是所以在同一进程里面我你都不可以的 。

啊 ，Lisp 好像有部分是可以 ， 至少最早的那个 Lisp 是可以登录进去可以改动态修改 ， 就这个时候要求它是一个动态语言 ， 对 ， 就是比如说静态就编译型语言就基本没戏了 ， 就已经被排除在门槛之外 。

**吴涛** [2:15:22]
就不用再下了 。

**Rio** [2:15:23]
原原原理上就不支持这一点 ， 对吧 ， 动态语言其实也就比较少 ， 主要是一些函数式的语言有望支持这一点 。

**吴涛** [2:15:33]
对 。 呃 ， 然后后端的做后端的人， 或者说做独立 APP 的人， 或者就做一个比较需要在一段时间里面查看这个程序跑起来有没有问题的人， 可能还会用到一个 debug 的一个一个变种 ， 就叫做呃 ，profiler 或者说 profiling tool， 就这个东西可以可以把一个程序包络在一个呃 ， 受到监控的运行环境里面 ， 然后看这个看这个程序的运行的过程中会不会有一些 ， 比如说呃 ， 响应太慢呀 ， 或者

### 性能分析

**吴涛** [2:16:10]
是内存泄漏啊之类的问题 ， 这些东西也可以视为一个广义上的呃 ，debugging tool， 比如说呃 ， 命令行下面有叫 Valgrind， 呃 ， 是一个其实是虚拟机吧 ， 就是它它会把一个 C 程序在这个虚拟机里面运行 ， 然后每运行一步就告诉你说这个程序运行的运行到这儿有没有 ，是不是已经扔出了一个 ， 比如说呃 ， 已经被已经没有办法被找到的一个一个区内存区域 ， 又比如说 S code 里

面也有专门的 profiling tool， 然后你可以让你一个 APP 在一段时间里面运行 ， 然后它会呃 ， 甚至是用图形化的方方式会告诉你说这这流漏了几 KB 数据 ， 这流漏了几 KB 数据 ， 然后一些可能你呃 ， 跑上一两分钟没问题的 APP， 跑上一个小时之后就会 crash， 你不知道为什么 ， 然后你用 profiler 一看 ， 哦 ， 它原来一直在泄露程序 ， 呃 ， 泄露内存 ， 然后泄露了一个小时之后，

你的 iPad 终于没有内存了 ， 所以它也就 crash 了 。

**Rio** [2:17:17]
嗯 ， 没错 。

**吴涛** [2:17:19]
然后有时候就是你如果你写 iOS APP 的时候 ，有时候你你在调试过程中它会哐当给你跳到一大堆汇编代码里面 ， 你说你这个时候应该怎么办 ？

**Rio** [2:17:31]
啊 ，是吗 ？

**吴涛** [2:17:32]
是的 ， 就是对啊 ， 就是如果你 。

**Rio** [2:17:35]
啊 ， 算了算了算了 。

**吴涛** [2:17:37]
所以我 。

**Rio** [2:17:38]
我是不会 ， 我是不会汇编的 。

**吴涛** [2:17:41]
这我也不能说会汇编吧 ，但是呃 ，在这种情况之下基本上你都知道呃 ， 你其实只要一步一步跳下去 ， 或者说你只要把断点设在一个比较比较比较正常的地方 ， 然后一步一步跳 ， 你找到自己要跳进汇编之前那一步 ， 就知道问题出在哪了 ， 倒不是特别的严重 。其实我只是想说有些 debugger 会把你引领到这个地方 ， 就是刚才还是高等语言突然一下子

跳到了那这个汇编里 ， 汇编里面你应该怎么办 ？ 对 ， 这种情况下其实呃 ， 我觉得还是有必要稍微学一点汇编的 ， 就至少你不用知道 ， 你不用把所有的指令背下来 ， 你也不用能有有能力去呃 ， 逆向工程 ， 或者是纯用汇编来写一个 3D 加速程序之类的这些功能技巧 ， 你至少要了解一些 ， 比如说 calling convention 是什么 ， 就 call stack 是什么 ， 然后这些东西

你可以了解一些最基本的汇编的概念 ， 那对于 debug 其实也有帮助 。 所以今天大概把调试这一块总结了一下吧 ， 纵览了一下， 那我觉得调试技术不管再怎么呃 ， 重要 ， 还是没有办法抵过养成一个良好的编程习惯来的更重要一点 。

就比如说我们前面也提到了 ， 就呃 ， 可以程序可以分为两种 ， 一种是先确定边界条件然后写代码 ， 另外一种是先写代码然后去找这个 ， 让这个代码能够正确工作的边界条件是什么 ，是两种截然不同的态度 。

那也许后一种态度会让你对于所有的 debug 工具都了如指掌 ，但从严格意义上来说还是有前一种习惯对你的帮助更大一点 。

行吧 ， 那这一期录了也有两个多小时， 可能最终剪出来没有这么多 ，因为我们中途也遇到了若干技术故障 ，但这一期总算也是达到了长度 。

我上一期发现你们的 IT 公论也在也在也在拼长度啊 ， 这样对吗 ？

**Rio** [2:20:02]
根本停不下来 。

**吴涛** [2:20:04]
呃 ， 到底发生了什么 ， 我在听的时候 ， 我其实一开始时候我就说我靠 ， 这一期怎么看起来这么长 ， 结果听出听了之后发现真的这么长 ，而且你们 。

**Rio** [2:20:14]
哈哈哈 ， 好吧 。

**吴涛** [2:20:15]
很不习惯是不是 ？

**Rio** [2:20:17]
呀 。

**吴涛** [2:20:18]
嗯 ， 好了 ， 那您刚刚收听到的是 IPN Podcast 网络旗下的 IT 技术节目 《 内核恐慌 》。 呃 ，IPN 旗下的其他六档 Podcast， 包括 SoftCore 啊 ， 技术主题节目 《IT 公论 》， 医疗主题节目 《 太一来了 》， 美食主题节目 《 未知道 》， 艺术主题节目 《 流星通信 》， 无主题节目 《 无次元 》， 故事主题节目 《Hi Story》，以及呃 ， 影像主题节目 《 印象 》， 同样欢迎收听 。

嗯 ， 欢迎你为我们的节目捐款 ， 捐款地址是 ipn.li/kernelpanic/donate， 捐款金额随意 ， 只要是能够被 8 整除的正整数就可以 。

呃 ， 上一次我们的上一次我呃 ， 嗓子毁了之后呃 ， 恳求各位捐款 ， 然后好像的确有几笔捐进来 ，但每一笔都是 8 美元 。

嗯 ， 非常感谢各位 ， 虽然捐款不会不会为你带来什么 ，不捐也不会让你失去什么 。 我们的口号是 No Hard Feelings， 感谢你收听本期节目 ， 下期再会 。

**Rio** [2:21:20]
拜拜 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
