首先,先說明一下“規(guī)劃項(xiàng)目結(jié)構(gòu)”具體的工作內(nèi)容是什么。以二個(gè)常見的程序開發(fā)平臺來說,不管是用 Visual Studio 來開發(fā) .NET 的程序,還是用各種 IDE 來開發(fā) Java 的程序,都會有一組用來輔助 IDE 進(jìn)行代碼項(xiàng)目管理的文件、甚至?xí)殡S著一到數(shù)個(gè)特定的目錄結(jié)構(gòu)。只不過,這些都不是這篇文章要涉及的部份。而是除了這些內(nèi)容以外,由開發(fā)人員自行產(chǎn)生的文件該如何妥適的進(jìn)行分門別類的工作,就是這篇文章所提到“規(guī)劃項(xiàng)目結(jié)構(gòu)”要主要工作內(nèi)容。
對很多的從業(yè)人員來說,“規(guī)劃項(xiàng)目結(jié)構(gòu)”可能是個(gè)無足輕重的工作項(xiàng),心里會想:不就是開幾個(gè)目錄把文件往里面丟就完事了嗎?能編能跑才是王道!會這樣想,大部份應(yīng)該都是以開發(fā)小型項(xiàng)目為主,所以好與不好的項(xiàng)目結(jié)構(gòu)在效益上并沒有太大的差別。
舉個(gè)例子,如果你是網(wǎng)拍的賣家,打算做個(gè)小本生意,只有一人負(fù)責(zé)接單、發(fā)貨。貨品的種類和數(shù)量都不會很多的情況下,進(jìn)來的貨可能就只是隨手扔在腳邊,不管怎么堆只要有一套自己的邏輯就行了,不愁找不到貨。但是如果網(wǎng)拍的事業(yè)開始小有名氣了、要逐步地?cái)U(kuò)大規(guī)模,發(fā)貨的品項(xiàng)或數(shù)量都不再是一個(gè)人可以負(fù)荷得來時(shí),就得要增加人手。一旦人手增加了,同樣的模式下問題就跟著出現(xiàn)。如果放任新加入的人隨個(gè)人喜好來擺放貨物、大家各做各的,要如何才能有效地掌握目前存貨的情形?況且人吃五谷雜糧哪有不生病,沒有統(tǒng)一的理貨方法,其他的人要如何接手?所以把例子的層級拉高來看,對于一個(gè)成熟的網(wǎng)購業(yè)者來說,倉儲就是一門學(xué)問,如何設(shè)計(jì)貨架以便分門別類地來存放貨品,是維持營運(yùn)的重要環(huán)節(jié)。
同理可證,很多大型開發(fā)項(xiàng)目也都是由小系統(tǒng)開始,應(yīng)該很少有人會聽到自己的老板一照面就說:咱們來做個(gè)功能無敵豐富的系統(tǒng)唄!大部份應(yīng)該都是:我有個(gè)想法,先做個(gè)小系統(tǒng)來看看市場的反應(yīng),如何?好吧,既然是個(gè)小系統(tǒng),那開發(fā)就隨性一點(diǎn),看起來有個(gè)樣子、功能正常就行了。
跟先前網(wǎng)拍的例子一樣,你怎么知道你現(xiàn)在的小系統(tǒng)不會意外地發(fā)展成大系統(tǒng)?有些人也許會覺得:等到了適當(dāng)?shù)碾A段,再一次性地投入資源,進(jìn)行重構(gòu)就好啦!不要花時(shí)間在無謂的事情上。然而,系統(tǒng)的發(fā)展很多時(shí)候就像是溫水煮青蛙一般,等察覺到系統(tǒng)已經(jīng)大到需要有一個(gè)較好的分類模式時(shí),代碼早就已經(jīng)盤根錯(cuò)節(jié)。在大部分的人都會有的因循茍且心態(tài)下,重構(gòu)?別傻了,只要能夠如期交付工作就上天保祐了,哪有多余的力氣去做吃力不討好的事。
好的項(xiàng)目結(jié)構(gòu)也是工作質(zhì)量指標(biāo)其中一環(huán),當(dāng)代碼依據(jù)著規(guī)則分門別類地放置,在后續(xù)的維護(hù)上自然會有一定程度的助益。不論是開發(fā)人員間工作上的指派、輪調(diào),或是在降低新進(jìn)人員的學(xué)習(xí)曲線上,都會比雜亂無章的項(xiàng)目結(jié)構(gòu)要來得成本低。
另外一方面,在面向?qū)ο蟮脑瓌t之下,每一個(gè)類的任務(wù)應(yīng)該要盡可能的單純,其中的一個(gè)效果就是讓單元測試可以更容易地被開發(fā)。在測試程序的代碼覆蓋率達(dá)到一定的程度,有自動化回歸測試的輔助,這時(shí)候談重構(gòu)才會有足夠的利基。否則談到重構(gòu),最大的恐懼都是來自于對于系統(tǒng)穩(wěn)定度的疑慮,在這種情況下自然不會有人甘冒風(fēng)險(xiǎn)去更動已經(jīng)完成的部份。
這時(shí)合宜的結(jié)構(gòu)規(guī)劃就可以輔助開發(fā)人員,做為類內(nèi)容是否過于復(fù)雜的衡量基準(zhǔn)。如果每一個(gè)類功能夠單純,則在分類上就會減少很多模棱兩可的情況出現(xiàn)。反之,則會因?yàn)轭愗?fù)擔(dān)了多個(gè)任務(wù),在分類上容易出現(xiàn)歧見,或是無法決定該放在哪一個(gè)分類之下。
所以古人說“慎始”,同時(shí)也說了“勿以惡小而為之”,養(yǎng)成良好的習(xí)慣是很重要的一件事。當(dāng)你是架構(gòu)師時(shí)“規(guī)劃項(xiàng)目結(jié)構(gòu)”是你要思考的細(xì)節(jié)。就算是一人項(xiàng)目,也應(yīng)該認(rèn)真地考慮替自己設(shè)定一個(gè)可以因應(yīng)系統(tǒng)擴(kuò)大的準(zhǔn)則,為未來承接更大的系統(tǒng)而做好準(zhǔn)備。
附注
新開了一個(gè)架構(gòu)師的文集,未來打算在這個(gè)文集里不定期地放一些在擔(dān)任架構(gòu)師時(shí)的工作經(jīng)驗(yàn)或心得,有興趣的朋友可以關(guān)注、期待一下。