寫直白的代碼
發(fā)布時間: 2018-11-20
為開源項(xiàng)目作貢獻(xiàn)最好的方式是為它減少代碼,我們應(yīng)致力于寫出讓新手程序員無需注釋就容易理解的代碼,讓維護(hù)者也無需花費(fèi)太多精力就能著手維護(hù)。
在學(xué)生時代,我們會更多地用復(fù)雜巧妙的技術(shù)去挑戰(zhàn)新的難題。首先我們會學(xué)習(xí)循環(huán),然后是函數(shù)啊,類啊,等等。當(dāng)我們到達(dá)一定高的程度,能用更高級的技術(shù)寫更長的程序,我們會因此受到稱贊。此刻我們發(fā)現(xiàn)老司機(jī)們用 monads 而新手們用 loop 作循環(huán)。
之后我們畢業(yè)找了工作,或者和他人合作開源項(xiàng)目。我們用在學(xué)校里學(xué)到的各種炫技尋求并驕傲地給出解決方案的代碼實(shí)現(xiàn)。
我們實(shí)現(xiàn)了某個小的功能,并以充分的理由覺得自己做到了?,F(xiàn)實(shí)項(xiàng)目中的編程卻不是針對某某部分的功能而言。以我個人的經(jīng)驗(yàn)而言,以前我很開心的去寫代碼,并驕傲地向世界展示我所知道的事情。有例為證,作為對某種編程技術(shù)的偏愛,這是用另一種元編程語言構(gòu)建的一個 線性代數(shù)語言[1],注意,這么多年以來一直沒人愿意碰它。
在維護(hù)了更多的代碼后,我的觀點(diǎn)發(fā)生了變化。
1. 我們不應(yīng)去刻意探求如何構(gòu)建軟件。軟件是我們?yōu)榻鉀Q問題所付出的代價(jià),那才是我們真實(shí)的目的。我們應(yīng)努力為了解決問題而構(gòu)建較小的軟件。2. 我們應(yīng)使用盡可能簡單的技術(shù),那么更多的人就越可能會使用,并且無需理解我們所知的高級技術(shù)就能擴(kuò)展軟件的功能。當(dāng)然,在我們不知道如何使用簡單技術(shù)去實(shí)現(xiàn)時,我們也可以使用高級技術(shù)。所有的這些例子都不是聽來的故事。我遇到的大部分人會認(rèn)同某些部分,但不知為什么,當(dāng)我們向一個新項(xiàng)目貢獻(xiàn)代碼時又會忘掉這個初衷。直覺里用復(fù)雜技術(shù)去構(gòu)建的念頭往往會占據(jù)上風(fēng)。
軟件是種投入
你寫的每行代碼都要花費(fèi)人力。寫代碼當(dāng)然是需要時間的,也許你會認(rèn)為只是你個人在奉獻(xiàn),然而這些代碼在被審閱的時候也需要花時間理解,對于未來維護(hù)和開發(fā)人員來說,他們在維護(hù)和修改代碼時同樣要花費(fèi)時間。否則他們完全可以用這時間出去曬曬太陽,或者陪伴家人。
所以,當(dāng)你向某個項(xiàng)目貢獻(xiàn)代碼時,請心懷謙恭。就像是,你正和你的家人進(jìn)餐時,餐桌上卻沒有足夠的食物,你只索取你所需的部分,別人對你的自我約束將肅然起敬。以更少的代碼去解決問題是很難的,你肩負(fù)重任的同時自然減輕了別人的重負(fù)。
技術(shù)越復(fù)雜越難維護(hù)
作為學(xué)生,逐漸使用技術(shù)證明了自己的價(jià)值。這體現(xiàn)在,首先我們有能力在開源項(xiàng)目中使用函數(shù),接著是類,然后是高階函數(shù),monads 等等。我們向同行顯示自己的解決方案時,常因自己所用技術(shù)高低而感到自豪或卑微。
而在現(xiàn)實(shí)中,和團(tuán)隊(duì)去解決問題時,情況發(fā)生了逆轉(zhuǎn)。現(xiàn)在,我們致力于盡可能使用簡單的代碼去解決問題。簡單方式解決問題使新手程序員能夠以此擴(kuò)展并解決其他問題。簡單的代碼讓別人容易上手,效果立竿見影。我們藉以只用簡單的技術(shù)去解決難題,從而展示自己的價(jià)值。
如果你是個好的程序員,你不需要證明你知道很多炫技。相應(yīng)的,你可以通過用一個簡單的方法解決一個問題來顯示你的價(jià)值,并激發(fā)你的團(tuán)隊(duì)在未來的時間里去完善它。
當(dāng)然,也請保持節(jié)制
話雖如此,過于遵循 “用簡單的工具去構(gòu)建” 的教條也會降低生產(chǎn)力。通常用遞歸會比用循環(huán)解決問題更簡單,用類或 monad 才是正確的途徑。還有兩種情況另當(dāng)別論,一是只是只為滿足自我而創(chuàng)建的系統(tǒng),或者是別人毫無構(gòu)建經(jīng)驗(yàn)的系統(tǒng)。
上一篇: 2018 重溫 Unix 哲學(xué)