編程王道,唯“慢”不破
人和人之間編程速度的差異還是很大的,有的程序猿寫代碼非常快,有的卻常常是龜速。Jeffrey Ventrella最近在一篇文章里探討了這種編程速度的差異,他是絕對的龜速派代表,來看看他對編程速度的看法:
我爸常跟我說的一句話是,慢一點(diǎn)碼,才能快點(diǎn)把程序?qū)懲辍?/p>
我在舊金山很多家互聯(lián)網(wǎng)公司工作過,現(xiàn)在已經(jīng) 52 歲了,對于程序猿這個(gè)職業(yè)來說,我的年齡算偏大的。我寫代碼的速度近乎龜速,事實(shí)上,我更像是一個(gè)會(huì)寫代碼的設(shè)計(jì)師。
以前有一次,我和一些比較年輕的程序猿一起工作,他們信奉的編程宗旨是“速度快、更迭少”。我們在同一個(gè) codebase 里合作,就像在共同煮一大鍋湯一樣。如果我們每個(gè)人都持續(xù)不間斷的貢獻(xiàn)代碼的話,未來這個(gè)工程應(yīng)該就會(huì)很美很壯觀的呈現(xiàn)出來。
但是并沒有。
問題在于,這些年輕的程序猿們在心里其實(shí)有這么一種思想,他們覺得:1、每個(gè)人都是可替代的;2、沒人應(yīng)該對某一部分的具體代碼負(fù)責(zé);3、所有人應(yīng)該都可以任意修改整個(gè)工程的代碼。
他們覺得,現(xiàn)在已經(jīng)有了github這種神器用來管理異步時(shí)間內(nèi)的代碼貢獻(xiàn),只要每個(gè)人都持之以恒的貢獻(xiàn)代碼,工程和產(chǎn)品就會(huì)順理成章的出爐了。
事實(shí)不是這樣的。編程從來就不應(yīng)該是拿工具來減少軟件開發(fā)的時(shí)間的。
編程應(yīng)該是一項(xiàng)有節(jié)奏感有韻律的運(yùn)動(dòng)。我傾向于把工程依照不同的規(guī)模和時(shí)間度量分成不同的涂層,每一個(gè)涂層再從探索、實(shí)驗(yàn)、error、臨時(shí)變量這 些細(xì)小的東西開始做起。有點(diǎn)像建設(shè)腳手架的形式。每一個(gè)涂層最終完成的時(shí)候是一段可以部署和擴(kuò)展的 implementation-ready 代碼。這種開發(fā)過程有點(diǎn)像是從策略到設(shè)計(jì)方案***到完成一棟真正的建筑。
有時(shí)候當(dāng)這棟建筑完成之后,我還會(huì)推倒重來一遍,因?yàn)槲矣X得我有更好的建筑方法。這種新的方法有時(shí)候是對的,有時(shí)候是錯(cuò)的,事實(shí)上除非真正去再做一遍,不然你永遠(yuǎn)無法知道究竟哪一種方法更好。
回到最初那鍋湯的問題:在軟件開發(fā)生態(tài)圈里,關(guān)于對整個(gè)設(shè)計(jì)流程產(chǎn)生推動(dòng)與支持的混合思考是很重要的,沒有這一部分的工作,再快的程序猿又能做出多 好的設(shè)計(jì)?很多神經(jīng)系統(tǒng)科學(xué)家相信神經(jīng)元信息的流動(dòng)在大腦的傳導(dǎo)過程中會(huì)有一個(gè)短暫的堵塞和混響,這對思維和感知會(huì)有很重要的作用。編程的設(shè)計(jì)也應(yīng)該是這 樣,需要時(shí)間。
慢速編程運(yùn)動(dòng)
慢速編程運(yùn)動(dòng)在維基百科里的解釋是這樣的:慢速編程運(yùn)動(dòng)是慢速運(yùn)動(dòng)的一部分,這是一種強(qiáng)調(diào)謹(jǐn)慎設(shè)計(jì)、高質(zhì)量代碼、軟件測試和思考的軟件開發(fā)哲學(xué),反對混雜組裝、布滿 bug 的代碼,以及過于快速的發(fā)布周期。
世界上的軟件開發(fā)團(tuán)隊(duì)都在尋找更具預(yù)測性的工程項(xiàng)目,希望能促成更多的程序員擁有可持續(xù)性的職業(yè)生涯。他們提議了一些可以切身操作的實(shí)踐方法,比如結(jié)對編程、代碼審查和代碼重構(gòu),以開發(fā)更可靠更健壯的軟件應(yīng)用。
在舊金山海灣地區(qū),風(fēng)險(xiǎn)投資支持的軟件開發(fā)正呈現(xiàn)出一種高燒般的熱度。利益正驅(qū)動(dòng)著軟件開發(fā)以一種完全不自然的不對拍的節(jié)奏感在運(yùn)動(dòng),它打亂了設(shè)計(jì)進(jìn)化(design evolution)原本應(yīng)有的周期節(jié)律和生物鐘。關(guān)于這一點(diǎn),Rushkoff在Present Shock里說得很明白了。
另一個(gè)問題在于,人們對科技越來越詭異的迷戀,以及開發(fā)人員對工具異常的狂熱。大家總在說,為什么有的軟件和應(yīng)用做得這么爛?沒錯(cuò),確實(shí)很爛。爛的原因在于,太多一味求快的程序猿在忙著建設(shè)工具,然后用這個(gè)工具去支持和適配另一個(gè)他們建好的工具,然后再用這個(gè)工具去支持和適配另另一個(gè)他們建好的工具,然后再用這個(gè)工具幫他們寫出更快的代碼。
這就是我為什么覺得軟件開發(fā)需要更多的“人”,而不是“工具”的原因。并且,這些人不僅僅只是幫忙做做外面的 UI 藝術(shù)之類的而已,應(yīng)該要有更多的人深入軟件開發(fā)的內(nèi)部——確保軟件更多的與人文產(chǎn)生共鳴和回響。
當(dāng)我們談?wù)摼幊虝r(shí),我們在談?wù)撌裁矗?/h4>
編程不是打字。
所有的程序猿都明白這一點(diǎn),但是大部分人都容易忘記這一點(diǎn)。
在電腦前噼里啪啦、彈指揮間的感覺確實(shí)很爽,這種鍵盤上啪啪啪的快感卻很容易讓人忘記編程是一項(xiàng)腦力活動(dòng),而不是體力勞動(dòng)。編程的真正奧義在于,把人類的思維、設(shè)計(jì)、語言、邏輯和精神創(chuàng)造以一種計(jì)算機(jī)可以識(shí)別和儲(chǔ)存的方式記錄下來。
我妻子有時(shí)會(huì)跑到院子里問我,你在編程嗎?我說,對,我在編程。事實(shí)上我可能正拿著鉗子修剪花盆里的花草,或者做做施化肥之類的事情。
植物、土壤、鉗子,這些都是編程的好工具,正如鍵盤、鼠標(biāo)和雙屏幕一樣。
目前,我們正在經(jīng)歷一個(gè)經(jīng)濟(jì)產(chǎn)業(yè)的轉(zhuǎn)型期,從新興到可持續(xù)發(fā)展之間的一次過渡。新的軟件產(chǎn)品和商業(yè)模式是需要發(fā)展,但為了互聯(lián)網(wǎng)行業(yè)發(fā)展的可持續(xù) 性,這種速度應(yīng)該降下來一些了。擼代碼不僅僅只是在擼當(dāng)下用戶的需求,擼的更是未來某個(gè)行業(yè)領(lǐng)域的架構(gòu)基礎(chǔ)。代碼應(yīng)該在程序員的關(guān)愛下慢慢的、茁壯的成 長。Like good wine。Like a baby。