本文將介紹寫技術(shù)方案的意義,如何評判技術(shù)方案的好壞斩例,如何寫好技術(shù)方案雄人。
寫技術(shù)方案的意義
寫技術(shù)方案根本目的是提高研發(fā)效率和質(zhì)量,具體體現(xiàn)在以下方面:
1念赶、提高溝通效率
對于整個團隊础钠,通過技術(shù)方案文檔和評審對齊提高溝通效率:
- 產(chǎn)品經(jīng)理可以審查技術(shù)方案是否與產(chǎn)品設(shè)計有偏差,是否滿足當前產(chǎn)品需求和后續(xù)產(chǎn)品設(shè)計規(guī)劃叉谜;
- 開發(fā)leader可以把控方案是否滿足技術(shù)要求旗吁,包括技術(shù)規(guī)范,性能要求停局,實現(xiàn)復(fù)雜度很钓,可拓展性等;
- 測試同學(xué)可以掌握需求技術(shù)實現(xiàn)原理董栽,改動點码倦,影響點,再做針對性測試用例設(shè)計锭碳;
- 后續(xù)接手項目的同學(xué)可以通過技術(shù)方案文檔熟悉系統(tǒng)袁稽。
2、提高開發(fā)效率和質(zhì)量
對于開發(fā)同學(xué)擒抛,通過寫技術(shù)方案推汽,把需求和實現(xiàn)提前梳理一遍补疑,減少等到編碼階段才發(fā)現(xiàn)前期考慮不全導(dǎo)致返工的情況;并且寫好技術(shù)方案再編碼歹撒,使得編碼時思維更加清晰莲组,提高編碼效率和質(zhì)量。
怎么樣才是好的技術(shù)方案
怎么樣才算是好的技術(shù)方案暖夭,至少需要滿足下面3個條件:
1 思路清晰
在講技術(shù)需求時锹杈,常見的問題是一上來直接給出解決方案,導(dǎo)致受眾不能理解為什么要這樣設(shè)計迈着。其實相比解決方案嬉橙,更重要的是怎么思考的,思考的過程非常重要寥假。思路就是思考的線索,思路清晰的方案霞扬,層次分明糕韧,讓受眾快速理解清楚。
整個技術(shù)方案思考的線索可以用5W2H分析法串起來:Why喻圃、Who萤彩、When、Where斧拍、What雀扶、How 和 How much(如下圖所示),從七個方面去分析思考:
整個技術(shù)方案需要先基于需求背景肆汹,定義清楚要解決的問題愚墓,明確目標,搞清楚 Why昂勉。定義清楚問題之后浪册,再從When,What岗照,Where村象,How等不同的角度,對問題進行分析和解決攒至,先講整體架構(gòu)厚者,再細化流程,先主線迫吐,再分支库菲,先正常鏈路,再異常鏈路渠抹。
2 滿足需求
技術(shù)方案滿足的需求包括功能需求和質(zhì)量需求蝙昙。
功能需求不僅是當前產(chǎn)品提出的功能需求闪萄,還要對未來需求的擴展有一定的規(guī)劃,預(yù)留好擴展點奇颠,這就要求開發(fā)在規(guī)劃設(shè)計前败去,對現(xiàn)狀和需求進行充分的收集和分析。
除了功能需求烈拒,更考驗開發(fā)同學(xué)技術(shù)實力的是質(zhì)量需求圆裕,包括異常處理,降級方案荆几,灰度方案吓妆,運維方案,高可用設(shè)計吨铸。設(shè)計時要結(jié)合具體業(yè)務(wù)場景行拢,當前項目階段,做合理的權(quán)衡诞吱,避免陷入極端:或面面俱到舟奠,過度設(shè)計;或方案過粗房维,考慮不周沼瘫。
3 可實施
可以這樣評估一個技術(shù)方案是否可實施:技術(shù)方案完成之后,其他人能否照著技術(shù)方案按時按質(zhì)完成開發(fā)并上線咙俩?
有的技術(shù)方案看似高大上耿戚,高瞻遠矚,開發(fā)實施起來卻困難重重阿趁,常見原因如下:
- 不夠細:涉及改動的字段膜蛔,報文,異常情況歌焦,邊界情況飞几,歷史數(shù)據(jù)兼容等處理沒說明清楚
- 做不完:方案做的調(diào)整過大,雖然能解決問題独撇,但是實施起來時間不夠
在寫技術(shù)方案時屑墨,方案需要足夠完善詳細,把開發(fā)涉及的關(guān)鍵點考慮完善纷铣,這些點沒有先界定清楚的話卵史,開發(fā)的時候容易才發(fā)現(xiàn)跟系統(tǒng)當前現(xiàn)狀有沖突,或者開發(fā)出來偏離方案設(shè)計搜立。
方案的設(shè)計也要考慮時間以躯,開發(fā)成本,是否符合系統(tǒng)現(xiàn)狀、團隊可調(diào)配的資源忧设,有些方案從技術(shù)的角度是最佳刁标,但是從實施的角度并非最佳,例如會額外引入上下游系統(tǒng)相應(yīng)的改動址晕,帶來一定的溝通協(xié)作成本膀懈。所以方案設(shè)計在考慮產(chǎn)品和技術(shù)等限制的同時,也需要考慮當前現(xiàn)狀谨垃,要求的上線時間等其他因素启搂,選擇最合適的技術(shù)方案×跆眨可以在方案中寫不同的實現(xiàn)的評估對比胳赌,進行取舍權(quán)衡,或者方案拆成不同的開發(fā)實施階段匙隔。
方案的組成
做技術(shù)方案設(shè)計的前提條件是疑苫,定義清晰的業(yè)務(wù)流程,明確的期望拿到的預(yù)期結(jié)果纷责。技術(shù)方案的各個組成部分圍繞整個產(chǎn)品的研發(fā)周期缀匕,用一張圖總結(jié)如下:
1 需求說明
為什么產(chǎn)品文檔介紹過需求,技術(shù)方案里面還要寫需求說明碰逸?主要原因如下:
- 介紹需求:通過在技術(shù)方案里面簡明扼要介紹產(chǎn)品需求,有利于其他看技術(shù)方案的人快速理解需求阔加,后面具體技術(shù)實現(xiàn)的出發(fā)點饵史。
- 對齊需求:需求說明部分體現(xiàn)了開發(fā)同學(xué)對產(chǎn)品需求的理解,在技術(shù)評審階段進一步與產(chǎn)品同學(xué)檢查對齊一遍胜榔,減少理解出現(xiàn)偏差胳喷。
需求說明包括需求背景和需求拆解:
(1) 需求背景
說明為什么需要做這個需求,需求的價值意義是什么夭织。
(2) 需求拆解
從需求實現(xiàn)的維度對需求拆解成相對各自獨立子需求吭露,并概要地說明每個子需求要做哪些內(nèi)容,可以依據(jù)實際情況按照不同的角度來拆解尊惰,常見拆解的角度有:
- 實現(xiàn)的步驟流程
- 功能模塊讲竿、業(yè)務(wù)領(lǐng)域
- 對外提供的接口、服務(wù)
2 概要設(shè)計
思路不清晰的技術(shù)方案有一個常見的問題:在交代完需求背景之后弄屡,就直接開始介紹每個子需求的具體實現(xiàn)题禀。這種技術(shù)方案各個部分比較分散細碎,沒有統(tǒng)一成整體膀捷,閱讀起來并不好把握迈嘹,這些設(shè)計背后的思路是什么,為什么要這樣設(shè)計。
概要設(shè)計包括系統(tǒng)現(xiàn)狀秀仲,總體思路和系統(tǒng)架構(gòu)融痛。
(1) 系統(tǒng)現(xiàn)狀
為什么需要寫系統(tǒng)現(xiàn)狀趟紊?一方面是有些產(chǎn)品需求文檔涉及系統(tǒng)現(xiàn)狀這塊并不清晰回季,例如需求文檔寫成“在系統(tǒng)當前實現(xiàn)邏輯的基礎(chǔ)上麦向,進行xxx調(diào)整”范删,因此需要在技術(shù)方案對系統(tǒng)現(xiàn)狀進行補充說明球匕。另一方面割以,介紹系統(tǒng)現(xiàn)狀能方便理解后續(xù)設(shè)計的出發(fā)點悉盆,在技術(shù)評審時方便評估當前設(shè)計的合理性以及是否有遺漏的點昧绣。
系統(tǒng)現(xiàn)狀可以針對需求的內(nèi)容氓英,需求影響點來介紹侯勉,常見的內(nèi)容可以介紹系統(tǒng)當前處理邏輯,歷史數(shù)據(jù)的數(shù)據(jù)量铝阐,請求量址貌,數(shù)據(jù)增長量等情況。寫系統(tǒng)現(xiàn)狀時徘键,不需要面面俱到练对,而是結(jié)合當前需求,針對性地重點介紹與需求相關(guān)系統(tǒng)的情況吹害,為接下來介紹總體思路螟凭,系統(tǒng)架構(gòu)做鋪墊,其他不太相關(guān)的現(xiàn)狀可以簡單帶過或者不介紹它呀。
(2) 總體思路
寫總體思路可以為后面介紹整個詳細解決方案奠定基礎(chǔ):對方案進行信息壓縮螺男,后面的詳細方案介紹都是圍繞著總體思路進行展開,使得整個方案閱讀起來方向明確纵穿,思路清晰下隧。總體思路的內(nèi)容是概括性介紹需求實現(xiàn)涉及關(guān)鍵問題的解決方案谓媒。
(3) 系統(tǒng)架構(gòu)
概要設(shè)計中的系統(tǒng)架構(gòu)是總體思路進一步補充淆院,說明系統(tǒng)總體上的架構(gòu)設(shè)計,畫系統(tǒng)架構(gòu)圖是介紹清楚系統(tǒng)架構(gòu)的有效手段句惯。在概要設(shè)計中的架構(gòu)與詳細設(shè)計中的架構(gòu)的關(guān)鍵區(qū)別在于土辩,前者關(guān)注系統(tǒng)整體處理,后者關(guān)注子需求的具體實現(xiàn)抢野。在概要設(shè)計中介紹的架構(gòu)圖常見的歸類有:
- 按照系統(tǒng)模塊和處理流程介紹脯燃,介紹各個模塊處理的步驟,系統(tǒng)間的交互蒙保。
- 按層級介紹辕棚,把具有相同屬性或特征的信息塊歸為同一個層級,例如系統(tǒng)MVC分層架構(gòu)。
畫圖時逝嚎,注意不要想在一張圖里面做到面面俱到扁瓢,畫之前要想清楚這張圖要表達什么內(nèi)容,傳遞什么信息补君,再針對性來畫引几,不同的類型的圖不要合在一起。例如想說明系統(tǒng)的部署結(jié)構(gòu)挽铁,用部署圖伟桅,說明業(yè)務(wù)的主要流程,用流程圖叽掘;如果圖里面楣铁,既有系統(tǒng)部署涉及的基礎(chǔ)組件,又有業(yè)務(wù)處理流程更扁,圖表現(xiàn)出來的信息就比較混亂盖腕。
3 詳細設(shè)計
詳細設(shè)計可分成開發(fā)約定,功能實現(xiàn)浓镜,可維護性設(shè)計溃列,可靠性設(shè)計,方案選擇膛薛。
(1) 開發(fā)約定
開發(fā)約定部分常見介紹的內(nèi)容如下:
- 方案新引入的名詞听隐,概念的解釋,方便后面的內(nèi)容引用哄啄。
- 前期上下游對接達成一致的約定/協(xié)議遵绰。
(2) 功能實現(xiàn)
軟件系統(tǒng)工作的核心功能是對數(shù)據(jù)的處理。因此在技術(shù)方案介紹具體功能實現(xiàn)時增淹,重點關(guān)注的點是數(shù)據(jù)鏈路,包括:
- 數(shù)據(jù)源:系統(tǒng)的流量來源乌企、業(yè)務(wù)在何時何地觸發(fā)虑润,例如對外提供的接口,定時任務(wù)加酵,MQ消費等
- 計算轉(zhuǎn)換:數(shù)據(jù)如何做轉(zhuǎn)換運算拳喻,加工處理的流程
- 存儲:數(shù)據(jù)存儲設(shè)計
為了介紹整個數(shù)據(jù)處理流程,體現(xiàn)在以下方面:
- 接口設(shè)計:提供接口設(shè)計文檔猪腕,包括入?yún)⒊鰠⒆侄味x冗澈,接口參數(shù)校驗邏輯,異常情況的處理和返回的錯誤碼陋葡。
- 系統(tǒng)間交互流程:結(jié)合系統(tǒng)間流程圖說明整筆業(yè)務(wù)請求涉及哪些系統(tǒng)組成部分亚亲,業(yè)務(wù)的發(fā)起來源,系統(tǒng)間交互調(diào)用了具體哪個接口,請求處理基本步驟和數(shù)據(jù)落地存儲邏輯捌归。
- 系統(tǒng)內(nèi)處理流程:結(jié)合業(yè)務(wù)處理流程圖說明請求如何加工計算數(shù)據(jù)肛响,處理的具體步驟,最終處理完成之后結(jié)果如何保存惜索,或者傳輸?shù)绞裁吹胤健?/li>
- 存儲設(shè)計特笋,包括存儲結(jié)構(gòu)(包括MySQL、ES巾兆、Redis猎物、OSS等)設(shè)計,包括表和字段的概念定義角塑,各個表之間的關(guān)聯(lián)蔫磨,業(yè)務(wù)系統(tǒng)如何使用這些庫表。
(3) 可維護性設(shè)計
可維護性設(shè)計關(guān)注的是后續(xù)系統(tǒng)的迭代升級吉拳,需求變更质帅,系統(tǒng)怎么維護的問題。這塊的關(guān)鍵點主要是代碼復(fù)雜度問題留攒,不好維護的系統(tǒng)煤惩,會因為系統(tǒng)引入一個新需求,整個系統(tǒng)需要做大量改動炼邀。因此系統(tǒng)需要考慮通過提前做一些可拓展設(shè)計方便后續(xù)維護魄揉,體現(xiàn)在以下方面:
- 拓展點分析:結(jié)合產(chǎn)品需求分析后續(xù)擴展帶來的變化點,為了支持這些變化系統(tǒng)需要預(yù)留哪些擴展點拭宁。
- 系統(tǒng)建模:針對變化點洛退,對系統(tǒng)對象進行建模,主要關(guān)注:模塊(職責明確的模塊或者組件)杰标、關(guān)系(組件間明確的關(guān)聯(lián)關(guān)系)兵怯、邊界(約束和指導(dǎo)原則)。
- 設(shè)計模式:使用設(shè)計模式時腔剂,要注意設(shè)計模式的底層邏輯是“找到變化媒区,封裝變化”,將變化封裝在可控范圍內(nèi)掸犬,具體介紹設(shè)計模式涉及的類圖袜漩,以及拓展新需求時,系統(tǒng)需要做的變動湾碎。
- 配置項:包括配置項的具體定義宙攻,使用注意事項。
(4) 可靠性設(shè)計
可靠性設(shè)計包括以下要點:
灰度方案
如果是新系統(tǒng)初步上線用于替代老系統(tǒng)介褥,新系統(tǒng)還需要經(jīng)過進一步線上驗證座掘,這時需要考慮灰度方案递惋,包括灰度的周期計劃,灰度的范圍/維度雹顺,灰度配置策略丹墨。
容量評估
容量評估需要根據(jù)請求量,評估要預(yù)留給程序多少相應(yīng)的運行資源嬉愧。包括內(nèi)存贩挣,磁盤,CPU没酣,存儲服務(wù)等王财。
評估的點包括:接口平均QPS、峰值QPS裕便、接口請求和返回報文大小绒净,消息隊列的平均消息數(shù)、峰值消息數(shù)偿衰、報文大小挂疆。這一部分如果是改動的業(yè)務(wù),可以參考以前的監(jiān)控下翎,如果是新業(yè)務(wù)或者新活動可以跟運營缤言、產(chǎn)品確定業(yè)務(wù)量。若預(yù)估峰值會很高视事,需要進行壓測胆萧。
監(jiān)控報警
當方案不確定性比較大,容易出錯俐东,一旦出錯造成的影響較大跌穗,需要加監(jiān)控告警,說明的信息包括:模塊虏辫,監(jiān)控指標蚌吸,監(jiān)控閾值,報警方式等砌庄。
(5) 方案選擇
當我們設(shè)計了一個方案之后羹唠,評估這個方案是不是最優(yōu)方案最簡單的辦法,就是看看還有沒有更優(yōu)的方案鹤耍。
不同方案如何做評估選擇?可以做360度全面評估對比验辞,具體的操作方式為:列出我們需要關(guān)注的質(zhì)量屬性點稿黄,然后分別從這些質(zhì)量屬性的維度去評估每個方案,再綜合挑選適合當時情況的最優(yōu)方案跌造。
常見的方案質(zhì)量屬性點有:性能杆怕、可用性族购、硬件成本、項目投入陵珍、復(fù)雜度寝杖、安全性、可擴展性等互纯。在評估這些質(zhì)量屬性時瑟幕,需要遵循架構(gòu)設(shè)計的原則: “合適原則”和 “簡單原則”,避免貪大求全留潦,基本上某個質(zhì)量屬性能夠滿足一定時期內(nèi)業(yè)務(wù)發(fā)展就可以了只盹。
4 測試方案
良好的測試用例設(shè)計能有效提高開發(fā)質(zhì)量,技術(shù)方案中不僅需要考慮開發(fā)自測兔院,為了進一步提高研發(fā)質(zhì)量殖卑,還需要考慮如何提高測試同學(xué)的測試質(zhì)量和效率。技術(shù)方案在測試這塊需要考慮的點包括:影響點坊萝,自測用例孵稽,測試注意點。
(1) 影響點
影響點可以用清單的形式列出本次開發(fā)影響了哪塊功能十偶,哪些接口菩鲜,接口url,改動的內(nèi)容是什么扯键。這樣測試同學(xué)在設(shè)計測試用例時可以做對照參考睦袖,減少功能遺漏測試的情況。
(2) 自測用例
自測用例是介紹說明需求自測的用例設(shè)計荣刑,可以用清單的形式列出馅笙,一般包括涉及場景,測試步驟厉亏,測試輸入董习,期望輸出等信息。
(3) 測試注意點
有些隱藏的異常情況處理爱只,邊界條件皿淋,特殊處理邏輯,如果沒有特別說明恬试,測試同學(xué)測試的時候很容易遺漏這塊窝趣,而線上bug往往出現(xiàn)在這一塊。所以可以在方案里面特殊指出這塊训柴,讓測試同學(xué)在測試的時候特別注意一下哑舒。
5 上線部署
不想需求上線后各種問題,疲于應(yīng)對幻馁,那就有必要在技術(shù)方案階段考慮上線部署的問題洗鸵,在技術(shù)方案設(shè)計中先提前準備好越锈,等到上線階段對著技術(shù)方案寫的注意事項,步驟進行一步步檢查和執(zhí)行膘滨,減少上線事項遺漏或者處理出錯的情況甘凭。
上線部署部分涉及的點包括環(huán)境準備,系統(tǒng)準備火邓,發(fā)布順序丹弱,線上驗證;
(1) 環(huán)境準備
系統(tǒng)依賴環(huán)境的準備包括MySQL贡翘、Redis蹈矮、MQ、ES和Nginx等服務(wù)搭建和初始化鸣驱,機器資源等泛鸟。
(2) 系統(tǒng)準備
系統(tǒng)準備常見主要如下:
- 依賴的服務(wù)配置,數(shù)據(jù)更新踊东,例如數(shù)據(jù)庫表創(chuàng)建北滥,SQL初始化腳本,Nginx配置更新闸翅,MQ的topic創(chuàng)建再芋,網(wǎng)絡(luò)端口打通,監(jiān)控配置坚冀,IP白名單申請济赎,定時任務(wù)創(chuàng)建。
- 引用服務(wù)項目配置更新记某,代碼檢查司训,分支merge。
(3) 發(fā)布順序
發(fā)布部署的服務(wù)之前有業(yè)務(wù)依賴關(guān)系液南,被依賴的服務(wù)需要先發(fā)布部署壳猜,如果有這種依賴關(guān)系,在技術(shù)方案中應(yīng)當標明滑凉。
(4) 線上驗證
線上驗證的部分统扳,需要說明服務(wù)部署之后,怎么驗證服務(wù)是否正常畅姊,需要做哪些檢查驗證項咒钟。例如telnet檢查端口是否通,日志是否有報錯若未,通過線上測試賬號走一筆業(yè)務(wù)看看是否正常朱嘴,監(jiān)控面板要看哪些指標。
在開發(fā)和測試階段陨瘩,當配置項腕够,腳本,配置出現(xiàn)更新調(diào)整舌劳,需要更新保存在技術(shù)方案文檔里面帚湘,上線時照著文檔操作,不容易遺漏甚淡。
總結(jié)
想成為優(yōu)秀的開發(fā)人員大诸,不能只局限在開發(fā)領(lǐng)域,而是必須要有跨界的意識贯卦,包括產(chǎn)品意識资柔,測試意識、項管意識和運維意識:
- 產(chǎn)品意識:理解產(chǎn)品的具體業(yè)務(wù)流程是什么撵割,產(chǎn)品為何這樣設(shè)計贿堰,目前業(yè)務(wù)規(guī)劃的發(fā)展方向,主動溝通產(chǎn)品方案中的不合理之處啡彬,提供參考解決辦法羹与。
- 測試意識:技術(shù)方案中要考慮測試同學(xué)如何測試,提供必要的細節(jié)信息支撐測試庶灿,例如數(shù)據(jù)更新存儲流程纵搁。開發(fā)提測前對涉及的影響點做必要的自測,主動溝通測試同學(xué)的測試方案的不合理或遺漏的點之處往踢,提供參考解決辦法腾誉。
- 項管意識:對任務(wù)進行合理分解,在開發(fā)峻呕、測試利职、上線流程中,要及時發(fā)現(xiàn)影響整體進度的問題點山上,主動協(xié)調(diào)解決或者上報反饋眼耀,按照計劃主動推進項目保障最終按時按質(zhì)上線。
- 運維意識:對系統(tǒng)的日常運維佩憾、容量和系統(tǒng)瓶頸哮伟、系統(tǒng)流量增大擴容方案要有一定的認識和解決方案,保障業(yè)務(wù)正常使用妄帘。
工具推薦
- 思維工具:結(jié)構(gòu)化分析法楞黄、5W2H分析法
- 腦圖軟件:Xmind、百度腦圖
- 畫圖軟件:ProcessOn抡驼、PPT鬼廓、PlantUML