好久沒有寫博客,一方面因?yàn)楣ぷ魈Γ硪环矫媸且驗(yàn)闆]有發(fā)現(xiàn)什么好寫的。可是后來發(fā)現(xiàn)沒什么好寫的原因其實(shí)也是因?yàn)楣ぷ魈α恕CΦ貌徽#詻]有很多時(shí)間和精力來研究和欣賞自己喜歡的東西了。
我在一家叫做 Coverity 的公司工作,我住在三藩市(San Francisco)。Coverity 是一個(gè)奇怪的公司,三藩市是一個(gè)奇怪的城市。
Coverity 制造一種叫做“靜態(tài)分析”(static analysis)的軟件。這種軟件可以在不運(yùn)行程序的情況下,經(jīng)過對(duì)代碼的分析,自動(dòng)的找到程序里面可能出現(xiàn)的問題。這有點(diǎn)像我之前給 Google 做的那個(gè) Python 分析器,只不過針對(duì)另外的語言(C,C++ 和 Java 等),分析的側(cè)重點(diǎn)不同,能處理代碼的規(guī)模也貌似大一些。還有就是這么多年了,久經(jīng)沙場(chǎng)考驗(yàn)了。
Coverity 具有世界上最先進(jìn)的一些技術(shù),所以麻雀雖小,卻讓很多人離不開它。恐怕很少有人知道,這小小的公司的忠實(shí)客戶,包括了一系列的大拿:美國宇航局, 波音, 洛克希德馬丁,雷神(Raytheon),BAE Systems,豐田,歐洲原子能中心(CERN)…… 貌似幾乎所有對(duì)代碼質(zhì)量不敢有絲毫差錯(cuò),又不得不用像 C++ 這樣毛病眾多的語言的公司,都購買了 Coverity 的產(chǎn)品。比如最近的火星好奇者號(hào)上的所有200多萬行代碼,都經(jīng)過了 Coverity 的靜態(tài)分析。當(dāng)然,如此精密的設(shè)備不可能光靠 Coverity 查一下錯(cuò)就能確保萬無一失,它必須依靠很多其它的技術(shù),但 Coverity 確實(shí)是這些東西的開發(fā)過程里面比較重要的部分。
我必須承認(rèn),Coverity 給了我足夠的啟發(fā),甚至間接的讓我發(fā)現(xiàn)了自己之前做的 Python 靜態(tài)分析里面存在的一些問題。Coverity 的產(chǎn)品在大規(guī)模的代碼上面的成功,也讓我意識(shí)到了自己在 Python 分析器里的一些突發(fā)奇想的設(shè)計(jì)的正確性和價(jià)值。如果我現(xiàn)在做一個(gè)新的 Python 分析器,它將比原來的精確和高效(也可以推廣到其它語言比如 JavaScript)。我也清楚的看到,Coverity 自發(fā)研制的一些“不大嚴(yán)謹(jǐn)”的做法,其實(shí)比程序語言領(lǐng)域里面一些看似高深的“邏輯”還要“正確”。這些微妙的“提示信息”,讓我把多個(gè)領(lǐng)域的知識(shí)串通了起來。所以我覺得跟這公司還有點(diǎn)臭味相投,加入 Coverity 也是不枉此行的。
然而我也發(fā)現(xiàn),Coverity 缺少我擁有的程序語言理論知識(shí)。絕大部分的 Coverity 工程師沒有系統(tǒng)的學(xué)習(xí)過 lambda calculus 和函數(shù)式編程。在我的 Python 分析器中,其實(shí)包含了 Coverity 還沒有的技術(shù)。Python 的靜態(tài)分析本來就比 C++ 和 Java 之類的難,然而我的實(shí)現(xiàn)卻異常的簡(jiǎn)單。這些微妙的技術(shù),貌似很多人都可以說他“會(huì)做”,但是他們卻很難把它做對(duì)。這就像“CPS 轉(zhuǎn)換”一樣,很多人都說他會(huì)做,可是真正做對(duì)的只有極少數(shù)人(我是其中之一)。這些技術(shù)源自于我對(duì)程序語言本質(zhì)的理解,源自于 Dan Friedman, Kent Dybvig 和 Amr Sabry 等老師的教誨,也源自于我自己辛勤的實(shí)驗(yàn),實(shí)驗(yàn),再實(shí)驗(yàn)…… 在我簡(jiǎn)短而優(yōu)雅的代碼中,包含了許多人需要花費(fèi)好幾倍的代碼長(zhǎng)度才能達(dá)到的目標(biāo)。所以雖然 Coverity 的工程師們技術(shù)實(shí)力很強(qiáng),但在代碼的簡(jiǎn)單程度和對(duì)程序語言語義的理解上,真的很難達(dá)到我的程度。
這就是為什么我經(jīng)常能夠一眼就看出 Coverity 產(chǎn)品里存在的問題,并且很快的修正錯(cuò)誤。舉一個(gè)簡(jiǎn)單的例子,有一天我修改了一行代碼,使得產(chǎn)品在某些 benchmark 上的內(nèi)存使用量減少了一半。我為什么可以做到這一點(diǎn)呢?因?yàn)樵谖业?Python 分析器里,這個(gè)問題是從一開頭就不存在的。它源自于一種幼稚的解釋器寫法,有點(diǎn)像 GoF 的《Design Patterns》里的那種。Coverity 的代碼里面有好些類似的問題,都是我自己根本不可能犯的錯(cuò)誤,我都沒有機(jī)會(huì)給他們改進(jìn)。我不是想貶低同事們的水平,他們都是 Stanford, Berkeley 等學(xué)校畢業(yè)的高手,可是我也很清楚自己的技術(shù)地位。
所以我就經(jīng)常發(fā)現(xiàn)這樣的麻煩事:我順手改掉了一個(gè)自認(rèn)為很顯然的問題,或者一個(gè)我根本不會(huì)犯的錯(cuò)誤,然后就發(fā)現(xiàn)有大批的測(cè)試需要被修改,我也會(huì)被要求寫出“regression test”,用以防止同樣的錯(cuò)誤再次發(fā)生。某些同事對(duì)于測(cè)試的戰(zhàn)戰(zhàn)兢兢的態(tài)度,其實(shí)跟我當(dāng)年在 Google 實(shí)習(xí)的時(shí)候沒有什么兩樣。看到這里的問題了嗎?這些我“根本”不會(huì)犯的錯(cuò)誤,幾分鐘時(shí)間順手就改掉了,但是我卻要花成天的工夫去修改和創(chuàng)建測(cè)試,防止它“再次”發(fā)生。我不得不說,在這些測(cè)試上所花費(fèi)的工夫,占用了比我修改代碼多好幾倍,甚至幾十倍的工夫!
想想這六個(gè)月以來我干了些什么,再比較一下在 Google 實(shí)習(xí)的那六個(gè)月獨(dú)自從頭做出來的東西,我發(fā)現(xiàn)自己簡(jiǎn)直什么也沒有干。這就是我不喜歡“測(cè)試驅(qū)動(dòng)開發(fā)”(TDD)的原因。在 Google 的六個(gè)月里,我無視同事對(duì)于測(cè)試的要求,從無到有的做出了如此精密的系統(tǒng),一個(gè)測(cè)試都沒有寫照樣做得好,為什么呢?因?yàn)槲业拇a非常的簡(jiǎn)單清晰,我隨時(shí)都可以把它們完整的呈現(xiàn)在頭腦里面,從而讓“心靈之眼”可以看到可能出現(xiàn)的錯(cuò)誤。也許這就是所謂的“邏輯思維”。
對(duì)測(cè)試過分依賴的人,往往不具有這樣的思維能力。他們不能夠看到代碼最簡(jiǎn)單的本質(zhì),所以需要做很多試探,以求達(dá)到“近似解”。為了不至于偏差很多,就寫很多測(cè)試,用以捕捉和防止每一次的錯(cuò)誤。這就像一個(gè)初學(xué)畫畫的人,一點(diǎn)一點(diǎn)的描,用橡皮反復(fù)的擦,可總也抓不住事物的精髓。這些人對(duì)“錯(cuò)誤”的記憶能力特別強(qiáng),往往深入的追究一塊代碼是“如何”錯(cuò)的,“為什么”是錯(cuò)的,下次如何才能不犯同樣的錯(cuò)誤。
然而我卻沒法記住之前的代碼是如何錯(cuò)的,我也不想知道為什么它是錯(cuò)的,我只記得“正確”的代碼是什么樣子。錯(cuò)誤的方式有千萬種,可是正確的卻往往只有一個(gè)。把腦力浪費(fèi)在記憶錯(cuò)誤的東西,這就是為什么很多人不能寫出真正優(yōu)美而正確的代碼。我受到的訓(xùn)練讓我可以直接得到正確的結(jié)果,所以測(cè)試對(duì)于我來說分量沒有那么重。當(dāng)我的代碼需要大量的測(cè)試才能確保正確的時(shí)候,那就是它該被推翻重寫的時(shí)候。所以我的代碼往往沒有任何補(bǔ)丁和變通,可以說是無懈可擊。這就像是一個(gè)真正會(huì)畫畫的人,他閉目沉思,然后一氣呵成。當(dāng)然,優(yōu)美的代碼并不是一蹴而就的,有的代碼被我推翻重來幾十次才最后成功,但我最后的代碼不留下絲毫錯(cuò)誤的痕跡。所以我覺得,看一個(gè)程序員的水平,不要看他留下來多少行代碼,而要看他刪掉了多少行。
我覺得做 Coverity 的工程師真累。這種累不止在于以上的技術(shù)層面的繁瑣,而且在于管理層對(duì)工程師的缺乏尊重以及不必要的壓力。這讓我在受到了足夠的“啟發(fā)”之后,開始懷疑是否還有繼續(xù)為它工作的價(jià)值。對(duì)于公司管理,以及對(duì)于 IT 行業(yè)總體的看法,我還是以后再講吧。
-
Google
+關(guān)注
關(guān)注
5文章
1763瀏覽量
57522 -
工程師
+關(guān)注
關(guān)注
59文章
1570瀏覽量
68514 -
代碼
+關(guān)注
關(guān)注
30文章
4787瀏覽量
68589
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論