“描述一個事物,唯有一個名詞定義它的概念,唯有一個動詞揭露它的行為,唯有一個形容詞表現它的特徵。要做的,就是用心去尋找那個名詞、那個動詞、那個形容詞……”
—— 福樓拜 (Gustave Flaubert)
我想講個故事。
很久很久以前(一般講故事都是這樣開頭吧), 兩個老工程師在一起聊天,談各自生涯中最自豪的工程。其中一個先講述了他的傑作:
“ 我們建造的橋,橫跨一個峽谷,峽谷很寬很深。我們花了兩年時間研究地質,選擇材料。聘請了最好的工程師團隊來設計方案,而這又花了五年時間。 我們簽下了最大的工程隊,委託他們建造基礎結構、塔墩、收費亭,以及用於連線橋樑和高速公路的道路。橋面下層是鐵路,我們甚至還修了自行車道。 那座橋花費了我數年的心血。”
另外一個聽完之後,陷入了沉思,過了一會兒,說到:
“ 有一天晚上,我和一個朋友喝了點伏特加,然後我倆扔了一根繩子,越過一個河谷。呃…… 就是一根繩子,兩頭系在兩顆樹上。 河谷兩邊各有一個村莊,起初,有人加了個滑輪,用來傳遞包裹。然後,有人拉起了第二根繩子,勉強可以走走,雖然很危險,但小夥子們很喜歡。 後來,一群人重新修建了一下,使得更牢固。於是,女人們也開始從上面走,每天帶著她們的農產品過橋。 就這樣,在橋的另一邊形成了一個市場。因為地方開闊,造了很多房子,慢慢地發展成了一個鎮子。 繩索橋被木橋替代,這樣就可以走馬車了。 後來,鎮上的人們修了一座真正的石橋。再然後,人們又把石料改成了鋼材。 如今,那座鋼構懸索橋依然佇立在那裡。”
前一個工程師沉默良久,說到:“ 有意思。我那座橋建成大約十年後,被拆除了。事實證明我們選錯了地點,建好的橋沒人用。據說有幾個野路子的傢伙,在下游幾英里處,拉了一根繩子,所有人都從那走。”
金門大橋(舊金山)
我很喜歡這個故事。故事的出處,在一款訊息佇列產品—— ZeroMQ 的官方指南第6章裡。
說完故事,我想聊聊軟體開發中,常常可以聽到的一個概念 —— Best Practice :最佳實踐。Wikipedia 上對其解釋為:
A best practice is a method or technique that has been generally accepted as superior to any alternatives because it produces results that are superior to those achieved by other means or because it has become a standard way of doing things.
(最佳實踐是一種:因其產生的結果優於其它選擇下的結果,或其已經成為一種做事的標準,從而被普遍認可優於任何替代方案的方法或技術。)
這個概念源於管理學,然後在 IT 界氾濫。簡而言之,就是所謂“正確的做法”。
最佳實踐本身是美好的存在,猶如夜空中的一輪明月,照亮黑暗中的方向,指引著摸索前行的凡人。
但凡事有度,子曰:“過猶不及。”
我今天想說的,就是這月亮的背面。(傳說中,月球背面隱藏著…… 噓~)
潮汐鎖定導致月球永遠以同一面朝向地球
首先,最佳實踐容易帶來思想包袱,讓人無法專注於解決問題本身。
總是希望採用最好的技術方法,不願意在不正確的做法上浪費時間,導致瞻前顧後,甚至裹足不前。此時的最佳實踐,已然成為了一種毒藥,一旦偏離了問題本身這個出發點,就會不知不覺走進“巨集大構想”的思維陷阱。把簡單的問題複雜化,阻礙了邁出第一步,直到能規劃出“包羅永珍”的解決方案後才肯動手,拖延症就這樣來了,時間卻走了。
你想好了未來每一天怎麼過嗎…… 沒想好? 那……不活了?
其次,對最佳實踐的執念容易讓人鑽牛角尖,將目標的重心帶偏。
過度關注實施過程是否符合標準化,忽視了專案中其它重要的東西,比如使用者體驗,比如實際需求。就像故事裡講的那樣:第一座大橋,幾乎是教科書般的標準化路數,可產品落地後和客戶需求卻差了好幾英里;第二個看上去很野路子,但精準地解決了痛點,從始自終都是緊緊圍繞實際需求迭代,每一次的進步都可以產生效用,這才叫殺手級應用。
這讓我想起了 Plan-9 的傳說。
你聽說過 Plan-9 OS 嗎? 一款由貝爾實驗室的極客們打造的用於完善 UNIX 不足的作業系統。什麼不足?在 UNIX 的哲學中,有一條叫做 “一切皆檔案” ,但實際上UNIX本身並沒有嚴格遵從這一條。於是,Plan-9 OS 完美實現了這一點。然後呢……? 沒有然後了。它從沒進過市場,所以如果你沒聽說過它,一點也不奇怪。Plan-9 OS 沒有解決任何現實問題,沒人在乎 “一切皆不皆檔案”。
這種執念的另一種表現就是工程師思維,沉迷於奇技淫巧中無法自拔,程式設計師尤其容易中招。
比如效能優化。“優秀的程式設計師應該榨乾每一位元組記憶體”,聽起來很熟悉,不是嗎?但經濟學上來講,邊際效應決定了一次專案中,越優化價效比越低。有一個很容易被忽略的事實:硬體其實比程式設計師要便宜。
再比如對設計模式的崇拜。設計模式當然是好東西,但如果像強迫症一樣使用它們,堅持用上它們才是正確的程式設計,就會導致按圖索驥,強行讓問題去適應設計模式,而不是讓解決方案針對問題,這就本末倒置了。
我有個基友,C++ 極客。畢業後入了騰訊,積累了鉅額財富後,自己創業了。當然,當老闆可比寫 C++ 難多了,於是現在又去積累鉅額財富了。想當年和那廝聊天,言必出設計模式,沒事侃正則,再沒事就研究 GC 策略 (好像玩 C++ 的普遍這德性) 。前不久看他程式碼,差點沒認出來,這傢伙畫風一轉,現在連線口都懶得多用(估計看到這,某些狂熱分子肯定在破口大罵:你什麼意思,你說你沒用面向介面程式設計?)那位兄臺甚至都懶得多聊,輕描淡寫來一句,“沒心思,以後有需要再加。”
順便扯一句,那哥們最近負責開發一款手遊,他跟老闆彙報的時候,預估的研發週期要12個月,然後老闆跟他說:“好,12月出公測。” (哈~ 估計他肯定舌頭打結把“12個月”說成了“12月”)。看到這的你,是否回憶起了你的老闆?
這也是我接下來想說的關於最佳實踐的另一個問題:專案實施。
工作數年,大小專案經歷若干,慢慢體會到,一個專案的開發順利與否,並不在於技術選型是否為最佳實踐,更多的時候,取決於開發方案和技術儲備之間的平衡。做專案畢竟是要講方案落地的,如果最佳實踐中的技術成本,超出了開發者的落實能力,那就是坑,這時盲從最佳實踐無異於挖墳。如果是一個人的專案,抽時間惡補一通,興許能填填坑,這取決於IQ。但要是一個團隊,那就不是什麼 IQ,EQ,QQ 的問題了,這中間產生的學習成本,集體培訓成本,反覆溝通成本,大量的初級錯誤,千奇百怪的程式碼,互相沖突引發的焦躁情緒,等等。這些負面的東西如果不能妥善的處理,足以抵消掉最佳實踐帶來的好處。別忘了,deadline 正在迫近。
我自己曾經在一個專案組裡,強行推行 Git 做原始碼管理,當時組裡共9人,有7人只會 SVN,但我堅持 Git 是 “最佳實踐”。要不說年少無知少不更事呢,罷了,後來的事情我不想回憶了…… 那次專案之後,我再也不在一群只會 SVN 的隊伍裡提 Git 了。
一個人做軟體已經很難,比這更難的,是一群人做軟體。
當塵埃落定,驀然回首,最佳實踐很可能沒你想象中那麼重要。它更多的是一種精神層面的求道,並非物質世界的必要。
祖克伯 ( Mark Zuckerberg ) 於2004年在哈佛柯克蘭公寓 ( Kirkland House ) 裡寫出 TheFacebook 的時候 ( 次年更名為Facebook ) ,用的是 “世界上最好的程式語言” PHP。這門可能是業界被吐槽次數最多的語言一直支撐著FB帝國的誕生,直到席捲全球。Stack Overflow 的聯合創始人 Jeff Atwood 曾公開揶揄 Facebook 是一家 “召集全球頂級程式設計師在 Windows XP 上寫 PHP ” 的公司。但這無所謂,24年前的馬克也不糾結。一直等到需要的時候 (2010年),Facebook自己動手研發了一個程式語言 —— Hack,來解決 PHP 帶來的危機。
《社交網路》
最佳實踐,關鍵在時機(Timing)。
如果說用 Facebook 這個 “根本不存在” 的網站來舉例,純屬虛構的話,那我們來說點真實的例子,Web 技術的基石——HTML。由20世紀最重要的100人之一的 Tim Berners-Lee 創造的 HTML,其發明之偉大,足以單獨開篇博文來讚美了,這裡就不贅述了。
這樣一個造福全人類的神作,本身的設計結構絕非完美,甚至可以用混亂不堪來形容。沒有嚴格統一的約束,形同虛設的規範,標準化程式的難產。以至於在很長一段時間內,連自身元素的定義,都可以向瀏覽器廠商妥協。但是,種種被人詬病的存在,絲毫不影響 HTML 改變世界的腳步。你我今天能相會於園,皆仰賴它的誕生。
同樣的例子還發生在 Web 世界另一個巨擎上——JavaScript。當今世界,Web 前端技術已經水銀瀉地般肆虐整個開發界,前端框架百花齊放、JS 衍生品鱗次櫛比。所有這一切的背後,全都源於上世紀90年代橫空出世的 JavaScript。
那麼,JavaScript是最佳實踐嗎?
別逗了,如果有什麼語言可以和剛才說到的 PHP 競爭一下誰被罵的次數更多,那非 JavaScript 莫屬。這個僅花了十天設計出來的語言,打一出身就被貼上了怪胎的標籤。混亂的標準,多樣的實現,安全漏洞,語法隨意,反人類…… 總之,JavaScript 和最佳實踐半毛錢關係都扯不上,但它卻是撐起當今網際網路半壁江山的擎天柱。
所以,用最接地氣地話來說,不管黑貓白貓,逮著耗子就是最佳實踐貓。
彼之蜜糖,吾之砒霜。所謂最佳實踐,其定義本身往往也是分歧的源頭。什麼是最佳?這個最佳是獨一無二的嗎?世界上有很多很多現實問題,可能根本就沒有所謂的最佳實踐。
請聽題,世界上最好的程式語言是哪個?
第二題,世界上最好的文字編輯器是哪個?
朋友,這天還聊得下去嗎……
最後,說一個我自己的故事。
很久很久以前,為了找一款滿意的文字編輯器,我幹了一件可能是前無古人,後不知道有沒有來者的蠢事 —— 我開啟 Wikipedia,搜尋 “ text editor ” ,然後轉到一個叫做 “ List of text editors ” 的頁面,接下來的一個月,我幾乎把當時那個頁面上,所有我能下載安裝的文字編輯器,全部試用了一遍……
嗯?你問我為什麼這麼做?呵呵,不把全世界的文字編輯器遍歷一遍,我怎麼知道哪個是最好的?
這事細節我不想再提了,我也不想回憶了。要不說年少無知少不更事呢,時至今日,我想不出比這更愚蠢的事了。WTF~~
這個頁面上的表格行數逐年增多
如今,再有人問我最好的程式語言或者最好的文字編輯器的問題的話,我會說:
“朋友,要打架嗎?”
這兩個問題的最佳實踐,唯有暴力。