支付宝研究员王益的建议:“学好语文,才能写好代码”
王益,螞蟻集團(tuán)研究員,資深程序員,從10歲開(kāi)始寫(xiě)代碼。初中畢業(yè),王益就用“中華學(xué)習(xí)機(jī)”和自己焊接的電路板,把自家的老式“威力牌”雙筒洗衣機(jī)改造成了自動(dòng)洗衣機(jī);還用Apple BASIC語(yǔ)言和6502匯編混合編程寫(xiě)了人生中第一個(gè)游戲;高中自學(xué)了大學(xué)所有計(jì)算機(jī)課程,參加計(jì)算機(jī)水平測(cè)試,先后獲得了“程序員”、“高級(jí)程序員”、“系統(tǒng)分析員”認(rèn)證……清華博士畢業(yè),王益“縱橫”于美國(guó)硅谷和國(guó)內(nèi),在全球多家互聯(lián)網(wǎng)巨頭工作,2008年獲得“Google APAC Innovation Award”稱(chēng)號(hào)。
原文鏈接:
https://developer.aliyun.com/article/766797?utm_content=g_1000150554王益還是知名開(kāi)源項(xiàng)目SQLFlow、ElasticDL的負(fù)責(zé)人,雖已“高齡”,但仍對(duì)代碼充滿熱愛(ài),并經(jīng)常寫(xiě)代碼。以下是他的觀點(diǎn):
和每個(gè)程序員一樣,我的十三年職業(yè)生涯里,每一天都在和 code review、design doc、bug reports 打交道。我在中國(guó)和美國(guó)互聯(lián)網(wǎng)公司之間切換了多次,也在北京和舊金山兩個(gè)機(jī)場(chǎng)間往復(fù)飛行了多年,其間唯一不變的是 —— 每天都要和寫(xiě)得不夠好的技術(shù)文字戰(zhàn)斗 —— 有我自己寫(xiě)的,也有同事們寫(xiě)的。
科學(xué)之母
為什么這么悲催呢?我有一個(gè)反思。我小時(shí)候聽(tīng)過(guò)老師們的很多謬論。最荒謬的是“學(xué)好數(shù)理化、走遍天下都不怕”。并列第一的還有“數(shù)學(xué)是一切科學(xué)之母”。很多年以后,我靠數(shù)學(xué)拿到了博士學(xué)位,然后發(fā)現(xiàn)身邊很多學(xué)好了數(shù)理化的朋友們,在硅谷被印度同事干得一敗涂地。而真正堪稱(chēng)科學(xué)之母的,是“邏輯”和“理性”,并不是數(shù)學(xué)。如果要清晰表達(dá)理性,需要的是語(yǔ)文。
因此,我寧可說(shuō)“語(yǔ)文才是一切科學(xué)之母” —— 寫(xiě)不清楚論文的研究生都畢不了業(yè),根本沒(méi)資格研究科學(xué)。類(lèi)似的,不能清晰表達(dá)邏輯的程序員,說(shuō)不清楚自己的想法和貢獻(xiàn),沒(méi)法得到晉升;甚至因?yàn)?deisgn doc 寫(xiě)不清楚,沒(méi)法吸引同事一起做一個(gè)項(xiàng)目,也就無(wú)法帶頭;甚至沒(méi)法吸引領(lǐng)導(dǎo)的注意和認(rèn)同,無(wú)法立項(xiàng)。于是只剩下中年危機(jī)。
很多中國(guó)程序員沒(méi)法加入到開(kāi)源項(xiàng)目中來(lái),自以為是因?yàn)椤坝⒄Z(yǔ)不好”。我的觀察是,大概 15% 是因?yàn)橛⒄Z(yǔ)技法問(wèn)題,85% 還是因?yàn)檫壿嬍崂聿磺宄?#xff0c;換成漢語(yǔ)一樣寫(xiě)不好。而我,雖然高考英語(yǔ) 148 分,也仍然在后來(lái)的求學(xué)生涯里經(jīng)歷了四年發(fā)不出一篇論文的精神折磨。
這里沒(méi)有看不起誰(shuí)的意思 —— 核心問(wèn)題出在我們經(jīng)歷的教育體制上 —— 當(dāng)偏科理工成為理所當(dāng)然,那就真的只培養(yǎng)螺絲釘,培養(yǎng)不出來(lái)領(lǐng)頭羊了。
試舉一例
看官怕不信我的危言聳聽(tīng)。那么我們?cè)嚺e一例。這是我負(fù)責(zé)百度 PaddlePaddle 項(xiàng)目期間,一位績(jī)效很不錯(cuò)的年輕同事在一個(gè) 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.
英語(yǔ)詞法和語(yǔ)法問(wèn)題:
prefetch => pre-fetch
would training => would train (其實(shí)這里的核心問(wèn)題是邏輯問(wèn)題,并不是虛擬語(yǔ)氣的語(yǔ)法問(wèn)題,下文詳述)
parameter => the parameter(單數(shù)名詞前需要有冠詞)、或者 parameters(改成復(fù)數(shù)形式)、或者 the parameters(復(fù)數(shù)名詞前也可以用冠詞強(qiáng)調(diào)特定性)
邏輯問(wèn)題:
Fluid 是 PaddlePaddle 的一個(gè)子項(xiàng)目。我們做 Fluid 不是為了訓(xùn)練某一個(gè)模型,所以 a model => models,用復(fù)數(shù)泛指不同用戶(hù)訓(xùn)練的很多模型。
including the large parameter。數(shù)學(xué)上,一個(gè) parameter 就是一個(gè)數(shù)字,用計(jì)算機(jī)表示就是 64 bits,不會(huì) large 也不會(huì) small。這里邏輯上把 parameter tensor 和 parameter 混淆了??梢哉f(shuō) a large number of parameters,也可以說(shuō) a large parameter tensor。
could not be stored in one trainer's memory。首先,PaddlePaddle Fluid 里的術(shù)語(yǔ)里,一個(gè) trainer 是一個(gè)進(jìn)程;而進(jìn)程并不擁有 memory,所以不存在 trainer's memory 這個(gè)概念。這里作者想說(shuō)的是進(jìn)程的內(nèi)存地址空間。不過(guò)行文邏輯和內(nèi)存的地址空間也沒(méi)有什么關(guān)系 —— a large parameter tensor 之所以存不下,就是因?yàn)橐慌_(tái)機(jī)器的物理內(nèi)存小,而不是某個(gè)特定進(jìn)程的內(nèi)存地址空間太小 —— 實(shí)際上,內(nèi)存地址空間往往大于物理內(nèi)存容量。
其次,這里 could not be stored in 只是說(shuō)”不能被放進(jìn)“,而沒(méi)有說(shuō)原因 —— 作者想說(shuō)原因是”太大了所以放不下“ —— 這里的因果關(guān)系用英語(yǔ)表示可以說(shuō) too large to fit in the memory —— 可惜作者并沒(méi)有表達(dá)出來(lái),于是讀者可能誤會(huì)”不能被放進(jìn)“的原因,比如”為了高效計(jì)算 parameter tensors 所以需要將其放進(jìn) GPU memory 里”。
當(dāng)時(shí)一位在百度硅谷研究院工作的印度同事在 code review 這個(gè) design doc 的時(shí)候幫著修改了一下:
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.
這里我想強(qiáng)調(diào)的是:上述分析里,關(guān)于邏輯的文字量遠(yuǎn)多于關(guān)于英語(yǔ)的文字量。很多不完美的技術(shù)寫(xiě)作都是邏輯問(wèn)題。
解決之“道”
寫(xiě)作是一門(mén)藝術(shù)。Donald Knuth 說(shuō)人類(lèi)的智慧分為幾種境界,其中藝術(shù)是最高境界。
第一重境界叫技術(shù)(techniques)。對(duì)于一個(gè)問(wèn)題,能給出一個(gè)解法的人就算達(dá)到這個(gè)境界了。這樣的人叫 technician(技術(shù)工人)。
大部分程序員是這個(gè)級(jí)別的。
第二重境界叫科學(xué)(science)。經(jīng)歷了很多問(wèn)題,提出了很多解法之后,技工可能會(huì)總結(jié)出一些規(guī)律,稱(chēng)之為理論(theory)。每個(gè) theory 的出發(fā)點(diǎn)是一些抽象描述物理世界的公理(axioms)。比如歐式幾何這個(gè)理論有五個(gè)公理,就是記錄在歐幾里得老師的《幾何原本》(Elements)里的。從公理出發(fā),大家可以按照邏輯可以導(dǎo)出很多推論(theorems)。很多推論恰好也符合對(duì)物理世界的描述。比如沿著歐式幾何的公理,大家推導(dǎo)了兩千多年,一些推理幫著人類(lèi)把阿波羅發(fā)射到月亮上還能活著回來(lái) —— 數(shù)學(xué)真是tmd一個(gè)巧合啊 —— 沒(méi)事沒(méi)事,語(yǔ)文才是科學(xué)之母。這里我要嚴(yán)正聲明,這不是玩笑 —— 20 世紀(jì)人類(lèi)最偉大的科學(xué)發(fā)現(xiàn)是哥德?tīng)柖ɡ怼S盟自捳f(shuō),就是沿著邏輯推導(dǎo),推著推著一定會(huì)發(fā)現(xiàn)一個(gè)推論和之前的某個(gè)推論是相悖的,比如一個(gè)說(shuō)老王家的雞是公的,另一個(gè)說(shuō)老王家的雞是母的。所以,真的,用數(shù)學(xué)計(jì)算出來(lái)的阿波羅軌跡能把人安全的帶回來(lái),真是一個(gè)奇跡 —— 說(shuō)它是公的,它恰好就是公的。
什么樣的程序員可以算是 scientist 呢?給定一個(gè)問(wèn)題,能分析設(shè)計(jì)出最優(yōu)解法的,而不是隨便給一個(gè)解法了事的。
第三重境界叫哲學(xué)(philosophy)。小學(xué)思想品德課制造的一個(gè)誤區(qū)是讓人以為哲學(xué)是文科,其實(shí)哲學(xué)是理科。理工科的碩士研究生畢業(yè)之后的學(xué)位是 Master of Science。而博士研究生畢業(yè)之后就是 Ph.D. 了 —— Philosophy Doctor(哲學(xué)博士),也有人說(shuō)是 permanent head damage,也有道理,不是悖論。哲學(xué)是歸納了很多 theory 的人歸納出來(lái)的原則(principles),說(shuō)的是怎么思考問(wèn)題,可以歸納出好的 theories —— 別從公理出發(fā)剛推了沒(méi)幾步就出現(xiàn)悖論 —— 這tm多尷尬)。因?yàn)檎軐W(xué)是指導(dǎo)人們歸納 theory 的,所以我們說(shuō)哲學(xué)原理(principles)是幫助我們拓展人類(lèi)知識(shí)邊界的工具。
什么樣的程序員可以稱(chēng)為哲學(xué)家呢?有一套哲學(xué)思想叫 Unix Philosophy https://en.wikipedia.org/wiki/Unix_philosophy 。看進(jìn)去就明白了。
第四重境界叫藝術(shù)(art)。Paul Graham 有一本書(shū)叫《Hackers & Painters》,說(shuō)的就是最高境界的程序員和畫(huà)家一樣。徐悲鴻畫(huà)的馬,大家都說(shuō)好!而且每個(gè)人都能說(shuō)出一些好的理由 —— 比如簡(jiǎn)練卻生動(dòng)、比如線條剛?cè)嵯酀?jì)、比如動(dòng)感十足。既然人人都能說(shuō)出來(lái)的評(píng)價(jià)標(biāo)準(zhǔn),恐怕算不上 theories,估計(jì)可以算 techniques。徐老師無(wú)疑是大家!他也明白自己不同尋常,可是他卻沒(méi)法把自己的高才總結(jié)成一些 theories 或者 techniques,讓徒弟照著弄就能畫(huà)出一樣好看的馬。藝術(shù)家的直覺(jué)(英語(yǔ)叫 gut feeling,直譯為豬肚和肥腸的感受)只可意會(huì),不可言傳。漢語(yǔ)里的“道可道非常道”,這個(gè)道不是 principles 而是 arts。老子不是哲學(xué)家,而是藝術(shù)家啊。
有些程序員,每次碰到一個(gè)難題,其豬肚和肥腸的都會(huì)有一些感受,照著這靈感做,總是沒(méi)錯(cuò),基本就是最優(yōu)選擇。如果他不是蒙的,那么他就算一個(gè)藝術(shù)家了。
寫(xiě)作技法
寫(xiě)作雖然是最高境界 —— 藝術(shù),可惜作為一個(gè)程序員,語(yǔ)文并非我的專(zhuān)長(zhǎng),我只能算技工。我有幾條技法,類(lèi)似于欣賞徐悲鴻大師的畫(huà)的時(shí)候說(shuō)出來(lái)的那些評(píng)價(jià)標(biāo)準(zhǔn),在此分享給大家,拋磚引玉,僅供參考。如果有高人能指正,升華成 theories 甚至 principles,可謂善莫大焉,提升了當(dāng)代基礎(chǔ)教育水平。
首先,篇章結(jié)構(gòu)上講究 層層遞進(jìn)。
作為一個(gè)知識(shí)分子,應(yīng)該理解這個(gè)世界是分形的(fractal)。要說(shuō)明一個(gè)事兒,得從大面兒上先把邏輯理順。每個(gè)邏輯環(huán)節(jié)可能需要補(bǔ)充 evidence,每一層 evidence 是遞進(jìn)的一層境界。就像剝洋蔥,一層一層往里剖析。
從行文上看,一篇文章各個(gè)章節(jié)的標(biāo)題,應(yīng)該存在邏輯關(guān)系。讀者只看標(biāo)題,就能明白文章大意。如果感興趣,則看每一段的首句。這些首句連起來(lái)是遞進(jìn)的第二層,更詳盡的邏輯。如果對(duì)某一段的首句感興趣,再看其中的內(nèi)容。
其次,文法上請(qǐng)講究:環(huán)環(huán)相扣、滴水不漏。
環(huán)環(huán)相扣的意思是:相鄰兩句之間要有因果關(guān)系;相鄰兩段要有因果關(guān)系;相鄰兩節(jié)要有因果關(guān)系。因?yàn)橐蚬你暯泳褪沁壿嫛?/p>
滴水不漏的意思是:邏輯推理不可跳躍,不可以默認(rèn)讀者知道某一環(huán)節(jié)所以跳躍。如果要保持行文的精簡(jiǎn) ,應(yīng)該通過(guò)遞進(jìn)來(lái)做到,而不是跳躍。
然后,句法上講究:盡量用短句,不要長(zhǎng)句;盡量用簡(jiǎn)單句;不要從句。
相傳白居易作詩(shī)要給老婆婆們讀。反復(fù)修改到老嫗?zāi)芙?#xff0c;才發(fā)表。這倒是符合一條哲學(xué)原理,Occam's Razor,也是我的專(zhuān)欄名字。用漢語(yǔ)說(shuō)叫“刪繁就簡(jiǎn)三秋樹(shù)”。我讀書(shū)時(shí)崇拜 Bertrand Russell 的行文 —— 頗多從句,但卻無(wú)力模仿 —— 不知怎么保持每個(gè)從句如此簡(jiǎn)短,而且用從句把邏輯編制得密不透風(fēng),同時(shí)保持繁簡(jiǎn)相宜。為免邯鄲學(xué)步,還是學(xué)習(xí)白樂(lè)天老師吧。
句法的第二條技法是:一定要用主動(dòng)語(yǔ)態(tài),技術(shù)行文不可用被動(dòng)語(yǔ)態(tài);每句要有主謂賓 —— 漢語(yǔ)里被動(dòng)語(yǔ)態(tài)比比皆是,英語(yǔ)里被動(dòng)語(yǔ)態(tài)是用來(lái)表達(dá)強(qiáng)烈情緒的 —— 一個(gè)程序員怎么可以有情緒?面試官放水了吧?
最后說(shuō)詞法。規(guī)則最繁復(fù)。但是注意幾條,差不多也就覆蓋了常見(jiàn)問(wèn)題的十之七八。
章節(jié)標(biāo)題里的單詞要 capitalize。但是 and 這些詞不要 capitalize。迷迷糊糊搞不清楚的可以借助工具 https://capitalizemytitle.com/
專(zhuān)有名詞要按照作者的寫(xiě)法來(lái)寫(xiě)。沒(méi)有道理。
TensorFlow 的 F 要大寫(xiě)。Kubeflow 的 F 是小寫(xiě)。為什么 —— 沒(méi)有為什么?因?yàn)樗麄兊陌l(fā)明者一拍腦袋就這么定了。
單數(shù)名詞前要有冠詞。復(fù)數(shù)名詞前可以沒(méi)有冠詞。但是也可以有,來(lái)表示特指。
一個(gè)縮寫(xiě)在文中第一次出現(xiàn)的時(shí)候,一定要有全稱(chēng)。比如 Machine learning (ML) is like chicken ribs.
言歸正題
上文中頗多玩笑。但是寫(xiě)作是非常嚴(yán)肅的事情,是人生必備的技能。今天開(kāi)源軟件開(kāi)發(fā)成了一種新的商業(yè)模式。MySQL 曾經(jīng)是第一個(gè)開(kāi)源商業(yè)項(xiàng)目,買(mǎi)了一億美元。今天的開(kāi)源項(xiàng)目的估值百億美元者比比皆是。來(lái)自五湖四海的程序員,完全通過(guò) code review 的方式合作,創(chuàng)造了 Linux 和很多其他重塑了人類(lèi)社會(huì)形態(tài)的技術(shù)(Android、Chromebook、data centers)。在這個(gè)大教堂向大巴扎轉(zhuǎn)型的時(shí)代里,一幫老死不相往來(lái)的程序員,完全通過(guò)寫(xiě)作實(shí)現(xiàn) proposal、design docs、code review、和 issue tracking。從這個(gè)角度來(lái)說(shuō),語(yǔ)文是人類(lèi)文明之母也不為過(guò)。
歷史上每一個(gè)偉大的人類(lèi)文明的語(yǔ)文都是邏輯。中國(guó)的科舉,比的不是詩(shī)詞歌賦,而是策論。策(戰(zhàn)國(guó)策的策,也是湖南經(jīng)視著名節(jié)目越策越開(kāi)心的策)就是娓娓道來(lái),也就是上文中的“環(huán)環(huán)相扣”;論就是推理嚴(yán)謹(jǐn),也就是上文中的”滴水不漏“。詩(shī)詞歌賦小說(shuō)演義都屬于雜書(shū);不好好學(xué)習(xí)的人才看的,比如三國(guó)、水滸、西廂記、金瓶梅、金瓶梅、還有金瓶梅啦。藏傳佛教有因明學(xué)。因就是因果,明就是說(shuō)明白邏輯關(guān)系。古希臘就不用說(shuō)了,整個(gè)社會(huì)制度建立在邏輯辯論之上。我們小學(xué)時(shí)學(xué)過(guò)一個(gè)為了練習(xí)發(fā)聲,把小石子放在嘴里練習(xí)辯論的演說(shuō)家。如果不記得名字了,他叫德摩斯梯尼。小石子只是他練習(xí)的一個(gè)小環(huán)節(jié),為了具有說(shuō)服大眾的雄辯能力,他早年師從伊薩攸學(xué)習(xí)修辭,后來(lái)教授修辭學(xué)。今天的西方世界視古希臘為其文明源頭;現(xiàn)代西方民主制度仍然參照古希臘的制度建立。美國(guó)總統(tǒng)大選的路演和候選人辯論都是對(duì)德摩斯梯尼那時(shí)的規(guī)則的模仿。策論和因明是美國(guó)公立小學(xué)從學(xué)前班就開(kāi)始的教育。我娃在疫情之前每周要做一個(gè)presentation。小屁蛋兒們的小手握不住鼠標(biāo),沒(méi)法做ppt,都是手繪。疫情失學(xué)之后,她經(jīng)常無(wú)聊地爬在后院枇杷樹(shù)上和籬笆墻外遛狗的行人越策越開(kāi)心。
以上,謹(jǐn)策。祝大家開(kāi)心!
以上轉(zhuǎn)載自SQLFlow專(zhuān)欄:https://zhuanlan.zhihu.com/p/151675013。
原文鏈接:https://developer.aliyun.com/article/766797?
版權(quán)聲明:本文中所有內(nèi)容均屬于阿里云開(kāi)發(fā)者社區(qū)所有,任何媒體、網(wǎng)站或個(gè)人未經(jīng)阿里云開(kāi)發(fā)者社區(qū)協(xié)議授權(quán)不得轉(zhuǎn)載、鏈接、轉(zhuǎn)貼或以其他方式復(fù)制發(fā)布/發(fā)表。申請(qǐng)授權(quán)請(qǐng)郵件developerteam@list.alibaba-inc.com,已獲得阿里云開(kāi)發(fā)者社區(qū)協(xié)議授權(quán)的媒體、網(wǎng)站,在轉(zhuǎn)載使用時(shí)必須注明"稿件來(lái)源:阿里云開(kāi)發(fā)者社區(qū),原文作者姓名",違者本社區(qū)將依法追究責(zé)任。 如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,歡迎發(fā)送郵件至:developer2020@service.aliyun.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的支付宝研究员王益的建议:“学好语文,才能写好代码”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020年7月编程语言排行榜来喽,R编程
- 下一篇: 【趣话编程】如果张东升是个程序员