Simon Brown,集開發(fā)者、架構(gòu)師及作家于一身,他認(rèn)為成功的項(xiàng)目需要的不僅僅是好代碼。在他的演講《好代碼是不夠的》中,Brown討論了項(xiàng)目成功所需的所有元素,從前期設(shè)計(jì)到操作文檔。
Brown認(rèn)為好代碼是一個(gè)好的開始,但要取得成功,人們需要知道要構(gòu)建什么、要發(fā)布什么以及它可以運(yùn)作起來。
要知道構(gòu)建什么,需要一套需求。收集完需求之后,要有一個(gè)“大局觀”,軟件架構(gòu)代表了當(dāng)前對(duì)該產(chǎn)品的認(rèn)識(shí)。然后,大問題需要被分解成更小的解決方案,其中包含了組件、組件之間的交互以及用到的服務(wù)。隨后,估計(jì)實(shí)現(xiàn)這個(gè)解決方案需要多少成本。據(jù)Brown說,所有這一切,從確定需求到做出估算,只要1-2天。這不是一個(gè)人的工作,應(yīng)該是所有直接參與的人共同完成,這樣才能群策群力。
如果做得好,一個(gè)輕量級(jí)的軟件架構(gòu)能為項(xiàng)目引入結(jié)構(gòu)——“什么是組件以及它們?nèi)绾位ハ鄿贤ā薄c指導(dǎo)方針——“源自文檔模式、模板和原則”,這能帶來一致性——“以標(biāo)準(zhǔn)的方法來解決常見問題”——與清晰性——人們能知道自己的方向,因?yàn)樗小按缶钟^”。作為一個(gè)反例,Brown提到一個(gè)項(xiàng)目,其中使用了三種持久化解決方案:Spring、EJB和Hibernate。這是因?yàn)闆]有人事先決定使用什么持久化框架。
接下來的步驟是確定優(yōu)先級(jí)。除非是一個(gè)小項(xiàng)目,否則不該試圖一步到位構(gòu)建并發(fā)布整個(gè)項(xiàng)目,而是應(yīng)該確定什么是最重要的,首先完成這部分。這需要完善并挑戰(zhàn)需求范圍,決定實(shí)現(xiàn)需求的一個(gè)子集,它足以滿足最初設(shè)想的愿景的一部分內(nèi)容。
其次是跟蹤進(jìn)度。跟蹤進(jìn)度有不同的方法,例如電子表格或看板。Brown指出,這些方法都是用來了解迭代進(jìn)行到目前為止的進(jìn)度完成情況的,它們并不跟蹤已發(fā)布的軟件。
架構(gòu)是否可以運(yùn)作起來?如果作為結(jié)果的解決方案無法如預(yù)期那樣運(yùn)作,那一切都是徒勞的。Brown認(rèn)為,對(duì)于一個(gè)可用的解決方案而言,它必須滿足以下要求:
- 它能滿足架構(gòu)需要:功能和非功能性需求、環(huán)境約束和所采用的原則
- 它為代碼提供了一個(gè)堅(jiān)實(shí)的基礎(chǔ),人們可以在此之上進(jìn)行構(gòu)建
- 它為解決解決方案中試圖描述的初始業(yè)務(wù)問題提供了一個(gè)平臺(tái)
構(gòu)建一個(gè)原型。無論架構(gòu)有多偉大,代碼看起來有多漂亮,沒人真正知道系統(tǒng)是否能令人滿意,是否可以擴(kuò)展。原型正是人們所需要的。原型是對(duì)概念的一個(gè)驗(yàn)證,包含系統(tǒng)的垂直切片、主要需求和基礎(chǔ)部分,剛好用于模擬實(shí)際運(yùn)作,通過負(fù)載測試將整個(gè)系統(tǒng)至于壓力之下。用于原型的代碼后期可用于生產(chǎn)環(huán)境,也可丟棄。
負(fù)載測試是這樣實(shí)現(xiàn)的,“模擬典型使用場景中的多個(gè)用戶,并且環(huán)境越接近生產(chǎn)越好”。原型和負(fù)載測試要在項(xiàng)目的早期階段進(jìn)行,用于驗(yàn)證架構(gòu)。
源碼控制提供了:源代碼備份、代碼變更日志、恢復(fù)到不同版本的機(jī)制、經(jīng)簡化的并行開發(fā)方式,使用源碼控制是構(gòu)建解決方案中的重要一步。
自動(dòng)化測試也是必不可少的一塊。剛加入的新代碼會(huì)破壞什么東西嗎?對(duì)項(xiàng)目某個(gè)部分的變更可能會(huì)對(duì)其他部分產(chǎn)生負(fù)面影響。為了限制變更可能造成的破壞,單元測試和集成測試是必須的,否則就要在每次變更后手動(dòng)測試整個(gè)系統(tǒng)的功能。要做多少測試呢?Brown認(rèn)為,100%的測試覆蓋率是很難做到的,非常不切實(shí)際,他建議80%,覆蓋代碼最重要的部分。
自動(dòng)化構(gòu)建。代碼經(jīng)過測試后,需要在目標(biāo)機(jī)上進(jìn)行構(gòu)建和部署。但很多時(shí)候,系統(tǒng)在其他機(jī)器上無法進(jìn)行構(gòu)建,構(gòu)建腳本需要保證該系統(tǒng)可在任意目標(biāo)機(jī)上正常構(gòu)建。
Brown認(rèn)為還有一個(gè)有用的步驟,即使用持續(xù)集成。持續(xù)集成服務(wù)器能自動(dòng)從代碼庫中獲取源代碼、編譯、測試、打包并安裝,在此過程中出現(xiàn)任何錯(cuò)誤它都會(huì)發(fā)出通知。這有助于確保代碼的正確構(gòu)建,及早發(fā)現(xiàn)問題。
自動(dòng)化測試和構(gòu)建引入了一致性和可重復(fù)性。在多代碼分支上進(jìn)行并行開發(fā)時(shí),自動(dòng)化就更加有用了。
提取配置信息。系統(tǒng)配置信息取決于環(huán)境,最好將它放在代碼之外進(jìn)行維護(hù)。
應(yīng)用程序的版本應(yīng)該包含在某處:在元數(shù)據(jù)中、在診斷頁面中、在日志文件中,這樣人們才能知道自己正在看哪個(gè)版本的程序。
最后就是操作文檔。如果開發(fā)團(tuán)隊(duì)不是支持該軟件的團(tuán)隊(duì),那么有些操作文檔是必須的,其中包含的信息涉及如何使用系統(tǒng)、如何監(jiān)控系統(tǒng)、如何管理系統(tǒng)以及有問題時(shí)如何進(jìn)行診斷。