對于開發(fā)者來說,架構(gòu)設(shè)計是軟件研發(fā)過程中最重要的一環(huán),所謂沒有圖紙,就建不了房子。在遍地App的互聯(lián)網(wǎng)時代,架構(gòu)設(shè)計有了一些比較成熟的模式,開發(fā)者和架構(gòu)師也可以經(jīng)常借鑒。 但是,隨著應(yīng)用的不斷發(fā)展,最初的架構(gòu)往往面臨著各種問題,比如無法滿足客戶的需求、無法實現(xiàn)應(yīng)用的擴展、無法實現(xiàn)新的特性等等。在這種情況下,我們?nèi)绾伪苊庖恍┛?,盡量比較成功地實現(xiàn)架構(gòu)的重構(gòu),是很多開發(fā)者和架構(gòu)師亟需解決的問題。 在這里,跟大家分享一下Uber的工程主管Raffi Krikorian的12條規(guī)則,并附上一些解讀,希望對大家有所啟發(fā)。 看起來這個規(guī)矩有些多余,但是請不要忽略。每一次架構(gòu)的重構(gòu)都是“傷筋動骨”,就像做手術(shù)一樣,即使再成功,也會傷元氣,所以決策者們首先要分析架構(gòu)重構(gòu)的理由和其他備選方案,明確重構(gòu)的目的是為了滿足業(yè)務(wù)需求,并且是不得不做的最佳方案,然后再考慮其他問題。 有時候,經(jīng)過分析就會發(fā)現(xiàn),也許還有其他解決方案,比如增加計算資源,或者重構(gòu)的目的不是為了業(yè)務(wù)需求,那就沒有必要做了。 檢查清單:
如果確定要重構(gòu),那么要把目標(biāo)明確下來,也就是重構(gòu)的邊界條件,怎么才算是“完成”了重構(gòu),目標(biāo)要有數(shù)據(jù)量化,或者有能夠測試的辦法。這也是一個需求分析的過程,如果需求不明確,那么規(guī)格說明書沒法寫清楚,負責(zé)重構(gòu)的團隊也沒有明確的目標(biāo),不能以重構(gòu)的時間或者主觀的判斷為結(jié)束的依據(jù)。前幾天和一朋友聊天,他最近在負責(zé)系統(tǒng)的性能優(yōu)化,也要做一些重構(gòu)的事情,開始的時候團隊的目標(biāo)不明確,大家不知道優(yōu)化到什么程度,所以不敢下手。如果目標(biāo)是提高10%,那么可以從細節(jié)處著手;如果是提高50%,那可能要搞大動作才能實現(xiàn)了。后來目標(biāo)明確之后,團隊才找到合適的辦法。 檢查清單:
現(xiàn)在軟件研發(fā)最流行的就是快速迭代、持續(xù)交付、盡早反饋。這同樣可以用在架構(gòu)的重構(gòu)上,重構(gòu)過程的難度不亞于構(gòu)建一個新產(chǎn)品,所以在設(shè)計重構(gòu)的時候,要引入持續(xù)交付的流程,每一個重構(gòu)步驟或者模塊都要快速部署并得到反饋,以便評估重構(gòu)的效果,及時作出策略調(diào)整。有的讀者會說,我們的架構(gòu)重構(gòu)是釜底抽薪型的,沒法漸進,只能一蹴而就。如果是這種情況,可以考慮在另外一套拷貝的系統(tǒng)中做重構(gòu),經(jīng)過謹慎測試之后,將數(shù)據(jù)和業(yè)務(wù)遷移過去。 檢查清單:
在啟動重構(gòu)之前,團隊要對當(dāng)前的架構(gòu)狀態(tài)有清晰的了解,也就是設(shè)定好基準(zhǔn),以便評估重構(gòu)的效果。據(jù)我的經(jīng)驗,負責(zé)重構(gòu)的架構(gòu)師或者開發(fā)者,往往還沒有搞清楚現(xiàn)有的架構(gòu)設(shè)計,就開始重構(gòu)了,結(jié)果經(jīng)常出現(xiàn)這樣的情況:重構(gòu)到某個階段,發(fā)現(xiàn)行不通,然后一拍腦袋說,哦,原來這塊的架構(gòu)是這個樣的,是為了達到某某業(yè)務(wù)需求啊,這塊不能動,得想別的辦法。類似的例子在研發(fā)團隊中時有發(fā)生,也提醒我們要慎重小心。記得有位哲人說過,了解別人很容易,了解自己很難。 檢查清單:
數(shù)據(jù)的重要性不言而喻,業(yè)務(wù)都是以數(shù)據(jù)流為載體的,所以架構(gòu)重構(gòu)的本質(zhì)就是對于數(shù)據(jù)流的重構(gòu)。數(shù)據(jù)對重構(gòu)的重要性主要體現(xiàn)在兩個方面:在重構(gòu)設(shè)計時,需要考慮業(yè)務(wù)數(shù)據(jù)的需求,重構(gòu)之后的系統(tǒng)對于數(shù)據(jù)的存儲、處理、分析等功能是否有影響;在重構(gòu)過程中,考慮依靠數(shù)據(jù)甚至是實際的數(shù)據(jù)來驗證重構(gòu)的效果,提供評估的支持。 檢查清單:
技術(shù)債務(wù)在平常的軟件研發(fā)過程中也是比較突出的問題,現(xiàn)在單獨拿出來強調(diào)是希望提醒開發(fā)者們:架構(gòu)重構(gòu)往往是為了償還技術(shù)債務(wù),所以請不要在償還技術(shù)債務(wù)的過程中制造技術(shù)債務(wù)了。技術(shù)債務(wù)就像信用卡一樣,會有很高的利息率,就如同給團隊留下了大量的帳務(wù)開銷。組織應(yīng)該培養(yǎng)一種保證設(shè)計質(zhì)量的文化。應(yīng)當(dāng)鼓勵重構(gòu)、同時也應(yīng)當(dāng)鼓勵持續(xù)設(shè)計以及其它有關(guān)代碼質(zhì)量的實踐。在開發(fā)時間中應(yīng)當(dāng)專門抽出一部分以解決技術(shù)債務(wù)。如果沒有合適的照料,那么真實世界中的代碼會變得越來越復(fù)雜難懂。 檢查清單:
架構(gòu)的重構(gòu)過程應(yīng)該是以目標(biāo)為導(dǎo)向,換句話說“注重實效”。對于技術(shù)人來說,一個經(jīng)常被輕視的問題在于,喜歡追逐新鮮的熱門技術(shù),這其實是個好事情,說明技術(shù)人勇于創(chuàng)新,不斷接受新技術(shù)。但是對于架構(gòu)的重構(gòu)這樣的關(guān)鍵性任務(wù)來說,是不是新技術(shù)并不重要,重要的是能不能實現(xiàn)重構(gòu)的目標(biāo)。對于新技術(shù)來說,雖然熱度大,但是人才儲備還不足,大家踩過的坑還不多,積累的失敗教訓(xùn)和成功經(jīng)驗還不夠,在這種情況下,建議大家不要頭腦一熱就上馬新技術(shù),應(yīng)該客觀冷靜地評估新技術(shù)和成熟技術(shù)對架構(gòu)重構(gòu)的影響和效果,以數(shù)據(jù)和經(jīng)驗來說話,而不要追趕時髦。 檢查清單:
這條軍規(guī)更像是對架構(gòu)師們的心理建議,軟件開發(fā)過程中,壓力無處不在。對于架構(gòu)重構(gòu)來說,壓力來源于多個方面:管理層、團隊成員、同級部門等等。說白了,架構(gòu)重構(gòu)對個人來說往往是一件出力不討好的事情。和做一個新產(chǎn)品能夠取得很高的贊賞相比,重構(gòu)的成績往往并不受領(lǐng)導(dǎo)重視,而且出了問題還要承擔(dān)很大的責(zé)任。從軟件開發(fā)角度看,做新產(chǎn)品是從0到1,而架構(gòu)重構(gòu)是從-1到1,復(fù)雜性和難度通常更大。因此,重構(gòu)的負責(zé)人要提前做好心理準(zhǔn)備,舒緩壓力的一個技巧是,設(shè)置好里程碑,將重構(gòu)的成果量化,并且和業(yè)務(wù)的變化關(guān)聯(lián)起來,定期向利益相關(guān)各方同步狀態(tài),得到大家的理解和支持。 檢查清單:
雖然看起來像是一句廢話,但是我想Raffi Krikorian特意把這條提出來一定是有理由的。架構(gòu)重構(gòu)的最終目的是改進業(yè)務(wù),所以對于業(yè)務(wù)的了解將有助于架構(gòu)師和技術(shù)人確定重構(gòu)目標(biāo)的優(yōu)先級和關(guān)鍵路徑。比如,我們需要知道哪些關(guān)鍵業(yè)務(wù)的架構(gòu)是不能碰的,哪些業(yè)務(wù)之間是互相關(guān)聯(lián)的,哪些業(yè)務(wù)的架構(gòu)是需要優(yōu)先重構(gòu)的.....等等。除了了解業(yè)務(wù)本身,我們還需要了解“人”,表面上管理層是重構(gòu)目標(biāo)的裁決者,但實際上業(yè)務(wù)部門的人才是。技術(shù)人需要了解他們的業(yè)務(wù)需求,并將其轉(zhuǎn)化為重構(gòu)目標(biāo)。通過這種方式,架構(gòu)重構(gòu)的意義才能得到具體的體現(xiàn)。 檢查清單:
恩......這又是一個不那么讓人舒服的建議。不管你是否愿意相信,技術(shù)在架構(gòu)重構(gòu)(以及其他很關(guān)鍵的公司決策中)的影響因素中并不是最高的,我們還會涉及到商業(yè)利益、管理層偏好、大客戶影響、辦公室zhengzhi、站隊問題等等,對于架構(gòu)師和技術(shù)人來說,這些因素往往不是他們所能掌控的。我們能做的就是,與利益相關(guān)者設(shè)定重構(gòu)目標(biāo),然后,根據(jù)不同的影響因素,調(diào)整目標(biāo)。請記住,不要死扛這個目標(biāo),當(dāng)有人提出不同的意見時,要坦誠地和他們交流,并告知他們?nèi)绾尾杉{意見,那么重構(gòu)目標(biāo)會有變化,然后讓其他利益相關(guān)者也知道這些變化。非技術(shù)因素的影響是客觀存在的,而且從商業(yè)層面來說也是合理的,所以對于技術(shù)人來說要學(xué)會適應(yīng)。 檢查清單:
這和上篇中所提到的“管理好技術(shù)債務(wù)”有異曲同工之處。架構(gòu)的重構(gòu)對代碼質(zhì)量要求很高,一方面是重構(gòu)過程對bug的容忍性比新產(chǎn)品的研發(fā)更低,另一方面也決定了下一次重構(gòu)的難易程度。關(guān)于代碼質(zhì)量的書籍和文章已經(jīng)有很多,在這里只想提醒大家一點:代碼審查是一個非常好的辦法。代碼審查是軟件開發(fā)過程中的必要步驟,既可以幫助被審查者提到代碼質(zhì)量,又可以讓審查者加深對產(chǎn)品的理解。不論團隊多忙,一定要保證代碼提交之前,是經(jīng)過其他成員審核過的,短期來看會占用團隊的時間,長期來看是事半功倍的好事。 檢查清單:
這是Raffi Krikorian列舉的最后一條軍規(guī),是對之前所有建議的總結(jié),我在這里不做解讀了,請大家自我感覺吧。 關(guān)于架構(gòu)的重構(gòu),Raffi Krikorian給了很好的建議,不過到底有沒有效果,還是要實踐中檢驗。盡信書不如無書,來源于實踐中的經(jīng)驗是最有價值的,為技術(shù)人所用才有意義。 |
|
來自: 過河卒沖 > 《技術(shù)架構(gòu)》