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