為什么隨著時(shí)間的推移,系統(tǒng)開發(fā)難度越來越大、開發(fā)效率越來越低、bug卻越來越容易出現(xiàn)?為什么系統(tǒng)剛重構(gòu)完開發(fā)起來很順暢,但過段時(shí)間又變得難以開發(fā)、效率降低,每隔一年就要進(jìn)行一次大的重構(gòu)?
相信大家都思考過這些問題,斯坦福大學(xué)的JOHN OUSTERHOUT教授給出了一個(gè)他的答案,復(fù)雜度是軟件系統(tǒng)中很重要的一個(gè)因素,在開發(fā)過程中,復(fù)雜度會(huì)不斷變高,如果不能進(jìn)行有效控制,就會(huì)呈現(xiàn)指數(shù)型增長,導(dǎo)致開發(fā)效率越來越低,難度增大,同時(shí)bug越來越容易出現(xiàn)。
首先,我們來定義一下什么是軟件系統(tǒng)的復(fù)雜度,所謂復(fù)雜度是指針對(duì)軟件系統(tǒng)進(jìn)行維護(hù)和拓展需要花費(fèi)的成本大小。如果進(jìn)行一個(gè)小的修改,需要耗費(fèi)很大的成本,說明這個(gè)系統(tǒng)的復(fù)雜度高。如果只需要不大的成本就能完成新功能的開發(fā)或現(xiàn)有功能的完善,則說明這個(gè)系統(tǒng)的復(fù)雜度是可控的,比較低的。
接下來,我們講一下復(fù)雜度在系統(tǒng)會(huì)有哪些表現(xiàn):
牽一發(fā)而動(dòng)全身,一個(gè)變動(dòng)需要修改多處地方。這種一般發(fā)生在有重復(fù)代碼的部分,比如某個(gè)屬性的id為100,在多處用到的地方直接硬編碼100,過了一段時(shí)間這個(gè)id換成了200,則需要修改多個(gè)地方才能實(shí)現(xiàn)變更。針對(duì)一個(gè)變動(dòng)需要修改多個(gè)地方,很容易發(fā)生遺漏,顯著提高了系統(tǒng)的復(fù)雜度。晦澀難懂,難以修改。導(dǎo)致修改難度大的原因會(huì)很多,命名不規(guī)范,接口定義不夠通用,代碼邏輯晦澀等都會(huì)導(dǎo)致修改難度變大。這些都會(huì)增加系統(tǒng)的復(fù)雜度。未知的問題,各種大坑。在使用新數(shù)據(jù)或第三方庫的時(shí)候,通常會(huì)各種未知的坑讓人防不勝防。有些接口會(huì)有一些反人類的設(shè)計(jì),并且沒有任何文檔提示。比如某列表查詢接口超過n(n=30,40或50)會(huì)自動(dòng)截?cái)啵瑴y(cè)試環(huán)境數(shù)據(jù)量少驗(yàn)證穩(wěn)如 ,發(fā)布到生產(chǎn)環(huán)境第二天客戶就來反映問題。這些按照常識(shí)難以預(yù)料的問題,會(huì)增加系統(tǒng)的復(fù)雜度,導(dǎo)致各種bug的產(chǎn)生。包括一些開源的項(xiàng)目也常常會(huì)有各種未知的問題,說不定哪天就來個(gè)坑,所以對(duì)于新的技術(shù)、第三方服務(wù)或者庫都要充分驗(yàn)證,熟悉各種坑后才能大規(guī)模線上使用。大家可以看一下自己的項(xiàng)目,難以維護(hù)的項(xiàng)目是不是復(fù)雜度都很高呢?既然導(dǎo)致系統(tǒng)難以維護(hù)的原因找到了,那怎么能有效控制系統(tǒng)的復(fù)雜度呢?在接下來的幾篇專欄中會(huì)進(jìn)行詳細(xì)介紹,敬請(qǐng)期待。
編輯 潤揚(yáng)網(wǎng)絡(luò)策劃服務(wù)有限公司