編者按:本文作者為Jeff Standen,這是一位有著21年以上經(jīng)驗(yàn)的國(guó)外軟件開(kāi)發(fā)者。如果你覺(jué)得他的經(jīng)驗(yàn)比較有益處,可以借鑒一下。

首先開(kāi)發(fā)spike解決方案 —— 這是我早期敏捷/極限編程所養(yǎng)成的習(xí)慣之一。spike解決方案是一次性原型,可以幫助你在投入大量時(shí)間和精力之前驗(yàn)證你是否走對(duì)路。
區(qū)別就在于原型,因?yàn)槟阕裱@樣一個(gè)規(guī)則,在你完成研究之后,你最終會(huì)扔掉“spike”代碼。所以允許你偷工減料,迅速行動(dòng),因?yàn)樗粫?huì)出現(xiàn)在產(chǎn)品或代碼審查中。
此方法有助于迅速發(fā)現(xiàn)設(shè)計(jì)的哪些部位尚不明確,而不必過(guò)早地嘗試架構(gòu)或設(shè)計(jì)決策。
致力于小而連貫代碼塊的版本控制 —— 通過(guò)類(lèi)似CVS/Subversion,每次提交都直接發(fā)送到服務(wù)器。做部分文件的提交并不簡(jiǎn)單。
隨著Git的出現(xiàn),只提交較大文件的若干行代碼變得很容易,并且可以在push到遠(yuǎn)程代碼倉(cāng)庫(kù)之前先本地rebase/merge提交。
有一次,我在工作于更大功能的時(shí)候,采用了小型增量提交,我的工作效率直線(xiàn)上升。這樣做能夠清空我的大腦以便于面對(duì)更重要的事情。
經(jīng)常寫(xiě)代碼 —— 最近,我正工作于:一個(gè)基于Web的企業(yè)協(xié)作和自動(dòng)化平臺(tái)(PHP / MySQL),一個(gè)基于云的實(shí)時(shí)指標(biāo)聚合器和使用循環(huán)哈希(Node.js/ Redis)的API,一個(gè)面向iOS app商店(Swift/ SpriteKit)的棋盤(pán)游戲,專(zhuān)門(mén)的基于URL的cronjob可替代基于web的SaaS服務(wù)(JAVA),等等。
用過(guò)大量框架和語(yǔ)言有助于我的抽象和算法思維。
我從工具,如Eclipse RCP、Tapestry和Hibernate中學(xué)到了很多偉大的經(jīng)驗(yàn)教訓(xùn),并用到我的PHP項(xiàng)目里。尤其是在2000年初,在有Java特征的企業(yè)生態(tài)系統(tǒng)用于PHP存在之前。我從Unity3d/C#學(xué)到了很多關(guān)于網(wǎng)絡(luò)和面向消息的架構(gòu)。
如果我只堅(jiān)持單一平臺(tái)和社區(qū)的話(huà),就永遠(yuǎn)不會(huì)知道這些概念。
編寫(xiě)簡(jiǎn)單的代碼 —— 我以前習(xí)慣于寫(xiě)復(fù)雜的代碼以作為對(duì)自己的挑戰(zhàn)。而現(xiàn)在的挑戰(zhàn)是要編寫(xiě)優(yōu)雅且簡(jiǎn)單的代碼——到一種每個(gè)人都覺(jué)得他們也能做到的地步(即使他們不能)。簡(jiǎn)單代碼通常來(lái)自于若干次復(fù)雜代碼的迭代。
引用Antoine de Saint Exupéry的話(huà)就是:“不是沒(méi)有什么可添加,而是沒(méi)有什么可消減的時(shí)候,才算是達(dá)到了完美?!?/p>
這也使得我們?cè)陂L(zhǎng)時(shí)間休止之后返回項(xiàng)目,以及鼓勵(lì)其他人參與進(jìn)來(lái)變得容易多了。
最后優(yōu)化 —— 我們很容易掉入試圖比用戶(hù)或計(jì)算機(jī)更聰明,并且預(yù)優(yōu)化各種邊緣情況的陷阱。關(guān)注帕累托法則(80%的效果來(lái)自于20%的工作)。寫(xiě)代碼,運(yùn)行代碼,當(dāng)必要的時(shí)候?qū)W⒂谧畲蟮钠款i。這也支持保持代碼庫(kù)的簡(jiǎn)單。
說(shuō)“不要首先優(yōu)化代碼”并不意味著“編寫(xiě)粗糙的代碼”。代碼總是應(yīng)該精益和優(yōu)雅,沒(méi)有必要畫(huà)蛇添足,不要將一整天的時(shí)間用在擠壓剩下的10%,但其實(shí)已經(jīng)能夠工作良好的一些東西上。不但工作效率會(huì)下降,而且還會(huì)引進(jìn)更多復(fù)雜性,解決方案變得不那么可歸納,等等。
著眼于“最重要的事情優(yōu)先”—— 總是有一些項(xiàng)目領(lǐng)域比其他的更有趣或更具挑戰(zhàn)性。工作于那些有趣的東西總是比工作于那些必要的東西更有誘惑。
在攻克重要部分時(shí),將有趣部分作為一種調(diào)劑,也就是說(shuō),兩者都做一點(diǎn)也是可以。
因此,光從這一點(diǎn)上說(shuō),將大的問(wèn)題分解成小問(wèn)題的理念是不言自明的。每個(gè)人都懂。所以,我會(huì)通過(guò)計(jì)分若干“quick wins”來(lái)開(kāi)啟我的一天,這能讓我更有沖勁和更專(zhuān)注(“quick wins”可以是任何東西,包括有趣又小型的挑戰(zhàn)),然后我會(huì)首先沖向“最重要的事情”。
了解全棧 —— 當(dāng)我剛開(kāi)始干這一行的時(shí)候,沒(méi)有什么比等別人做完他們那部分東西,然后我才能繼續(xù)我那部分工作更糟糕的了(設(shè)計(jì)師,后端人員,前端人員,數(shù)據(jù)庫(kù)人員,服務(wù)器人員,等等)。
于是,當(dāng)我2000年創(chuàng)辦自己的軟件開(kāi)發(fā)公司的時(shí)候,我做了一個(gè)明智的決定,那就是涉獵全棧。我知道我不可能擅長(zhǎng)所有東西,也不可能是最后唯一對(duì)所有一切負(fù)責(zé)的人,但我想要做終端到終端的原型,因?yàn)槲覜](méi)有耐心看過(guò)程。
每當(dāng)我需要的東西觸碰到我不懂的領(lǐng)域時(shí),我會(huì)研究它。于是乎,我學(xué)會(huì)了服務(wù)器管理,數(shù)據(jù)庫(kù)管理,設(shè)計(jì),前端/后端開(kāi)發(fā),云架構(gòu)等。
通過(guò)了解其他領(lǐng)域是做什么的,我才能寫(xiě)出包含它們需要的代碼。
當(dāng)然,其中的一些要點(diǎn)似乎并不是所謂的“小習(xí)慣”,但我向你保證,它們是小變化歷經(jīng)20年時(shí)間導(dǎo)致的結(jié)果。重要的行為變化并沒(méi)有意義,更多的是關(guān)于我是如何頻繁地練習(xí)這門(mén)技術(shù)(在過(guò)去10年時(shí)間中每年大概4000-5000個(gè)小時(shí))。
所以,我的做法更像是去回答這個(gè)問(wèn)題:“什么樣的小習(xí)慣會(huì)導(dǎo)致更糟糕的軟件和低效的生產(chǎn)力?”,然后反過(guò)來(lái)。



