測(cè)試運(yùn)行太慢

  實(shí)際上測(cè)試運(yùn)行太慢是一種信號(hào),該信號(hào)告訴我們耦合的太緊了。運(yùn)行一個(gè)測(cè)試,需要編譯加載很多模塊。如果運(yùn)行一個(gè)測(cè)試需要20分鐘,你希望頻繁的運(yùn)行測(cè)試么?如果運(yùn)行一套測(cè)試需要10個(gè)小時(shí),你希望測(cè)試多久運(yùn)行一次?測(cè)試運(yùn)行太慢是第一個(gè)被打破的窗戶,如果不趕快修補(bǔ),后面會(huì)有更多的窗戶被打破。

  測(cè)試運(yùn)行太慢,我們不會(huì)頻繁的運(yùn)行測(cè)試,測(cè)試也不能提供立即的反饋,這樣測(cè)試的作用大打折扣了。上面主要從代碼實(shí)踐方面來(lái)闡釋編碼中的破窗和如何防止破窗,其實(shí)在軟件開(kāi)發(fā)的很多方面都存在類似的情況。

  源代碼管理

  有很多團(tuán)隊(duì)因?yàn)楦鞣N各樣的原因采用了難以使用的源代碼管理工具,或者完全因?yàn)閺S商對(duì)管理層的廣告宣傳,采用了一個(gè)無(wú)比重型,好看但不中用的工具。在經(jīng)受一兩次工具的折磨之后,團(tuán)隊(duì)成員會(huì)產(chǎn)生懼怕的心理,盡量的推遲提交代碼。提交代碼需要足夠的頻繁,甚至一次有意義的重命名都可以作為一次提交,這樣在代碼復(fù)查的時(shí)候光閱讀提交代碼的注釋能演示出代碼的演化過(guò)程。而且,如果每一次成功都有保存,這樣在犯錯(cuò)的時(shí)候我們有機(jī)會(huì)后悔,我們有機(jī)會(huì)回滾到一個(gè)成功的狀態(tài)。人的大腦雖然非常聰明,但也非常易于出錯(cuò),特別是在疲勞的時(shí)候,如果我們小步前進(jìn),小步提交,我們能停在任何地方。你還記不記得那種必須到某個(gè)時(shí)候才能保存當(dāng)前狀態(tài)的電腦游戲?

  有的時(shí)候并不是工具難以使用,而是環(huán)境使然。在分布式的團(tuán)隊(duì)里,有可能網(wǎng)絡(luò)不穩(wěn)定,遠(yuǎn)程源代碼倉(cāng)庫(kù)經(jīng)常不可訪問(wèn),或者在提交代碼時(shí)需要連上VPN,然后再提交,久而久之也會(huì)讓團(tuán)隊(duì)成員懶于提交代碼。這樣我們應(yīng)該采用分布式的源代碼管理工具,比如Git。

  難以集成

  代碼寫(xiě)完了并不是開(kāi)發(fā)任務(wù)的結(jié)束。你還記不記得多少次為了集成產(chǎn)品,解決幾個(gè)模塊之間的沖突而加班加點(diǎn)。敏捷強(qiáng)調(diào)及時(shí)的反饋,持續(xù)的交付。如果集成一次產(chǎn)品需要幾天時(shí)間,我們?nèi)绾巫龅郊皶r(shí)反饋呢?如果集成太困難,大家都會(huì)懼怕集成,會(huì)盡量的避免集成,但產(chǎn)品終是要集成的,所以到了后期限的時(shí)候,大家都在加班加點(diǎn),但卻不是寫(xiě)代碼,而是為了集成。

  如果集成太困難,我們?yōu)槭裁床怀掷m(xù)的集成呢?所有團(tuán)隊(duì)成員都工作在同樣的分支上。持續(xù)集成服務(wù)器不斷的簽出新的代碼,運(yùn)行各種各樣的測(cè)試,后構(gòu)建出可用的軟件出來(lái)。只要需要,任何時(shí)候我們都可以提供可以工作的軟件。

  可視化

  可視化是管理中的鐵三角之一。很多管理人員喜歡使用各種各樣絢麗的工具繪制出絢麗的圖表。比如使用Project做出精確到天的人員計(jì)劃,使用PowerPoint做出產(chǎn)品的宏偉藍(lán)圖。好像將這些做出來(lái),然后發(fā)給大家有一種這個(gè)項(xiàng)目都在我的控制之內(nèi)的感覺(jué)一樣。其實(shí)不管怎么的軟件工具還是比不上紙和筆。軟件打開(kāi)需要時(shí)間,隨著軟件更新?lián)Q代,軟件體積越來(lái)越大,打開(kāi)一個(gè)龐大的Project文件甚至需要一兩分鐘的時(shí)間,而且文檔埋藏在電腦文件系統(tǒng)的深處。找到文檔,打開(kāi),幾分鐘已經(jīng)過(guò)去了,別看這幾分鐘,久而久之我們不想再去看這些東西了,我們以為這些東西都裝在了我們的腦中,但實(shí)際卻沒(méi)有。花了很多精力編寫(xiě)的需求文檔,后成了一紙空文,當(dāng)發(fā)現(xiàn)與需求不符的時(shí)候已經(jīng)晚了。要防止這種事情的發(fā)現(xiàn),我們不要打破第一扇窗。

  雖然到了二十一世紀(jì),豐田公司還是在很多方面采用原始的看板。軟件開(kāi)發(fā)中也是一樣,拋棄那些精美的軟件吧,將計(jì)劃,進(jìn)度,用戶故事用簡(jiǎn)單的紙和筆繪制,然后貼在開(kāi)發(fā)人員抬頭可見(jiàn)的墻上。不需要畫(huà)的多精美,因?yàn)樵骄涝讲幌肴バ薷,但軟件開(kāi)發(fā)中永恒不變的是變化,我們必須隨需而變。

  笨重的流程

  有的公司給開(kāi)發(fā)、測(cè)試、部署規(guī)定了嚴(yán)格的流程。開(kāi)發(fā)人員想將產(chǎn)品功能部署到測(cè)試環(huán)境都需要與很多相關(guān)人員交互,提交申請(qǐng)單,然后才能由專人將剛剛修改的一行代碼部署到測(cè)試環(huán)境中,進(jìn)行測(cè)試。首先不說(shuō)這個(gè)過(guò)程中有多少等待,多少浪費(fèi)。光這笨重的流程讓大家望而卻步,進(jìn)而導(dǎo)致懼怕修改,連好的改進(jìn)都會(huì)受到抵制。

  后記

  軟件開(kāi)發(fā)的方方面面像一扇扇窗戶,不要打破第一扇窗戶,打破了也要趕快去修補(bǔ),不然軟件會(huì)隨著窗戶一樣,一扇扇的被打破,慢慢的腐化下去。