王益,蚂蚁团体研究员,开源我的项目 SQLFlow 和 ElasticDL 的负责人。他从 10 岁开始写代码。已经用本人焊接的电路板扩大“中华学习机”来把自家的老式“威力牌”双筒洗衣机革新成了主动洗衣机;用 Apple BASIC 语言和 6502 汇编混合编程写了人生中第一个游戏;高中自学了大学所有计算机课程,加入计算机程度测试,先后取得了“程序员”、“高级程序员”、“系统分析员”认证。王益从事 AI 基础架构工作十三年,先后在寰球多家顶级互联网公司任职,亦曾在硅谷和北京两地守业。
王益还是出名开源我的项目 SQLFlow、ElasticDL 的负责人,虽已“高龄”,但仍对代码充斥酷爱,并常常写代码。以下是他的观点:
和每个程序员一样,我的十三年职业生涯里,每一天都在和 code review、design doc、bug reports 打交道。我在中国和美国互联网公司之间切换了屡次,也在北京和旧金山两个机场间往返航行了多年,其间惟一不变的是 —— 每天都要和写得不够好的技术文字战斗 —— 有我本人写的,也有共事们写的。
迷信之母
为什么这么悲催呢?我有一个反思。我小时候听过老师们的很多谬论。最荒诞的是“学好数理化、走遍天下都不怕”。并列第一的还有“数学是所有迷信之母”。很多年当前,我靠数学拿到了博士学位,而后发现身边很多学好了数理化的敌人们,在硅谷被印度共事干得落荒而逃。而真正堪称迷信之母的,是“逻辑”和“感性”,并不是数学。如果要清晰表白感性,须要的是语文。
因而,我宁肯说“语文才是所有迷信之母”—— 写不分明论文的研究生都毕不了业,基本没资格钻研迷信。相似的,不能清晰表白逻辑的程序员,说不清楚本人的想法和奉献,没法失去降职;甚至因为 deisgn doc 写不分明,没法吸引共事一起做一个我的项目,也就无奈带头;甚至没法吸引领导的留神和认同,无奈立项。于是只剩下中年危机。
很多中国程序员没法退出到开源我的项目中来,自以为是因为“英语不好”。我的察看是,大略 15% 是因为英语技法问题,85% 还是因为逻辑梳理不分明,换成汉语一样写不好。而我,尽管高考英语 148 分,也依然在起初的求学生涯里经验了四年发不出一篇论文的精力折磨。
这里没有看不起谁的意思 —— 外围问题出在咱们经验的教育体制上 —— 当偏科理工成为天经地义,那就真的只造就螺丝钉,造就不进去领头羊了。
试举一例
看官怕不信我的危言耸听。那么咱们试举一例。这是我负责百度 PaddlePaddle 我的项目期间,一位绩效很不错的年老共事在一个 design doc 里的一句。
We propose an approach to prefetch parameter from Parameter Server while distributed training so that Fluid would training a model including the large parameter which could not be stored in one trainer’s memory.
英语词法和语法问题:
prefetch => pre-fetch
would training => would train(其实这里的外围问题是逻辑问题,并不是虚拟语气的语法问题,下文详述)
parameter => the parameter(复数名词前须要有冠词)、或者 parameters(改成复数模式)、或者 the parameters(复数名词前也能够用冠词强调特定性)
逻辑问题:
Fluid 是 PaddlePaddle 的一个子项目。咱们做 Fluid 不是为了训练某一个模型,所以 a model => models,用复数泛指不同用户训练的很多模型。
including the large parameter。数学上,一个 parameter 就是一个数字,用计算机示意就是 64 bits,不会 large 也不会 small。这里逻辑上把 parameter tensor 和 parameter 混同了。能够说 a large number of parameters,也能够说 a large parameter tensor。
could not be stored in one trainer’s memory。首先,PaddlePaddle Fluid 里的术语里,一个 trainer 是一个过程;而过程并不领有 memory,所以不存在 trainer’s memory 这个概念。这里作者想说的是过程的内存地址空间。不过行文逻辑和内存的地址空间也没有什么关系 —— a large parameter tensor 之所以存不下,就是因为一台机器的物理内存小,而不是某个特定过程的内存地址空间太小 —— 实际上,内存地址空间往往大于物理内存容量。
其次,这里 could not be stored in 只是说”不能被放进“,而没有说起因 —— 作者想说起因是”太大了所以放不下“—— 这里的因果关系用英语示意能够说 too large to fit in the memory —— 惋惜作者并没有表达出来,于是读者可能误会”不能被放进“的起因,比方”为了高效计算 parameter tensors 所以须要将其放进 GPU memory 里”。
过后一位在百度硅谷研究院工作的印度共事在 code review 这个 design doc 的时候帮着批改了一下:
We propose an approach to pre-fetch the parameters from a parameter server during distributed training so that Fluid is able to train models with parameter tensors that are too large to fit in the memory of a node.
这里我想强调的是:上述剖析里,对于逻辑的文字量远多于对于英语的文字量。很多不完满的技术写作都是逻辑问题。
解决之“道”
写作是一门艺术。Donald Knuth 说人类的智慧分为几种境界,其中艺术是最高境界。
第一重境界叫技术(techniques)。对于一个问题,能给出一个解法的人就算达到这个境界了。这样的人叫 technician(技术工人)。
大部分程序员是这个级别的。
第二重境界叫迷信(science)。经验了很多问题,提出了很多解法之后,技工可能会总结出一些法则,称之为实践(theory)。每个 theory 的出发点是一些形象形容物理世界的公理(axioms)。比方欧式几何这个实践有五个公理,就是记录在欧几里得老师的《几何本来》(Elements)里的。从公理登程,大家能够依照逻辑能够导出很多推论(theorems)。很多推论恰好也合乎对物理世界的形容。比方沿着欧式几何的公理,大家推导了两千多年,一些推理帮着人类把阿波罗发射到月亮上还能活着回来 —— 数学真是 tmd 一个偶合啊 —— 没事没事,语文才是迷信之母。这里我要严正声明,这不是玩笑 —— 20 世纪人类最平凡的迷信发现是哥德尔定理。用俗话说,就是沿着逻辑推导,推着推着肯定会发现一个推论和之前的某个推论是相悖的,比方一个说老王家的鸡是公的,另一个说老王家的鸡是母的。所以,真的,用数学计算进去的阿波罗轨迹能把人平安的带回来,真是一个奇观 —— 说它是公的,它恰好就是公的。
什么样的程序员能够算是 scientist 呢?给定一个问题,能剖析设计出最优解法的,而不是轻易给一个解法了事的。
第三重境界叫哲学(philosophy)。小学思维品德课制作的一个误区是让人认为哲学是理科,其实哲学是文科。理工科的硕士研究生毕业之后的学位是 Master of Science。而博士研究生毕业之后就是 Ph.D. 了 —— Philosophy Doctor(哲学博士),也有人说是 permanent head damage,也有情理,不是悖论。哲学是演绎了很多 theory 的人演绎进去的准则(principles),说的是怎么思考问题,能够演绎出好的 theories —— 别从公理登程刚推了没几步就呈现悖论 —— 这 tm 多难堪)。因为哲学是领导人们演绎 theory 的,所以咱们说哲学原理(principles)是帮忙咱们拓展人类常识边界的工具。
什么样的程序员能够称为哲学家呢?有一套哲学思想叫 Unix Philosophy https://en.wikipedia.org/wiki/Unix_philosophy。看进去就明确了。
第四重境界叫艺术(art)。Paul Graham 有一本书叫《Hackers & Painters》,说的就是最高境界的程序员和画家一样。徐悲鸿画的马,大家都说好!而且每个人都能说出一些好的理由 —— 比方简练却活泼、比方线条刚柔相济、比方动感十足。既然人人都能说进去的评估规范,恐怕算不上 theories,预计能够算 techniques。徐老师无疑是大家!他也明确本人不同寻常,可是他却没法把本人的高才总结成一些 theories 或者 techniques,让师傅照着弄就能画出一样难看的马。艺术家的直觉(英语叫 gut feeling,直译为猪肚和肥肠的感触)只可意会,不可言传。汉语里的“道可道十分道”,这个道不是 principles 而是 arts。老子不是哲学家,而是艺术家啊。
有些程序员,每次碰到一个难题,其猪肚和肥肠的都会有一些感触,照着这灵感做,总是没错,根本就是最优抉择。如果他不是蒙的,那么他就算一个艺术家了。
写作技法
写作尽管是最高境界 —— 艺术,惋惜作为一个程序员,语文并非我的特长,我只能算技工。我有几条技法,相似于观赏徐悲鸿巨匠的画的时候说进去的那些评估规范,在此分享给大家,抛砖引玉,仅供参考。如果有高人能斧正,升华成 theories 甚至 principles,堪称善莫大焉,晋升了当代基础教育程度。
首先,篇章构造上考究 层层递进。
作为一个知识分子,应该了解这个世界是分形的(fractal)。要阐明一个事儿,得从大面儿上先把逻辑理顺。每个逻辑环节可能须要补充 evidence,每一层 evidence 是递进的一层境界。就像剥洋葱,一层一层往里分析。
从行文上看,一篇文章各个章节的题目,应该存在逻辑关系。读者只看题目,就能明确文章粗心。如果感兴趣,则看每一段的首句。这些首句连起来是递进的第二层,更详尽的逻辑。如果对某一段的首句感兴趣,再看其中的内容。
其次,文法上请考究:环环相扣、滴水不漏。
环环相扣的意思是:相邻两句之间要有因果关系;相邻两段要有因果关系;相邻两节要有因果关系。因为因果的连接就是逻辑。
滴水不漏的意思是:逻辑推理不可跳跃,不能够默认读者晓得某一环节所以跳跃。如果要放弃行文的精简,应该通过递进来做到,而不是跳跃。
而后,句法上考究:尽量用短句,不要长句;尽量用简单句;不要从句。
相传白居易作诗要给老婆婆们读。重复批改到老妪能解,才发表。这倒是合乎一条哲学原理,Occam’s Razor,也是我的专栏名字。用汉语说叫“删繁就简三秋树”。我读书时崇拜 Bertrand Russell 的行文 —— 颇多从句,但却有力模拟 —— 不知怎么放弃每个从句如此简短,而且用从句把逻辑编制得密不透风,同时放弃繁简相宜。为免邯郸学步,还是学习白乐天老师吧。
句法的第二条技法是:肯定要用被动语态,技术行文不可用被动语态;每句要有主谓宾 —— 汉语里被动语态亘古未有,英语里被动语态是用来表白强烈情绪的 —— 一个程序员怎么能够有情绪?面试官放水了吧?
最初说词法。规定最简约。然而留神几条,差不多也就笼罩了常见问题的十之七八。
章节题目里的单词要 capitalize。然而 and 这些词不要 capitalize。迷迷糊糊搞不清楚的能够借助工具 https://capitalizemytitle.com/
专有名词要依照作者的写法来写。没有情理。
TensorFlow 的 F 要大写。Kubeflow 的 F 是小写。为什么 —— 没有为什么?因为他们的发明者一拍脑袋就这么定了。
复数名词前要有冠词。复数名词前能够没有冠词。然而也能够有,来示意特指。
一个缩写在文中第一次呈现的时候,肯定要有全称。比方 Machine learning (ML) is like chicken ribs.
言归正题
上文中颇多玩笑。然而写作是十分庄重的事件,是人生必备的技能。明天开源软件开发成了一种新的商业模式。MySQL 已经是第一个开源商业我的项目,买了一亿美元。明天的开源我的项目的估值百亿美元者亘古未有。来自四面八方的程序员,齐全通过 code review 的形式单干,发明了 Linux 和很多其余重塑了人类社会形态的技术(Android、Chromebook、data centers)。在这个大教堂向大巴扎转型的时代里,一帮老死不相往来的程序员,齐全通过写作实现 proposal、design docs、code review、和 issue tracking。从这个角度来说,语文是人类文明之母也不为过。
历史上每一个平凡的人类文明的语文都是逻辑。中国的科举,比的不是诗词歌赋,而是策论。策(战国策的策,也是湖南经视驰名节目越策越开心的策)就是娓娓道来,也就是上文中的“环环相扣”;论就是推理谨严,也就是上文中的”滴水不漏“。诗词歌赋小说演义都属于杂书;不好好学习的人才看的,比方三国、水浒、西厢记、金瓶梅、金瓶梅、还有金瓶梅啦。藏传佛教有因明学。因就是因果,明就是说明确逻辑关系。古希腊就不用说了,整个社会制度建设在逻辑答辩之上。咱们小学时学过一个为了练习发声,把小石子放在嘴里练习答辩的演说家。如果不记得名字了,他叫德摩斯梯尼。小石子只是他练习的一个小环节,为了具备压服公众的雄辩能力,他早年师从伊萨攸学习修辞,起初传授修辞学。明天的东方世界视古希腊为其文化源头;古代东方专制制度依然参照古希腊的制度建设。美国总统大选的路演和候选人答辩都是对德摩斯梯尼那时的规定的模拟。策论和因明是美国公立小学从学前班就开始的教育。我娃在疫情之前每周要做一个 presentation。小屁蛋儿们的小手握不住鼠标,没法做 ppt,都是手绘。疫情失学之后,她常常无聊地爬在后院枇杷树上和篱笆墙外遛狗的行人越策越开心。
以上,谨策。祝大家开心!
原文链接:https://developer.aliyun.com/…_content=g_1000169105
本文为阿里云原创内容,未经容许不得转载。