王益,螞蟻集團研究員,開源項目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,都是手繪。疫情失學之後,她經常無聊地爬在後院枇杷樹上和籬笆牆外遛狗的行人越策越開心。
以上,謹策。祝大家開心!
以上轉載自SQLFlow專欄:
https://zhuanlan.zhihu.com/p/151675013。