黃翔
摘 要:一般情況下,只有親身參與過(guò)大項(xiàng)目的開(kāi)發(fā),經(jīng)歷過(guò)大團(tuán)隊(duì),才能感受為什么軟件工程很重要,又很難做對(duì)。軟件開(kāi)發(fā)有一個(gè)難題,叫做“擴(kuò)展”(scaling),即怎樣服務(wù)更多的用戶,并發(fā)用戶數(shù)上升一個(gè)數(shù)量級(jí),軟件就必須重構(gòu),大量問(wèn)題隨之產(chǎn)生。本文利用軟件工程的思維研究、如何擴(kuò)展軟件和團(tuán)隊(duì),適應(yīng)大項(xiàng)目的需要,對(duì)大項(xiàng)目的困境做出分析研究并提出相應(yīng)解決方法。
關(guān)鍵詞:軟件工程;代碼解耦;團(tuán)隊(duì)解耦
一、引言
大項(xiàng)目的技術(shù)難度高,管理難度更高,而且大團(tuán)隊(duì)的生產(chǎn)率往往很低,行動(dòng)緩慢。
只有親身參與過(guò)大項(xiàng)目的開(kāi)發(fā),經(jīng)歷過(guò)大團(tuán)隊(duì),才能感受為什么軟件工程很重要,又很難做對(duì)。
軟件開(kāi)發(fā)有一個(gè)難題,即擴(kuò)展,怎么樣服務(wù)更多的用戶,10000個(gè)并發(fā)用戶,跟有10個(gè)并發(fā)用戶,這是完全不同的概念,哪怕功能完全相同,背后的實(shí)現(xiàn)是完全不一樣的。并發(fā)用戶數(shù)上升一個(gè)數(shù)量級(jí),軟件就必須重構(gòu),大量問(wèn)題隨之產(chǎn)生。
二、大項(xiàng)目的困境分析
一個(gè)典型的大型軟件項(xiàng)目,開(kāi)發(fā)過(guò)程通常是最開(kāi)始的時(shí)候,它是一個(gè)小項(xiàng)目,開(kāi)發(fā)人員就是兩三個(gè)人,甚至可能只有一個(gè)人。產(chǎn)品比較簡(jiǎn)單,功能很有限。第一版發(fā)布后,拿給客戶使用,反響不錯(cuò)??蛻粢蟮男鹿δ埽軌蚝芸扉_(kāi)發(fā)出來(lái),Bug 修補(bǔ)也很快,因?yàn)樵缙诳蛻敉梢耘c開(kāi)發(fā)人員直接溝通,快速反饋。
公司于是決定投入更多人員,開(kāi)發(fā)這個(gè)項(xiàng)目。團(tuán)隊(duì)慢慢變大了,軟件開(kāi)始變得復(fù)雜,開(kāi)發(fā)速度逐漸變慢了,2.0 版花費(fèi)的時(shí)間比預(yù)期要長(zhǎng)一點(diǎn)。Bug 的修復(fù)難度開(kāi)始增加。總之,新功能的開(kāi)發(fā)日程變久了。
公司的自然反應(yīng)是進(jìn)一步擴(kuò)充團(tuán)隊(duì)。但是更多的新成員其實(shí)會(huì)降低其他人的生產(chǎn)率,一個(gè)普遍現(xiàn)象是團(tuán)隊(duì)規(guī)模越大,每個(gè)人的平均生產(chǎn)率越低。
幾年以后,代碼逐漸老化,復(fù)雜性不斷增加,項(xiàng)目開(kāi)始停滯不前,最終這個(gè)項(xiàng)目成為技術(shù)債務(wù),等待被新項(xiàng)目替換。
產(chǎn)生上述困境的其根本原因有兩個(gè),其一就是代碼復(fù)雜度,隨著代碼量的增長(zhǎng),單個(gè)開(kāi)發(fā)者想要理解整個(gè)代碼庫(kù),變得越來(lái)越困難,不真正理解系統(tǒng),過(guò)時(shí)的代碼開(kāi)始累積,技術(shù)債務(wù)就這樣出現(xiàn)了。其二就是團(tuán)隊(duì)問(wèn)題,隨著團(tuán)隊(duì)成員的增加,交流成本開(kāi)始指數(shù)式上升。如果整個(gè)團(tuán)隊(duì)有 n 個(gè)程序員,為了了解其他人的工作,你需要跟 n - 1 個(gè)人逐一交流,那么整個(gè)團(tuán)隊(duì)的交流路徑總數(shù)就是 n * (n - 1) / 2。這意味著,交流成本的增長(zhǎng)速度是人員增長(zhǎng)速度的平方,團(tuán)隊(duì)人數(shù)越多,協(xié)同的難度就越大。不管怎么做,大型組織都很難保持所有成員的積極參與。
三、軟件工程的解決辦法
大項(xiàng)目的開(kāi)發(fā)效率不高根本原因是軟件規(guī)模的增長(zhǎng),必然使得代碼和團(tuán)隊(duì)變得笨重。解決這個(gè)問(wèn)題就需要從代碼和團(tuán)隊(duì)兩方面去解決。
從軟件工程的角度進(jìn)行代碼解耦,將軟件解耦,拆分成組件或者模塊,防止各個(gè)部分緊密地耦合在一起。每個(gè)組件和模塊,都可以獨(dú)立開(kāi)發(fā),通過(guò)公開(kāi)的接口被其它部分調(diào)用,每個(gè)部分都可以單獨(dú)重構(gòu),不擔(dān)心影響到其他部分。
從軟件工程的項(xiàng)目管理的角度去進(jìn)行團(tuán)隊(duì)解耦,把人員分開(kāi)。首先,每個(gè)子團(tuán)隊(duì)都可以獨(dú)立運(yùn)作,不依賴外部人員。人數(shù)不宜過(guò)多,每個(gè)子團(tuán)隊(duì)最好不要超過(guò)5個(gè)人。其次,子團(tuán)隊(duì)內(nèi)部的運(yùn)作,不需要被外部知道。最后,子團(tuán)隊(duì)之間的協(xié)調(diào),應(yīng)該按照公開(kāi)的協(xié)議和規(guī)則,最好能夠自動(dòng)完成,避免私下協(xié)商。
四、結(jié)束語(yǔ)
很多大團(tuán)隊(duì)按照人員角色分組,比如架構(gòu)組、開(kāi)發(fā)組、DBA 組、測(cè)試組、工程組等等,這是錯(cuò)誤的。這樣完全沒(méi)有解耦。正確做法是按照軟件的業(yè)務(wù)功能分組,每組負(fù)責(zé)一個(gè)全流程的軟件大功能,設(shè)計(jì)、編碼、測(cè)試、部署、支持等人員都在同一組。這樣才能做到解耦,以及獨(dú)立的交付和重構(gòu)。另外軟件架構(gòu)師的角色也很重要,保障各種服務(wù)與整個(gè)系統(tǒng)運(yùn)行狀況之間的協(xié)議和通信,保證代碼和團(tuán)隊(duì)可以正確解耦。
本文通過(guò)對(duì)大項(xiàng)目的問(wèn)題的分析并提出解決方法。著手從代碼復(fù)雜度和團(tuán)隊(duì)管理兩個(gè)方面闡述了大項(xiàng)目解決方法。
參考文獻(xiàn):
[1]趙俊,石春. 探究軟件開(kāi)發(fā)進(jìn)程中項(xiàng)目管理與軟件工程的結(jié)合[J]. 電腦知識(shí)與技術(shù),2020,16(11):82-83
[2]崔萌萌,安強(qiáng). 項(xiàng)目管理對(duì)軟件工程開(kāi)發(fā)的必要性研究[J]. 科技風(fēng),2017(17):65. DOI:10.19392/j.cnki.1671-7341.201717057..
[3]周競(jìng)亮. 軟件工程在大型工程管理系統(tǒng)開(kāi)發(fā)中的實(shí)踐[J]. 人民長(zhǎng)江,2009,40(17):86-88. DOI:10.3969/j.issn.1001-4179.2009.17.030.