# 14. 类型系统

内核恐慌 · 2015-04-04

<https://lib.pan.icu/6652abb2-d000-43a9-94e0-a8db45199658>

本期《内核恐慌》深入探讨编程语言中的类型系统，吴涛和Rio解释了它的核心作用：在计算机纯数字世界与人类思维之间建立映射，帮助程序员组织数据并避免错误。但他们也通过千年虫、2038问题和IEEE 754浮点数精度缺陷等具体案例，展示了类型系统引入的常见陷阱。节目区分了强类型与弱类型（如Haskell的严格 vs JavaScript的自动转换）、静态与动态类型（如C++的编译期剥离类型信息 vs Python的运行时类型推断），并讨论了用户自定义类型与系统原生类型的区别。他们还批评了JavaScript因弱类型导致的诡异行为，并比较了不同语言在类型转换上的设计哲学（如Perl使用点号拼接字符串以避免歧义）。最后，他们指出类型系统的选择深刻影响编程思维，并建议教育应从实用出发而非先灌输底层细节。

## Questions this episode answers

### 为什么在很多编程语言中，浮点数运算有时会得到不精确的结果，比如0.1加0.3不等于0.4？

因为计算机采用IEEE 754标准，用有限的二进制位表示小数。十进制的小数如0.1转换为二进制是无限循环小数，只能截断近似存储。运算时产生微小误差累积，导致0.1+0.3可能得到类似0.4000000000000001的结果。吴涛和Rio指出，这个陷阱常困扰初学者，理解浮点数的符号位、指数位和尾数位存储方式有助于识别这类问题。

[1:43:51](https://lib.pan.icu/6652abb2-d000-43a9-94e0-a8db45199658?t=6231000)

### 什么是2038年问题？它与千年虫有何相似之处？

2038年问题指在32位系统中，Unix时间戳（从1970年1月1日0时0分0秒开始的秒数）用32位有符号整数存储。到2038年1月19日3时14分7秒，秒数达到最大值2147483647，下一秒溢出变成负数，导致系统时间回滚到1901年。这与千年虫类似，都是因存储时间的整数类型宽度不足引起，属于类型系统设计缺陷。

[1:38:58](https://lib.pan.icu/6652abb2-d000-43a9-94e0-a8db45199658?t=5938000)

### I Like Rabbits 是一个什么服务？它让程序员怎么使用？

I Like Rabbits（ilikerabbits.com）是一个把编程任务当作API调用的服务。用户可以发送邮件描述一个明确定义的编程任务，服务方回复报价（通常不超过6小时、300美元）。若接受，它们在约定时间内交付代码。Rio和吴涛讨论认为，这相当于将程序员外包API化，主要面向清楚需求但没有时间自己实现的程序员，是一种二级支持。

[50:25](https://lib.pan.icu/6652abb2-d000-43a9-94e0-a8db45199658?t=3025000)

## Key moments

- **[0:00] 开场**
  - [1:52] 内核恐慌宣布废除正音班环节
  - [6:00] 吴涛引用《舒克和贝塔历险记》中办报理念作为捐款主旨：想看的人看，不想看的人就不要看
  - [7:01] 吴涛反对使用“打赏”一词，认为节目不是卖艺
- **[11:03] Ducati**
  - [11:07] 吴涛解释喜欢杜卡迪Scrambler的原因：复古造型、中端价格，最便宜版仅8000多欧元
  - [15:55] “哈雷戴维森使用1912年的技术，卖的是2012年的价钱”——吴涛对比摩托车品牌
  - [19:19] 吴涛总结摩托车行业格局：德国和日本厂商卖技术，意大利人卖设计，美国人卖情怀
- **[21:10] 来信**
  - [22:38] 一位在药厂工作的女统计程序员听众来信表示，虽不能完全理解技术内容，但科普知识有所收获
  - [24:56] 传统统计工具在处理TB级数据时不现实，统计人员面临大数据挑战
  - [27:17] 吴涛以《不可思议的机器》游戏为例，设想将编程工具游戏化
  - [34:01] 听众来信指出学术圈编程语言选择多为路径依赖，实验室传统决定使用MATLAB或Python
  - [36:27] 吴涛解释对Java的成见是在实际工作中形成，认为其语言特性不如C#
  - [39:18] “人长得丑努力有什么用啊？”——吴涛批判PHP社区努力但语言本身糟糕
- **[49:47] I Like Rabbits**
  - [49:51] Rio介绍I Like Rabbits.com服务：通过邮件提交编程任务，按件收费，将程序员API化
  - [57:10] 吴涛认为I Like Rabbits的聪明之处在于面向清楚知道自身需求的程序员
  - [59:02] Rio引用XKCD漫画，展示外行难以理解编程任务复杂度的巨大差异
  - [1:01:44] 吴涛希望未来人工智能能自动完成I Like Rabbits上的子任务
  - [1:03:00] 吴涛和Rio辩论：在计算器普及的现代，是否还有必要让小学生背诵乘法表？
  - [1:18:11] 苹果收购高性能数据库FoundationDB，原有用户面临无法继续使用的风险
- **[1:18:41] 苹果收购**
- **[1:24:18] 类型系统**
  - [1:27:31] 吴涛指出编程初学者常难以理解加引号的数字2与纯数字2在计算机中的区别
  - [1:33:20] 吴涛和Rio回顾千年虫问题，根源在于年份数据类型仅用两位数字存储
  - [1:38:59] 2038年问题：32位系统使用有符号32位整数存储Unix时间将在2038年1月19日溢出
- **[1:44:05] 浮点数**
  - [1:44:05] 浮点数精度陷阱：在二进制浮点系统中，0.1加0.3不等于0.4
  - [1:53:33] Rio和吴涛讨论JavaScript类型转换的诡异行为，加号运算符同时用于字符串拼接和数值相加
- **[2:00:41] 强弱类型**
  - [2:01:18] 吴涛和Rio解释强类型语言对类型转换更严格，弱类型语言允许隐式转换
  - [2:09:01] Rio以Go语言为例，说明强类型语言不允许不同宽度整数间的隐式转换
- **[2:11:17] 动静态**
  - [2:11:33] 吴涛解释动态类型与静态类型的区别：静态类型变量类型固定，动态类型变量可持有不同类型值
  - [2:14:10] 吴涛认为C++非常静态，运行时不保留类型信息；Objective-C相对动态，可运行时查询对象类型
  - [2:16:56] 吴涛提到一篇PayPal程序员博客观点：Python的类型系统实际上比Java更强
- **[2:18:01] 自定义类型**
  - [2:18:01] 吴涛和Rio讨论Ruby等语言中一切皆对象，原生类型与用户定义类型无本质区别
- **[2:23:20] 结语**

## Speakers

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

## Topics

编程语言

## Mentioned

Apple (company), Ducati (company), C (product), C# (product), Ducati Scrambler (product), FoundationDB (product), I Like Rabbits (product), Java (product), JavaScript (product), PHP (product), Perl (product), Python (product), Ruby (product)

## Transcript

### 开场

**吴涛** [0:04]
从协调事件时 ：1970 年 1 月 1 日 00:07， 现在已经过去了 1427400128 秒 。 欢迎收听 ， 您 ——

**Rio** [0:16]
这么精确 ？

**吴涛** [0:17]
对 ， 这样其实就可以反推出来我们的录音时间是什么时候 。

**Rio** [0:21]
没关系啊 ， 反正我们要提前录的嘛 。

**吴涛** [0:24]
是 ， 这期是提前录的 ，因为我下周开始 —— 就是各位听到这期的时候我应该已经在国内了 。 对 。

**Rio** [0:32]
有没有什么国内粉丝可以见面的 ？

**吴涛** [0:35]
呃 ， 还是算了吧 。 大家吃鸡蛋就好 ，不要见那只下蛋的鸡 。Anyway。

**Rio** [0:43]
见了就不想吃鸡蛋了是吧 ？

**吴涛** [0:46]
没错 ， 影响食欲 。 好 ， 您现在收听的是 IPN Podcast 旗下的网 IT 技术主题节目 《 内核恐慌 》。 我们号称 hardcore，但是也没有干货 。

想听的人听 ，不想听的人就不要听 。《 内核恐慌 》 的网址是 ipn.li/kernelpanic。 我们推荐大家使用 Podcast 客户端订阅我们的节目 。

如果您不知道该用什么客户端 ， 欢迎访问 ipn.li/faq。 如果你非常喜欢我们的节目 ， 或者说 ，不管你是不是喜欢我们的节目 ， 都欢迎你为我们捐款 。

我们的捐款地址是 kernelpanic.fm/donate。 捐款金额随意 ， 只要是能被 8 整除的正整数就可以 。 捐款不会为你带来什么 ，不捐也不会让你失去什么 。

唉 ， 这个 ——

**Rio** [1:36]
好长是不是 ？

**吴涛** [1:37]
这个贯口活儿变得越来越长了 。

**Rio** [1:39]
你多练几次你就顺溜了嘛 。

**吴涛** [1:42]
对 ， 我现在每天晚上睡觉之前没事就背这个 。

**Rio** [1:46]
嗯 。 所以今天节目正式开始之前 ， 我们还是做一下 —— 有几个事情要说一下哈 。

**吴涛** [1:52]
对 。 首先是我们废了正音班 ， 这个要跟大家知会一下 。其实我们从上上一期开始就没有再说正音班的内容了 ，因为 —— 出于某些原因 ， 我们两个都觉得有点厌倦了 。

就何必呢 ，是吧 。 不管 ， 虽然我们英语很烂 ， 中文也开始退化了 ，但大家都明白我们在说什么 ，不是吗 ？

所以就 ——

**Rio** [2:16]
将就了是吧 ？

**吴涛** [2:17]
放过我们吧 。 当然还是欢迎大家在 ——

**Rio** [2:22]
对 ， 知道总比不知道好 。 你提了我们下次就不说了 。

**吴涛** [2:24]
对 ， 你告诉我们就是了 。 我们 ， 对 ， 我们虚心接受 ，但是改不改 ， 想起来的话就改吧 。 想不起来也没办法 。

比如说那个什么粘贴还是粘贴 ， 我现在又忘了 ， 应该是粘贴还是粘贴 。

**Rio** [2:36]
呃 ， 粘贴 。

**吴涛** [2:37]
OK。Good to know。

**Rio** [2:40]
对 。

**吴涛** [2:42]
呃 ， 再就是捐款这件事情 。 嗯 ， 对 ， 我不知道你怎么看待捐款这件事情 ，但 —— 或者说 ， 我假设我知道你知道 ， 呃 ， 假设我知道你怎么看待捐款这件事情 ，但是我觉得可能还是有必要在这边说一下， 就是 ， 呃 ， 这不算 rant，但也的确是 ， 呃 ， 看了几位朋友的反馈之后， 呃 ，有一些感想 。

就是我们的 Podcast 对于你来说 ， 就是对于正在听这个节目的你来说 ， 应该是某种完全可以没有 ，但是有的话不失为一件好事的存在 。

**Rio** [3:31]
这叫什么 ？Something nice to have。

**吴涛** [3:33]
Yeah, nice to have。 因为如果你觉得我们两个 Podcast 对于你来说是一个必要的生存条件的话 ， 那你一定不会 ， 那你一定会不惜一切代价砸锅卖铁供奉我们 ， 对吧 ？

确保我们两个生存 。

**Rio** [3:48]
有这种类型的节目存在吗 ？

**吴涛** [3:50]
对 ， 所以没有嘛 ， 对吧 ？ 所以从这个意义上来说 ，其实没有任何一个节目是完全 ——

**Rio** [3:56]
不可少的 。

**吴涛** [3:57]
对 ，是完全不能没有的 ， 对吧 ？

**Rio** [4:00]
嗯 ， 没错 。

**吴涛** [4:00]
所以我们两个还 —— 既然我们两个还是要自食其力 ， 所以我们的节目肯定不是对于你来说必要的 。

但是如果你觉得我们的节目对于你来说不是什么好事的话 ， 那你何必要听呢 ， 对吧 ？ 所以 ，it's something nice to have。

而对于我们两个人来说 ， 来自于听众的捐款 ，其实同样也是完全可以没有 ，但是有的话不失为一件好事的东西 。

但是这样 ， 这句话说起来可能有点 ， 怎么说 ，snob。 就是自命不凡 ，但的确是这样 。 因为我们两个做这个是副业 ， 对吧 ？

**Rio** [4:31]
呃 ， 这都谈不上副业 ， 只能说是兴趣吧 。

**吴涛** [4:34]
对 ， 就是 ——

**Rio** [4:35]
你副业你好歹有个什么 ， 你就觉得还能够补充你的主业的收入是吧 ？ 你像按我们这种收入水平 ， 就其实不需要 ， 就也不可能靠这个捐款过活嘛 。

**吴涛** [4:48]
对 。 而且甚至我们 《 内核恐慌 》 这个节目不可能像 《IT 公论 》 那样 ， 呃 ， 推出一个会员计划 ， 说什么请捐款支持吴涛和 —— 吴涛和 Rio 把 《 内核恐慌 》 做成最好的编程 Podcast。

我们说不出来 。 这样一个 motivation 对于我们来说是假的 。 因为 ， 说实话 ， 把 Podcast 做成目前这个样子 ， 已经是我们能做的最好的一个状态了 。

就我们没有更多的资历可以给大家讲述更专业的内容 。 我们也没有人脉可以去请到能够给大家讲述更专业的内容的人。

至少现在还不能 ， 对吧 ？ 当然我们可能会即将请到一位正常级人物 ，但是我们现在先卖个关子 。

**Rio** [5:29]
对 ， 所以其实我们现在是作为一个 hobby 在做这件事情 。 那么 ， 然后就在这个有限的时间头上呢 ， 我们能做到什么样程度 ， 就尽力而为吧 。

**吴涛** [5:41]
没错 。 所以在这个前提之下， 我们开放捐款的 motivation 就只能是像那个 Portal 里面那个炮塔说的那句话 ，know how feelings。

然后， 呃 ， 舒克贝塔历险记里面 ， 舒克和贝塔办了一份报纸免费发放 。 报纸叫什么我忘了 ，但是创刊司我一直记得 。

就是我很小的时候看的那童话 ， 我觉得印象非常深刻 。 就是我们想办一份报纸 ， 我们就办了 。

想看的人看 ，不想看的人就不要看 。

**Rio** [6:08]
所以这句话是来自于那里是吧 ？

**吴涛** [6:10]
对 ， 这其实是正元节的 。Attributed 正元节 。

**Rio** [6:13]
OK。

**吴涛** [6:14]
我觉得这句话非常诚恳 。 就是 ， 所以就抄来做本节目的介绍了 。 所以同样也可以作为我们捐款的一个主旨 。

就是你想捐就捐 ， 捐了不会得到什么 。 不想捐就不要捐 。 不捐也不会失去什么 。

**Rio** [6:29]
有人说这个 ， 这个 ， 这个什么 ， 你这个态度是不是太屌了 ？

**吴涛** [6:34]
呃 ，也有人认为我的态度很诚恳 。 不是 。

**Rio** [6:38]
对 ， 所以其实这里面就有两种这个看法吧 。 就是说你既然是来伸手要钱的 ， 你还那么屌 ， 搞什么是吧 ？

**吴涛** [6:48]
但反过来我也觉得 ， 就是 ， 比如说有一个 ， 当然我没有恶意啊 ， 就是我觉得有一位听众说什么 ， 呃 ， 如果我们使用什么打赏之类的词 ， 可能捐起来的人会更多一点 。

但我就觉得 ， 我们又不是卖艺 ， 我们打什么赏啊 ？ 你还给不给 ， 算了是吧 ？ 不是吧 ？ 对啊 。

然后， 呃 ， 虽然我们非常 ， 呃 ， 露骨的诚恳地在捐款页面上写说这笔钱会拿来给 ， 呃 ，Rio 这个国粉买一台 Retina MX， 然后给我买辆摩托车 。

但实际上， 呃 ， 我们还是有一部分成本需要支出的 。 比如说 kernelpanic.fm 这个域名 ， 我们是要续费的 。 然后 IPN 作为我们的东家 ，也一直是 ， 就是 ， 呃 ， 免费支持我们的运营 。

但我觉得将来这件事情如果要走上正轨的话 ， 那肯定 IPN 的运营费用我们也是要出一部分 。

**Rio** [7:47]
对 ， 就其实现在是有一些固定成本要支出的 。 不多 ，但是还是有的 。 而且就假设我们的时间不算钱的话 ， 还是要一些我们需要每月固定支出的东西 。

**吴涛** [7:59]
对 。 当然我们也并不真的指望说那个捐款页面上的两个目标都能实现 。 因为就我们现在获得的捐款金额 ， 呃 ， 一周就是 ， 等等 ， 到现在是大概两周了吧 ？

**Rio** [8:17]
呃 ， 十天吧 ，不到两周 。

**吴涛** [8:19]
对 ， 十天里面我们凑齐了一个无符号的 char 类型 ，在大部分处理器上所能存储的最大值 。

**Rio** [8:30]
所以其实从这个角度来讲 ， 像我们这种可有可无的捐款项目 ， 能筹到的钱还是好于平均数的哈 。

**吴涛** [8:39]
呃 ， 应该是吧 。 我觉得至少其实在这么短的时间之内 ， 居然能让一个 unsigned char 一出 ，其实挺好的 。

**Rio** [8:50]
也不错 。

**吴涛** [8:51]
我之前的期待要比这个低很多 ， 说实话 。

**Rio** [8:53]
OK。

**吴涛** [8:54]
对 。

**Rio** [8:55]
就是如果你要我们就是 ， 叫什么 ， 希望姿态低一点的 ，其实也可以 。 那各位大爷 ， 该给钱的就给钱吧 。

有钱的捧个钱场 ， 没钱的捧个人场 ，是这么说的吧 ？

**吴涛** [9:08]
好像是吧 。

**Rio** [9:09]
我也忘了 。

好 ， 那是开玩笑 。

**吴涛** [9:13]
然后， 呃 ，有听众说为什么我不能 ， 为什么我们不能支持用 ， 呃 ， 那个叫什么 ， 支付宝加扫码 。 呃 ， 这个是有技术限制 。

就是我们用的这个 Stripe 它是不支持这个技术 。

**Rio** [9:30]
对 。 呃 ，不过我们可以单独再开一个 。 就如果真的这样对你来说是比较好的一个方法的话 ，也可以考虑加一个这个码 ， 然后你直接扫也行 。

**吴涛** [9:42]
嗯 ，不过那样一来好像就比较难说怎么 ， 难道你要动态生成一个 QR code 然后 ——

**Rio** [9:48]
啊 ，不用啊 ，不用啊 。 就是把你的那个支付宝的钱包的那个地址生成那个 QR code， 贴在那个网页上就可以了 。

**吴涛** [9:55]
那金额怎么办呢 ？

**Rio** [9:56]
那就没有办法限制了 ， 随意 。

**吴涛** [9:59]
对 ， 我的意思就是难道不能动态生成一个 QR code 然后 ——

**Rio** [10:03]
呃 ， 支付宝的 API 好像不能这样 。 就起码给开放给个人的是不能这样 。

**吴涛** [10:07]
金额永远是恒定的 。

**Rio** [10:09]
不是不是 ， 就是你没有办法指定金额 。

**吴涛** [10:13]
那谁来指定金额 ？ 支付者指定金额 。

**Rio** [10:16]
对对对 ， 没错 。 就是他扫过了之后 ，他会让你输入一个金额嘛 ， 可以这样 。

**吴涛** [10:20]
啊 ，OK。

**Rio** [10:21]
这个可能比较适合这个国内的使用习惯 ，但对于我们管理或者统计起来就会有一点麻烦 。 因为 ， 啊 ，由于众所周知的原因 ， 我觉得国内那些服务的 API 都做得不是特别好吧 ， 我觉得 。

**吴涛** [10:37]
你太婉转了 。

**Rio** [10:41]
也还是有待提高 。

**吴涛** [10:42]
一大坨一大坨的屎 。

**Rio** [10:44]
还有就是我们可以考虑开一个什么 ， 比特币哈 。

**吴涛** [10:48]
呃 ， 对 ， 这倒是可以做 。

**Rio** [10:50]
嗯 ， 对 ， 这个下次吧 ，有空我们慢慢搞 。 这个也本来也是 ， 叫什么 ， 业余时间搞的东西 。

**吴涛** [10:57]
嗯 ， 没错 。 好 ， 所以关于节目本身的事情我们就说到这儿 。 呃 ——

### Ducati

**Rio** [11:03]
哎 ， 还有人问为什么你要 ， 你喜欢那个摩托车 。

**吴涛** [11:07]
啊 ，Ducati Scrambler。

**Rio** [11:10]
啊哈 。

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

**Rio** [11:11]
So what's so special about it?

**吴涛** [11:13]
好 ， 大家知道 Ducati 在摩托车界就有点像 Lamborghini 在汽车界 。 呃 ， 当然这个类比不是非常准确 ，因为摩托车本身不是一个非常能够凸显人的社会地位的东西 。

就是很少有人会把高档的摩托车当作社会地位的体现 。

**Rio** [11:36]
哎 ， 你这么说不一定哦 。

**吴涛** [11:39]
对 ， 你看那个 ——

**Rio** [11:40]
你看那个城乡结合部的青年， 他晚上那个轰鸣着摩托车 ，他肯定不是这么想的 。

**吴涛** [11:48]
对 ，但那种 ， 就是你不能说他们所宣称的那样一种 ， 呃 ， 社会地位是社会的顶层 ， 或者说他们不会认为这是一种 ， 呃 ， 宣扬自己有多么富有 ， 或者是多么 ， 呃 ， 我花了这个钱这个 status。

**Rio** [12:06]
OK。

**吴涛** [12:07]
因为我也不知道 ， 就是作为文化符号的摩托车 ，其实更多的是偏向于人性的不羁或者是叛逆的那一面 。

比如说以前那个 《 马龙白兰度 》 的电影 ， 叫什么来着 ， 反正就是讲一群码头工人骑摩托车多么 ， 呃 ， 离经叛道的 。

它塑造了一个离经叛道的骑摩托车的人的形象 。 或者是以前日本的叫什么 ， 暴走族 。 暴走族就是在深夜里面骑着摩托车在 ， 呃 ， 限速的高速公路上去飙车的这样一群人。

**Rio** [12:46]
这个全球各地都一样啊 。

**吴涛** [12:48]
但现在已经 ， 这两群人都已经消失了 。《 码头风云 》 和 《 暴走族 》 里面的那群狂放的骑摩托车的叛逆的年轻人， 都已经消失了 。

**Rio** [12:59]
中国还有啊 。

**吴涛** [13:01]
中国落后于时代 。 而且中国禁摩啊 ， 所以中国摩托车文化从来没有发展过起来过 。

**Rio** [13:07]
呃 ， 还好吧 ，也就中小城市还没有禁这个东西 。

**吴涛** [13:11]
就 anyway， 回到 Ducati 这个问题上 。 就是 Ducati 是在摩托车爱好者的心目中比较高大上的一个品牌 。 呃 ， 就和意大利的其他 ， 呃 ， 机械 ， 呃 ， 内燃机品牌一样 。

我不知道这么说是不是正确 。 比如说 ， 呃 ， 法拉利啊 ， 呃 ，Lamborghini 啊 ， 还有什么 ？ 意大利的名车还有什么 ？

**Rio** [13:38]
就这两个吧 ， 还有什么我不知道 。

**吴涛** [13:41]
对 ， 咱俩都不是很懂车 。 然后， 呃 ，Ducati 和比如说意大利的其他牌子 ，有一个叫 MV Agusta， 或者是 Moto Guzzi， 都是算是在摩托车界里面比较顶级的车 。

然后 Ducati 特别之处在于什么呢 ？ 就是 Ducati 的创始人非常喜欢吃西红柿 ， 所以 Ducati 的几乎每一辆车都是红色的 。

**Rio** [14:09]
因为西红柿的关系吗 ？

**吴涛** [14:12]
然后呢 ，Ducati 在 70 年代的时候 ，有一个离经叛道的设计师非常喜欢吃鸡蛋 。 然后他设计出了一款车 ， 呃 ， 居然是黄色的 。

然后这款车在 ——

**Rio** [14:27]
他喜欢吃蛋黄是吧 ？

**吴涛** [14:29]
这款车在 30 年之后被 Ducati 复刻 。

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

**吴涛** [14:33]
就有了我们今天的 Ducati Scrambler。 然后这款 Ducati Scrambler 实际上是在向 1976 年还是 72 年的原版的单缸发动机的 Scrambler 致敬 。

就是如果你找出当初 70 年代那款车来看的话 ， 两辆车的造型其实是非常神似的 。 呃 ， 所以从这个意义上来说 ，Scrambler 实际上是复刻了 ， 就像 ， 呃 ， 菲亚特复刻了旧的 Fiat 500， 呃 ， 重新做了一辆 Fiat 500， 然后在世界上大卖 。

一样 ， 呃 ，Ducati 也重新复刻了 Scrambler， 然后在 ， 呃 ， 即将迎来一个大卖 。 因为 Ducati Scrambler，Ducati 一年的产量大概有 45000 台 ， 然后 Scrambler 预计的 ， 目前已经的 ， 目前已经出现的定数是 1 万辆 。

也就是说他们明年， 他们今年 2015 年上市的这款 Scrambler 可能会占到全厂产量的四分之一 。

**Rio** [15:32]
这么多 ？

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

**Rio** [15:34]
OK。

**吴涛** [15:34]
然后这也就宣告了可能 Ducati 要告别西红柿时代 ， 迎来新的时代 。

**Rio** [15:39]
OK。 啊 ， 所以那个 Ducati 和这个叫什么 ， 那个叫什么 ， 哈雷是吧 ？ 哈雷摩托 ， 哈雷 ， 哈雷戴维森 ，他们之间是一个 ， 就是作为品牌的话 ，是大概是一个什么样的关系 ？

**吴涛** [15:55]
呃 ， 哈雷戴维森是 ， 怎么说呢 ， 哈雷戴维森使用着 1912 年的技术 ， 卖的却是 2012 年的价钱 。

**Rio** [16:06]
就哪个贵呢 ？ 就一般来 ， 就平均来看 ， 就哪个高档一点 ？

**吴涛** [16:12]
一般来说是 Ducati 要贵一点 ，但是 ， 呃 ，Scrambler 除外，Scrambler 上市价格 ， 就是 Scrambler 有四个版本 。 呃

， 怎么说呢 ， 呃 ， 摩托车分为很多种 。 呃 ， 跑车 ， 就 Ducati 之前以做跑车来为主 。 然后他们还有一个比较 ， 比较 ， 呃 ， 特别一点的 ， 叫 ， 呃 ， 摩托车还有一个类型叫 Naked Bike。Naked Bike 有点可以类比为 ， 嗯 ， 汽车里面的吉普车吧 。

呃 ， 然后 Naked Bike 他们有一款叫做 ， 呃 ，Diablo。 然后

他们的 Diablo 就是也是恶魔的意思 ，但是是那个 B 被写成了 V，因为 ， 呃 ， 这两个字母本来就是同一个音位 。

呃 ， 我为什么喜欢 Scrambler， 就是因为 ， 呃 ，因为 Scrambler 是 Ducati 的一种转型的尝试吧 ， 我觉得 。 就是 Ducati 它最有名的车是跑车 ， 比如说 1196 或者是 848，以及它的 Naked Bike。

呃 ，但是

Scrambler 可以说是 Ducati 试图向中端市场转型的一个尝试 。 因为这款车卖得非常便宜 ， 就是和 ， 呃 ， 非常是要加引号的 ，因为要和 ， 呃 ，Ducati 的其他车比起来 ， 比如说其他车可能会卖到 1 万 6、1 万 8， 甚至 2 万以上 。

但是 Scrambler 的四个版本里面 ， 最便宜那个版本只要 8000 多欧元 。 就以现在的欧元对人民币的汇率来说 ， 简直是白菜价的一款 Ducati。

呃 ， 甚至很多 ， 甚至很多二手 Ducati 都没有这个价格 。 而哈雷戴维森在另外一只手上则是 ， 则是一种美式文化的体现 。

就是哈雷戴维森其实并不强调他们的车有多漂亮 ， 当然他们自己觉得他们车很漂亮 。 呃 ，而是强调他们骑车的时候是非常酷的一群人。

就这么说吧 ， 世界上最发达的摩托车科技实际上在日本 。 因为 ， 呃 ， 或者说在德国 ， 如果一定要大言不惭地这么说的话 。

就是在去年， 呃 ， 世界上最快的摩托车仍旧是德国的 ， 呃 ， 宝马做的 HP4。

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

**吴涛** [18:37]
对 ， 然后去年， 呃 ， 日本的 Kawasaki 做了一款带涡轮增压的摩托车 ，350 马力 。 呃 。

**Rio** [18:46]
就比很多汽车都要 。

**吴涛** [18:48]
对 ， 比很多汽车都要 ， 都要夸张一万倍 。 然后， 呃 ， 时速可能是 350 公里以上不封顶 。

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

**吴涛** [18:55]
是非常非常恐怖的一款车 。

**Rio** [18:57]
那不得飞起来 。

**吴涛** [18:58]
对 ， 使用碳纤维啊 ， 然后增压发动机啊 ， 都是一些前无古人的技术 。 至少用在摩托车上非常 ， 对 ， 非常了不起 。

但是不管是意大利还是美国 ， 都没有人在做这样的尝试 。 就是他们还是在卖 ， 怎么说呢 ， 意大利人主要是卖设计吧 ， 然后美国人主要是卖情怀 。

**Rio** [19:19]
哈哈哈 。 所以叫什么 ， 就是 ， 呃 ， 德日厂商卖技术是吧 ？

**吴涛** [19:27]
呃 ， 可以这么说吧 。 因为德国的厂商一直在强调 ， 怎么说呢 ， 德国 ， 至少德国人最喜欢买的一款摩托车就是 BMW 出的一款越野车 。

然后这款车在整个欧洲卖得也很好 。 呃 ， 英国人有英国的戴恩芬 ， 或者说不是那个胸罩的戴恩芬 ，也叫 Triumph，但是 ， 呃 ， 中文我相信一般翻译成凯旋 ， 就是英国凯旋摩托车 。

凯旋摩托车也有一款叫做 Scrambler，但是要比 Ducati 的 Scrambler 贵一些 。

**Rio** [19:56]
OK。

**吴涛** [19:57]
呃 ，Scrambler 这种摩托车最大的特点就是它 ， 呃 ， 强调一定的越野能力 。 就是它本质上还是一款街道车 ，但是你可以骑着它上土地或者是沙滩这样的地方 。

呃 ， 然后它主要还是设计非常漂亮吧 。 就 ， 就喜欢那个调调 。 怎么说呢 。

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

**吴涛** [20:22]
我也很难解释为什么一定是 Ducati Scrambler，因为其实还有其他的选择 ， 比如说 Yamaha 的一些 Naked Bike 看起来也很帅 ，但是 somehow someway 我觉得 Scrambler， 呃

，在一个 sweet spot 上， 就很漂亮 ，而且又不是特别贵 ，而且是不是日本车 ，也不是德国车 。 对 ， 所以是它 。

**Rio** [20:47]
OK， 没问题 。

**吴涛** [20:48]
我希望这个解释让大家满意 。 因为 ， 呃 ， 我其实也没有仔细想过为什么这个问题 。 因为有时候你喜欢一个东西不是特别容易说出为什么的 。

**Rio** [20:59]
而且大部分时候都是这样吧 。

**吴涛** [21:00]
对 ， 就比如说你为什么喜欢一门语言 ， 可能有时候也很难理解 。 然后接下来是我们的读者反馈时间

了吧 ？

### 来信

**Rio** [21:12]
呃 ， 我来念吧 。

**吴涛** [21:13]
呃 ， 对 ， 就是我们上期节目播出之后收到了至少三封热情洋溢的来信 。 然后， 呃 ，有一封是写给我们两个的 ， 另外一封是写给 Rio 的 。

那 Rio 你要不要先念写给你的那篇 ？

**Rio** [21:31]
OK。 呃 ， 等一下， 这个怎么念呢 ？ 我想想 。

**吴涛** [21:36]
你就节选里面没有个人崇拜那些念 。

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

啊 ， 我得总结一下吧 ， 好像有点长 。OK， 这样吧 。 呃 ， 这是一位 ，也是在加拿大的一个 ， 呃 ， 女听众 。 哎 ，不容易啊 ， 我们节目期下多了这么多女听众 。

真的是感谢慕瑶老师 。 啊 ， 然后她是在一个 ， 应该是制药厂做这个统计吧 ， 就是之前我们跟慕瑶讲的那期讲了很多这个学统计的同学最后都去了可能制药厂的 。

然后她说 ， 哎 ， 为什么会听 ， 呃 ， 我们这个 《 内核恐慌 》 还有 《IT 公论 》 呢 ？ 啊 ，因为她有一颗 ， 我用第一人称的角度来念哈 ，因为我有一颗崇拜 IT 人士的心 ， 一想到几行代码就解决很多问题 ， 就感到很酷炫 ，但无奈自己本科和研究生学的都是统计 ， 所以其实你们在播客里面提到的很多东西 ， 自己并不是太能听懂 ，但是总觉得多听一听其

实吸收不到技术内容 ， 科普性质的东西还是有所收获的 。 哎 ， 这个其实我觉得我们节目的目的就达到了哈 。

**吴涛** [22:45]
非常 constructive 的心态 。

**Rio** [22:48]
对 ， 就是有时候你并不一定收获的是某一个实质性的东西 ， 你知道 ， 你知道有一种东西的存在 ， 或者说有一个概念的存在能够跟你日常生活中相关 ， 或者不那么相关你也能想得到 ， 我觉得其实 ， 哎 ，也是我们一个 ， 呃 ， 我们节目的一个成就或者目的之一吧 。

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

**Rio** [23:07]
OK， 我接着念哈 。 然后她说 ， 呃 ， 我两期节目都提到了统计 ， 所以我想就想跟你们分享一下， 如果硬要把统计和编程联系起来 ， 那么我现在的职业就是完美的结合 。

她这个 job title 就是职位的名称叫做 statistical programmer， 或者叫做 SAS programmer。 呃 ，clinical，clinical programmer， 这个应该是 。

**吴涛** [23:30]
SAS 应该是一个软件吧 。

**Rio** [23:32]
是一个统计用的专业工具 。

**吴涛** [23:33]
是一个统计软件 ， 对 。

**Rio** [23:34]
哦 ， 对 ， 没错 。 然后这些都是对相关职位的不同说法 。 虽然我们叫 programmer，但其实一般药厂或者是 ， 呃 ， 我不知道这个 CRO 公司是什么东西 。Anyway， 啊 ， 或者是这个公司的程序员的 SAS 编程的技能只是工作的一部分 ， 对统计知识的了解和一些这个 ， 呃 ， 叫做 clinical 的知识的了解是需要 ， 就是我们今天讲的所谓的专业知识嘛 ，domain knowledge。

然后她就接着说哈 ， 她说很多项目里面数据集需要十几个 G 是很正常的 ，是很常见的事情 ，但是我作为一个刚工作不久的程序员来说 ， 貌似对如何优化程序考虑的还不是很多 。

对 ， 就是说她的工作中的一些情况 ，其实还挺有意思的 。 所以说我们之前想的说 ， 啊 ， 那学统计的这个同学到了药厂去工作的时候会用些什么东西 ， 她就提到了像 SAS 啊这些东西去做分析 。

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

**Rio** [24:29]
其实她这个也反映出来一个问题啊 ， 就是说像他们学统计的话 ，并没有一个从像这种 ， 就是 computer science 那种训练 ， 这样他们在很多时候对这个工具底层的一些实现可能不是特别了解 。

然后她提到如果你的数据集比较大的话 ， 它现在还好 ， 可能是十几个 G 还行 。 如果你到了以后， 假设我们有更多的像什么有 research kit 这种东西来统计更大量的样本的时候 ， 可能这个数据就是 TB 级别了 。

到时候他们用一些传统的这种统计工具来做可能就不是特别现实嘛 。 所以这里面其实也展现出 ，也就体现出了一个趋势哈 ， 就是大数据时代对包括 ， 呃 ， 传统的这个学统计和做统计的人员也是有挺大挑战的 。他们要去理解什么叫做 ， 我们讲用烂的词 ， 就是大数据怎么怎么弄 ， 然后应该要学会各种 ， 啊 ， 处理大数据的工具啊 ， 还是挺

， 就是还是蛮多挑战的我觉得 。

**吴涛** [25:24]
对 。 呃 ，CRO 是 Contract Research Organization 的缩写 。

**Rio** [25:29]
啊 ， 就是什么外包研发机构是吧 ？

**吴涛** [25:32]
对 ， 一个 organization that provides support to the， 就是对制药厂和生化技术公司提供外包研究的这么一个机构 。

**Rio** [25:42]
嗯哼嗯哼 。 然后 。

**吴涛** [25:43]
哎 ，其实刚好我不知道你有听上期那个 IT 公论刚刚讲到这个 research kit 嘛 。 就可能 。

**Rio** [25:49]
我听到他这个声音好激动 。

**吴涛** [25:53]
这个等一下再说 。 呃 ， 就他们那期提到我 ， 我其实感想还蛮多的 。其实从 ， 呃 ， 这个我们从这个技术角度来看还其实蛮多挑 ， 刚才讲了没 ， 蛮多挑战 。

比如说以后要有更多的这种 ， 就是 IT 技术的介入去做这些像他们叫做什么 clinical trial， 叫什么 ， 呃 ， 药的实验对吧 ？

**Rio** [26:12]
临床实验 。

**吴涛** [26:13]
对 ， 临床实验 。 那么你要去制定相关的软件啊 ， 那可能传统上你用一些什么表格或者这种传统的统计工具就能够实现的 。

那现在你要 ， 你要做一个 APP， 然后 APP 你要收集数据 ， 然后后台要在某一个什么可能云服务的平台里面上去跑 ， 跑完结果你要存储起来 ， 然后再怎么利用对吧 ？

其实就是可能可以很明显的看到这方面的 ， 就对这个能够兼通 ， 呃 ， 叫什么 ， 同时精通这种计算机和这种 clinical trial 的这种专业知识的人才来说肯定是一个 ， 呃 ， 缺口吧 。

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

**吴涛** [26:50]
当然从另外一个侧面我又想起了慕瑶那一期说到了 ， 我们真是每一期都可以说到慕瑶那一期 。 就是工具不好用这个问题 ， 我觉得如果说一个人可以使用一种类似于 ， 呃 ，gamified 的编程工具来完成这一切的话 ， 可能会让事情容易很多 。

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

**吴涛** [27:17]
呃 ， 比如说有些游戏真的就好像在编程一样 ， 比如说 ， 呃 ，有曾经有个游戏叫做什么 ，不可思议的机器 。

**Rio** [27:27]
这是干嘛 ？

**吴涛** [27:27]
呃 ，impossible machine 应该是叫 ， 就是它给你一大堆 ， 呃 ， 预制的组件 ， 比如说什么 ， 呃 ， 导轨啊 ， 球啊 ， 气球啊 ， 锤子啊 ， 或者什么笼子里的老鼠啊之类的 ， 然后你把它们以某种形式 ， 呃 ， 连接起来 ， 比如说让球滚过导轨 ， 砸到一个什么东西上， 然后那东西连着一个剪刀 ， 剪刀把线剪断 ， 然后， 呃 ， 线本来拴着一个笼子 ， 然后笼子里的老鼠被

惊动开始跑 ， 会带着笼子一起跑 ， 然后那个笼子撞到什么东西 。

**Rio** [28:03]
很多动画片里面的场景吧那种 。

**吴涛** [28:05]
对 ，有一个专门的词来形容这种 ， 呃 ， 花费很多费尽周章来完成一些微不足道的事情的 ， 就是这种装置是什么装置 ， 我忘了 ， 忘了一词 ，但是大概是这样一种东西 。

就是我的意思是如果有一种编程工具能够让人们以类似的方式把逻辑组件拼装在一起 ， 然后以某种可视化乃至于可以触碰和视觉化的方式来处理他们的数据的话 ， 那可能整个工作效率和 ， 呃 ， 工作效率会提升 ， 然后学习曲线会急速下降 。

**Rio** [28:48]
就我不太 ， 我不知道哈 ， 刚你说那种可能对于教学还可以 ，但是一旦到了实际生产应用的时候 ， 你要考虑这个效率的问题 ，有可能很多这个所谓的底层 ， 底层的抽象你是没有办法真正的隐藏起来的 。

**吴涛** [29:03]
对 ， 就像 ， 就像我以前说过 ， 就是有些可能非常 ， 呃 ，不能图像化的东西是没有办法强迫它去图像化 ，但是反过来说 ， 比如说 ， 呃 ，MATLAB， 那个里面已经有很多拖拖拽拽 ， 然后就可以完成一系列硬件设计的工作的这样一种可能性了 。

那我看不出什么理由在至少你那些比较低级的什么打开文件或者是把文件 ， 呃 ， 叫什么 ， 洗净文件 ， 洗净数据这个过程 ，是可以 ， 可以某种方式 ， 呃 ， 视觉化的 。

**Rio** [29:42]
嗯 ，其实现在我觉得看起码你说这个工具 ， 就它对面对大数据这个领域 ， 它工具的不成熟其实也是蛮显而易见的吧 。

啊 ， 之前大家用了很久那个什么 MAPREDUCE 那种框架 ， 什么 Hadoop 之类的 ， 现在又有什么叫 Spark， 我也看到有一个新的比较火热的东西 。

**吴涛** [30:00]
啊 ，Project Spark？

**Rio** [30:02]
对对 ， 就那个 。

**吴涛** [30:03]
OK。

**Rio** [30:04]
对 ，但其实这些来说 ， 你从不管它本来也是自己在不断演进中， 然后对于使用者来讲 ， 还是要看很多这种东西才能够理解 ， 甚至能才能够搭建这么一个平台起来 。

啊 ， 所以也说不好可能以后的途径是类似于像那个 ， 像类似于 Amazon 它提供的那种 AWS 里面有这种类似的服务嘛 ， 你就不用花钱去 ， 呃 ， 你不用去想它底层是怎么去构建这个系统的 ， 你只要按这个处理能力来花费这个处理数据就好了 。

可能这也是一种解吧 ， 我觉得 。

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

**Rio** [30:38]
啊 ，但不管怎么说 ， 这里面始终是一个 ， 呃 ， 相对来说比较新鲜的领域嘛 ， 那么它的各种不成熟啊 ， 各种范式的不清晰 ， 我觉得是一个可能在这个阶段难免的事情 。

**吴涛** [30:53]
嗯 。 呃 ， 新兴领域总是会遇到这样的问题 。

**Rio** [30:57]
对 ， 没错 。

**吴涛** [30:58]
那接下来我再读另外一篇读者来信 。 啊 ， 这篇稍微长一点 。Hi Rio， 吴涛 ， 今天听到 Kernel Panic 要做一期数据的 podcast， 很是激动 ，因为从做博士到现在博士后还都是一直在做数据挖掘和机器学习 ， 所以也算是一直在跟数据打交道 ， 和你们分享一下自己的见解吧 。

不知道会不会有 2200 次我经历 。 呃 ， 我的博士是在大连海事大学读的 ， 读了有 5 年吧 ，因为花了很长时间给老板做项目 ，而且老板也不给定题目 ， 所以花了很长时间学习机器学习的方方面面 ， 最后选定了当时 ，也就是 2009 年很热门的一个题目 ，Topic Model 作为博士题目 。Topic Model 简单的说就是能从大规模的文本数据之中自动找到涉及的主题的一类算法 ，因为是 unsupervised 算法

，也就是说在没有任何人工先验知识加入的情况下， 就会学习到的一些知识 。 所以当时我觉得还是很酷的 ， 可以说在 Topic Model 之前 ， 机器学习领域对于 supervised 的模型研究的比较多 ，也产生了很多经典算法 ， 比如神经网络啊 ， 支持向量机啊 ， 集成学习啊等等等等 ， 这些都用 ， 这些都是用来分类数据或者做预测的 ， 需要训练数据都带有人工事先标好的类

标才能 work。Anyway， 好像有些扯远了 ， 我想说的是数据还是很有类的 ， 很有 ， 很有 ， 咋咋咋 。Anyway， 好像有点扯远了 ， 我想说的是数据还是很有趣的一类研究 ，不管是文字还是视觉 ， 想必你们每天也多少会感受到 ，而且在上一期大神上过节目之后， 这个感受会更加的明显 。

对于数据和编程方面 ， 我觉得尤其是数据挖掘和机器学习 ， 包括自然语言处理以及机器视觉 ，其实在编程方面都比较初级 ， 一般人在选择编程语言上都是 follow suit， 如果一个实验室的传统是 MATLAB， 那么就用 MATLAB， 一来有问题能够找到人问 ， 二来师兄师姐的代码可以参考 ， 这个情况在国内仍旧非常普遍 。

还有一个原因就是国内对于盗版的纵容态度 ， 我觉得国内大学里面的实验室没有几个会花钱买 MATLAB 死贵的授权 ，而这个状况将会一直持续着 。

我的依据就是到现在为止 ， 每天在知乎上邀请我回答 MATLAB 的问题还是很多 ， 这个话题仍旧很活跃 。

话说 MATLAB 并不是一个很好的语言 ，而且作为一个闭源厂商的产品 ， 代码本身并不适合流传 ，但是在最近几年在文本领域使用 Python 的越来越多了 ，因为毕竟 this is theright thing to do， 当然 Java 和 C 也有一定的规模 ，不过毕竟 Python，不过最近 Python 在学术领域是一天天火起来的 。其实在学术圈里面 ， 对于编程语言的选择 ， 除非有特别的偏好 ， 基本上都是一种被动的态度 ， 要么是某

些 project 要求使用某种编程语言 ， 某些是研习的习惯而已 。OK，the point is， 编程语言对于解决学术问题的影响可以说是几乎没有影响 。

这个有一个因素是评价学术论文的体系是 peer review，而 peer review 很少会去看代码 ， 最近倒是很多论文会在 GitHub 上开源自己的代码 ，在有 GitHub 之前都是给作者发邮件 ， 第三下次的求 ， 至于给不给完全是看作者的心情 ，不给咱也不能爬着爬过网线去掐死人家博士 。Well， 上面的见解都是来自于一所国内二流大学的博士 。

呃 ， 这位听众你实在是太谦虚了 ， 我看你的邮箱是 ， 呃 ，MTU dot edu dot sg， 所以应该是南洋理工的朋友 。

啊 ， 这位听众在的来信里面提到了一些可以推荐上我们节目的嘉宾 ， 嗯 ， 就就像我们一开始说的 ， 我们可能没有人脉能请到这些人 ，但是 ， 呃 ， 至少现在还没有 ，也许等到我们能够做出点名声来了 ， 嗯 ，也许邀请的时候门槛会低一些吧 。

**Rio** [35:17]
不过他里面那个来信里面提到一些事情就还挺有意思的 ， 比如说他说这个技术的路径依赖的事情 ， 我觉得还挺有意思 。

就好像其实你任何一个公司一样 ， 对吧 ， 你公司的技术选型很多时候还是得靠你看你现有的人的这个技术水平 ， 或者说他对他熟悉的技术 ， 这个叫做 tech stack 是怎么样子 ， 然后另外就是看你有没有什么所谓历史遗留的代码 ， 是一个什么样的环境或者语言写的 ， 很大程度上你也会受那个的影响 ， 或者说是绑架吧 。

**吴涛** [35:49]
对 ，make sense， 就是我觉得有时候可能我们 ， 呃 ， 大学毕业的时候已经懂那么两三门语言的人会有一种莫名其妙的成见 ， 就是完全没有在业界摸爬滚打过的人， 呃 ， 一离开学院就开始

赃痞别人使用的工具 。

**Rio** [36:11]
嗯哼 。

**吴涛** [36:12]
可能我不知道这是不是学计算机人的特例 ，但但我觉得这种态度其实是有时候是需要自我反省一下的 。

**Rio** [36:19]
那那我我先先提个小问题 ， 吴涛同学作为你这种长期的加班黑 ， 你怎么看这件事 ？

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

**Rio** [36:31]
哎 ， 知乎上有个问题啊 ， 专门问这个的 ， 就说说这个我们这个节目或者是包括 IT 功能对这个安卓或者对 Java 都有这个成见 ， 你怎么看 ？

来 ， 啊 ， 元芳你怎么看 ？

**吴涛** [36:45]
呃 ， 我觉得我对 Java 的成见不是在踏出校门的时候就有了 ， 我对 Java 的成见是正儿八经的用它赚过 ， 呃 ， 一段时间的工资之后才开始有的 。

**Rio** [37:03]
所以是毕业后就工作中形成的 ？

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

**Rio** [37:08]
OK。

**吴涛** [37:08]
嗯 ， 当然也有一个可能就是我

在 ， 呃 ， 我入门的 object oriented 语言是 C#。

**Rio** [37:23]
OK。

**吴涛** [37:23]
而 Java 在 ， 呃 ， 想喷就喷吧 ， 反正 Java 在语言的特性层面上是完全不如 C# 的 。

**Rio** [37:35]
我觉得这点可以是公认的吧 ， 就是 C# 作为从语言设计的一个角度来讲 ， 它是一个比 Java 好得多的一个语言 。

**吴涛** [37:43]
对 ， 就是 Java 程序员基本上最能作为反驳的一条论据就是学 Java 有工作 ，不管你说什么他都可以说学 Java 有工作 。

**Rio** [37:55]
没错 ， 这是事实啊 。

**吴涛** [37:56]
呃 ，但是公平的 ， 好吧 ， 公平是没有标准的 ， 就我觉得我们节目对于 Java 的的的成见是一种非常 ， 呃

，不管你怎么说 ， 就是要成见的成见 。 我刚才想说李克忠 ，但是何必呢 。 就我觉得节目是要有见解的 ， 就我不能说 ， 呃 ，因为反正我又没有拿 Oracle 的钱 ， 为什么要一定要替他说好话呢 。

**Rio** [38:33]
我就是觉得他长得丑 ， 对吧 ？

**吴涛** [38:34]
对啊 ， 呃 ， 就你喜欢或者讨厌一门语言 ， 你可以完全没有理由的 ，而更何况我们是有理由的 。

**Rio** [38:42]
嗯哼 。

**吴涛** [38:43]
那不喜欢就不喜欢呗 ， 那有那么多人拿着 Java 写安卓的程序 ，有那么多巨大的公司拿 Java， 呃 ， 做那么伟大的事情 ， 那我们可以反过来说 so what？

那 Facebook 还是用 PHP 写出来的 ， 那 so what，PHP 照样是一个很蠢的要死的语言 ， 这还是有人会站出来说你没有看到 PHP 的人的社区有多努力 ，是啊 ， 多努力 ，so what？

**Rio** [39:15]
补坑了 。

**吴涛** [39:16]
但人长得丑努力有什么用啊 ？

**Rio** [39:18]
哈哈哈 ，不是人长得丑就要后天多努力吗 ？ 你这样多打击人家的信心 。

**吴涛** [39:25]
呃 ， 反正 PHP 的 PHP 和 Java 的流行程度不会因为我们在这边说几句风凉话就就消退 ， 对吧 ？ 然后无论该用还得用 ， 你没事吐吐槽 ， 我们没事吐吐槽就就就 。

**Rio** [39:39]
无论无论我们说多么酸多么激愤多么揶揄的话 ， 照样还是有人会冷笑一声 ， 然后继续随着他吃饭 ， 对吧 ？

那我们也不能懒着你 ， 对吧 ？ 啊 ， 那个就刚才那个听众来信里面 ，他还提到说这个最近几年在这个文本处理这个领域使用 Python， 就是呃 ， 做研究哈 ， 越来越多了 。他说毕竟 this is theright thing to do，其实这点我还挺好奇的 ， 就为什么这个会是一个 right thing to do 呢 ？

**吴涛** [40:06]
因为在文本处理 ， 就是如果说错了 ， 各位听众欢迎你纠正我 ， 就是在 NLP 这一块 ，因为我当时曾经想要考 ， 想要去考再考一个 NLP 的硕士 ， 所以我大概看过一阵 ， 就是 NLP 这个领域在 2008 年左右 ， 呃 ， 基本上 de facto 的工具只有两种 ， 就是 Perl 或者 Python。

呃 ， 如果你要两害相权取其轻的话 ， 那我觉得任何一个理智的人都会选 Python。

**Rio** [40:41]
Perl 现在基本上已经快死了吧 ， 我觉得 。

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

**Rio** [40:45]
我很少有看到新项目还是在用 Perl 写 。

**吴涛** [40:49]
Perl 基本上是在你没有得选的时候才 ， 我之前可能说过 ， 就是有一个 ， 呃 ， 电源厂商送了一个电源来 ， 然后这个电源的 API 是用 ， 这个电源的接口是 Perl 接口 。

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

**吴涛** [41:02]
然后除此之外， 我再也没有在过去的 5 年里面接触过任何其他 Perl 程序 。

**Rio** [41:08]
啊 ， 啊 ， 我好像上次接触到一个那个 Lino 的 ， 那个他的 API 的客户端简称 Perl 写的 。

**吴涛** [41:15]
OK。

**Rio** [41:16]
然后那个安装过程就酸爽 ， 装一下要装可能一两百个依赖 。

**吴涛** [41:24]
Perl 有时候还是很有用的 ， 比如说什么 。

**Rio** [41:27]
它那个叫什么 CPAM 吧 ， 那个还是还是很厉害的 。

**吴涛** [41:31]
但我觉得 Perl 对于我来说最常用的最大的用途就是替换 ， 呃 ， 那个 Linux 平台下面 ， 就是作为 Linux 平台下面最唾手可得的一个一个文本查找替换工具 。

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

**吴涛** [41:48]
因为 Perl 整体表达是很 ， 就是很好嘛 ， 然后 。

**Rio** [41:52]
开玩笑啊 ， 那个大部分的正则表达式的标准都是从那里来的 ， 叫什么 Perl compatible regular expression 嘛 。

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

**Rio** [42:02]
PCRE， 对 。

**吴涛** [42:03]
对 ，PCRE。 嗯 ， 说到哪了 ， 对 ， 呃 ， 说 Python 在 ， 呃 ， 学术圈是 right thing to do， 我觉得是可以理解的 ，因为学术圈里面有很多很多人都在用 Python。

**Rio** [42:18]
嗯哼 。

**吴涛** [42:19]
呃 ，不只是自然语言处理 ， 还包括统计啊 ， 包括物理学啊 ， 包括生物学啊 ， 生物学 ， 生物学 ， 比如说那个 ， 呃 ， 就不说名字了 ， 反正就是在这边读博士的一个 ， 呃 ， 生物学女博士说她去参加 MATLAB 的培训 ， 然后她们她们的导师说哎你要去就去吧 ， 呃 ，不对 ，是给她们培训 MATLAB 的导师 ， 跟她们说 ， 呃 ， 虽然我在教你们 MATLAB，但是平时如果真的要遇到这些事情 ， 我都是用 Python

的 。

**Rio** [42:53]
哈哈哈 ， 对 ， 这个就 Python 在学术领域 ， 它们就就特别是在这种非非 CS 这个区 ， 这个这个专业方向上， 用的还是蛮多的 ， 我感觉就是可能一个是它比较好上手 ， 语法相对来说比较直观 ，不像像慕亚老师说的有那么多奇怪的分号啊什么的问题 ， 它的靠一个缩进来实现嘛 。

啊 ， 然后可能会起码从视觉上可能很多人更习惯这一点 ， 然后它在你刚才也有一个路径依赖的问题嘛 ， 就是最开始那波人用的是这个 ， 导致后来它有有有用的有用的一些包啊库啊都是这个写的 ， 然后就从而久而久之就形成了这个滚雪球的效应吧 。

**吴涛** [43:36]
对 ， 再有就是 Python 在这个领域是以 Python 的角色或者说以其特性来说和它最相近的可能是 Ruby，而 Ruby 基本上只是在 Web 应用的圈子里面比较火 。

呃 ，Matt 好像 Matt 好像说过 ， 就说他希望 Ruby 可以在学术界有所建树 ，但是至少我最近没有读到相关的新闻 ， 就是说 Ruby somehow 能够在学术界 ，因为学术界的惰性是很大的 。

**Rio** [44:12]
对 。

**吴涛** [44:13]
我不太相信 Ruby 可以仅仅靠其创始人的呼吁能够在学术圈这么强烈路径依赖的这个这个市场加引号里面获得一定的份额 。

**Rio** [44:26]
反正我是没有看到吧 ， 就是经常就是系里面会给就是非 CS 的人开一些这种就是入门课 ， 然后基本上还是一项 ， 就是动态这种 scripting language 的话还是以 Python 为主的 。

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

**Rio** [44:40]
啊 ，TCL 都有时候教 ，不过现在好像少了 。

**吴涛** [44:43]
哇 ，TCL。

**Rio** [44:46]
Anyway， 啊 ， 哦 ， 还有一个听众反馈要说一下， 就是上期我们 ， 呃 ， 这个是这位叫他以前我们也给我们经常来信的一位听众啊 ， 李旭 ，他在那个 Twitter 上给我们说那个 ， 上期我们不是提到了那个 Windows 3 的那个并发那一块嘛 。

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

**Rio** [45:04]
啊 ， 好 ， 这个是这个诗诗也是给我们提个醒啊 ， 啊 ， 先我先读一下他的反馈吧 。他说这个 Win3 开始并发那几分钟内的槽点也太多了点 。

啊 ， 首先你们把多任务 OS 的概念给混进去了啊 ， 虽然啊 ，其次虽然概念不清 ，但是如果你把边听歌边看图判断并行 OS， 那 DOS 也能办到好吧 ？

然后多线程之前的多进程就不算了吗 ？ 啊 ， 最后没有 hyper threading， 没有 hyper thread 就没有多线程了吗 ？ 啊 ， 这个你要不要解释一下 ？

**吴涛** [45:36]
呃 ， 坦率说我也解释不清楚 ，因为我承认在那在讲那个东西的时候 ， 我基本上不知道自己在说什么 ， 就是或者说不确定自己在说什么 。

呃 ， 后来我去查了一下 Windows 3.2 或者 Windows 3， 它的基本机制其实是一个 ， 它本质上 Windows 3 本质上是一个虚拟机管理器 ， 呃 ， 它自己跑一个 ， 就是 Windows 3 有三种执行模式 ， 这个先不说 ， 然后在最理想的那种执行模式之下， 它自己是一个虚拟机管理器 supervisor， 然后它在下面跑几个 DOS 虚拟机 。

呃 ， 就这种情况下的确不能算是 ， 呃 ， 我们当时所试图解释的一种多进多进程实现的多任务 。

**Rio** [46:25]
嗯 。

**吴涛** [46:26]
而是 something totally different。 但是我觉得这件事情的细节不重要 ， 就是 ， 呃 ， 我觉得它给我们带给我们最大的教训就是以后还是不要说微软相关的东西了 。

**Rio** [46:44]
不懂你就别逼逼 。

**吴涛** [46:46]
对啊 ， 除非我们 100% 的确定自己在确定自己知道自己在说什么 。

Oh, please, do you know what you're talking about? Because I don't think you know what you're talking about.

**吴涛** [46:56]
否则我们在接下来的题目里面节目里面尽量不提及和微软有关的任何东西 ， 我觉得这是一个比较可取的 。

**Rio** [47:06]
那你最喜欢的 C# 你怎么办 ？

**吴涛** [47:09]
啊

， 同样吧 ， 反正只有在我确切知道自己在说什么的时候 ， 比如说我上次说什么 docnet 跑在 OS 10 上这种东西 ， 我是确切知道自己在说什么的 ， 只有在这种情况下才说吧 ， 否则还是算了 。

而且 Windows 这个东西就我我不知道 ， 嗯 ， 个人什么感受 ， 就是我是觉得你对操作系统感兴趣的话 ， 你是不可能不离开 Windows 的 ，因为你你不知道 ， 你不是 ， 如果你除非你在微软工作 ，并且你做 OS 相关的东西的话 ， 你不知道这个操作系统是怎么实现的好吗 ？

就如果你对系统级别的编程感兴趣的话 ， 又想看看一个真实的操作系统是怎样被搭建起来的 ， 想要了解其内部的构造 ， 那 Linux 简直是要没有其他的选择了 ， 就除非你去做一些什么更 hardcore 的 free BSD 之类的 ，但那已经是至少是你在了解了 Linux 之后才会发生的事情了 。

对于一个生活在现代的人来说 ， 除非你是 70 年代的一个 hacker， 否则你怎么能不去了解一下 Linux？ 就就在从这个角度来说 ， 讨论 Windows 到底有什么意思呀 ？

所以 。

**Rio** [48:25]
对 ， 我觉得还是有意义的啊 ， 就起码现在有很多人， 就绝绝大部分的桌面用户还是在用这个吧 ，但是因为我们都算不了对这个平台了解很多 。

**吴涛** [48:37]
我的意思是 ，you know， 咱们的节目号称内核恐慌 ， 对吧 ？ 就所以是要比较系统像一点 ，而不是用户应有的这样像一点 。

就如果你要想你想讨论 application 的话 ， 你去欢迎你去收听 IT 公论 。

**Rio** [48:51]
哈哈哈

。

**吴涛** [48:54]
我们内核恐慌这边讲的都是一些比较 ， 呃

， 我也不知道 。

**Rio** [49:01]
哎 ，不管怎么说哈 ， 还是就非常感谢李旭给我们的这个反馈 ， 这个这个提的非常好 ， 就是一针见血的指出我们这个不懂别瞎逼逼 。

**吴涛** [49:12]
对 ，不懂不要瞎逼 。

**Rio** [49:13]
不过我希望就说还是 ， 呃 ， 呃 ，不影响这个整体讨论的 ， 呃 ， 内容吧 ， 就是为这个原则为好 ， 那其他的就是我们以后会谨慎一点 ， 然后确认之后再说 ， 对 。

**吴涛** [49:27]
对 ，anyway, no hard feelings。 内核恐慌的内核恐慌的 slogan，no hard feelings。

**Rio** [49:34]
摆事实讲道理嘛 。

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

**Rio** [49:38]
OK， 那么就我们反馈暂时做到这里哈 ， 然后这周有什么新闻发生的事 ？

### I Like Rabbits

**吴涛** [49:47]
哦 ， 还有讲新闻啊 。

**Rio** [49:49]
啊 ， 对对对 ， 还有讲新闻 。

**吴涛** [49:51]
嗯 ， 对 ，其实 ， 呃 ， 首先是一个服务 ， 呃 ， 这是你发现的吧 ？

**Rio** [49:59]
啊 。

**吴涛** [49:59]
就 I Like Rabbits。

**Rio** [50:01]
我好像看到的 。

**吴涛** [50:02]
对 ， 我看一下我觉得当时就震惊了 。

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

**吴涛** [50:06]
这叫什么 ？ 你知道我们脑子里面冒出来的第一个反应是什么吗 ？

**Rio** [50:10]
要失业了 。

**吴涛** [50:11]
不是不是 ， 这样做道德吗 ？ 这样做道德吗 ？

**Rio** [50:15]
为什么不道德呢 ？

**吴涛** [50:17]
就 ， 呃 ， 这有点像代写论文啊 ， 我觉得 。

**Rio** [50:21]
哦不 ， 你你还是先解啊 ， 我来我来解释一下这个是什么东西 。

**吴涛** [50:24]
好 ， 你先说一下它是干嘛的 。

**Rio** [50:25]
OK， 它这个网址叫做 I Like Rabbits dot com， 叫我爱兔子们点 com。 啊 ， 兔子就是 rabbit，R-A-B-B-I-T-S， 就是我爱 I Like Rabbits dot com。 好 ， 它是一个服务哈 ， 它是这个服务是干嘛的呢 ？

就是它有它这个服务的唯一的一个接口 ， 就是一个邮箱地址 ， 然后你给这个邮箱地址发一个信 ， 信里面你用简短的一两段话能够解释清楚一个编程的相对简单的 ， 或者简单或者这个比较明确定义的这个编程的任务 ， 然后它会给你回一封信 ， 它会回回一封说这个大概需要花多长时间 ， 然后花多少钱 ， 然后问你愿是否愿意接受 。

如果你接受的话 ， 它就去做了 ， 然后它在约定的时间内把这个这这个你要的这个结果 ， 它可能是一段代码或者是一段数据片段 ，是你需要的一个东西 ， 然后给你发回来 ， 然后你再按之前约定好的这个价钱支付酬劳就可以了 。

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

**Rio** [51:27]
简单来说呢 ， 这个就是叫做我们姑且称之为把程序员 API 化了吧 。

**吴涛** [51:35]
呃 ， 我是这么理解的 ， 就是在我眼里它是一个二级的外包网站 。

**Rio** [51:44]
嗯哼 。

**吴涛** [51:45]
比如说有一个网站叫 ODesk， 嗯 ， 你如果你是一个 ， 比如说你是一个艺术家 ， 然后你想要给自己做的东西做一个网站 ， 你但是你不会写程序 ， 呃 ， 你可以选择学编程 ， 或者选择去 ODesk dot com 上面找一个程序员为你做解释 。

你需要做的就是 ， 呃 ， 描述清楚说你要干什么 ， 然后， 呃 ， 去找有没有人来愿意为你做这件事情 ， 然后你们两个讨价还价 ， 然后那个人帮你做出来 。

呃 ， 就说在 ODesk 这样网站上面 ， 买方是完全不懂写程序的人， 或者说买方是一个项目的 product owner， 然后你呢 ， 你则要身兼 product manager 和 programmer developer 这两个角色 。

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

**吴涛** [52:36]
呃 ， 倾听对方的需求 ，并且替对方把东西做出来 。 而 I Like Rabbits dot com 这个网站提供的则是你作为一个

包工头 ， 要把你手下的这个活再外包出去 。

**Rio** [52:55]
嗯哼 。

**吴涛** [52:56]
的这么一个网站 。 它相当于叫什么 second level support。

**Rio** [53:00]
嗯哼哼哼 。 对 。

**吴涛** [53:04]
但 。

**Rio** [53:05]
你说 。 然后它这个居然有点意思啊 ， 就是说它它有一个下面有个 FAQ， 就常见问题解答嘛 ， 它会说他们接受哪些类型的任务 ， 然后大概是一个什么样的收费标准 ， 当然就说会有一些限制 ， 比如说你不能说哎 ， 来我你给我做个 Google 吧 ， 你这种事情是不现实的 。

它有给一些这种范例 ， 比如说它要写个模块 ， 然后爬一个什么数据 ， 这种是可以做的 。 然后它要有一个什么 URL， 上面有一些有一些链接 ， 它要全给全部给它抓回来 ， 做到一个那个 ， 呃 ， 电子表格里面 ， 这种事情它也可以帮你做 。

它现在的价格是说它不接 ， 就一般的这种收费不会 ， 就从来就一定不会超过 300 美元 ， 就根据难易程度 ， 呃 ， 花费的时间不一样的有所不同嘛 。

哈 ，但我这个其实这我觉得其实还是挺有意思的一个事情 ， 就很多就其实刚才解决了那种 ， 啊 ， 你有那种一些比较重复性的劳动可以被计算机解决 ，但是 ， 啊 ， 你自己又一下没有那个时间 ， 或者是没有那个知识储备去自己做的话 ， 用这种服务我觉得还是蛮好的 。

**吴涛** [54:10]
呃 ， 或者可以这么说吧 ， 就是如果你你需要做一个比较大的项目 ， 然后因为某种某种缘故你耽搁了 ， 然后你可以利用这个网站来救救急 ， 然后我之所以说它像一个代写论文 ， 那就是就是这种感觉 ， 就是我我 party 太厉害了 ， 然后我现在需要急需交一个小论文 。

**Rio** [54:33]
嗯哼 。

**吴涛** [54:34]
呃 ， 否则不能毕业 ， 那我去找了枪手网枪手网站 ， 这这是这这有这有道德上的问题吗 ？ 呃 。

**Rio** [54:42]
应该有吧 ， 一般的学术机构都不会都都不会认可这种事情的 。

**吴涛** [54:48]
对 ， 呃 ，但是反过来仔细想一下， 好像放在软件上面这一点就不成立了 ，因为 ， 呃 ， 你可以看到这个网站要要会给你做的事情 ， 比如说它提供那个什么把 PDF 转把 PSD 转成 HTML CSS， 这些东西是完全没有研究性质 ， 或者说完全没有创造那价值在里面的 。

**Rio** [55:13]
就就我们叫什么劳动密集型的部分 。

**吴涛** [55:18]
对 ， 就是软件这个伪白领工作里面最蓝领的那一部分 ， 你可以在这个网站上完成 。 呃 ， 然后它在它开出的价格是多少 ？

它说一个任务一般不应该超过 6 个小时， 然后它收费不应该一般不会超过 300， 所以也就是它在它在暗示就是它大概一个小时的成本是 50 美元 ，而如果你的人力成本在一个像样点的公司里面超过了 50 美元每个小时， 这还是很有可能 ， 对吧 ？

**Rio** [55:51]
嗯 。

**吴涛** [55:51]
嗯 ， 的话 。

**Rio** [55:52]
大部分大部分的这种 ， 所以就比如说你就拿北美来说吧 ， 你这个人力成本都不止那么一个小时 50 啊 。

**吴涛** [56:00]
对 。

**Rio** [56:00]
就你你找一个传统外包公司 ， 那至少可能是 100 以上 。

**吴涛** [56:04]
对 ， 然后在这种情况下用这个网站其实是无可厚非的一件事情 ， 当然你可能会另有另外一些时间成本在里面 ， 比如说你要跟对方讲清楚需求 。

**Rio** [56:15]
对 。

**吴涛** [56:15]
然后你要 ， 呃 ， 花一点时间去验收 ， 然后去去理解对方具体做了什么 ， 然后这个东西可能不符合你的想象 ， 然后你要自己去改一下什么的 ，但这些成本应该来应该最多最多不会超过你在上面投入 ， 就是对方在上面投入的时间本身 。

**Rio** [56:36]
嗯哼 。

**吴涛** [56:36]
呃 ， 否则你就是一是一个 ， 否则你就可以去去申诉嘛 ， 就就是说你做这个东西完全不符合我的需求之类 。

**Rio** [56:43]
哈哈 ， 对 ， 所以它对那个对那个任务的要求是限限制还是蛮还是挺大的 ， 就说它需要你能够在相对简单简短的这个文字里面能够描述清楚的这么一种 ， 就是叫我们叫做啊 well defined problems 吧 。

**吴涛** [56:59]
对 ， 就是我觉得这个网站最最聪明的一点就是它它的目标客户全是一群知道自己要解决什么问题的人。

这是 。

**Rio** [57:11]
其实这个已经蛮难的了 ， 就就怎么说 ，他们不经常讲吗 ， 解决问题的一大部分工作其实在定义问题嘛 ， 就如果你能把这个问题定义的非常清楚了 ， 就其实你有自己一定的水一定的就是自己动手做的话 ，其实有一半多的工作就已经完成了 。

但是其实我很怀疑哈 ， 就很多这种没有这个编程基础的人去描述这么一个问题的时候 ，他可能是描述不清楚呢 。

**吴涛** [57:39]
对 ， 我觉得这是这个网站最聪明的地方 。 我觉得在 ODesk 这样的地方 ， 你会遇到很多根本不知道自己想要什么的人， 就是你看他们的需求的描述就是 Hi, I want to make a website, uh, uh, with this and that function and blah blah, and I have like two hundred eur two hundred dollar budget.

然后我就想就扇他两巴掌 ， 就是哈哈 ， 就就好像很多人会讨论说我要我要做一个 APP， 然后把把交互和特性想的非常详细 ， 然后你问他说哦 ， 那服务器怎么办 ， 然后他瞪大眼睛瞪着你说服务器是什么 。

**Rio** [58:20]
哈哈哈 ， 这这还算好的啦 ，他们至少能把交互那些给你想明白 ， 就好像之前啊 ， 就不管不光在软件行业有这个问题啊 ， 硬件行业有这个问题 ， 之前不是有那个是谁说吗 ，是那个 Frog Design 吗 ， 还是哪家公司我忘了 ， 就苹果的 iPhone 出来之后， 不是当时有一个有应该是三星嘛 ， 去找这个工业设计公司 ， 就他们专门给人外包做工业设计的 ， 说哎 ，

我们要做一个类似的手机 ， 你们看半年能不能搞定 。 然后这家那边花了几很多年的时间做技术研究 ，而且那些人都是这个业界的最顶尖的人， 你要我们半年搞出来 ， 这搞笑吧 。

对 ， 就这之类的事情是一个挺挺麻烦的 。 这让我想起那个呃呃叫什么 XKCD 上面有一个有一有一个有一个漫画哈 ，他说这个漫画内容大概是这样子的 ， 我凭脑子记可能有点不准 ，但是大概意思应该是这样啊 ， 就说哎 ， 呃 ，有两个人， 一个人他跑来找那个人给他做一个呃软件算法 ， 说啊 ， 我们要做一个 APP， 这个 APP 的功能呢 ， 就是你首先你要判断他人人在

拍照的地点是在一个叫什么呃国家森林公园里面 。

**吴涛** [59:33]
哦 ，OK， 我知道这个 。

**Rio** [59:35]
他说好 ， 那个那个那边那个人说好 ， 没问题 ， 我可以用那个这个手机自带的这个 GPS， 再加上这个常见的地理信息数据库 ， 就可以解决了 ， 没问题 。

**吴涛** [59:45]
对 ，他说的好像是给我一台电脑和两晚上时间 ， 大概这样 ， 一个周末加一台电脑 。

**Rio** [59:50]
对对 。

**吴涛** [59:50]
就可以做出来 。

**Rio** [59:51]
然后他说那个你就是那个那个过来提需求的人就说了 ， 然后他就接着说啊 ， 然后第二呢 ，他要判断这个扎在那个这个呃国这个什么国家森林公园里拍了一张照 ， 这个照片是不是一只鸟 。

**吴涛** [1:00:05]
哈哈哈 ， 对 ， 然后一一开始说我只需要一台电脑和一个傍晚的人， 呃 ， 一个周末的人说呃点点点 ， 那我需要一个国家实验室和几十个博士生 。

**Rio** [1:00:19]
然后给再给我五年的时间 。

**吴涛** [1:00:21]
然后五年时间 。

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

**吴涛** [1:00:23]
然后我记得那幅漫画的呃 title 或者就是你 hover text 是呃学计算机最大的难题之一 ， 就是怎么向一个外行人解释复杂度 ， 为什么呃看起来相似的任务复杂度会差这么多 。

**Rio** [1:00:40]
对 ， 就所以其实我就很好奇就说啊 ， 这个东西如果你拿就刚才我们讲这个 I Like Rabbits 这个服务 ， 你开放给公众来讲 ， 它它能够真的理解哪些是你能做 ， 哪些是不能做的吗 ？

所以 。

**吴涛** [1:00:54]
不 ， 我我觉得这个网站聪明之处就在于它它可以很简单的回旋 ， 你说这个东西我们做不了 ， 然后就完了 。

**Rio** [1:01:04]
OK。

**吴涛** [1:01:05]
而而它所前它所面向的客户群是那些知道自己要做什么 ， 只不过没有时间做的人。

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

**吴涛** [1:01:12]
就我觉得它其实就是就像我说的是一个 second level support， 然后它主要面向的对象是那些知道自己要做什么的程序员 。

**Rio** [1:01:20]
OK， 所以其实其实从这个角度来说 ， 你可以看到就以以后假设这种类型的服务啊流行起来或者说多起来之后， 那些所谓的底层低端的工种就可能会被逐渐淘汰掉了吧 。

**吴涛** [1:01:36]
我也不知道 ， 我其实我其实是比较希望人工智能发展到一天 ， 人工智能可以自动完成这些 subtask。

**Rio** [1:01:44]
那那我们人干嘛 ？

**吴涛** [1:01:46]
就人只做 grand design。

**Rio** [1:01:48]
不 ， 如果人工智能都发 ， 如果人工智能都发展到能够做出这种 design 了 ， 那你觉得它不可以去 。

**吴涛** [1:01:55]
不不 ， 我意思是不 ， 我的意思是 I Like Rabbits dot com 这个网站上的工作可以交由人工智能去做 。

**Rio** [1:02:03]
就基础的那种比较蠢的工作是吧 ？

**吴涛** [1:02:05]
对 ， 就是有你就像你说 well well defined 问题可以交由人工智能去做 ， 然后人类程序员只做 grand design 那种 。

**Rio** [1:02:13]
嗯哼 ，OK， 这也不错 。 所以其实从这个角度来讲 ， 这个就属于叫什么啊 ， 如果可以类比的话哈 ， 这个就是啊成编程界的 Siri。

**吴涛** [1:02:25]
呃 ， 对 。

**Rio** [1:02:26]
你给他一个简单的 task，他能给你返回一个结果这样 ， 然后不知道像以后就能这个东西能够在多大程度上被智能的解决 ，不知道那个什么 IBM 那个 Watson 能不能够做到类似的事情 。

**吴涛** [1:02:40]
其实就是那个 Tony Stark 的那个呃

J Janice。

**Rio** [1:02:48]
对 ， 那个那个超级计算机 。

**吴涛** [1:02:51]
对 ， 我忘了它叫什么了 ，但是那个超计算机其实就是一个这样的角色吧 ，Tony Stark 只做 grand design， 然后他负责做粗做做粗活和累活 。

**Rio** [1:03:00]
嗯哼 ， 这其实就好像回到有之前有一个呃基础教育方面的一个问题了 ， 就说在这个计算器或者计算机如此如此普及这种就随处可得的这种现代哈 ， 我们还有必要要求每个小学生去背得到背得下那个叫什么四则运算吗 ？

还是这个舅舅乘法表

？

**吴涛** [1:03:22]
我觉得 10 以内的乘法 ， 除非你是法国人， 否则还是背一背吧 。

**Rio** [1:03:27]
为什么除非 ， 为什么法国人又被黑了 ？

**吴涛** [1:03:31]
法国人不是念数字非常困难吗 ？ 什么 90 要说成 40 加 50 加 40 之类的 。

**Rio** [1:03:37]
不是十进制的是吧 ？

**吴涛** [1:03:39]
就他他们有一些二呃呃 。

**Rio** [1:03:43]
二十进制 。

**吴涛** [1:03:44]
Wait a second，他们应该是 anyway， 反正就是类似于什么 70 要不说 70， 就是没有 70 这个数字 ， 要说 40 加 30， 然后法国的法国的法语 ， 法国的法国的法语和瑞士的法语的念数字的方法还不一样之类的 。

**Rio** [1:03:59]
啊 ，是吗 ？

**吴涛** [1:04:00]
对 。

**Rio** [1:04:01]
天呐 ， 哎 ，不知道他们和这个加拿大这个魁北克法语有没有什么不一样 。

**吴涛** [1:04:07]
对 。

**Rio** [1:04:08]
这是蛮蛋疼的 。

**吴涛** [1:04:09]
我的观点是就算 。 要说的不了了 。 我写过一篇 blog， 就是说因为他当时做助教做教微积分二嘛 ， 然后他说呃美国的大学生学微积分的时候面对的一些问题都是什么 ， 比如说给得由一个形如什么什么什么什么的函数求此函数在什么什么什么什么地方的什么什么什么 ， 然后他他说人们怎么能不痛恨这门学科 ， 乃至在通过考试之后就立刻想办

法把它忘掉 。 呃 ， 数学为什么一定要用这样的方法教 ， 就人们我们凭什么逼迫所有人都像数学家一样去学习数学 ，因为数学家学习数学就是因为数学本身 ， 就数学家不会去想这个东西有什么用 ，他反正就是这么想的 。

如果我来 ， 就是他说如果他来呃编写数学教数学课本的话 ，他一定会呃从比如说他举了一些数学在现实生活现实生活中的例子 ， 可能比如说什么密码学或者是呃人们为什么可以预测三天之内的天气 ，但不能预测一个月的之类的这样一些 ， 就是和数学息息相关的大问题 。

呃 ，他会他会他说他更愿意从这些问题入手 ， 然后尽量避免让人去学一些可以靠机器或者是计算器解出来的问题 ， 比如说你要求一个什么函数在某一点的值 ， 或者是是否收判断一个基数是否收敛 ， 你去 Wolfram Alpha 上搜一下就好了 ， 就为什么一定要是用手算的 ， 为什么要学习那些复杂的求导技巧 。

呃 ，他大概是这样一个观点 ， 就我觉得的确也是这样 ， 就是你在学编程的时候 ， 可能与其去像唐浩强那样追求 ，但是我不是想黑唐浩强的 ，因为他的教材之所以会这么流行 ，也是跟时代相关 ， 就是在他写 C 教材的时代 ， 还我们对 C 的认识还不像今天这样 。

但是如果你要一定要去钻研 ， 比如说从左到右一堆加号 ， 然后最终求出来的值是什么样的 ， 你去钻研这种这种细节回回相似的写法到底有什么意义 ， 就可能教学里面就是编程教学里面也的确存在着类似的问题 。

**Rio** [1:06:34]
对 ， 就其实就是应用题嘛 ， 你得先告诉他们你这个东西就对于大多数人来讲哈 ， 你教学的意义是让他们能够觉得这个东西是有用的 ， 这样他们才有这个动力 ，有这个所谓的 incentive 去学嘛 。

所以很多其实不光是数学教育啊 ，其实现在的编程教育也有这个问题 ， 很多人都在抱怨说我在大学本科学那么一堆什么算法呀 ， 什么一堆乱七八糟东西 ， 为什么呢 ？

就是你不告诉他的意义何在 ，他不明白中间的重要性怎么样 。 很多人反而是在可能毕业很多年工作之后， 然后啊才突然间意识到哦 ， 原来当初学那个东西是这么的有用 ，但是也看来当时没学好 ， 现在来又好像觉得悔之晚矣的感觉 。

**吴涛** [1:07:18]
对 ， 就是好像你要教一个人和汽车有关的东西 ， 你你不教他怎么去

， 先甚至不说不教他怎么开车的 ， 你甚至不教他去辨认这辆车是是是是宝马还是还是比亚迪 ， 你就先给他讲内燃机的原理 ， 这这有意义吗 ？

但在编程教育领域 ， 可能很多时候我们做的的确是这样的事情 ， 就是不会先去教他怎么样写程序 ， 把自己需要每天去刷的网站呃上面的东西抠下来 ， 然后把每天不一样的内容发给自己 ， 或者是比如说我也不知道呃自己写一个屏幕保护程序之类的 ，而先要教他什么是对象 ， 什么是指针 。

**Rio** [1:08:13]
哈哈哈 。

**吴涛** [1:08:14]
当然当然你也可以反过来说 ， 可是我们目前的编程语言就是这样的 ， 你不懂得什么是面向对象和指针 ， 你就是你是写不出来一个平板的 。

但但也不尽然吧 ， 我觉得如果要我来呃设计编程课的话 ， 我可能会从比如说什么 Arduino 之类的地方入手 ， 就是先你你先用一个呃那个语言叫什么 processing， 嗯哼 ， 用 processing 的集成环境写一个可以让 Arduino 的 LED 亮起来的 C 呃类 C 的程序 。

呃 ， 这不是很有成就感吗 ？ 而且加上一个小马达或者是一个小探测器 ， 就立刻可以做出来一些 ，不管说它究竟有什么样真实的实实用性质 ，但至少可以就像精工实习 ，不是精工实习 ， 电子实习会让你做一个收音机一样 ， 至少能听个响吧 。

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

**吴涛** [1:09:10]
但是很多人花了很多时间去学编程 ， 最后连响都听不了 ， 就你让他写个程序 ， 然后吭哧吭哧的打开命令行 ， 然后让围观的美眉都失望了 。

**Rio** [1:09:21]
哈哈哈 ， 对 ， 所以其实就我觉得真的就是我们的这个教学的这个思想也好 ， 这个理念也好 ， 可能很多时候要要转过来 ， 要从一个考虑到啊 ， 绝大多数人应该从那个兴趣或者实用主义的导向出手 ， 你得先告诉他我们为什么要做这么一件事情 ， 然后我们如果要做这件事情 ， 需要什么样的工具或者什么样的条件才能够实现 ， 然后你告

诉他这些解释清楚之后， 你再去说啊 ， 那我们现在开始学这工具 ， 然后你在这个学习过程中， 你还得不断的强化说你看啊 ， 我们今天学了这个指针和这个什么宿主这个概念 ， 那么你可以做些什么样的事情 ， 可以解决一部分到我们之前要解要实现的一个大目标中间的一小一小部分 ， 对吧 ？

这样才可以有一种啊激励机制去不断的去呃去去让那那些人有更多的这种对知识的渴求嘛 ，而不是说像现在呃或者是过去我们学习的时候 ， 先告诉你一堆诡色难懂的什么公式概念 ， 然后你也不知道到底是为什么要学这么东西 ， 很盲目的这种方式嘛 。

**吴涛** [1:10:26]
对 ， 这其实让我想起来就是还是回到节目最开始说的那个 ， 要把呃数据领域或者是应用领域的编程 gamify 的这样一个理念 ， 就是呃有时候人们会问说为什么小孩不愿意读书 ，而是更愿意打游戏 ， 就你会想你说这不是废话吗 ？

因为游戏比较好玩 ， 可是你那我进一步追问为什么游戏这么好玩 ， 就是因为有那么成千上万的人， 呃 literally 成千上万的人， 嗯哼 ， 花了成千上万个小时认真的去设计 ， 把这个系统设计的让你沉迷其中不能自拔呀 。

**Rio** [1:11:08]
对啊 ， 里面有各种综合的什么心理学的因素去提高我们叫什么可玩性嘛 ， 对吧 ？

**吴涛** [1:11:15]
对啊 ，而反过来一个写教材的人可能是 ， 我没有恶意 ，但是可能就只是一个想要平支撑 ， 然后赶紧呃东拼西凑搞出一本教材来抄抄抄抄国外的教材来 ， 嗯 ， 的一个国内大学的什么副教授之类的人， 不是吗 ？

你你看这种书怎么可能产生兴趣 ？

**Rio** [1:11:36]
没错 。

**吴涛** [1:11:37]
就我记得我觉得最烂的一个最好的一个例子 ， 就是最好的一个反面例子 ， 就是呃我上大学的时候学的线性代数那本书 ， 我觉得简直是 bullshit， 那个教材我忘了是谁写的 ，但就看的是云里雾里 ， 就直到我到了德国开始接触 ， 就因为德国人非常喜欢线性代数 ， 喜欢行连式矩阵到一个无无可复检的地步 ， 哈哈哈 ， 呃无以复加的地步 ，sorry， 然后我才意识到原来行

列式是这么用的 ， 或者说行列式其实是有内在内在规律和关联的 ， 比如说它描述了空间 ， 或者是 Whatever 什么东西 ， 它它是对于我们现实世界的一种转换 ， 就是那个东西之所以要写成那个形式 ， 就是因为它写成那个形式最有效最有用 。

可是我在大学里面读那本薄薄的线性代数的时候 ， 我是完全没有意识到这一点的 。

**Rio** [1:12:28]
对 ， 我我这个印象也特别深刻 。 我上大学的时候这一块 ， 我当时我读的这个 ， 当时好像学校分几个等级吧 ， 就是说我们是读的都是那种比较难 ，有一种是面向文科 ， 文科院系开的那个线性代数的课要稍微简单一点 ，但我们那个当时还算一个理科的一个院系嘛 ， 或者工程类的 ， 然后啊 ， 就就学的就很难啊 ，但是那个书就觉得觉得写的很史 ，

你通篇你翻完一看 ， 没有一个例子 ， 这个东西到底是干嘛用的 ， 然后全部都告诉你一些公式定理 ， 让你去证明怎么怎么样 ， 让你去变换 ， 然后就觉得啊 ，why why why am I doing all this？

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

**Rio** [1:13:07]
对吧 ，有那种感觉确实挺糟糕的 。

**吴涛** [1:13:10]
但是如果你能让我在第一节课里面就了解这个行列式 ， 或者说这个矩阵的变换 ， 可以在比如说写游戏的时候用到 。

**Rio** [1:13:19]
对啊对啊 ， 我也是在 。

**吴涛** [1:13:20]
举个例子 ， 那也许我可能我就会眼睛一亮 ， 然后开始拼命学这门课了 。

**Rio** [1:13:25]
对 ， 我也是后来在后来是其实在呃编程的时候做那个叫什么啊位图 ，不是叫向量图的那个构造的时候 ， 比如说向量图 ， 你要假设你有一个图形在一个二维的坐标系里面 ， 你要去变换它的形状 ， 对吧 ？

你要去改变它的位置 ， 然后你发现所有的这种操作都可以转换成一个矩阵运算 ， 你发现啊 ， 原来这个东西可以这么神奇的 ， 还可以叠加 ， 就是你可以通过矩阵运算的方法把各种一些什么你要先位移 ， 然后再翻转 ， 然后再扩大 ， 再放大或者再缩小的这种 ， 或者是拉伸或者是怎么样的一个变化 ， 你可以把它累加成一个一个所谓的什么一个什么特征矩阵之类

的玩意玩的玩意 ， 然后你再应用一次 ， 这样你就可以大大提高了这个这个什么那个编程的效率嘛 ， 然后你会发现哎 ， 它矩阵运算还可以并行 ， 就比如什么并发执行嘛 ， 叫做 single instruction multi data 这种方式来执行 ， 你发现啊 ， 原来这个东西这么的有用 ， 你的你的这种东西 ， 你就是在啊基础教育的时候觉得完全不会体会到的这种感受 。

**吴涛** [1:14:29]
没错 ，而且这个时候就更反映出来 ， 就是这些东西其实都可以用计算器完成啊 。

**Rio** [1:14:34]
哈哈哈 ， 没错啊啊 ， 所以其实一条一条的数对角线 。 对 ， 所以其实我就是很很多时候我在想啊 ， 现在我们这个技术和这个知识的进步这么的就是加速的呃膨胀嘛 ， 就整个知识体系也不断的就扩展 。

我就假设我以后教育小孩的时候 ， 会不会说还是按照这种我们以前接受教育的时候那种很愚蠢的模式在一步一步学 ， 还是说好像哎 ，不用学 ，不用花时间背那么多的这种什么四则运算啊 ， 或者是背那个乘法表之类的 ， 给你个计算器 ， 你先明白里面的原理 ， 然后之后你用用就好了 。

如果你原理记不清楚了 ， 然后说你回来再来去研究一下到底是为什么 ， 我觉得这样可能是一个更加有效的一个方法吧 。

**吴涛** [1:15:17]
没错 。

**Rio** [1:15:18]
或者说从某一个角度来讲 ，有一些我们过去觉得啊 ， 你必须要学会这个矩阵矩阵那些变换的一些基础的技巧 ， 或者导呃推导什么微积分的基础技巧 ， 你才能够做的事情 ，其实也不是特别必要 。

就说我们就好像我们现在写软件一样 ， 你不可能有一个任何一个程序员说啊 ， 我这个软件我从它的顶层应用到底层实践 ， 每一个细节我都知道的一清二楚 ， 我能够知道它是怎么去实践的 ， 中间你始终是有一些啊这个概念的这种啊误区 ， 最终是你是当做黑盒来处理的嘛 ， 你就记住它的能做什么样的事 ， 然后能实现什么样的功能 ， 至于

说它具体的内部的原理或者实现你不清楚 ，其实短期内影响也不是那么大 。

**吴涛** [1:16:02]
就等你真的有把它弄清楚的需要的时候 ， 再去弄清楚也不晚 。

**Rio** [1:16:07]
没错没错 ， 所以可能在面临这种知识爆炸的这么一个一个时代 ， 需要去缩短我们去啊能够学以致用的能力的这种这种方法 ， 可能很可能就是说啊 ， 我们过去觉得是一定要打牢基础的东西 ，其实也不一定非得在那个时候一一从从从底层一个一个往上学 ， 对吧 ？

就好像现在我觉得很多这种呃像 CS 的教育 ， 你也说你也很难说你真的会从汇编或者从机器语言一行一行的往上教着走 ， 对吧 ？

那可能他学到一半就已经丧失掉了全部的兴趣了 ， 那反而是说那我们来先从应用的角度出发 ， 哎 ， 我们来先写个简单的游戏吧 ， 然后告诉你一些你要为了达成这个游戏 ， 你要先学会啊 ， 这个怎么操作图像上的一些这个图形的 API， 你要怎么去操作一个啊呃结构 ， 把这个游戏表达出来 ， 然后至于说中间有没有什么算法 ， 可以以后一步一步再去学

吧 ， 就是一个叫什么 top down 的 approach， 你先学会呃零部件怎么样啊 ，不是先学会这个每一个模块怎么样 ， 然后再把模块拆拆成零部件 ， 然后直到这样无处反复 ， 直到拆成最后的不可再分的一个一个东西 ， 可能这是一个更好的抽象的方式 。

**吴涛** [1:17:21]
对 ， 就好像你不你不去弄明白化疗器是怎么运作的 ，也是可以骑摩托车的样子 。

**Rio** [1:17:26]
哈哈哈 ， 没错 ， 就是像我到现在为止我我学当时我学那个开车的时候 ， 我一个我叔叔他教我开车嘛 ， 然后就是说要先学一些什么什么化油器 ， 什么是什么啊 ， 发动机是怎么运转的 ，其实到现在为止我对发动机的工作原理就还是觉得很很神奇 ， 特别是看那个什么行星齿轮那些东西 ， 我觉得哇 ， 这个我脑子完全想不出来为什么会这样

，但是它它不影响你开这个车嘛 ， 对吧 ？ 所以我觉得可能对于很多人来说 ， 就除非你真的是学什么机械工程 ， 你要造一个车 ， 那你对于普通人来讲 ， 你学会开车可能也就够了 ，不是不一定真的要学会啊 ， 为什么为什么这个行星齿轮这个工作原理是怎么样 ， 怎么才能什么传动比又怎么怎么样那些东西 。

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

**Rio** [1:18:10]
OK。

**吴涛** [1:18:11]
OK， 我是怎么从 I Like Rabbits 好像扯的有点远 。 对 ， 好 ， 回到回到新闻环节 ， 我们居然还在新闻环节 ， 就是下条新闻是呃 Apple 买了一个公司 ， 嗯哼 ， 呃这个公司叫做 FoundationDB， 我好像还用过它的服务 ， 是一个在线的云存储 ， 呃不是云存储 ， 是一个在线服务 ，在线数据库提供商 。

### 苹果收购

**Rio** [1:18:41]
嗯哼 ， 所以其实这件事情还是挺好奇的 ， 我之前没有听说过这家公司 ， 你说你有用过他们 ， 你可以简单介绍一下他 ，他这是一个什么样的产品吗 ？

**吴涛** [1:18:53]
啊 ，其实就是一个 FoundationDB，其实就是一个在线的 data store， 你可以呃注册一个账户 ， 申请个 API， 然后它同时提供 NoSQL 和 SQL 呃数据库 。

**Rio** [1:19:06]
OK。

**吴涛** [1:19:06]
我我没有用过它的 SQL 服务 ， 然后它 NoSQL 服务就是一个它等于它给你一个网址 ， 然后你可以往这个网址上存数据 ， 然后你就可以使用这个网址作为你的呃应用程序的后台 ， 然后的数据仓库 ， 然后往里面存东西或者取东西 ， 然后一直很稳定啊 ， 呃没有什么 bug 啊之类的 ， 就我用过很多很多年时间 ，因为我其实也没有什么具体切实的需求需要用到它 。

**Rio** [1:19:30]
嗯 ，他们不是说有一个什么可以下载回来在自己机器上用的 ， 就不一定是一个网络服务吧 ？

**吴涛** [1:19:36]
那我还真没用过 。

**Rio** [1:19:37]
OK， 呃 ， 然后我就大概去看了一下他的报道 ，因为我之前没有听说或者接触过这个产品 ， 就是我看他的报道就说他的这个卖点是说他的性能很好 ， 就是特别是写入的性能非常非常的惊人， 好像是比同类产品要高 ，有有数量级的提高吧 ， 好像是 。

**吴涛** [1:19:57]
听起来和 B 公司相似 。

**Rio** [1:20:00]
什么情况 ？

**吴涛** [1:20:01]
Anyway， 就是其实我我我想说的就是苹果的公司买这个公司的动机是想要提供更好的云端服务嘛 。

**Rio** [1:20:13]
这个不奇怪 ， 我们不是老吐槽苹果云端服务不好吗 ？ 那他如果自己短期内不能呃原生的研发出呃靠谱的服务 ， 那买这种系统上现有的靠谱的服务也可以啊 ， 挺好的 ， 所以这是一个 Aqua hire 嘛 。

**吴涛** [1:20:30]
OK。

**Rio** [1:20:31]
然后我看到那个 Hacker News 上面很多人是对这个吐槽 ， 就是说啊 ，因为他之前是有一个 ，他不是他是闭源的产品 ，但是他有一个免费的可以试用的版本嘛 ， 我记得然后很多人说就拿回去之前用这个 FoundationDB 做了产品 ， 然后现在苹果把它这家公司买下来之后就不再提供下载了 ， 当然也可以想见以后也不会有按照苹果一贯的调性 ，他买了之后是肯定不会把这

个东西拿出来给大家免费的用的 ， 所以就变成苹果私有的一个技术了 。 那之前买了这个产品或者是用了这个服务 ， 然后构建了自己产品的人， 现在就得想怎么去赶快转型吧 ， 这个是一个挺头大的一个事情吧 ， 就是 。

**吴涛** [1:21:16]
嗯 ， 我觉得不一定哎 。

**Rio** [1:21:19]
啊 ？

**吴涛** [1:21:20]
你觉得苹果会苹果是这样调性的吗 ？

**Rio** [1:21:24]
你看他买过什么样的服务 ，他最终会开放给 。

**吴涛** [1:21:28]
可是之前基本上都是 ， 比如说 TestFlight，TestFlight 就当然 TestFlight 不是一个很好的案例 。

**Rio** [1:21:37]
对啊 ，TestFlight 现在不就只能在 iOS 上面用了吗 ？

**吴涛** [1:21:40]
可 TestFlight 之前也只能在 iOS 上用 。

**Rio** [1:21:43]
它不是 Android 吗 ？

**吴涛** [1:21:43]
TestFlight 有 Android 版 。

**Rio** [1:21:44]
OK， 对对对 ， 所以所以其实还是会有一些问题的 ，但你从这个商业的角度上讲 ， 这样无可厚非 ， 对啊 ， 只要你要用一个啊没有自己稳健的盈利能力或者盈利历史的独立的公司 ， 要用一个什么小公司的啊创业团队的做的东西 ， 那就是会有这么一下这种状况啊 ， 没有办法 。

**吴涛** [1:22:08]
嗯 ， 说的也是 。

**Rio** [1:22:09]
所以 。

**吴涛** [1:22:10]
之前倒是从来没有想过这个 。

**Rio** [1:22:11]
就这也是一个教训吧 ， 就是说你做一个创业公司也好 ， 如果你的这个某一样的技术对你来说很重要 ， 你要确保要不你用的是一个很成熟而开放的一个技术 ， 就不会出现啊 ， 怎么某一个呃公司收购之后， 你这个东西就以后再也没法用了 ， 这种比较尴尬的局面嘛 。

**吴涛** [1:22:33]
嗯 ，但是反过来也有一个 argument， 就是前公司的前公司在决定某一个

项目的技术的时候会说呃 ， 如果可以选择的话 ， 尽量选择那些背后有个公司在支持的闭源产品 ，不啊 ， 可能没有说闭源产品 ， 就是说至少公司不 ，他这个产品背后有公司在支持 ， 这样你出了问题的时候 ， 你可以呃用钱解决问题 ， 能用钱解决的问题都是小问题 ， 就是基本上是这样一个理念 ， 就是因为如果你使用一些开源产品的话 ，有可能一 ， 你必须自己投入

很多时间去解决一个可能非常 critical 的问题 。

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

**吴涛** [1:23:16]
二 ，也许这个开源社区渐渐就黄了 。

**Rio** [1:23:19]
所以他现在就说要找那种 ， 就刚才讲你你那个是一种模式嘛 ， 或现在很多这种开源的技术 ， 它也是走的这么一种方式 ， 就是 。

**吴涛** [1:23:28]
开源加服务 。

**Rio** [1:23:29]
对 ， 开源 ， 就是产品 ， 这个技术产品可能最核心的就就起码大部分是开源的 ， 就你可以拿一个免费版本自己回去导成自己用 ，但同他同时呢也买这个付费咨询的服务 ， 就如果你有遇到什么实际的问题自己解决不了了 ， 那你可以付费给这个公司做 ，他们会因为他们是这个这个开源项目的主要的开发者 ， 然后他们对这个也有很更深刻的了解 ， 那么他

能够帮你去解决你自己在短时间没有办法自己解决的问题 ， 这也是一个很好的方案啊 。 啊 ，但问题就是说这个时候你还是得小心 ， 你要去选那种不会被突然被收购掉的这种公司 ， 那像 FoundationDB 这个很不幸就不属于这个这个类型 ， 那之前用的人现在就可能就这现在就自认倒霉了呗 。

**吴涛** [1:24:14]
哎 。 好吧 。

**Rio** [1:24:17]
OK。

### 类型系统

**吴涛** [1:24:18]
呃 ， 今天我们终于要进入正题了 ， 已经说了一个半小时 。 呃 ， 今天的正题就是噔噔噔噔类型系统 。

**Rio** [1:24:28]
嗯哼 。

**吴涛** [1:24:29]
此处加入回音若干 ， 类型系统系统系统 。

**Rio** [1:24:32]
哈哈哈 ， 你这个自带回音 。

**吴涛** [1:24:35]
呃 ， 对 ， 我我其实这个这个主主题呃 ， 我必须承认选的有点仓促 ，因为呃 ，因为我下周就要回国了 ， 所以没有很就我们录这一期跟录上一期其实没有隔几天 ， 就是没有非常充裕的时间来准备这件事情 。

我只能说这个这个话题其实是我呃隐隐约约已经想了有一阵子的 ， 就是有时候我经常会想要跟我 ，而且我已经跟一些人聊过了这些事情 。

**Rio** [1:25:05]
OK。

**吴涛** [1:25:05]
嗯 ，但是我觉得类型系统其实是一个很少被人提起来 ， 至少在程序员圈子里面 ， 你会觉得它是一个天经地义 ， 就像吃饭睡觉一样正常的存在 ，但是却很容易成为一个学习编程过程之中绊脚石 ， 或者说屋子里面的大象一样的这样一个问题 ， 就是明它明明就在那 ，但是很少有人讨论它 。

**Rio** [1:25:35]
没错 。

**吴涛** [1:25:36]
呃 ， 你你说没错什么意思 ？ 你被类型系统折磨过吗 ？

**Rio** [1:25:40]
我觉得至少你任何一个 ， 就起码你像在学这种所谓的强类型的语言 ， 像什么 Java 呀之类的时候 ， 很多人都会被这个折腾过吧 ， 哎 ， 这个什么这个类这个变量的声明的类型又不对了 ， 或者说包括很多现在不是很多语言在搞那种就类型推导嘛 ， 就是你不用显示的声明很多地方的语言 。

但是呢 ， 对他这这个这个 compiler 编译器 ， 它会帮你在编译的时候去推导出你那些东西的哪些应该是哪些类型的 ， 如果他推导不出来 ， 那么他就会报错 ， 这个时候你才改啊 ， 想想为什么会报错 ， 想哎 ， 这个是不是我想错了 ， 还是怎么样 ， 然后包括在日常工生就日常的使用中， 我们用了很多这种所谓的啊动态类型的语言 ， 那就就坑就

更多了 ， 你可能指望着写了一个函数 ， 指望着传两个参数进来 ， 都是一个是一个是整数 ， 一个是浮点数 ， 然后这边突然突然传两个字符串过来 ， 你怎么办 ， 对吧 ？

所以其实在现实中还是要就很大很大程度上是要跟这个类型系统搏斗的 。

**吴涛** [1:26:44]
对啊 ，其实其实你刚才描述这些问题 ， 我我想说的就是你仍旧在把它当做一个司空见惯的东西来处理 ， 就是你知道它在哪 ， 你知道你要跟它打交道 ，而我想说的是 ， 就是我我之所以会产生这样对这个话题产生兴趣 ，是因为我呃想起了一件事情 ， 就是因为因为我学编程很早嘛 ， 就是从呃 。

**Rio** [1:27:11]
嗯嗯 ， 此处加入年龄梗 。

**吴涛** [1:27:13]
OK， 我就不透露自己年龄了 。Anyway， 就是我在上大学的时候啊 ， 呃 ， 教我的同学一些就是编程的基本概念 ， 我发现比如说一个非常简单的事情 ， 就是字符串这个东西 。

**Rio** [1:27:30]
嗯哼 。

**吴涛** [1:27:31]
你需要跟它解释很久 ， 就是一个没有受过编程 ， 一个没有写过程序的人。

**Rio** [1:27:39]
嗯哼 。

**吴涛** [1:27:40]
很有可能不明白为什么一个一个数字 ， 比如说一个数字呃 2 吧 ， 数字 2 为什么单独写出来和写在两个引号之间的时候 ， 差别就是这么大的 。

对 ， 就是对于一个正常人来说 ， 对于一个不写程序的人来说 ， 你把一个数字 2 写在一张纸上， 你指着你对他说 ， 或者说你从一个程序员的角度讲 ， 请问这个数字是整形的还是还是字符类型的 ， 你说的出来吗 ？

你说不出来 。 但但是为什么突然学编程的时候 ， 这件事情就一下子变得这么重要 ， 就是为什么我不加引号的 2， 对于计算机来说就是 10，而而加了双引号的 2， 对于计算机来说就是

2 的 2 的 ASCII 码是多少 ？

**Rio** [1:28:42]
呃 。

**吴涛** [1:28:42]
我想 0 是 48，2 是 50。

**Rio** [1:28:46]
50。

**吴涛** [1:28:46]
为为什么加上双引号之后它就变成 50 了 ？ 就是在对于对于当时学 C 语言的同学来说 ， 为为什么这件事情

是是很难一时用一眼用枝言半语解释清楚的 ， 就是为什么我们在写程序的时候就要产生这样的差别呢 ？

**Rio** [1:29:05]
嗯哼 。

**吴涛** [1:29:06]
我觉得这是一个这是一个很有可能折磨一些人的问题 ， 所以呃 ， 我还是我我我想要从这个从这一点上说开始 。

**Rio** [1:29:17]
OK。

**吴涛** [1:29:18]
大概就是这样一个话题的来源 ， 就是我我觉得就是我想要解释清楚的一件事情 ， 就是为什么计算机要有类型系统 ， 为什么我们作为程序员 ， 作为一个呃 ， 作为一个介于完全不需要理会类型系统的人和完全不知道什么是类型系统的计算机之间的这么一个中间人， 会一定要跟类型系统天天打交道 ， 然后把自己折磨得痛不欲生的 ，

对吧 ？OK， 嗯

， 什么是类型系统 ？ 呃 ， 我刚才说了 ， 比如说一个数字 2，在不加引号的时候 ， 它是一个它是一个数字类型 ，而加了引号之后， 它变成了一个字符类型 。

呃 ， 那么字符类型和数字类型的差别是什么呢 ？ 就是字符类型和数字类型在计算机上的存储方式是不一样的 。

比如说我刚才举的那个例子 ，2 被两个引号引起来的时候 ， 它的实际的数值是 50， 这是一个什么意思呢 ？

就是如果你因为我们知道计算机只能处理数字 ， 那么你就必须存在这样一种映射关系 ， 告诉他们这些数字所代表的意义跟那些数字代表的意义是完全不一样的 。

**Rio** [1:30:52]
嗯哼 。

**吴涛** [1:30:53]
比如说呃 ， 一个数一个类型系统在这里面给我们带来的意义就是 ， 我们可以以一种用我们的大脑能够理解的方式去组织计算机里面的纯数字的世界 ， 同时让这个世界跟我们所要处理的实际问题有所关联 。

**Rio** [1:31:13]
嗯哼 ， 所以其实从这个意义上来讲 ， 类型系统简单的做了一件呃有用的事情 ， 就是它告诉我们规定了一个数字和我们要表达的那个符号也好 ， 呃 ， 或者其他一些什么类型的数据也好 ，他们之间的一种映射关系嘛 。

**吴涛** [1:31:33]
对 ， 就是我们可以说 ， 比如说最简单的就是呃 ， 这 8 个比特组成的这一个 byte。

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

**吴涛** [1:31:41]
呃 ， 这个字节所代表的是一个数字 ，而另外一个比特所代表 ， 或者另外 1,000 个比特所代表的是一个 ， 比如说餐馆的预订信息 ， 或者是一张美女图 。

**Rio** [1:31:58]
嗯哼 。

**吴涛** [1:31:58]
美女图可能几百个 byte 是存不下的 ，不过呃 ，you see my point。 对 ， 所以嗯 ， 我们可以说

有了这样的一个类型系统 ， 我们就可以更好的思考 ， 同时又可以让计算机把我们的思考转换成为相应的数字处理问题来加以处理 。

**Rio** [1:32:26]
嗯哼 。

**吴涛** [1:32:27]
然后加入了类型系统之后， 它就可以让我们在使用计算机的时候使用用一种类似于人类那种类更接近更接近人类的方式去思考 ， 同时又可以避免一些错误 。

就是呃 ， 我记得维基百科的那个 Type system 的词条上面 ， 大概是第二句还是第三句 ， 就说类型系统存在的主要原因之一就是就是可以帮助人们排除一些 bug。

**Rio** [1:32:59]
嗯哼 。

**吴涛** [1:33:00]
对 ，但是就其实反例也是存在的 ， 就是因为类型系统的存在 ， 我们也会面临一些同样是在普通人在不会写程序的人看来会比较难以理解的问题 。

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

**吴涛** [1:33:18]
比如

比如为什么

会有千年虫问题 ， 我知道 。

**Rio** [1:33:27]
这是一个挺好的问题 。

**吴涛** [1:33:28]
这有一个这又这又是一个暴露年龄的 ， 就是可能我相信也许我们会不会有 2000 年之后出生的听众 。

**Rio** [1:33:38]
呃 ， 现在就 15 岁可能会有哎 。

**吴涛** [1:33:43]
好吧 ， 对 ， 就假如你是在 2000 年之后出生 ，并且在听我的节目的话 ， 你可能不会想到在上世纪就在你出生之前的几年， 人类曾经有过一场

类似于现在你看什么僵尸片或者是核战争爆发之后的景象的这么一种这么一种恐慌感 ， 就好像彗彗星要撞地球了 。

**Rio** [1:34:09]
嗯 。

**吴涛** [1:34:09]
说嗯 ， 我们的计算机系统有一个非常大的设计缺陷 ， 就是在上世纪发明计算机的时候 ， 呃 ， 人们写年份只写后两位 。

**Rio** [1:34:24]
就是 19XX19991910。

**吴涛** [1:34:27]
很难想象吧 ， 对 ， 很难想象吧 。 但是那个时候我们就是这么做的 ， 就是比如说我是 1983 年出生的 ， 我又暴露年龄 ，而且这么直接 ， 就我我我基本上就只写 83， 然后那个时候出的日历上面都写 89。

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

**吴涛** [1:34:43]
呃 ，6 月 3 日后的一天 ， 诸如此类的 。 然后呃 ，而计算机发明的那个时代 ， 人们觉得哎呀 ， 干嘛要存四位数的年份呢 ？

对吧 ， 既然大家都只说了 。

**Rio** [1:34:57]
反正开头都是 19 多少 ， 对吧 ？

**吴涛** [1:34:59]
对啊 ， 那就存两位数吧 。 而且计算机内存很贵啊 ， 能省两能省两个比特就省两个比特 。

**Rio** [1:35:05]
嗯哼 。

**吴涛** [1:35:05]
结果大概在 。

**Rio** [1:35:07]
两个 byte。

**吴涛** [1:35:08]
千年虫 。

**Rio** [1:35:08]
这里应该要啊 ， 等一下， 它不是以这个 ， 对 ， 它是以两个 byte， 它是用字符串的形式这样 。

**吴涛** [1:35:14]
它是 char 类型嘛 ， 对吧 ？

**Rio** [1:35:16]
对对 。

**吴涛** [1:35:17]
然后那时候就说哎呀 ， 能省两个字就省两个字元 ， 然后但就只存两位数 。 然后在 90 年代 ， 千年虫最严重的时候是 95 年， 就是最在至少在舆论上面 ，在媒体上面闹得最凶的年份 。

**Rio** [1:35:33]
应该是 99 嘛 。

**吴涛** [1:35:35]
不是 99，99 年的时候人们已经预见到就是这个问题没有那么严重 。

**Rio** [1:35:39]
OK。

**吴涛** [1:35:40]
就但是在 9293 年的时候 ， 我印象里面千年虫吵得特别凶 ， 就说 2,000 年的时候飞机飞着航道就掉下来了 ， 或者是银行你的存款全都变废纸了 。

**Rio** [1:35:51]
嗯哼 。

**吴涛** [1:35:51]
或者是 。

**Rio** [1:35:52]
我当时有很多这种什么啊 ， 什么末世预言嘛 ， 就是因为啊 ， 这种是因为千年虫导致的 。

**吴涛** [1:35:58]
对 ， 就说我们现在的人类系统已经如此深深的依赖于计算机 ， 呃 ， 这个问题一旦爆发的时候 ， 人类社会对于人类社会的打击是毁灭性的 。

然后这个问题具体就是这个问题其实发酵起来的状况其实也很简单 ， 就是有些计算机 ， 就如果你的计算机只用两位数来储存年份的话 ， 到 2000 年的时候 ， 你你的年份会从 99 变成 00， 然后系统会出一些 ， 对 ， 系统会出一些问题 ， 系统会认为 ， 比如说你这个人明明只有呃 ，

呃 ， 明明才刚出生 ， 然后系统认为你已经是一个几百岁了 ， 快 100 岁的老人， 这样这样的事情出现 。

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

**吴涛** [1:36:44]
或者是嗯 ， 对 ， 一直想我一直想举不出来例子 ， 就是很难想象那个时候人们会因为 。

**Rio** [1:36:51]
就计算年龄嘛 ， 比如说我们常见 ， 你比如你 83 年出生 ， 我们 93 年的时候计算就 93-83， 哎 ， 你今年 10 岁 ， 对吧 ？

但是如果你的那个到了 2,000 年的时候 ， 你发现哎 ， 这个清零了 ， 然后这个就是 00-83 变成了一个负数 。

**吴涛** [1:37:09]
对 ， 就还有什么 ， 当时我记得还有什么说什么核武器的那个倒计时也是会受到千年虫的影响 ， 然后千年虫一旦发作的时候 ， 核武器说哎呦 ， 怎么着 ， 回到解放前了 ， 赶紧射核弹 。

**Rio** [1:37:23]
原始手 。

**吴涛** [1:37:24]
对 ， 就把核弹发射出去 ， 诸如此类 ， 很可笑的一些预言 。 但事实上证明 ，因为可能也是因为发现的早 ， 或者说呃 ， 人们有所预警 ， 所以实际上千年虫的问题可能个别有发生 ，但基本上没有任何影响对于人类社会的正常运作来说 。

绝大部分呃 ， 可能遭到影响的机构都已经及时为其呃做出了调整 ， 比如说银行系统呀 ， 或者航空系统呀 ， 嗯 ， 基本上没有人受到影响 。

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

**吴涛** [1:38:01]
还是说我错过了什么非常严重的千年虫灾害 ？ 没有吧 ？

**Rio** [1:38:05]
嗯 ， 应该是没有的 ， 就我们起码平安的度过了 2,000 年， 然后皮癣没有 ， 对吧 ？

**吴涛** [1:38:11]
对 ，而千年虫问题实际上就是某种意义上的一个类型系统导致的问题 。

**Rio** [1:38:19]
没错 ， 那个类型就是代表啊 ， 年份的这个类型设计的太太窄了 。

**吴涛** [1:38:26]
对对 ， 如果那个时候能把年份设成四个比特 ， 呃 ， 四个呃字节的话 ，也许就不会有这个问题 。

**Rio** [1:38:34]
没错 。

**吴涛** [1:38:36]
但是反过来说 ， 呃 ， 你会说那为什么要用一个字符串来存时间 ？ 字符串来代表时间的不是很麻烦吗 ？

对 ，有些人就是不用字符串来代表时间 ，但是他会遇到其他的问题 ， 比如说呃 ， 知名的另外一个知名的问题 ， 对 ，2038 问题 。

**Rio** [1:38:58]
嗯 。

**吴涛** [1:38:59]
嗯 ， 就是我们现在使用的 32 位系统 ， 操作系统会会用一个 32 位的整数 ，32 位的二进制数来放 ， 来存放一个年年份 ， 来存放一个时间 。

**Rio** [1:39:12]
对 ， 这个时间就开始我们节目开始的时候报的那个时间 ， 叫做 Unix time。

**吴涛** [1:39:17]
对 。

**Rio** [1:39:17]
它的定义是从 1970 年 1 月 1 日， 这个格林威治时间的 00:00 开始 ， 从那一刻起到现在为止 ， 一共经过了多少秒 ？

**吴涛** [1:39:30]
呃 ，不确切 ， 就不算闰秒的话 ， 经过了多少秒 ？

**Rio** [1:39:35]
对 ， 那个闰秒也是经过了多少秒嘛 ， 它这个并不规定 ， 就它跟日历的关系没有没有直接的关系 。

**吴涛** [1:39:42]
哎 ， 我怎么记得它会跳一下呢 ？

**Rio** [1:39:44]
对 ， 它是会跳的 ，但是就说它就是你要从这个换算成日历的时间 ，是要考虑闰年、 闰秒那些东西的嘛 。

但是这个时间本身是一个相对来说是一个啊 ， 就是它是一个 diff， 就是跟那一刻的一个差值 ， 对吧 ？ 就我们理想模型下应该是这样子 。

**吴涛** [1:40:02]
对 ， 我但我我的意思是这个差值并不是很短 ， 嗯 ，unique 就是它并不是唯一的 ， 就是有有些在闰秒那些的时刻 ， 实际上有可能会代表前 ， 就是两个日期里面的两个时间 。

**Rio** [1:40:18]
不 ， 你你应该是反的 ， 就它它这个时间对应的日历上的时间可能不止一个 ， 就是呃 ， 就以某一个这个 Unix time 的秒数 ， 它反射反算回去的日历上的时间 ， 可能对应的不是你想象的那么一对一的关系 。

**吴涛** [1:40:34]
没错 。

**Rio** [1:40:35]
OK。

**吴涛** [1:40:35]
Anyway， 呃 ， 又跑题了 。 重点就是说 ， 如果用 32 位的一个整数 ， 二进制整数来存放秒数的话 ， 那么到 2038 年 1 月 19 日 3:14:07， 呃 ，32 位的系统上面的时间会全都变成 1， 然后下一秒就会全都变成 0。

**Rio** [1:41:02]
嗯哼 。

**吴涛** [1:41:03]
所以在这个时候系统就系统就疯了 。

**Rio** [1:41:06]
就就 。

**吴涛** [1:41:07]
那我会说啊 ， 我又回到 1970 年了 。

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

**吴涛** [1:41:11]
对啊 ， 这就是我们紧接着要面对的下一个因为类型系统而引入的一个人为的限制 ， 或者说一个一个一个从某种意义上讲是一个 bug 的问题 。

**Rio** [1:41:22]
不过还早呢 ， 现在还有 38 年嘛 ， 就是 15 年， 还有 23 年的时间 。

**吴涛** [1:41:28]
对 ， 我们就像 1970 年发明计算机那些人一样 ， 就或者说推广计算机的人一样 ， 呃 ， 说哎呀 ， 反正还早 ， 离 2,000 年还早 。

**Rio** [1:41:37]
谁管 ， 到时候再说嘛 。

**吴涛** [1:41:39]
船到桥头自然直 ， 肯定会有人采取措施的 。

**Rio** [1:41:43]
反正到时候那个要修这个 bug 的人又不是我 ， 管他呢 。

**吴涛** [1:41:47]
对 ，make sense。 我相信 32 位系统到 2038 年应该还是会继续再大量使用的 。

**Rio** [1:41:53]
应该会吧 ， 特别是那些什么小小的那种微型的设备里面 ， 可能还是会有这种考虑低功耗的时候 。

**吴涛** [1:42:01]
对 。

**Rio** [1:42:02]
甚至可能还有 16 位的系统 ， 你知道吗 ？ 现在还有很多这种 。

**吴涛** [1:42:04]
对 ，16 位的系统到现在还是大行其道啊 。

**Rio** [1:42:08]
对啊 。

**吴涛** [1:42:12]
Anyway， 然后嗯 ，而且而且据说早期的 Unix 系统甚至是就是有一个呃 ，他们的那个时钟震荡器 ， 就是每一秒钟震荡 60 次 ， 就震荡频率是 60Hz， 然后他们用一个 32 位的二进制整数来存放这个 Hz 震动的频率 ， 就是说它这用这个数来算 ， 呃 ， 已经过去了多少个 1/60 秒 ， 然后这种系统上系统时间两年多一点就要重置一次 。

**Rio** [1:42:47]
这不就很多单片机就这样做这种样子的吗 ？ 我记得现在好像很多还是这样子 。

**吴涛** [1:42:52]
单片机里面放时间的 。

**Rio** [1:42:58]
对啊 ， 就是它那个它自己那个时间发生器只能存一个精度比较啊 ， 然后它整个这个硬件限制嘛 ， 它就只能这样 。

**吴涛** [1:43:08]
OK，但是它 OK， 好吧 ，但它存的其实不是年份 ， 它只是存一个就是已经震荡了多少次 ， 它并并不是跟时间相关 。

**Rio** [1:43:17]
相对自己的一个时间 。

**吴涛** [1:43:18]
一个计数器 ， 计数器一出 OK。

**Rio** [1:43:21]
嗯哼 。

**吴涛** [1:43:22]
嗯 ，

对 ， 诸如此类的 bug 其实还是有一些的 ， 就是 Wikipedia 上有个列表叫做 Time Formatting and Storage Bugs， 啊 ， 然后大家可以我们会把这个链接放在 shownotes 里面 ， 大家去看一看 ， 就是诸如此类的一些问题还是不能说层层出不穷 ，但绝对不是孤立 ， 就是这就是人们引入类型系统之后所产生的一个副作用 。

**Rio** [1:43:50]
没错 。

**吴涛** [1:43:51]
然后还有一个比较重大的问题 ， 或者说一个同样会让初学者感到困扰的问题 ， 嗯 ， 就是浮点数的问题 。

**Rio** [1:44:05]
啊 ， 这个我觉得很多人都不理解这个原理吧 ， 包括我到现在我对它原理还是就是属于一知半解的状态 。

### 浮点数

**吴涛** [1:44:12]
对 ， 我只能当遇到这个问题的时候 。

**Rio** [1:44:15]
再去查这个 manual。

**吴涛** [1:44:16]
大声喊一声 ， 大声喊一声是 IE1754， 哈哈哈 。

**Rio** [1:44:22]
再再去看它的那个是那个标准规范怎么样子 。

**吴涛** [1:44:26]
对 ， 所以呃 ， 浮点数的最大问最大的问题 ， 或者说其具体表现是什么呢 ？ 就是呃 。

**Rio** [1:44:35]
正 0 和负 0。

**吴涛** [1:44:37]
呃 ， 这倒不是重要的 ， 就是在有些情况之下， 比如说 0.3 加上 0.1。

**Rio** [1:44:48]
啊 ， 对 ， 它不能 。

**吴涛** [1:44:50]
会得到一个 0.400000000001 之类这样一个数 。

**Rio** [1:44:59]
对 ， 它不能精确的表示一些运算 。

**吴涛** [1:45:03]
对 ， 就是在某些时候 ， 没错 ，在某些时候你你们对于二进制数来说 ， 呃 ，有些数字是可以被精确表示 ，而有另外一些不能 ， 比如说嗯 ，以二进制数的 0.1 来说 ，0.1 代表的其实是 1/2， 然后 0.01 代表的其实是 1/4， 所以 1/2 和 1/4，也就是 0.5 和 0.25 都是可以被精确表示的 ，但是介于两者之间的一个数字就很难被表示 。

**Rio** [1:45:35]
对 ， 只能只能用这个在精度允许的范围内尽量去逼近它吧 。

**吴涛** [1:45:43]
没错 ，而我们刚才说到的这个 IE1754 标准呢 ， 它所规定的就是假如我有一个 32 位或者是 64 位的二进制数 ， 我应该怎么样用它来代表一个带有小数位数的浮点数 。

**Rio** [1:46:02]
嗯哼 。

**吴涛** [1:46:04]
对 ， 然后它规定的内容就是 ， 比如说嗯 ， 首先如果我是一个 32 位的二进制数的话 ， 我最左的那边 ， 最左的那一位是叫做呃 sign bit， 如果它是 0 的话 ， 整个数字就是一个正数 ， 如果它是 1 的话 ， 整个数字就是一个负数 ， 然后接下来的 8 位呃 ， 代表整个数字的指数 ， 呃 ，也就是说这个 8 位所代表的就是如果大家用用科学技术法来写的话 ， 它所

代表的是 10 的多少次方 ， 科学计算法上面科学对 10 的多少次方那个方次 。

**Rio** [1:46:45]
嗯哼 。

**吴涛** [1:46:46]
而接下来的 23 个比特则是小数点后面的那些位数 。

**Rio** [1:46:52]
就所谓的叫做呃 ，有效数字部分 。

**吴涛** [1:46:55]
对 ， 嗯 ， 呃 ， 比如说

0.15625， 这是 Wikipedia 上举的一个数 ， 举的一个例子 ， 它的表示方式就是嗯 ， 符号位是 0， 然后呃 ， 位数 exponent 指数这一部分是 01， 我好像发了一个很长的 1。

**Rio** [1:47:19]
哈哈哈 。

**吴涛** [1:47:20]
Anyway， 它有 0，5 个 1， 然后两个 0， 然后接下来 23 位是 01， 然后后面是嗯 ，21 个 0。

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

**吴涛** [1:47:29]
然后 0.15625 这个数字就可以这样被精确的表示出来 ， 然后呃 ，64 位的时候呢 ， 基本上也是一样 ， 只不过指数位扩展到 11 位 ， 然后嗯 ， 小数位扩展到了 52 位 。

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

**吴涛** [1:47:44]
嗯 ， 然后这个规定所或者说这个规范所呃 ， 指定这样一种表示小数的方式 ，在许许多多的编程语言里面都被拿来用 ， 比如说 Java 有 ， 然后 C# 有 ， 呃 ，C 也有 ， 然后 JavaScript 也有 。

**Rio** [1:48:04]
嗯 。

**吴涛** [1:48:04]
嗯 ， 然后当你在作为一个编程初学者毫不知情的情况之下， 选择了使用这样一种的这样一种表示小数的方式来进行数学运算的时候 ， 往往就会产生这样或者那样的问题 ， 比如说你判断两个数相乘或者相加的结果是不是大于 ，是不是精确的等于另外一个数 ， 然后计算机总是说不等于 ，不等于 ，不等于 ， 然后你不知道为什么 。

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

**吴涛** [1:48:33]
这是一个很很坑的一件事情 。

**Rio** [1:48:35]
对 ，因为它这个就通常判断是否等于 ， 它是检查它的这个所谓的比特位嘛 ，是不是一样的 ， 对不对 ？

**吴涛** [1:48:43]
对 ， 然后这就导致了经常会有一些所谓呃 ， 学编程就是很多人都会说编程很容易啊之类的 ，但是却只口不提这些 ，其实是相当 dark corner 的一些非常容易把你绊倒的一些部分 。

呃 ， 这我觉得和浮点数相关的内容其实就是非常重要的陷阱之一 ， 然后网上流传一篇帖子叫做呃 ， 每关于浮点数 ， 每个程序员都需要知道的一些事情 ， 呃 ， 应该也是比较推荐大家看一看 ， 当然我已经不太记得里面写什么了 ，但基本上大意就是千万不要信任你所使用的类型系统 。

**Rio** [1:49:26]
嗯哼哼哼 。

**吴涛** [1:49:29]
对 ， 然后嗯

， 所以有一些编程语言也会试图说解决这个问题 ， 或者说绕过这个问题 ， 或者说至少说对于使用者来说 ， 把这个问题抽象掉 ， 就是让使用者不会去注意到底层其实有这么一个坑爹的东西的存在 ， 它直接就支持 ， 比如说嗯 ，decimal 类型 ， 我记得 decimal 是谁先提出来的 ，但是至少 C# 里面是有的 ， 现在我能想到的例子只有 C#， 就是它可以做任意精度的嗯 。

**Rio** [1:50:08]
啊 ， 十进制的运算 ， 对 。

**吴涛** [1:50:12]
可能也不是任意精度 ，但是是一个要比浮点数精度高得多的呃 ， 随意的浮点数运算 。

**Rio** [1:50:21]
嗯哼 。

**吴涛** [1:50:21]
呃 ，但其但代价也是比较大的 ， 就是你在使用 decimal 的时候 ，其性能会非常的差 ， 至少在那个时候是非常差 ， 就是呃 ， 我记得那时候读 MSDN 说提醒你说 ， 除非你在做 ， 除非你在金融领域 ， 否则请你不要用这个类 ，不要用这个类型 ，但我不知道现在是不是还是这样 ，因为现在应该已经改善很多了 。

**Rio** [1:50:44]
但还是绕不开这个问题 ，因为你像这种浮点数 ， 它可以在 CPU 里面有硬件级别的指令的支持 ， 对吧 ？

但是你要做这种就你自任意精度的数的表达的话 ， 你就只能通过软件去模拟了嘛 ， 这个时候的性能那可想而知了 ， 你传统加减乘除 ， 可能人家一两个指令就解决的问题 ， 你要化 ， 你要化为几十个或上百个指令 ， 然后还要循环判断分支之类的 ， 你就很麻烦 。

**吴涛** [1:51:14]
没错 ， 所以这也就从另外一个侧面说明了类型系统的一个重大的用途 ， 就是它可以帮助我们指导计算机去正确的使用资源 。

**Rio** [1:51:27]
嗯哼 。

**吴涛** [1:51:27]
呃 ， 比如说我们情知接下来要进行的这个运算 ， 比如说两个年份的相减 ， 它在 99% 到 99% 的可能性之下都不会超过四位数 ， 那我们为什么要使用一个

decimal 类型 ， 就是一个支持任意长度和任意大小的浮点类型来做这个运算呢 ， 对吧 ？

**Rio** [1:51:54]
嗯哼 。

**吴涛** [1:51:54]
所以我们在这种情况下就可以相对安全的使用一个短整数来存储 ，也就是一个 16 比特的二进制数来存储年份 ， 来存储年份之间的差异 ， 对吧 ？

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

**吴涛** [1:52:10]
嗯 ，但是这种情况也也却又不是一直成立的 ， 比如说嗯 ， 假如你的两个年份是用长整来存储的 ，而你偏偏要选择一个短整的数来存储它们之间的差异 ， 那可能对于性能又不是一个特别好的影响 ， 就是你反倒不如说好 ， 那我也把它们的差用一个长整数来存储好了 ， 这样在这样在具体做运算的时候 ，CPU 可能反而会去省一些力 ，因为每一个程每一个类型都

是一样的 。

**Rio** [1:52:48]
不用赚 。

**吴涛** [1:52:48]
就更懂得怎么去优化 ， 对 ， 所以嗯 ， 类型系统其实是一个非常相对来说复杂 ，但是又很少人会告诉你说这个东西一定要弄清楚的这么一套东西 。

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

**吴涛** [1:53:04]
对 ， 然后嗯 ， 还有什么 ？ 类型系统还曾经给我带来的困扰就是 ， 或者说让我思考的一些地方 ， 就是比如说在不同的语言里面 ， 对于不同类型之间的

数据是否应该相互转换 ，以及怎样相互转换的设计哲学上面也是不一样的 。

**Rio** [1:53:33]
对 ， 这个 type casting 是一个很大的一个问题哈 ，而且各有有很多这种不同的思路 ， 比如说我们常用的语言里面有个很坑爹的这个 JavaScript 的类型转换就非常的诡异 。

**吴涛** [1:53:48]
对 ， 我记得嗯 ，JavaScript 里面 ， 对 JavaScript 首先非常坑的一点就是字符串的连接和数字的相加都是用加号 。

**Rio** [1:54:04]
这个很多语言里面都是这样子的 ， 就是它通过这个运算符运算符重载嘛 ， 然后把这个叫做叫呃 string concatenation， 就字符串的拼接和这个数值运算的我们传统的加减乘除那个加 ，是用同一个这个这个这个十字十字符号这个来表达的嘛 ，但是在一般的那些语言里面呢 ， 你通常会报错 ，因为你你你用 5 一个数字加一个字符串什么意思呢 ？

这个定义是就是它所谓这个 semantic 是很不明朗的嘛 ，但是像 JavaScript 这种比较坑爹的语言呢 ， 它就会帮你自动来 ， 我帮你 ， 我很聪明呐 ， 我能猜出你在想什么啊 ， 你肯定是要把这个两个数字相加 ， 对吧 ？

那我先把这个啊 ， 这不对啊 ， 它先把这个数字变成一个字符串拼一起 ， 或者说是它先把这个字符串转化成一个数字 ， 再把这个结果这个求和的结果给你 ， 就这个其实有很多这种坑爹的变化在里面 。

**吴涛** [1:55:02]
没错 ， 就比如说 ，而且我觉得 JavaScript 更坑的一点是不仅仅是数字和字符串是这样的 。

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

**吴涛** [1:55:10]
在很多其他地方也是这样的 ， 比如说你给它一个矩阵 ， 它会把矩阵转换成嗯 。

**Rio** [1:55:19]
数字或者字符串来转 。

**吴涛** [1:55:21]
我想说 array， 对对 ， 呃 ， 一个数组 ， 它会把数组转换成字符串 ， 然后把字符串跟你的呃另外一个东西相相相拼接 ， 或者说你给它一个 object， 它也会把这个 object 转成一个数字或者是字符串来跟你加号前面的那个相拼接 ，而且这种拼接规则是不满足交换律的 ， 就是可能 A 加 B 是一种结果 ，B 加 A 是另外一种结果 ， 一切都是如此的不可预测 ， 呃 ，以至于网

上专门有做过一些非常搞笑的视频来嘲笑这种现象 。

**Rio** [1:55:55]
对 ， 所以你不能指望一个什么这两个星期里面设计出来的语言有一个很合理的类型系统 ， 对吧 ？ 这个是没有办法的 ，但我们可以回过头来看一下那些所谓正儿八经设计的语言的类型系统会是一个怎么样子的 。

**吴涛** [1:56:10]
但当然这件事情还有另外一种思路 ， 就是既然相加和字符串相连其实是两种操作 ， 那我为什么不干脆就设计两种操两种操作符给它们呢 ？

比如说 perl， 呃 ，perl 是用点 。

**Rio** [1:56:29]
嗯哼 。

**吴涛** [1:56:30]
呃 ，PHP 也是用点 。

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

**吴涛** [1:56:32]
Lua 是用点点 。

**Rio** [1:56:34]
对 。

**吴涛** [1:56:35]
就是你用点点才可以把两个字符串拼接起来 ，而你用加的时候 ， 呃 ，是只能算数的 。

**Rio** [1:56:42]
啊 ， 这个就是避免了这个操操作符重载的这个问题嘛 。

**吴涛** [1:56:46]
对 ，而且在这种情况之下， 你说它傻也好 ， 说它精明也好 ， 语言会更加有信心的去帮你做类型转换 ， 比如说你写 ， 至少在 perl 里我可以 100% 敢说在 perl 里面 ， 你如果写一个呃 ， 字符串的 3， 就是双引号 3 双引号 ， 加上一个字符串的 2 双引号 2 双引号 ， 最终的结果出来会是 5，因为 perl 如此聪明 ， 它猜到了你虽然给它两个字符串 ，但你实际想要做的是一

种加法 ，因为你使用了加这个符号 ， 对吧 ？

**Rio** [1:57:28]
嗯 。

**吴涛** [1:57:28]
但是在 JavaScript 里面 ， 你写一个字符串的 3， 再加一个字符串的 2， 你最终的结果肯定是 32， 就在这种情况之下， 就如果你可以分别使用两个不同操作符的话 ， 那么类型呃 ， 自动类型转换实际上有可能从中获得益处 ，但是可能获得益处也就仅限于此 。

**Rio** [1:57:55]
嗯 ， 我觉得可能很多人对这个事情的想法还是不太一样哈 ， 就说有几种思路起码我们看到 ， 就刚才你讲 ， 那么我们就避免操作符重载 ， 一个操作符就只做一件事情 ， 语义明确 ， 绝对不会出错 ， 对吧 ？

那它这样的坏处就是说你有些啊 ， 所谓约定俗俗成的东西可能就不是那么的呃 ， 直观了 ， 特别是有些人很喜欢写那个什么 DSL 的情况下嘛 ， 啊 ，domain specific language 的情况下， 那如果你不能重载这个运算符的话 ， 那它很多这种就看起来那个语言就会很丑

，但这就是两个不同的呃 ， 那种什么思潮吧 ， 我觉得这个也很难说哪个好哪个不好 ， 就是你就有时候你你是选择了语言 ， 你没有办法 ， 你只能接受这么一件事现实 。

**吴涛** [1:58:46]
没错 ， 就是呃 ， 比如说 Java 里面有一些操作其实明明应该用 ，也不能说明明 ， 就是其实是可以用呃 ， 一个单个的运算符来做的 ，但是它偏偏要写成一个方法 ， 比如说著名的点 Equals， 判断两个字符串相同要使用点 Equals，而不能使用等号 ， 呃 ， 然后 。

**Rio** [1:59:13]
它没有重载那个操作符嘛 ，其实它就就有有这个所谓的中间路线主义者嘛 ， 就是它并不是严格的说我们这个操作符不完全重载 ， 比如它里面好像是那个字符串的添加还是用加号吧 ， 我记得 。

**吴涛** [1:59:29]
现在是用加号 ， 对 。

**Rio** [1:59:30]
OK。

**吴涛** [1:59:30]
但是它相等就不用等号 。

**Rio** [1:59:32]
对 ， 它就没有 ， 就是是一个就是 mixed 这种两种思路都会有 ， 你就觉得很诡异 ， 你会觉得这个语言不不够 consistent。

**吴涛** [1:59:41]
对 ，而事实上就是这样一些和操和类型系统乃至于类型系统本身的存在 ， 呃 ， 会会深深的又又来了那个什么什么什么主因 ， 嗯 ， 所以实际上一种呃 ， 编程语言的类型系统乃至于和类型系统相关的这一系列 utilities 是会影响我们呃 ， 思考乃至于写程序的方式的 。

**Rio** [2:00:10]
没错 。

**吴涛** [2:00:10]
呃 ， 所以就是说如果你是一个 Java 程序员的话 ， 你把现实领域里面的一些问题转化成对应的 Java 程序的时候 ， 你因为你的思考会受到 Java 的类型系统的限制 ， 你所最终思考的过程乃至于你的路径都可能会跟一个类型系统和 Java 完全不一样的 ， 比如说嗯 ，Lisp 或者是 JavaScript 的程序员是完全不一样 。

**Rio** [2:00:39]
嗯哼 。

**吴涛** [2:00:41]
对 ， 嗯 ， 所以这就要这就涉及到了一个语言 ， 它对于类型系统的选择 ， 呃 ， 或者说它的设计哲学也是可以有所不同的 ， 比如说最常见的两个概念就是强类型和弱类型 ，strong type and weakly type， 啊 ，weak type，weak type， 对 ， 嗯 ， 对 ， 强类型其实就是说在这种语言里面 ， 呃 ， 一个类型

### 强弱类型

**吴涛** [2:01:18]
是比较容易或者说比较重要的 ，是比较容易一眼看出来的 ， 就是如果要一个比较直观的解释 ， 就是在这个类在这个语言里面 ， 你所写下来的每一行程序 ， 你所遇遇到的每个数据 ， 你都可以很直观的 ， 至少是在声明的时候看出来它是一个什么样的类型 ， 比如说呃 ，

哎 ，C++ 是一个强类型的语言 ， 我可以这么说吧 。

**Rio** [2:01:49]
嗯 。

**吴涛** [2:01:49]
而 C++ 是强类型的吧 。

**Rio** [2:01:53]
嗯 。

**吴涛** [2:01:53]
因为怎么说呢 ， 强类型和弱类型其实并不是一个非常没有一个非常科学的定义 ， 没有一个非常准确的定义说 。

**Rio** [2:02:01]
它只是一个相对的概念嘛 ， 我觉得 。

**吴涛** [2:02:03]
对 ， 只有一种语言是比较强类型的 ， 然后另外一种语言是比较弱类型的 。

**Rio** [2:02:08]
嗯哼 ，但是我们这个划分的依据是什么 ？ 这个肯定要搞清楚 。

**吴涛** [2:02:13]
在使用的时在声明对类型 ， 呃 ，在声明一个变量的时候 ， 需要写出这个变量的类型算是强类型的一种体现吗 ？

**Rio** [2:02:23]
嗯 ，不一定啊 ， 现在不是有类型推导了吗 ？ 有时候可以是被推导出来的 。

**吴涛** [2:02:30]
嗯 ， 带有类型推导的语言仍旧可能是强类型的语言 。

**Rio** [2:02:35]
对 ， 没错 。

**吴涛** [2:02:37]
嗯

， 那么我们可不可以从是否进行自动类型自动类型转换的角度来讨论 ？ 如果一种语言会非常严格的处理你所你所声明的数据类型 ，以及你在实际运行之中给它的数据类型 ， 呃 ， 我们就可以说它是一种强类型语言 ， 比如说 Haskell 会呃 ， 拒绝在一个接受

整数的函数上面 ， 呃 ， 处理一个浮点数的输入 ， 我们就可以说 Haskell 是一门强类型的语言 。

**Rio** [2:03:24]
嗯 ， 我觉得这个分这个分法可能是会明确更加清晰一点的一个标准 。

**吴涛** [2:03:29]
对 ，而像比如说 Lua 这种只有一个 number 类型的语言 ， 就是相对来说更弱类型的语言 。

**Rio** [2:03:39]
没错 。

**吴涛** [2:03:40]
然后像 JavaScript 这种语言更是弱的一大户 ， 就 。

**Rio** [2:03:46]
就弱鸡语言 。

**吴涛** [2:03:47]
对 ， 它会自动帮你呃 ， 做很多的类型转换 。

**Rio** [2:03:51]
而且不会报错 ， 就所以其实这里区分的一个标准就是说 ， 啊 ， 如果你的这个类型写的不是很严谨 ， 编译器会不会报错 ， 啊 ， 这个时候就可以来判断它是一个 。

**吴涛** [2:04:02]
乃至于是强类型还是弱类型 。

**Rio** [2:04:05]
对对 。

**吴涛** [2:04:05]
或者是更强更弱还是怎么样子 。 对 。

**Rio** [2:04:09]
就这这里有一个概念要解释一下， 就是为什么那那个类型自动转换会有什么问题 ， 刚刚才没有讲 。

**吴涛** [2:04:16]
自动类型转换会引入一些错误 ，而这些错误有时候有可能是致命性的 。

**Rio** [2:04:22]
对 ， 比如说最核心的一个问题就是说你要啊 ， 假设你要取刚才你那个那个年年份相减的问题 ， 就是很好的一个例子啊 ， 就是那你假假设你要用两你要求两个 64 位整数的差 ， 对吧 ？

但是如果你的存储的结果你的声明的时候只用了 32 位 ， 那很可能就会溢出 ， 得出的结果就是错误的 ， 比如说你用这个 64 位的最大值减掉 64 位的最小值 ， 它的那个差值就甚至会超过自己本身嘛 ， 对不对 ？

**吴涛** [2:04:51]
对 ，而且虽然你可以 argue 说如果这两个 64 位的程序 ， 就这两个 64 位的变量 ，其包含的值真的只是一个年份而已啊 ， 它它不可能超过 9999， 比如说 ， 或者说不会超过在我的有生之年它不会超过 20998。

**Rio** [2:05:11]
嗯哼 。

**吴涛** [2:05:12]
但是我反过来你可以说 you never know 就是 。

**Rio** [2:05:16]
对啊 ， 你要做什么考古或者你要做什么 。

**吴涛** [2:05:19]
对啊 。

**Rio** [2:05:20]
历史或者对未来的一些预测的时候 ， 你很难讲你会超过哪个值 ， 这个时候就要很小心的去选择那个呃 ， 数值的类型 ， 然后你要看你的这个编程 ， 这个就每一步执行的时候会可能哪些会会可能产生哪些啊类型错误 ， 比如说溢出啊 ， 或者就是主要就是溢出吧 ， 对 。

**吴涛** [2:05:41]
对 。

**Rio** [2:05:41]
嗯 。

**吴涛** [2:05:42]
而且嗯 ， 这种错误有 ，而且这种错误很可能是在你测试阶段很难发现的 ， 就是虽然说当程序员的一个必要条件就是你必须不停的去考虑一些边界条件 ，但是有时候你是你是会你的你的思想模型会导致了你认为这种边界条件根本就不是边界条件 ，而是不可能 ，不可能发生 ， 甚至就是不可能发生 ， 所以你不会在你的呃 ， 测试例子里面这么写 ，但实际上

最后它也许就是这么发生了 。

**Rio** [2:06:17]
嗯哼 。

**吴涛** [2:06:18]
嗯

， 与此类似的有一个问题就是有一些系统里面在上世纪七八十年代 ，有些系统里面会用 9999 来代替一个不合法或者是嗯 ， 还不知道确切日期的日期 。

**Rio** [2:06:39]
嗯 。

**吴涛** [2:06:40]
啊 ，有些人就会直接输入 9999， 然后到 99 年 9 月 9 日的那一天 ，有好多数字都变成了 9999， 然后在尤其是在一些转换的过程中， 呃 ， 试图把一个呃 ， 输入的数字转换成呃 ， 系统内在时间的时候 ， 很多程序都因此崩溃 ， 就是他们认为 9999 是一个错误的或者说不合理的年年呃 ，不合理的日期 ， 当然这个地方是因为它没有正确的区分日和年， 呃 ， 就是月日月和年

之间的界限而导致的 ，但是这也是一个就是你没有想到的一个 edge case。

**Rio** [2:07:18]
嗯 。

**吴涛** [2:07:19]
的例子 。 那所以强类型既然有好处的话 ， 那弱类型有没有好处 ？

**Rio** [2:07:25]
其实我觉得弱类型它不能就就它的好处 ， 我觉得可能要从一个角另外一个角度去看它 ， 就是说它可以让这个表达的让人表达的逻辑更清晰 ，因为你不用太考虑更多的细枝末节的问题 ， 你觉得哦 ， 这个在就是其实就是给了人这个程序员啊 ， 更多的这个容错的空间 ， 对吧 ？

你大概想这个是吧 ， 应该是个树吧 ，但具体是个什么树我也不去指定它 ， 到时候只要大部分时候运行的时候没问题就可以了 ，但其实从这个严谨和正确性的角度来讲 ， 我觉得弱类型是不好的 ， 就是它的语义对于机对于机器来说 ， 语义是一个很模糊的一个概念 ， 我觉得 。

**吴涛** [2:08:08]
嗯 ， 所以弱类型和强类型其实最大的区别就在于它到底是对机器更友善还是对人更友善 。

**Rio** [2:08:15]
对 ， 没错 ， 我觉得这个是很重要一个东西 ， 然后在实际使用的时候呢 ， 我觉得可能判断这个一个最主要的因素因这个一个一个相对来说比较明显的标志 ， 就是说有没有这个所谓隐式的类型转换嘛 ， 就是说假设你有两个呃 ， 树 ， 嗯 ， 假设你有一个 32 位的正整数 ，64 位的正整数 ， 你要加它 ， 这个编译器会不会报错 ， 这个时候可以是一个比较明显的强检

验它是强类型还是弱类型系统的一个标志 ， 就弱类型系统通常会允许你怎么改 ， 然后它大部分情况下也不会抱怨什么 ，但强类型系统它会一定告诉你说这里可能这里是一个你需要显式的做一下类型转换才可以 ， 编译器才不会就不逼逼你 ， 对吧 ？

**吴涛** [2:09:00]
对 。

**Rio** [2:09:01]
啊 ， 实际的使用中好像比如说我现在在在用的那个 Go 语言 ， 它就是一个非常强的 ， 它默认是不进行任何类型转换的 。

啊 ， 所以你要加两个不同长不同宽度 ， 甚至是不同就有一个所谓的无符号有符号的同样宽度的树 ， 它都是不不会自动帮你去做这个转换 ， 你要手工声明 ， 你要先把哪个树转换到哪个树 ， 你呃 ， 哪个类型转换到哪个类型之后， 两个类型一致之后你才可以做相应的操作 。

**吴涛** [2:09:29]
对 ，而比如说 C 语言就是介于两种之间的 ， 就是 C 语言里面大部分时候你是需要做强制类型转换的 。

**Rio** [2:09:37]
但是很多时候你也可以不做 。

**吴涛** [2:09:39]
很多时候你也可以不做 ， 比如说尤其是在数字相加或者是 。

**Rio** [2:09:45]
就主要是在不同不同类型的整形之间的这个四则运算的时候 ， 它可以让你模糊一点 。

**吴涛** [2:09:52]
它会对 ， 它会自动帮你提升到最合适的宽度 ， 或者或者说选择自动选择最宽的那一个 。

**Rio** [2:09:57]
嗯 。

**吴涛** [2:09:58]
来 。

**Rio** [2:09:58]
所以所以这个里面选择无非就是在我们叫做 verbose， 这个叫什么 ， 这个中文叫什么 verbose， 中文叫 。

**吴涛** [2:10:05]
啰嗦 。

**Rio** [2:10:06]
啰嗦和唠叨这个语系写起来是不是很麻烦 ， 看起来是不是觉得很多噪音的情况和呃 ， 和这个程序的正确性之间做一个取舍 ， 我觉得啊 ， 对于一些所谓系统级别的呃 ， 应用来讲 ， 我觉得强类型是一个更好的选择 ，但你说像那种什么脚本语言或者什么连你说什么 shell 脚本 ， 你写一次就扔了 ， 那你肯定是会心想你说那不要烦我那么多细节

， 我就加两个树 ， 别别逼逼 ， 就就是这么一个选择 。

**吴涛** [2:10:38]
但是很可惜的就是可能有些语言其设计初衷是让你拿来当脚本语言用的 ，但是最后阴差阳错成了一个业界重量级的工程语言 。

**Rio** [2:10:51]
JavaScript 就是这个例子 。

**吴涛** [2:10:53]
对 ， 或者 PHP， 就是类型系统其实是不敷使用的 ，但是就是弱到了不敷使用的地步 ，但是人们不得不捏着鼻子去用它 。

**Rio** [2:11:06]
没错 。

**吴涛** [2:11:08]
嗯 ， 所以强类型弱类型是相对来说比较怎么说呢 ， 比较一个一个比较主观或者说比较随意的判断标准 。

### 动静态

**Rio** [2:11:17]
嗯 。

**吴涛** [2:11:17]
但是反过来呃 ， 接下来要说的动态类型和静态类型的区分就比较有一个明显的界限了 ， 虽然也并不是百分之百 ，但至少我们的界限是比较就是至少标志是比较清晰的 。

**Rio** [2:11:32]
没错 。

**吴涛** [2:11:33]
嗯 ， 所以嗯 ， 什么是动态类型呢 ？ 动态类型就是呃 ， 如果说错的话一定要纠正我 ， 动态类型也就是意味着我有一个名字 ， 然后我有一样东西 ， 我把这个名字也就是变量名。

**Rio** [2:11:53]
嗯哼 。

**吴涛** [2:11:54]
加到这个东西上面 ， 说这样东西有这个名字 ， 那么如果我对名字的类型有所限制 ， 那我就可以说它是一门它是一种静态类型 ，也就是说嗯 ， 类型这个属性是归于名字的 ， 同时也要归于物物品 ，但是如果在这个过程之中只有被指明的那样东西有类型 ，而名字本身是不带类型的 ， 我就可以说它是一种动态类型的语言 ， 这样说对吗 ？

或者是这样说 。

**Rio** [2:12:30]
听起来 。

**吴涛** [2:12:30]
足够容易理解吗 ？

**Rio** [2:12:33]
我我还我还没没反应过来这句话在说 。

**吴涛** [2:12:36]
我是不太想使用什么 ， 比如说运行时绑定或者是编译器绑定这样的术语 。

**Rio** [2:12:42]
我觉得我以另外一个角度来说 ， 可能比较清楚的方法就是说你先不考虑它到底这个具体语言怎么实现这个值负值啊那些东西啊 ， 你就考虑一个单纯意义上的所谓一个变量 ， 它是否是有一具具备一个类型的 ， 就是说你这个变量你赋赋予它一个类型的值之后， 你还可以赋予它另外一种类型的值吗 ？

就如果不能的话 ， 这种通常我们就把它就是可以就是可以很安全的说它是一个静态类型的语言 ，但相反啊 ， 如果你赋予你先赋予一个它静一个类型的值 ， 然后你可以之后再赋予另外一个类型的值的话 ， 这个变量本身就可以就是可以具备多在不同时刻它可能具备多种类型 ， 这个时候我们可以认为它是一个动态类型的语言嘛 。

**吴涛** [2:13:27]
对 ，其实就是我刚才那段 lolly boss 的话想要表达的意思 ， 我就想说如果一种语言的名字 ， 如果一种语言在声明变量的时候 ，其名字本身是不带类型的 ， 我们就可以说它是一种动态语言 。

**Rio** [2:13:40]
嗯哼 。

**吴涛** [2:13:40]
嗯 ， 然后动态语言和静态语言之间其实也并不是完全有一个界限清晰的划分 ， 就像嗯 ， 虽然我们刚才说的这个概念看起来好像是非常明晰的 ，但是实际上我们会遇到这样一个问题 ， 就是嗯

， 尤其是在面向对象的时候 ， 面向对象编程的时候 ， 我们会说

一个

名字或者说一个变量名所带有的类型是它所指向的那一个值的类型的

超级 ，也就是说一种语言越静态 ， 它在运行时所知道的关于类型的信息就越少 ，而反过来一种类型一种语言越动态 ， 它在运行时所知道的和类型相关的嗯 ， 所谓 bookkeeping 机制也就越复杂 。

嗯

， 所以说我们可以在静态和动态的轴上面标出这种几种语言来说 ， 这种语言要比那那种语言更动态 ，但是与此同时呃 ， 还有其他种语言比这种动态的语言更为动态 ， 可以这样说吧 ？

**Rio** [2:15:10]
应该是可以的 ， 就是会有一个我们叫做一个一个 spectrum 嘛 ， 就是从非常动态的语言到非常静态的语言之间 ， 它是有这么一个连续的呃 ，不是不连续变化的这么一个进度条 。

**吴涛** [2:15:22]
对 ， 动态和静态的光谱的比较靠近动态那一端 ， 我们有 lua 或者是 list 这样一些比较动态的语言 ， 嗯 ，而反过来的另外一端呢 ， 我们有比如说

啊 ， 相当静态的语言是什么呢 ？C++ 是比较静态的 。 因为 。

**Rio** [2:15:41]
不怎么用 ， 你这个你得你得清楚 。

**吴涛** [2:15:45]
对 ， 我必须我必须比较小心的时候 ， 就是我的理解是在 C++ 的编译期编译时会剥离很多和类型相关的东西 。

**Rio** [2:15:55]
OK。

**吴涛** [2:15:55]
嗯 ， 所以它在运行时实际上是不知道 ， 比如说它是不知道呃 ， 它所真正处理的类型是什么类型 ， 就是呃 ，C++ 会在在运行时失去一切和类型相关的信息 ， 这实际上是非常静态的一个特性 。

**Rio** [2:16:14]
OK。

**吴涛** [2:16:15]
然后嗯 ，Objective C 可能就会要好一些 ，因为因为 Objective C 在虽然比 C++ 虽然和 C++ 几乎一样 ，也是相当静态的一种语言 ，但是它呃 ，在运行时能够得到的类型信息要比 C++ 多一些 ， 比如说你在 Objective C 里面可以询问你要发消息的那个对象是不是能够是不是能够对这个消息做出反应 ， 这实际上是需要知道那个对象所要所持有的具体类型 。

**Rio** [2:16:46]
对 ， 就凡是具有运行时的系统 ， 它的那个动态的属性都会更强嘛 。

**吴涛** [2:16:52]
对 ， 嗯

， 然后

我前两天看了一篇 PayPal 的程序员写的 blog， 呃 ， 标题大概是关于 Python 的若干迷思之类的这样一篇文章 ， 它里面提到一个观点说 Python 的类型系统实际上要比呃 Java

更强 ， 这是一个很新颖的观点 ， 对 ，而且呃 ，Python 是一个动态类型的系统 ，并且嗯 ，Java 或者说 JVM 其本身也是一个动态类型的动态类型的虚拟机 ，因为其呃 ， 根源可以追溯到一个 small talk 的 virtual machine， 我觉得这个观点还是蛮新颖的 。

**Rio** [2:17:45]
OK。

**吴涛** [2:17:46]
但是我还没有时间去去呃 ， 具体弄明白它所说的呃 JVM itself is more dynamically typed 到底是什么意思 ，但我觉得这是一个还挺有趣的观点吧 。

嗯 ， 说完了动态和静态 ， 我想再讨论一下就是用户所自己创建的类型和系统本身类型之间的关系 。

### 自定义类型

**Rio** [2:18:11]
就所谓的原生类型和用户类型嘛 。

**吴涛** [2:18:14]
对 ， 我的印象里面或者说我的感触里面是有些语言会刻意把两者分得非常清楚 。 呃 。

**Rio** [2:18:22]
大部分语言里面都是分有这个分分别的吧 。

**吴涛** [2:18:25]
对 ， 当然说刻意可能也不是特别的准确 ， 呃 ， 只能说有些语言在设计的时候它就考虑到了我本身必须和计算机所原生支持的一些最纯粹最基础的数据结构联系起来 ， 比如说我至少要支持什么刚才说到的嗯 ， 短整啊 ， 长整啊 ， 浮点呀 ，而且浮点可能还要细分为 32 位和 64 位的 。

**Rio** [2:18:54]
没错 。

**吴涛** [2:18:54]
嗯 ，而与此同时我还要在这些所谓的基础类型的基础之上加一些附加类型 ，而这些附加类型一般来说是会通过这个语言的一个库来实现的 ， 或者说这个语言所自带的那些

呃 ，standard library 里面所提供的一些 ， 尤其是容器类 。

**Rio** [2:19:20]
嗯哼 。

**吴涛** [2:19:20]
以这种方式来体现 ， 然后呃 ， 使用者这种语言的用户所能做的也就是利用其内建的基础类型 ，以及这些可能在库里面已经事先实现好的类型来拼出一个自己所需要的类型来 。

嗯 ， 可以说绝大语言绝大多数现在的主流语言都是这样的 。

**Rio** [2:19:44]
像 Java 它就分这个所谓的啊 primitive type 和这个 boxed type。

**吴涛** [2:19:49]
Boxed type， 对 。

**Rio** [2:19:51]
然后它的那个 primitive type 其实是你用户没办法自己去实现或者去修改的嘛 ，也不能继承 ，也不能做任何事情 ， 你就只能用它 。

**吴涛** [2:20:00]
没错 ， 嗯 ，但是比这样限制这样严格的限制更好一点的就是比如说 Ruby 或者是呃 objective C。

**Rio** [2:20:14]
嗯哼 。

**吴涛** [2:20:15]
呃 ， 它们就支持说用户可以自己去定义这样一种类型 ， 或者用户自己可以去扩展系统所提供的这些类型 。 嗯 ，但是 Objective C 可能不是一个非常好的例子 ，因为嗯 ，Objective C 所支持你做的实际上是给系统所抽象出来的一个 boxed type 加一个加一些扩展 ， 然后把它当成原生类型的扩展来用 ，但是至少在 Ruby 里面 ，因为 Ruby 有一句话就是它提倡说一切皆对象 ， 那整数也是对象 ， 所以你可以在

比如说一个数字 3 后面加一个点 ， 然后写一个方法之类的 。

**Rio** [2:20:55]
没错 ，而且它还可以就是说允许你在呃之后再添加新的方法 ， 然后你这个这个数字 3 点什么什么方法就可以是你新添加的那个 ， 对吧 ？

**吴涛** [2:21:06]
对 ， 嗯 ， 所以这也是一个非常有意思的事情啊 ， 就是如果你从来没有使用过这样的语言的话 ， 你可能会完全不会去想到这个 ， 就是我还可以做这样的事情 。

**Rio** [2:21:20]
嗯哼 。

**吴涛** [2:21:20]
就是也许在你看来呃 primitive 的类型和你自己写的数据结构之间是完全不同的两样东西 ， 前者是砖瓦 ， 后者则是你盖出来的建筑 ，但是在另外一些语言里面 ， 你可能会发现两者其实根本没有那么大差别 ， 你可以自由自在的去修改既有的砖瓦 ， 把它们变成我也不知道的可以变形的砖瓦 ， 然后用它来拼出更加特别的建筑 。

**Rio** [2:21:50]
嗯 ，Swift 算是这种吧 ， 就 Swift 它里面连这个所谓的 primitive type 都是自己呃叫什么可以就统一到库里面实现的 ， 就是说其实应该是可以改的 ， 这么说理解没错的话 。

**吴涛** [2:22:06]
对 ，是这样的 。

**Rio** [2:22:07]
嗯 。

**吴涛** [2:22:07]
当然它可能还不是像比如说 list 一样那么离经叛道 ， 那么那么逆天的所有的部分都可以修改 ，但是呃基本上这个是没错的 。

**Rio** [2:22:18]
OK。

**吴涛** [2:22:18]
对 ，但是然后就是讲讲到 list，list 里面可能根本就不存在什么系统定义的呃原始类型这种东西 ， 当然这么说可能也不对 ，但是啊 ， 姑且就这么认为吧 ， 就是 list 可能在以最 list 最基础简单的形式来看 ， 类型根本就是一种你需要自己去造出来的东西 。

**Rio** [2:22:42]
没错 。

**吴涛** [2:22:43]
对 ， 所以实际上如果我们在写程序的时候能够意识到类型系统 ， 或者说呃编程语言所内置的类型系统和我写出来的数据结构在概念上实际上是没有太大差别的时候 ， 或者说我写出来的数据结构实际上是呃系统的 ， 呃或者实际上是编程语言的类型系统的一种复杂化的体现 ， 那可能有很多问题就比较容易想明白了 。

好吧 ， 所以今天我们讲了一些有的没的 ， 效果也不是非常的好 ， 就至少我觉得还是没有讲明白 ， 当然也是因为嗯 ， 一方面准备比较仓促 ， 另外一方面也是这个话题太大了 。

### 结语

**Rio** [2:23:36]
嗯 ， 下次应该选小 ， 就是讲一个不一个部分一个部分的讲 。

**吴涛** [2:23:42]
嗯 ， 比如说其实动态和静态之间我们就可以说很多事情 ，但是好像又扯不到两个小时这么长 ， 我也不知道 ， 你有没有觉得现在两个小时好像已经成了某种某种仪式化的东西 ， 就是包括已经有也会有读者会 ，也会有听众会说嗯 ， 这一期的节目居然没有到两个小时， 你会觉得 。

**Rio** [2:24:08]
听着爽 。

**吴涛** [2:24:09]
对 ， 好像好像没有过这个坎 ， 我们就是在骗钱 。

**Rio** [2:24:13]
哈哈哈 ， 毕竟我们两周才出一次嘛 ， 就是他们还是希望每一期有足够的这个呃分量 。

**吴涛** [2:24:22]
对 ， 说的没错 ， 所以呃当然这一期也是特殊情况 ， 就是我要在国内待两周 ， 就是 。

**Rio** [2:24:28]
嗯哼 。

**吴涛** [2:24:29]
我我不是很想在国内录节目 ，因为嗯 。

**Rio** [2:24:33]
网络不太好嘛 。

**吴涛** [2:24:34]
对 ， 可能录起来没有什么 ，但是上传的时候要传装保存 。

**Rio** [2:24:40]
哈哈哈 。

**吴涛** [2:24:40]
我要回国我还没有搞那天 ， 我心里好好虚啊 。

**Rio** [2:24:44]
没关系啊 ， 现在国内的人网盘也挺方便的 。

**吴涛** [2:24:47]
但是没有账号啊 ， 没有什么都没有 。

**Rio** [2:24:52]
注册一个 。

**吴涛** [2:24:53]
没有支付 ， 没有支付宝 ， 没有没有没有淘宝账户 ， 淘宝账户好像曾经有过一个 ，但是已经十年没有用过了 。

**Rio** [2:25:03]
OK。

**吴涛** [2:25:04]
就有一种我也不知道 ， 就有一种

你好失去自我认自我认同那种随机感 。 哎 ， 我忽然想起来就是呃德国前两天地方法院法兰克福地方法院宣布 Uber 在全德是违法的 。

**Rio** [2:25:23]
哦耶 ， 那你们就没没没法做了 。

**吴涛** [2:25:26]
我从来没有做过 Uber， 说实话 ， 对 ，但是我觉得这是一个这是一件很有意思的事情 。

**Rio** [2:25:32]
你你开一个 Uber 的 app， 你看你周围有那种有 Uber 的车吗 ？

**吴涛** [2:25:36]
我我没有下载过 Uber， 太落后 。

**Rio** [2:25:40]
OK。

**吴涛** [2:25:41]
好 ， 等下可以试一试 ，但是也许回国可以试试 Uber。

**Rio** [2:25:45]
不过你那个什么德国公交那么发达 ， 打 Uber 的需求还是挺少的 ， 我觉得 。

**吴涛** [2:25:50]
也不一定 ， 就比如说嗯 ， 比如说女朋友车坏了 ， 然后也许你可以叫一个 Uber 去去接接她之类的 ， 这样的 use case 还是有 ，但是我也不知道 ， 就德国人在有些事情上非常让我无法理解 ， 比如说在德国的 Google map， 你可以去找 Google 投诉说我不要我的房子出现在 Google maps 上， 然后 。

**Rio** [2:26:14]
把它给抹掉 ， 对吧 ？

**吴涛** [2:26:15]
Google， 对 ，Google maps 就 Google 就会在 Google map 街景上把你的房子抹掉 ， 就是不是正儿八经抹掉 ，而是把你房子的正立面呃用一个虚化的图盖住 ， 就是非常二的一件事情 ，但是 somehow someway 这样的法律在德国就可以通过 ， 然后德国人还非常自豪 。

所以现在是从协调事件是 1970 年 1 月 1 日 0 时 0 分 0 秒起 ， 到现在已经过去了 1427409864 秒 。 呃 ， 您正在收听的是 IPN Podcast 网络旗下的 IT 技术节目 《 内核恐慌 》。

**Rio** [2:26:56]
小说 IT 功能 。

**吴涛** [2:26:57]
对 ， 我刚才小说 IT 功能 ， 我实在是太爱你们节目了 。 呃 ，《 内核恐慌 》 的网址是 ipn.li/kernelpanic。 嗯

， 欢迎你为我们捐款 ， 我们捐款地址是 kernelpanic.fm/donate。 呃 ，也欢迎你收听 IPN 旗下的其他六档 podcast， 包括呃技术主题节目 《IT 公论 》， 医疗主题节目 《 太医来了 》， 美食主题节目 《 未知道 》， 呃 ， 艺术主题节目 《 流行通信 》， 无主题节目 《 无次元 》，以及新近上线的故事主题节目 《Hi Story》。

**Rio** [2:27:35]
OK。

**吴涛** [2:27:36]
OK， 就这样吧 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
