30 秒看懂
2005 年,杨百翰大学(BYU)的一位助理教授开的数字 MRI 课程因选课学生全部退出而落空,他便利用这个空出来的学期,把两个互不兼容的数组库合并成了 NumPy。Travis Oliphant 与 Lex Fridman 一路聊过 SciPy、Anaconda、Conda 和 Numba,也谈到一个更长远的论点:支撑科学研究的工具建立在志愿者的时间之上,而他这二十年一直在为这份工作寻找经济上的出路。
- 1他从未成为 Python 专家。他能够持续使用这门语言,而无需成为专家,正是这一点让他押注于它。
- 2传统计算机科学把 n 维数组当作实现细节。Oliphant 说,把它做成一等对象,人们就会开始用维度来思考。
- 3Ludwig von Mises 主张,没有私有财产就没有真正的价格,没有价格,官僚就无法配置资源。Oliphant 在开源里也听到了同样的信号:谁解决了问题,谁就获得影响力。
- 4Numeric 和 NumArray 无法共享数据一个进程可以同时持着各 1 GB 的两种数组,两份内存、两套代码、两个社区在做同样的工作。
- 5NumPy 的核心发明是一种名为 dtype 的新类型对象广播(broadcasting)获得了真正的语义,两个旧库也被并入同一种数组。
- 6人在不喜欢某样东西时,本能是去攻击它。Oliphant 对年轻听众说,应当去造一个替代品,把人吸引过去。你不必毁掉一样东西,才能做出另一样。
按章节阅读整理后的全文
四年级的 GOTO 让他第一次意识到,编程有规则
Lex Fridman 介绍 Travis Oliphant 是 NumPy、SciPy 和 Anaconda 背后的程序员,然后请他讲讲记忆里的第一个程序。那是四年级,他在班上用 Atari 800(也可能是 Atari 400)的 BASIC 循环打印东西,用了 GOTO。老师告诉他不要这样写,说那违反良好的软件工程原则。这是他第一次意识到,这个游戏是有原则的。直到高中的 Pascal 先修课程,他才再次遇到这些原则。C 语言则要等到大学才接触。
他对编程的恋情来得更早。十岁时,父亲带回一台 Timex Sinclair,兴冲冲地想用它做电子表格,他却非要父亲买下 BASIC 扩展包。这台机器只有 2K 内存,他们又加了一个 16K 的扩展包;存储用的是一台磁带机,它把比特变成声音。他至今还记得那个声音。大约十二岁时,他们换成了 TI-99/4A,它有精灵图形(sprites)、图形能力,还能编程做音乐。他说,就是在那时,他真正坠入了爱河。
数学一直是吸引他的东西,不过他很清楚,孩子为什么会被贴上“数学好”的标签:低年级的数学靠的是记忆、乘法口诀和很短的工作记忆。他记性不错,大人便说他有数学头脑。他真正喜欢的是解决问题,而计算机只是把这种习惯用到了极致。那时他还不觉得机器是思维的延伸,它太原始了,一个想法和一段能跑起来的程序之间隔着太多劳动。多年后,Python 才弥合了这道缝隙。“我能用 Python 思考,”他说。
这句话引出了一段关于语言的岔题。Oliphant 另一门熟练的语言是西班牙语,他还记得自己第一次在梦里说西班牙语的那一天。Fridman 会说俄语,他谈到一门满是战争、饥荒和被打破的承诺、又有押韵诗歌传统的语言,也谈到陀思妥耶夫斯基:他的作品对音乐性的依赖较小,所以翻译之后仍能成立,而诗歌则做不到。Oliphant 同意语言会把思维引向某些路径,然后他说出了那个令人难过的部分:大量科学和技术都活在英语里,因此许多天才始终没有被看见。这也是他偏爱那些能赋予人力量的工具、抵触威权结构的原因之一。
1997 年选定 Python,是因为一年后代码仍然读得懂
Oliphant 在 1997 年第一次接触 Python,当时他是梅奥诊所(Mayo Clinic)的生物医学工程博士生。此前,他作为电气工程师,用 MATLAB、Perl、VMS 脚本和周边的 Fortran 工具从卫星信号里提取数据。那一年,他筛选过包括 Yorick 在内的多种语言。有两件事让 Python 没有被淘汰。其一是数组:1995 年,MIT 校友 Jim Hugunin 写出了 Numeric,那是这门语言里第一个真正的 n 维数组对象。如今人们说 tensor,Oliphant 仍然觉得它应该叫 ndarray,只是这场命名之争他输了。
其二是复数。计算机科学家可以把复数当作两个浮点数,然后让用户自己去搭。但对一个整天和 FFT 打交道的人来说,复数是把物理与数学连在一起的代数结构之一。如果语言本身不提供它,每个团队都要重新发明,而这些发明之间又没有共同的思路。Oliphant 说,共享的抽象之所以强大,是因为社区能用同样的方式思考;它之所以危险,是因为它会把被丢下的东西藏起来。正是这种惯性,让他喜欢的 Julia 至今仍在 Python 的潮流里挣扎。
真正让他爱上 Python 的时刻要小得多。1998 年,他回看自己 1997 年为弹性成像写的 Python 代码,那是用超声和 MRI 把波送进人体,再反推出弹性;他发现自己仍然看得懂。而 1995 年写的 Perl,他已经完全看不懂了。他并没有在成为 Python 专家,只是能够持续使用这门语言,无需成为专家。用缩进代替花括号是一次跳跃,他也清楚其中的具体代价:粘贴出错、制表符和空格混用、哑终端。但他几乎没有撞上过这些问题,并且喜欢没有多余字符的视觉结构。Perl 崇尚简洁,直到整个文化把难读变成了一种标榜。Python 的关键字是英文的,而他整天本来就在用英语工作,这一点让他用起来顺手。
他没有研究过,但很好奇:如果你在日语或中文环境里长大,学这些英文关键字是什么感觉。不过,对于只浸淫在系统或网页编程里的人,他会坚决为数组思维辩护。20 世纪 60 年代的 APL 把整个数组当作一个对象,发明了专用字符,甚至还有专门的键盘,并且形成了一种文化,像 Perl 那样,以用 30 个字符写出生命游戏为荣。从文化上看,微软多年来都没有重视数组编程。MATLAB 继承了这一传统;Numeric 继承了广播和归约;NumPy 又继承了 Numeric。他说,一旦 n 维数组成为一等公民,你就不会再把它当作实现细节,而会开始用维度来思考。
SciPy 始于缺失的求解器、Netlib 上的 Fortran,以及一个高中生做的 Windows 安装包
SciPy 是较年长的那个孩子。1998 和 1999 年,Oliphant 像用 MATLAB 那样用 Numeric,却发现了不少空白:没有可以直接调用的常微分方程(ODE)求解器,没有积分器,也没有能接收一个函数并返回最小值的优化器。邮件列表上的人,包括 Conrad Hinson 和 David Ascher,都在公开希望有这些库。他是个穷研究生,妻子认为他在读博士,这没错;而他喜爱的博士生活,有一部分正是可以自由决定要造什么。于是他开始写自己需要的工具。
第一个扩展模块是一个读取 DICOM 医学影像的 I/O 包,那是他用 C 写的第一段对接 Python 的代码。Guido van Rossum 关于引用计数的帖子,是唯一让他没有在内存泄漏里迷路的东西。随后他找到了 Netlib:那里有几百个 Fortran 77 例程,都是 20 世纪 60 年代到 80 年代写成并经过测试的。他最喜欢的 Fortran 是带复数和数组的 Fortran 90;没人会用它写整个程序,但写一个子程序完全没问题。他封装了 ODE 求解器和 Quadpack,用一个糟糕的网页发布了 gzip 压缩包,然后眼看着用户冒出了一百来个。爱沙尼亚的 Pearu Peterson 寄来一个他并未完全看懂的 makefile。一个叫 Robert Kern 的高中生为收集起来的“multipack”做了 Windows 安装包,使用量随之猛增。Oliphant 意识到,二进制安装包决定了一个社区能否成长。这条经验后来成了 Anaconda 的一部分。
2001 年,Eric Jones 和 Travis Vaught 把他的模块与 Pearu Peterson 的 F2PY 等组件合在一起,做成单一安装包,并命名为 SciPy。最初的设想是一整套研发环境:数组、数学、绘图、REPL,也就是把 MATLAB 搬进 Python。在他看来,开源协作有一个合作上限:基础设施做得很出色,但参与的人一多,产品管理就一塌糊涂。绘图交给了 John Hunter,他是一位量化分析师,同年把 Matplotlib 作为独立库发布。Enthought 组织了 SciPy 大会,参会的大约 50 位在职科学家都想把代码写好,并摆脱对 MATLAB 的依赖。Oliphant 并不是开源狂热分子。他反感的是,有人把代码公开了,却告诉读者要运行它就得先买 MATLAB 许可证。
Richard Stallman 劝他别生孩子,他转而去图书馆读 von Mises
那时他有三个孩子,后来还会有六个。他很欣赏 Richard Stallman 关于知识产权法和集体协作的写作,然后读到一句大意是“要像我一样,别生孩子”的话。那条路他走不通。必须有一种办法,既保住开源的文化,又能养家。这个缺口,在同一批博士岁月里,把他带进了他从未学过的经济学。他高中是毕业生代表,大学也成绩优异,却很尴尬地发现,一个人可以做到这一切,却仍然不懂钱和价格是怎么运作的。
他读了马克思和亚当·斯密,最后落在 Ludwig von Mises 1920 年那篇关于社会主义共同体经济计算问题的文章上,那是在布尔什维克革命之后写的。没有私有财产,就没有真正的价格;没有价格,官僚就无法分配资源;价格从交易中产生,而交易又需要对所交易之物有权威。自上而下的体系拿不到这种信息流。这个论证让他豁然开朗。价格是一种信号。开源也有一个近亲:谁能解决问题,谁就获得影响力,这种影响力用声望和贡献来衡量,货币则不计入。
那几年他在杨百翰大学任教,讲信号处理、概率论和电磁学,也因为讲得“太高深”而收到不少差评。他很尊重学生,于是默认他们已经懂他懂的东西。他的第一门课用投影片,教室昏暗;两周后的测验显示,没有人真正学到东西。他把投影片收起来,改用黑板。写字让他慢下来,让学生有时间思考,也让他自己专注。字迹难看,那也是他喜欢的自己的一部分。这条教训也进了 SciPy:名字要短到一眼就能看懂,文档要丰富到足以带人进入细节,知识要直接交出去,用不着拿来炫耀。
一门没人选的 MRI 课程催生了 NumPy,而 Matplotlib 的依赖让它真正落地
到 2004 年,Oliphant 已经进入终身教职的评审轨道。评语说,论文就在路上,但他应该少做开源,多写基金申请。与此同时,年轻的科学 Python 世界正在分裂。Perry Greenfield 所在的 Hubble 团队需要更丰富的数组类型、更稳定的广播,以及 Numeric 没有的记录数组,于是他们做了 NumArray。随后 ND Image 问世:形态学、膨胀、开运算,以及医学影像人员一直想在 SciPy 里用上的分割工具,而它只能跑在 NumArray 上。Numeric 和 NumArray 无法共享数据,同一个进程里,两种数组各占 1 GB 也是有可能的。两份内存,两套技术栈,两个社区在重复劳动。
命运随即给了他一个空档。他本来列了一门数字 MRI 课程,结果两名学生报了名又退了课,那个学期他没有别的课。于是他决定合并这两个库。他曾与 Paul Dubois、David Ascher 和 Conrad Hinson 一起编写 Numeric 的 C-API 文档,所以熟悉其中的结构。头四个月做出了第一版,又花了十四个月才让它真正可用。最难的是头四个月。技术核心是一个名为 dtype 的新类型对象,以及真正的广播和高级索引,不只是切片,还包括掩码和间接索引。为了把两个阵营都拉过来,他必须与 Numeric 和 NumArray 向后兼容。他说,NumPy 里至今仍有的许多古怪复杂性,都是那个目标留下的化石;如果从零设计,他不会那样写。
Fridman 称赞他的同理心和没有自我,并指出这正是他在 JavaScript 框架里看到的失败模式:它们选择分叉,而不去倾听。Oliphant 补充说,光倾听还不够,你还得真想把东西做出来。大约六个月后,Francesc Alted、Robert Kern 和 Charles Harris 加入进来,这些默默无闻的英雄用贡献来鼓励他。转折发生在 2006 年:John Hunter 放弃了 Matplotlib 的 Numeric/NumArray 双后端,让 NumPy 成为它的依赖。“我们做到了,”Oliphant 想。2006 年到 2009 年间,影响之大让他目瞪口呆。人们开始用 NumPy 来思考。这种语言上的转变,不只是库的转变,是他没有完全预料到的。
一本 9 万美元的书资助了一名学生,而一个类型系统的捷径至今仍挡住 GPU
2006 至 2007 年间,终身教职之争撕裂了系里,一路闹到校长那里,最后回来的结论是两年后可以再申请一次。他拒绝了,给 Eric Jones 打了电话,于 2007 年搬到德州。他在 Enthought 待了四年,并成为总裁;两人还一起帮 Jones 买断了一位合伙人的股份。这件事的结局并不好。他和 Jones 现在已经不是朋友了。他仍然尊重对方,也不愿讲述其中任何一方的版本。2012 年,他与 Peter Wang 创办了 Continuum Analytics,2015 年更名为 Anaconda。
在那次离开之前,他已经做过一场实验。他手上有一名研究生,却没有经费,又不想走寻常的募资路线,于是写了《NumPy 指南》(Guide to NumPy),自费出版,并收取 PayPal 付款。规则很简单:如果这本书卖出 25 万美元,或者五年后,他就把它开源。三年里他卖出 3 万本,收入 9 万美元,足以每年付给学生 2.5 万美元。大约有五封愤怒的邮件骂他收费是坏人;但也有更多人认为,用一本书为开源筹款,是一种公平的做法。一年半后,他在 Enthought 有了薪水,而 SciPy 的文档小组需要这些页面,于是他提前把书开源了。DARPA 的 Chris White 记得这次定价的噱头,回头找到了 Anaconda,一份跳过演示日的提案仍然拿到了资金。9 万美元的书销量,最后变成了数百万美元的研究经费。
2012 年,他在 NumPy 邮件列表上发了一封信,宣布离开项目。回头看,他不会再用数组标量来替代类型。Python 2 让用户定义的类成了真正的类型;他当时几乎没有理解那个元类钩子,于是搭了一套 Python 1 时代风格的系统,其中每个 dtype 都是同一个类型的实例。代价不在速度,而在笨拙:新类型、四元数、posit、渐进式类型,以及与 Numba 的干净衔接,都变得更难。最明显的疤痕是 GPU。从原则上说,NumPy 数组没有理由不能跑在 GPU 上;CuPy 的存在,就是这段历史的产物。他正在推动 data-apis.org,要的是一套共享的 API,而不只是一个数组,因为如今这种分裂局面,即 TensorFlow 和 PyTorch 被硬接在那些较晚才发现 Python 的 C++ 库上,比 2005 年还糟。他说,Facebook 让社区进入了结构之中,Google 要的是用户,而非贡献者。他仍然偏向黑客,也知道偏向这一边,可能会耗尽资金。
Guido 愿意听,Python 3 值得喜欢的地方太少,信息缺失时人们会往最坏处想
NumPy 早期,Oliphant 与 Paul Dubois 一起约 Guido van Rossum 在圣马特奥吃午饭,提议把数组对象放进 Python 3。他们没能把 NumPy 放进语言本身,却拿到了它的骨架,包括一个 memoryview 对象:他写了它的 C 内部实现,而它的 Python 接口后来由 Antoine Pitrou 和 Stefan Krah 修补。他从 Guido 那里学到的是开放,是在科学问题上愿意让步,以及回应贡献者、不让他们走开的习惯。缺失的矩阵乘法运算符晚了大约十年才到来。Guido 1998 年关于引用计数的笔记,至今仍是 Oliphant 能写出第一个扩展的原因。对他来说,Guido 因海象运算符(walrus operator)辞去 BDFL 一职,是一种熟悉的压力:只要做的事有分量,就不可能人人喜欢。
2012 年那封 NumPy 信件是一段艰难的时期。他说,批评者是必要的,因为你不可能什么都做对;但刻薄是另一回事。信息不完整时,人们会用最坏的故事去填补空白。他宁愿默认对方怀有善意,因为人们常常会不负这份善意;而一支想要发布产品的软件团队,必须练就这种默认。这是工程上的硬要求,不带道德口号的味道。Twitter 和 Facebook 已经学会,负面情绪能换来互动,所以这场斗争是结构性的。他还处在一个尴尬的中间位置:他对创业足够在意,让一些开源人士感到不安;对开源又足够在意,让投资人感到不安。
Python 3 是他研究惯性的一个案例。2005 年,他就已经在和 Guido 谈论跟上 Python 3 迁移的事。对 Python 2 的支持一直持续到 2020 年。在他看来,3.0 到 3.2 版没有多少值得喜欢的东西;他把 3.3 视为真正的 3.0,3.4 是他想要的第一个版本,而 3.5 带来了 @ 矩阵运算符,是人们不得不接受的版本。print 变成函数,修掉了 Guido 一直讨厌的一件事,但这不足以让大批人迁移。光靠“这是新版本”,无法让人挪窝。另一条教训是钱。Guido 有工作,但那份工作并不是全职做 Python。这门语言是靠志愿者劳动运转的。Fridman 想知道,匮乏是不是一种特性,就像经费不足的奥运选手那样。Oliphant 承认其中有一些道理,但他不认为钱和价值观是对立的。
np.sqrt 对标量慢是有意为之,Numba 的存在是为了让 for 循环变得诚实
当时正在领导特斯拉 Autopilot 的 Andrej Karpathy 发推说,在数据加载路径里把 np.sqrt 换成 math.sqrt 有帮助,有人回复说另一种写法还要更快。Oliphant 对此并不意外。NumPy 的数学函数是通用函数(ufunc)。对标量调用它时,标量会被广播成零维数组,穿过整套 ufunc 机制(类型转换、广播、解包),然后才交给 C 库的 sqrt。Python 的运行时可以为标量做特化,从而绕过这一整套流程。在大约一千个元素、也许一万个元素以下,原生 Python 可能更快,尤其是任务受 I/O 限制的时候。超过这个量级,数组带来缓存局部性、SIMD 和容易并行化的优势。他同意过早优化确实是一种恶习。为了更快的平方根而牺牲清晰度,往往是更糟的交易。
NumPy 里的 vectorize 只是他想要东西的假版本:给它一个 Python 标量函数,得到的是一个 ufunc,只不过每个元素都要弹回解释器。2009 或 2010 年,他试过 PyPy,但太重了。2012 年,他和 Wang 刚创办 Anaconda,又听过 Dave Beazley 讲 LLVM,于是写了一个编译器:把 Python 字节码映射到 LLVM IR,再让 LLVM 生成机器码。Numba 本身是用 Python 写的。它不解析,也不生成代码,它做的是翻译。他说,LLVM 的好处是提供了一块人们能共同协作的平台,那里面没有 GCC 或英特尔编译器那样的内部细节。这个项目重写了三次。原型很容易写,但要写出一个不乱成意大利面的编译器,就难了。
商业上的划分很干净:CPU 上的 Numba 免费,GPU 上的 Numba Pro 收费,它是最早的 CUDA JIT 之一。到 2013 年,你就能写一个 ufunc,把它放到 GPU 上,自动并行化,然后看到千倍的加速。大公司愿意为速度付费,也愿意为好用的界面付费。他说,这两样,是人们在开源周围总会买单的东西。同一时期,他还注意到一种社会层面的错位:2001 年 9 月 11 日事件已经满二十年,中东地区花掉了 6 万亿美元以上,而写出支撑科学工具的人,往往仍然没有报酬。Fridman 提出一个说法:相互贸易的国家不会开战,也许一起写代码的国家也不会。开源没有国界,商业却有。Oliphant 与伊朗和巴基斯坦的程序员做过线上交流,他认为,如果下一场大国冲突是各国都有强大开发者的网络战,这种人与人之间的连接层也许就很重要。
Guido 不肯管打包,Conda 只好长成一个独立于 Python 的东西
Continuum Analytics 起于两个技术押注:把 NumPy 和 pandas 扩展到多台机器上,并且不让网络绕过 Python 去抢它的位置。朋友、家人和愿意冒险的人都投了钱,所以 Oliphant 不愿玩风险投资那种“要么做大,要么出局”的游戏。他做咨询,这样就不会赔掉别人的钱,同时保留一部分上行空间。Dask、Bokeh、Numba、Conda、Datashader、HoloViz、Panel,以及为 JupyterLab 添砖加瓦的工作,都是在这股劲头里诞生的。他们发出了两份 DARPA 提案,其中偏数值方面的那份因为错过了五分钟的截止时间而落选。Chris White 仍然让一部分资金流向了基金会。打包之争则更早。2012 年,在 Googleplex 的一次聚会上(Wang 有一张 Oliphant 与 Guido 交谈的照片),他们说用户装不上这些软件。Guido 的回答是:你们自己去修。他自己从不安装新库。Oliphant 承认,如果你创造了这门语言,就可以把你需要的东西放进发行版里。
这份痛苦已经在扭曲 NumPy 本身。有人告诉他不要改这个库,因为他们花了一个星期才把 Python 装好,一改就得全部重来。SciPy 里满是 Fortran,scikit-learn 则串联着 C++。早期的 Python 打包无法处理二进制依赖。他们想要一个在 Windows、macOS 和 Linux 上都能用的包管理器,而且不想让它只服务于 Python。Conda 在 2013 年发布。从 2013 年到 2017 或 2018 年,conda install scikit-learn 是拿到整套技术栈的可靠办法。pip 后来也有了 wheel,但 wheel 止步于 Python 的边界,并且把二进制文件打包进去。只要底层库一换,你就得重建整个 wheel。他仍然认为用 pip 安装 TensorFlow 是个坏主意,而文档却一直在推荐。在网上搜索安装方法时,Conda 已经掉出了第一页,长尾文档里全是 pip 的方案,尽管 Conda 比 pip 的答案出现得还早。
他的实用建议是一种混合方案:用 Conda 搭建环境,把 NumPy、SciPy 和 scikit-learn 放进基础环境里,再用 pip 安装那些小型的纯 Python 工具。用 pip 安装 OpenCV 或 TensorFlow 要小心,因为一旦装上,就很难更新。他一直希望 pip 能把部分依赖交给系统包管理器,比如 Conda 或 RPM。他说,这个功能并不难做,只是没有经费。Conda-Forge 把配方做成了社区化的。至于 Conda 本身,他说得毫不含糊:它从来没有变成社区驱动,而这场斗争不该只让 Anaconda 一家去扛。每个项目都是从公司支持起步的,即便那家公司只有一个人。要成为基础设施,它就必须交到别人手上。
Quansight 尝试把开源劳动变成一台可以重复运转的公司机器
Oliphant 在 2018 年离开 Anaconda,创办了 Quansight,它的宗旨是把数据与开放的经济连接起来。咨询业务是一家全栈数据科学公司,做基础设施、Dask、GPU、培训和人员外包。Quansight Labs 则带点非营利色彩。企业可以购买一份“社区工作单”,也就是请一位 Spyder、NumPy 或 SciPy 维护者工作一个月。企业可以提出优先事项,但不能指定工作内容,由维护者和社区决定。每个 Quansight 项目的一部分利润,都会投入 Labs。他多年没有因为维护 NumPy 拿过报酬,如今终于开始付钱请别人去做了。
OpenTeams 是最让他兴奋的部分。他向埃克森美孚、壳牌、摩根大通和美国银行推销时明白,企业并不缺产品。它们买下平台,然后花大价钱请顾问去定制。开源加上同样的定制,可以更便宜。OpenTeams 是一个网络:它促成企业交易,把交付交给 Quansight 这样的公司,并对质量负责,这样客户买到的就不只是一条线索。Quansight Initiate 是一只早期基金,会把一部分收益分成(carry)交给 Labs。他认为,每一支风险投资基金都应当配一个开源实验室:投资人看到的是年轻公司,实验室看到的是社区,而这个循环本身就应该是一种产品。他复盘时说,Anaconda 发明得太多,结构得太少。Dask 已经分拆出几家公司,Bokeh 本可以再成一家,JupyterLab 则衍生出好几家。他希望把这种自然涌现变成一份可复制的配方。
微软在 2014 年提出收购早期 Anaconda 时,发起人离 Satya Nadella 还差两层。当时微软刚收购了一家 R 语言公司,想在 Python 这一侧也下一注。如果是 Scott Guthrie 出面报价,Oliphant 说他现在很可能已经在微软了。他认为微软收购 GitHub 很聪明,因为微软一直清楚自己的力量来自开发者。Ballmer 的那个梗很笨拙,但洞察是对的。他尚未看到的是 OpenTeams 那样的结构。为开发者喝彩,和让开发者拿到报酬,是两件不同的事。他给那些想赢得黑客好感的公司提的营销建议毫不含糊:拿出一部分广告预算,交给 NumPy、SciPy 和 Jupyter。把它当作有可读 ROI 的营销,别当成慈善。NumFOCUS 就是为了让这种转移更容易。难点在于找到能调动资金的 CMO,同时别把钱砸下去,制造新的问题。
雇用已经在做贡献的人,不要试图一次写完整个程序
被问到好的程序员需要什么,Oliphant 首先说的是好奇心。没有它,工作就会变得乏味,最好的工作也不会发生。第二,不要试图一次做完所有事。先把问题收窄:写代码之前,先写下输入、输出,以及你真正想达成的目标。把大项目整个吞下去,往往做得很糟。第三,善用别人的工作。从 Stack Overflow 上复制,或者从 Codex 上复制(他把 Codex 看作 Stack Overflow 的搜索引擎),都没有问题,前提是你理解了那段代码。不假思索地粘贴,什么也学不到。第四,对炒作周期保持怀疑。测试驱动开发、面向对象、敏捷:每个口号都有它的信号,但没有一个是解决一切的答案。
要怎样成为下一个创造 SciPy 的人?去倾听那些有问题的人,而这几乎就是所有人;然后去做实验。第一个版本大概会很烂。迭代是创新的核心,而人们之所以止步,往往就是心理上不敢发布那个糟糕的东西。好的工作不能靠刷屏完成,对一个深刻的问题,要坐下来待上一两个小时。构建 SciPy 和 NumPy 非常孤独。对他来说,内在动力是一种信念:这件事是对的。Python 已经有了有影响力的用户,却缺少库,所以写这些库本身就是好事。给一个新的开源项目 18 个月,再决定反馈是不是已经到位。6 个月远远不够,因为你面对的是人类的惯性。
催生这些库的工作环境,是一台 Linux 机器上的 Emacs,先是 CVS,后来是 SVN,再后来才是 Git。他曾发推说 Emacs 胜过 Vim,结果招来大量反驳,他最后删了推文。不过,只改一个字符的时候,他仍然会打开 Vim。Lisp 的括号曾经让他的思路受阻;如今他欣赏它的结构,也喜欢 Clojure 和 Hy 这样的项目。但他不认为 Lisp 能吸引偶尔写代码的人,那些人永远不会以编程为生,也不想在脑子里塞进花哨的语法。这正是 BASIC 能成功的原因,也是微软本该早十年就把这块市场交给 Python 的原因。他屏幕用得不多,窗口都在脑子里切换。十年来他一直用 Mac 笔记本,因为会议室的投影仪搞不定他的 Linux 桌面。他的招聘建议和职业建议是同一套:开一个开源项目,让人们来贡献,然后雇用他们。一两个小时的面试几乎说明不了什么;几周的合作却能说明很多。他最信任的筛选标准是谦逊,也就是承认自己还需要学习。他的妻子现在说他话太多了。
家人是你承诺相守的人,工作则是去建设,而非攻击
Fridman 请 Oliphant 给想要过上值得骄傲的生活的高中生和大学生一些建议。Oliphant 先从家庭说起,但家庭的定义比血缘要宽:找到你所爱的人,对他们作出承诺,让这份承诺成为其他东西都给不了的锚。然后再去找一些你也愿意承诺的东西,比如观念和团体。尤其是在高中阶段,不要把自己以为知道的东西就此定下来。给自己十年时间。他看到有些学生已经什么都懂了,就像他当年一样。观点是会变的。他曾是个激进的自由意志主义者(libertarian),反感美联储;如今他的看法更有层次,但仍然希望能有一场更长的货币政策对话。
他最想让人记住的一句话,是关于建设的。当你不喜欢某样东西时,本能是去攻击它。更好的做法是造一个替代品,并吸引人们走向你的路径。你不必摧毁一个项目,才能确立另一个。跟随好奇心,而不只是跟随金钱。找到你相信正确的事情,并坚持足够久,直到人类的惯性追上来。Fridman 以一个程序员的玩笑收尾,那是一条名为 Hodgson's law 的定律:每一个足够高级的 Lisp 应用,最终都会被用 Python 重新实现一遍。
同频道的其他文章
3:36:56EN → 简体中文
5:15:51EN → 简体中文
3:12:58EN → 简体中文
3:46:18EN → 简体中文
3:51:47EN → 简体中文
2:53:42EN → 简体中文