支付寶研究員王益的建議:“學好語文,才能寫好代碼”

簡介:王益,螞蟻集團研究員,資深程序員,從10歲開始寫代碼。高中自學了大學所有計算機課程,參加計算機水平測試,先後獲得了“程序員”、“高級程序員”、“系統分析員”認證……清華博士畢業,王益“縱橫”於美國硅谷和國內,在全球多家互聯網巨頭工作,2008年獲得“Google APAC Innovation Award”稱號。

王益,螞蟻集團研究員,資深程序員,從10歲開始寫代碼。初中畢業,王益就用“中華學習機”和自己焊接的電路板,把自家的老式“威力牌”雙筒洗衣機改造成了自動洗衣機;還用Apple BASIC語言和6502彙編混合編程寫了人生中第一個遊戲;高中自學了大學所有計算機課程,參加計算機水平測試,先後獲得了“程序員”、“高級程序員”、“系統分析員”認證……清華博士畢業,王益“縱橫”於美國硅谷和國內,在全球多家互聯網巨頭工作,2008年獲得“Google APAC Innovation Award”稱號。


原文鏈接:

https://developer.aliyun.com/article/766797?utm_content=g_1000150554


image.png

王益還是知名開源項目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,都是手繪。疫情失學之後,她經常無聊地爬在後院枇杷樹上和籬笆牆外遛狗的行人越策越開心。

以上,謹策。祝大家開心!

以上轉載自SQLFlow專欄:https://zhuanlan.zhihu.com/p/151675013

原文鏈接:https://developer.aliyun.com/article/766797?

版權聲明:本文中所有內容均屬於阿里雲開發者社區所有,任何媒體、網站或個人未經阿里雲開發者社區協議授權不得轉載、鏈接、轉貼或以其他方式複製發佈/發表。申請授權請郵件[email protected],已獲得阿里雲開發者社區協議授權的媒體、網站,在轉載使用時必須註明"稿件來源:阿里雲開發者社區,原文作者姓名",違者本社區將依法追究責任。 如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至:[email protected] 進行舉報,並提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章