摘要:的報告進(jìn)一步證實了與成功項目最密切的因素是良好的需求管理,也就是項目的范圍管理,特別是管理好項目的變更。需求管理的第一步就是要梳理不同來源的需求,主要包括從產(chǎn)品定位出發(fā)外部用戶反饋競爭對手情況市場變化以及內(nèi)部運營人員客服人員開發(fā)人員的反饋。
阿里妹導(dǎo)讀:技術(shù)主管,又叫「技術(shù)經(jīng)理」,英文一般是 Tech Leader ,簡稱 TL。隨著工作經(jīng)驗的不斷積累,能力的不斷提升,每個人都有機(jī)會成為Team Leader。然而在機(jī)會到來前,我們必須提前做好準(zhǔn)備,對TL的工作職責(zé)有一定了解。當(dāng)然,這也會為當(dāng)下更好地配合TL工作打下基礎(chǔ)。
今天,阿里巴巴高級技術(shù)專家云狄將結(jié)合自己多年的經(jīng)驗,從開發(fā)規(guī)范、開發(fā)流程、技術(shù)規(guī)劃與管理三個角度出發(fā),分享對技術(shù)TL這一角色的理解與思考,歡迎一起探討交流。
「技術(shù)主管」是開發(fā)團(tuán)隊中的某位程序員需要對一起創(chuàng)建系統(tǒng)的整個開發(fā)團(tuán)隊負(fù)責(zé)時所承擔(dān)的角色。通常他既要對最終交付的軟件系統(tǒng)負(fù)責(zé),另外也會像一個程序員一樣去開發(fā)實現(xiàn)系統(tǒng)。
一個技術(shù)主管的 60% ~ 70% 的時間可能花在了開發(fā)任務(wù)分解分配、開發(fā)實踐、技術(shù)架構(gòu)評審、代碼審核和風(fēng)險識別上,而余下的 30% ~ 40% 的時間則花在為了保障系統(tǒng)按時交付所需的各種計劃、協(xié)作、溝通、管理上。和團(tuán)隊管理者不同的是,技術(shù)主管的大部分管理工作都是針對具體研發(fā)任務(wù)和技術(shù)事務(wù)的。
接下來基于我在技術(shù)TL這個角色上,在開發(fā)規(guī)范、開發(fā)流程、技術(shù)管理與規(guī)劃等方面我的一些心路歷程,和大家共勉。
開發(fā)規(guī)范我當(dāng)時負(fù)責(zé)的業(yè)務(wù)是集團(tuán)收購一家子公司的業(yè)務(wù),在整體技術(shù)標(biāo)規(guī)范上與集團(tuán)的技術(shù)標(biāo)準(zhǔn)存在很大的差異。開發(fā)規(guī)范可以說是我來到這個團(tuán)隊干的第一件事,我當(dāng)時面對的問題是API接口格式混亂,沒有標(biāo)準(zhǔn)的RPC服務(wù)化,代碼沒有統(tǒng)一標(biāo)準(zhǔn)的開發(fā)規(guī)范,技術(shù)框架組件非標(biāo)準(zhǔn)化等一系列問題,作為一名業(yè)務(wù)上的新人,我第一時間制定了一套相對標(biāo)準(zhǔn)、全面的技術(shù)開發(fā)規(guī)范,邊寫代碼邊梳理開發(fā)規(guī)范,引領(lǐng)團(tuán)隊走向統(tǒng)一標(biāo)準(zhǔn)化開發(fā)道路。
針對團(tuán)隊研發(fā)規(guī)范暴露的上述問題,主要制定了如下規(guī)范:
命名規(guī)范我自己非常注重搭建項目結(jié)構(gòu)的起步過程,應(yīng)用命名規(guī)范、模塊的劃分、目錄(包)的命名,我覺得非常重要,如果做的足夠好,別人導(dǎo)入項目后可能只需要10分鐘就可以大概了解系統(tǒng)結(jié)構(gòu)。
具體規(guī)范包括包命名、類的命名、接口命名、方法命名、變量命名、常量命名。
統(tǒng)一IDE代碼模板約定了IDEA/Eclipse IDE代碼的統(tǒng)一模板,代碼風(fēng)格一定要統(tǒng)一,避免不同開發(fā)人員使用不同模板帶來的差異化以及代碼merge成本。使用IDEA的同學(xué)可以安裝Eclipse Code Formatter插件,和Eclipse統(tǒng)一代碼模板。
Maven使用規(guī)范所有二方庫、三方庫的版本統(tǒng)一定義到parent pom里,這樣來所有業(yè)務(wù)應(yīng)用工程統(tǒng)一繼承parent pom里所指定的二方庫、三方庫的版本,統(tǒng)一框架與工具的版本(Spring、Apache commons工具類、日志組件、JSON處理、數(shù)據(jù)庫連接池等),同時要求生產(chǎn)環(huán)境禁用SNAPSHOT版本。這樣以來升級通用框架與工具的版本,只需要應(yīng)用工程升級parent pom即可。
代碼Commit規(guī)范基于Angular Commit Message規(guī)范生成統(tǒng)一的ChangeLog,這樣一來對于每次發(fā)布release tag非常清晰,Mac下都需要安裝對應(yīng)的插件,IDEA也有對應(yīng)的插件,具體可以參考阮一峰老師的《Commit message 和 Change log 編寫指南》。
此刻忽然想起Linus面對pull request里的騷操作所發(fā)的飚:
Get rid of it. And I don’t ever want to see that shit again. ——Linus
代碼的commit的規(guī)范對團(tuán)隊非常重要,清晰的commit信息生成的release tag,對于生產(chǎn)環(huán)境的故障回滾業(yè)非常關(guān)鍵,能夠提供一些有價值的信息。
統(tǒng)一API規(guī)范統(tǒng)一Rpc服務(wù)接口的返回值ResultDTO,具體代碼如下:
success代表接口處理響應(yīng)結(jié)果成功還是失敗,errorCode、errorMsg表示返回錯誤碼和錯誤消息,module表示返回結(jié)果集,把ResultDTO定義到common-api頂層二方庫,這樣以來各個應(yīng)用不需要來回轉(zhuǎn)換返回結(jié)果。
Http Rest接口規(guī)范約定同ResultDTO相差無幾,需要額外關(guān)注一下加解密規(guī)范和簽名規(guī)范、版本管理規(guī)范。
異常處理規(guī)范異常處理不僅僅是狹義上遇到了Exception怎么去處理,還有各種業(yè)務(wù)邏輯遇到錯誤的時候我們怎么去處理。service服務(wù)層捕獲的異常主要包括BusinessException(業(yè)務(wù)異常)、RetriableException (可重試異常) 到 common-api,定義一個公共異常攔截器,對業(yè)務(wù)異常、重試異常進(jìn)行統(tǒng)一處理,對于可重試的異常調(diào)用的服務(wù)接口需要保證其冪等性。
另外其他業(yè)務(wù)層有些特殊異常不需要攔截器統(tǒng)一處理,內(nèi)部可以進(jìn)行自我消化處理掉,根據(jù)場景對應(yīng)的處理原則主要包括:
直接返回
拋出異常
重試處理
熔斷處理
降級處理
這又涉及到了彈力設(shè)計的話題,我們的系統(tǒng)往往會對接各種依賴外部服務(wù)、Api,大部分服務(wù)都不會有SLA,即使有在大并發(fā)下我們也需要考慮外部服務(wù)不可用對自己的影響,會不會把自己拖死。我們總是希望:
盡可能以小的代價通過嘗試讓業(yè)務(wù)可以完成;
如果外部服務(wù)基本不可用,而我們又同步調(diào)用外部服務(wù)的話,我們需要進(jìn)行自我保護(hù)直接熔斷,否則在持續(xù)的并發(fā)的情況下自己就會垮了;
如果外部服務(wù)特別重要,我們往往會考慮引入多個同類型的服務(wù),根據(jù)價格、服務(wù)標(biāo)準(zhǔn)做路由,在出現(xiàn)問題的時候自動降級。
推薦使用Netflix開源的hystrix容災(zāi)框架,主要解決當(dāng)外部依賴出現(xiàn)故障時拖垮業(yè)務(wù)系統(tǒng)、甚至引起雪崩的問題。目前我團(tuán)隊也在使用,能夠很好的解決異常熔斷、超時熔斷、基于并發(fā)數(shù)限流熔斷的降級處理。
分支開發(fā)規(guī)范早期的時候源碼的版本管理基于 svn,后來逐步切換到 git,分支如何管理每一個公司(在Gitflow的基礎(chǔ)上)都會略有不同。
針對分支開發(fā)規(guī)范,指定如下標(biāo)準(zhǔn):
分支的定義(master、develop、release、hotfix、feature)
分支命名規(guī)范
checkout、merge request流程
提測流程
上線流程
Hotfix流程
雖然這個和代碼質(zhì)量和架構(gòu)無關(guān),按照這一套標(biāo)準(zhǔn)執(zhí)行下來,能夠給整個研發(fā)團(tuán)隊帶領(lǐng)很大的便利:
減少甚至杜絕代碼管理導(dǎo)致的線上事故;
提高開發(fā)和測試的工作效率,人多也亂;
減少甚至杜絕代碼管理導(dǎo)致的線上事故;
方便運維處理發(fā)布和回滾;
讓項目的開發(fā)可以靈活適應(yīng)多變的需求,多人協(xié)同開發(fā)。
統(tǒng)一日志規(guī)范日志是產(chǎn)品必不可少的一個功能,具備可回溯性、能夠抓取問題現(xiàn)場信息是其獨一無二的優(yōu)點,尤其在生產(chǎn)系統(tǒng)上問題定位等方面具有不可替代的作用。
這里著重強(qiáng)調(diào)一下針對異常的日志規(guī)范:
WARN和ERROR的選擇需要好好考慮,WARN一般我傾向于記錄可自恢復(fù)但值得關(guān)注的錯誤,ERROR代表了不能自己恢復(fù)的錯誤。對于業(yè)務(wù)處理遇到問題用ERROR不合理,對于catch到了異常也不是全用ERROR。
記錄哪些信息,最好打印一定的上下文(鏈路TraceId、用戶Id、訂單Id、外部傳來的關(guān)鍵數(shù)據(jù))而不僅僅是打印線程棧。
記錄了上下問信息,是否要考慮日志脫敏問題?可以在框架層面實現(xiàn),比如自定義實現(xiàn)logback的ClassicConverter。
正確合理的使用日志,能夠指引開發(fā)人員快速查找錯誤、定位問題,因此約定了一套日志使用標(biāo)準(zhǔn)規(guī)范,現(xiàn)在可以更多的參考《阿里經(jīng)濟(jì)體開發(fā)規(guī)約——日志規(guī)約》。
統(tǒng)一MYSQL開發(fā)規(guī)范表的設(shè)計和 Api 的定義類似,屬于那種開頭沒有開好,以后改變需要花10x代價的,我知道,一開始在業(yè)務(wù)不明確的情況下,設(shè)計出良好的一步到位的表結(jié)構(gòu)很困難,但是至少我們可以做的是有一個好的標(biāo)準(zhǔn)。
統(tǒng)一工具與框架對開發(fā)過程中所用到的公共組件進(jìn)行了統(tǒng)一抽象與封裝,包括 dao 層框架mybatis、cache 組件 jetcache、httpclien t組件、common-tools (公共工具),同時抽取出全局唯一ID、分布式鎖、冪等等公共組件,把以上公共組件進(jìn)行集成到各個應(yīng)用,進(jìn)行統(tǒng)一升級、維護(hù),這樣以來方便大家將更多的精力集中到業(yè)務(wù)開發(fā)上。
開發(fā)流程目前團(tuán)隊的開發(fā)模式還是基于傳統(tǒng)的瀑布開發(fā)模式,整體開發(fā)流程涉及需求評審、測試用例評審、技術(shù)架構(gòu)評審、開發(fā)與測試、驗收與上線,這里主要基于TL的角度從需求管理、技術(shù)架構(gòu)評審、代碼評審、發(fā)布計劃評審幾個關(guān)鍵重點環(huán)節(jié)進(jìn)行探討,歡迎拍磚。
需求管理美國專門從事跟蹤IT項目成功或失敗的權(quán)威機(jī)構(gòu) Standish Group的CHAOS Reports 報導(dǎo)了該公司的一項研究,該公司對多個項目作調(diào)查后發(fā)現(xiàn),百分之七十四的項目是失敗的,既這些項目不能按時按預(yù)算完成。其中提到最多的導(dǎo)致項目失敗的原因就是"變更用戶需求"。另外從歷年的 Standish Group 報告分析看,導(dǎo)致項目失敗的最重要原因與需求有關(guān)。Standish Group 的CHAOS 報告進(jìn)一步證實了與成功項目最密切的因素是良好的需求管理,也就是項目的范圍管理,特別是管理好項目的變更。
產(chǎn)品因需求而生,在產(chǎn)品的整個生命周期中,產(chǎn)品經(jīng)理會收到來自各個方面的需求,但是每一個需求的必要性、重要性和實現(xiàn)成本都需要經(jīng)過深思熟慮的分析和計劃,避免盲目的決定需求或者變更需求,這樣很容易導(dǎo)致工作混亂,技術(shù)TL如果不能正確的對需求進(jìn)行把控,會導(dǎo)致整個項目偏離正確的軌道。
需求管理的第一步就是要梳理不同來源的需求,主要包括從產(chǎn)品定位出發(fā)、外部用戶反饋、競爭對手情況、市場變化以及內(nèi)部運營人員、客服人員、開發(fā)人員的反饋。首先技術(shù)TL對產(chǎn)品有足夠認(rèn)知和把控,簡單來說就是我的產(chǎn)品是為了滿足哪些人的哪些需求而做,產(chǎn)品需求一定要根植于客戶的需求、根植于客戶的環(huán)境。每款產(chǎn)品必定有其核心價值,能夠為客戶創(chuàng)造更多的價值,基于此考慮往往能得到一些核心需求,摒除價值不大的需求。
需求管理中最重要的就是對發(fā)散性需求的管理,往往因此也會導(dǎo)致產(chǎn)品在執(zhí)行過程中不斷的變更或增加需求。由于人的思維是發(fā)散性的,所以往往在產(chǎn)品構(gòu)思的過程中會出現(xiàn)各種新鮮好玩的想法,這些想法可能來自領(lǐng)導(dǎo)或者產(chǎn)品經(jīng)理自己,但是這些想法往往都是和產(chǎn)品核心方向不相關(guān)的,但是由于這些想法能夠在當(dāng)時帶來誘惑,因此這些不相關(guān)的需求會嚴(yán)重干擾了技術(shù)團(tuán)隊的精力,打亂或者延誤產(chǎn)品原本的計劃。同樣技術(shù)研發(fā)同學(xué)也需要建立對產(chǎn)品的深度思考,不要把自己定位成產(chǎn)品需求的實現(xiàn)者,同樣需要對需求負(fù)責(zé)。
很多時候需求的變更或增加是因為我們面臨太多選擇和想要的太多,沒有適當(dāng)?shù)目刂谱约旱挠?,并以自己的喜好來決定需求,這些因素很容易導(dǎo)致產(chǎn)品沒有明確的方向、團(tuán)隊成員疲于奔命,但是卻沒有實際的成果。所以技術(shù)TL一定要能夠評估出重新審視產(chǎn)品和篩選需求的優(yōu)先級,識別每一個需求的必要性、重要性和實現(xiàn)成本。通過深思熟慮給團(tuán)隊明確方向并專注,聚焦資源的支配,確保團(tuán)隊的精力都聚焦在產(chǎn)品的核心需求上。
技術(shù)架構(gòu)評審互聯(lián)網(wǎng)時代,大家提倡敏捷迭代,總嫌傳統(tǒng)方式太重,流程復(fù)雜,影響效率,什么都希望短平快,在扁平化的組織中,經(jīng)常是需求火速分發(fā)到一線研發(fā),然后就靠個人折騰去了,其實技術(shù)架構(gòu)評審這同樣是一個非常重要的環(huán)節(jié)。架構(gòu)評審或技術(shù)方案評審的價值在于集眾人的力量大家一起來分析看看方案里是否有坑,方案上線后是否會遇到不可逾越的重大技術(shù)問題,提前盡可能把一些事情先考慮到提出質(zhì)疑其實對項目的健康發(fā)展有很大的好處。
基于架構(gòu)評審,我們的目標(biāo)核心是要滿足以下幾點:
1.設(shè)計把關(guān),確保方案合格,各方面都考慮到了,避免缺陷和遺漏,不求方案多牛,至少不犯錯。
保證架構(gòu)設(shè)計合理和基本一致,符合整體原則。
維持對系統(tǒng)架構(gòu)的全局認(rèn)知,避免黑盒效應(yīng)。
通過評審發(fā)掘創(chuàng)新亮點,推廣最佳實踐。
架構(gòu)設(shè)計既要保證架構(gòu)設(shè)計的合理性和可擴(kuò)展性,又要避免過度設(shè)計。架構(gòu)設(shè)計不僅僅是考慮功能實現(xiàn),還有很多非功能需求,以及持續(xù)運維所需要的工作,需要工程實踐經(jīng)驗,進(jìn)行平衡和取舍。
架構(gòu)評審需要以下幾點:技術(shù)選型:為什么選用A組件不選用B、C組件,A是開源的,開源協(xié)議是啥?基于什么語言開發(fā)的,出了問題我們自身是否能夠維護(hù)?性能方面有沒有壓測過?這些所有問題作為技術(shù)選型我們都需要考慮清楚,才能做最終決定。
高性能:產(chǎn)品對應(yīng)的TPS、QPS和RT是多少?設(shè)計上會做到的TPS、QPS和RT是多少?而實際上我們整體隨著數(shù)據(jù)量的增大系統(tǒng)性能會不會出現(xiàn)明顯問題?隨著業(yè)務(wù)量、數(shù)據(jù)量的上升,我們的系統(tǒng)的性能如何去進(jìn)一步提高?系統(tǒng)哪個環(huán)節(jié)會是最大的瓶頸?是否有抗突發(fā)性能壓力的能力,大概可以滿足多少的TPS和QPS,怎么去做來實現(xiàn)高性能,這些問題都需要我們?nèi)ニ伎肌?/p>
高可用:是否有單點的組件,非單點的組件如何做故障轉(zhuǎn)移?是否考慮過多活的方案?是否有數(shù)據(jù)丟失的可能性?數(shù)據(jù)丟失如何恢復(fù)?出現(xiàn)系統(tǒng)宕機(jī)情況,對業(yè)務(wù)會造成哪些影響?有無其他補(bǔ)救方案?這些問題需要想清楚,有相應(yīng)的解決方案。
可擴(kuò)展性:A和B的業(yè)務(wù)策略相差無幾,后面會不會繼續(xù)衍生出C的業(yè)務(wù)策略,隨著業(yè)務(wù)的發(fā)展哪些環(huán)節(jié)可以做擴(kuò)展,如何做擴(kuò)展?架構(gòu)設(shè)計上需要考慮到業(yè)務(wù)的可擴(kuò)展性。
可伸縮性:每個環(huán)節(jié)的服務(wù)是不是無狀態(tài)的?是否都是可以快速橫向擴(kuò)展的?擴(kuò)容需要怎么做手動還是自動?擴(kuò)展后是否可以提高響應(yīng)速度?這所有的問題都需要我們?nèi)ニ伎记宄?,并有對?yīng)的解決方案。
彈性處理:消息重復(fù)消費、接口重復(fù)調(diào)用對應(yīng)的服務(wù)是否保證冪等?是否考慮了服務(wù)降級?哪些業(yè)務(wù)支持降級?支持自動降級還是手工降級?是否考慮了服務(wù)的超時熔斷、異常熔斷、限流熔斷?觸發(fā)熔斷后對客戶的影響?服務(wù)是否做了隔離,單一服務(wù)故障是否影響全局?這些問題統(tǒng)統(tǒng)需要我們想清楚對應(yīng)的解決方案,才會進(jìn)一步保證架構(gòu)設(shè)計的合理性。
兼容性:上下游依賴是否梳理過,影響范圍多大?怎么進(jìn)行新老系統(tǒng)替換?新老系統(tǒng)能否來回切換?數(shù)據(jù)存儲是否兼容老的數(shù)據(jù)處理?如果對你的上下游系統(tǒng)有影響,是否通知到上下游業(yè)務(wù)方?上下游依賴方進(jìn)行升級的方案成本如何最小化?這些問題需要有完美的解決方案,稍有不慎會導(dǎo)致故障。
安全性:是否徹底避免SQL注入和XSS?是否有數(shù)據(jù)泄露的可能性?是否做了風(fēng)控策略?接口服務(wù)是否有防刷保護(hù)機(jī)制?數(shù)據(jù)、功能權(quán)限是否做了控制?小二后臺系統(tǒng)是否做了日志審計?數(shù)據(jù)傳輸是否加密驗簽?應(yīng)用代碼中是否有明文的AK/SK、密碼?這些安全細(xì)節(jié)問題需要我們統(tǒng)統(tǒng)考慮清楚,安全問題任何時候都不能輕視。
可測性:測試環(huán)境和線上的差異多大?是否可以在線上做壓測?線上壓測怎么隔離測試數(shù)據(jù)?是否有測試白名單功能?是否支持部署多套隔離的測試環(huán)境?測試黑盒白盒工作量的比例是怎么樣的?新的方案是否非常方便測試,在一定程度也需要考量。
可運維性:系統(tǒng)是否有初始化或預(yù)熱的環(huán)節(jié)?數(shù)據(jù)是否指數(shù)級別遞增?業(yè)務(wù)數(shù)據(jù)是否需要定期歸檔處理?隨著時間的推移如果壓力保持不變的話系統(tǒng)需要怎么來巡檢和維護(hù)?業(yè)務(wù)運維方面的設(shè)計也需要充分考慮到。
監(jiān)控與報警:對外部依賴的接口是否添加了監(jiān)控與報警?應(yīng)用層面系統(tǒng)內(nèi)部是否有暴露了一些指標(biāo)作監(jiān)控和報警?系統(tǒng)層面使用的中間件和存儲是否有監(jiān)控報警?只有充分考慮到各個環(huán)節(jié)的監(jiān)控、報警,任何問題會第一時間通知到研發(fā),阻止故障進(jìn)一步擴(kuò)散。
其實不同階段的項目有不同的目標(biāo),我們不會在項目起步的時候做99.99%的可用性支持百萬QPS的架構(gòu),高效完成項目的業(yè)務(wù)目標(biāo)也是架構(gòu)考慮的因素之一。而且隨著項目的發(fā)展,隨著公司中間件和容器的標(biāo)準(zhǔn)化,很多架構(gòu)的工作被標(biāo)準(zhǔn)化替代,業(yè)務(wù)代碼需要考慮架構(gòu)方面伸縮性運維性等等的需求越來越少,慢慢的這些工作都能由架構(gòu)和運維團(tuán)隊來接。一開始的時候我們可以花一點時間來考慮這些問題,但是不是所有的問題都需要有最終的方案。
代碼評審代碼質(zhì)量包括功能性代碼質(zhì)量和非功能性代碼質(zhì)量,功能質(zhì)量大多通過測試能夠去發(fā)現(xiàn)問題,非功能性代碼質(zhì)量用戶不能直接體驗到這種質(zhì)量的好壞,代碼質(zhì)量不好,最直接的“受害者”是開發(fā)者或組織自身,因為代碼質(zhì)量好壞直接決定了軟件的可維護(hù)性成本的高低。代碼質(zhì)量應(yīng)該更多的應(yīng)該從可測性,可讀性,可理解性,容變性等代碼可維護(hù)性維度去衡量,其中 CodeReview 是保證代碼質(zhì)量非常重要的一個環(huán)節(jié),建立良好的 CodeReview 規(guī)范與習(xí)慣,對于一個技術(shù)團(tuán)隊是一件非常重要核心的事情,沒有 CodeReview 的團(tuán)隊沒有未來。
每次項目開發(fā)自測完成后,通常會組織該小組開發(fā)人員集體進(jìn)行代碼 review,代碼 review 一般 review 代碼質(zhì)量以及規(guī)范方面的問題,另外需要關(guān)注的是每一行代碼變更是否與本次需求相關(guān),如果存在搭車發(fā)布或者代碼重構(gòu)優(yōu)化,需要自行保證測試通過,否則不予發(fā)布。
CodeReview 我會重點關(guān)注如下事情:
確認(rèn)代碼功能:代碼實現(xiàn)的功能滿足產(chǎn)品需求,邏輯的嚴(yán)謹(jǐn)和合理性是最基本的要求。同時需要考慮適當(dāng)?shù)臄U(kuò)展性,在代碼的可擴(kuò)展性和過度設(shè)計做出權(quán)衡,不編寫無用邏輯和一些與代碼功能無關(guān)的附加代碼。
在真正需要某些功能的時候才去實現(xiàn)它,而不是你預(yù)見到它將會有用。 —— RonJeffries
編碼規(guī)范:以集團(tuán)開發(fā)規(guī)約、靜態(tài)代碼規(guī)約為前提,是否遵守了編碼規(guī)范,遵循了最佳實踐。除了形式上的要求外,更重要的是命名規(guī)范。目標(biāo)是提高代碼的可讀性,降低代碼可維護(hù)性成本。
潛在的BUG:可能在最壞情況下出現(xiàn)問題的代碼,包括常見的線程安全、業(yè)務(wù)邏輯準(zhǔn)確性、系統(tǒng)邊界范圍、參數(shù)校驗,以及存在安全漏洞(業(yè)務(wù)鑒權(quán)、灰產(chǎn)可利用漏洞)的代碼。。
文檔和注釋:過少(缺少必要信息)、過多(沒有信息量)、過時的文檔或注釋,總之文檔和注釋要與時俱進(jìn),與最新代碼保持同步。其實很多時候個人覺得良好的變量、函數(shù)命名是最好的注釋,好的代碼勝過注釋。
重復(fù)代碼:當(dāng)一個項目在不斷開發(fā)迭代、功能累加的過程中,重復(fù)代碼的出現(xiàn)幾乎是不可避免的,通常可以通過PMD工具進(jìn)行檢測。類型體系之外的重復(fù)代碼處理通常可以封裝到對應(yīng)的Util類或者Helper類中,類體系之內(nèi)的重復(fù)代碼通??梢酝ㄟ^繼承、模板模式等方法來解決。
復(fù)雜度:代碼結(jié)構(gòu)太復(fù)雜(如圈復(fù)雜度高),難以理解、測試和維護(hù)。
監(jiān)控與報警:基于產(chǎn)品的需求邏輯,需要有些指標(biāo)來證明業(yè)務(wù)是正常work的,如果發(fā)生異常需要有監(jiān)控、報警指標(biāo)通知研發(fā)人員處理,review業(yè)務(wù)需求對應(yīng)的監(jiān)控與報警指標(biāo)也是Code Review的重點事項。
測試覆蓋率:編寫單元測試,特別是針對復(fù)雜代碼的測試覆蓋是否足夠。
實際上維護(hù)單元測試的成本不比開發(fā)成本低,這點團(tuán)隊目前做的的不到位。
針對以上每次代碼review所涉及到的經(jīng)典案例會統(tǒng)一輸出到文檔里,大家可以共同學(xué)習(xí)避免編寫出同樣的Ugly Code。
發(fā)布計劃評審涉及到10人日以上的項目,必須有明確的發(fā)布計劃,并組織項目成員統(tǒng)一參加項目發(fā)布計劃review,發(fā)布計劃主要包含如下幾點:
1)明確是否有外部依賴接口,如有請同步協(xié)調(diào)好業(yè)務(wù)方;
2)發(fā)布前配置確認(rèn)包括配置文件、數(shù)據(jù)庫配置、中間件配置等各種配置,尤其各種環(huán)境下的差異化配置項;
3)二方庫發(fā)布順序,是否有依賴;
4)應(yīng)用發(fā)布順序;
5)數(shù)據(jù)庫是否有數(shù)據(jù)變更和訂正,以及表結(jié)構(gòu)調(diào)整;
6)回滾計劃,必須要有回滾計劃,發(fā)布出現(xiàn)問題要有緊急回滾策略;
7)生產(chǎn)環(huán)境回歸測試重點Case。
技術(shù)規(guī)劃與管理我在帶技術(shù)團(tuán)隊的這些年,對團(tuán)隊一直有一個要求,每周都要做系統(tǒng)健康度巡檢,未雨綢繆、晴天修屋頂,避免在極端場景下某些隱藏的bug轉(zhuǎn)變成了故障。
系統(tǒng)健康度巡檢為什么要把系統(tǒng)健康度巡檢放到技術(shù)管理里,我覺得這是一個非常重要的環(huán)節(jié)。像傳統(tǒng)的航空、電力、汽車行業(yè)都要有一定的巡檢機(jī)制,保障設(shè)備系統(tǒng)正常運轉(zhuǎn),同樣軟件系統(tǒng)也同樣需要巡檢機(jī)制保障業(yè)務(wù)健康發(fā)展。
隨著業(yè)務(wù)的不斷發(fā)展,業(yè)務(wù)量和數(shù)據(jù)量不斷的上漲,系統(tǒng)架構(gòu)的腐蝕是避免不了的,為了保障系統(tǒng)的健康度,需要不斷的考慮對系統(tǒng)架構(gòu)、性能進(jìn)行優(yōu)化。
系統(tǒng)的監(jiān)控與報警能夠一定程度發(fā)現(xiàn)系統(tǒng)存在的問題,系統(tǒng)存在的一些隱患需要通過對系統(tǒng)的巡檢去發(fā)現(xiàn),如果優(yōu)化不及時在極端情況會導(dǎo)致故障,巡檢粒度建議每周巡檢一次自己所負(fù)責(zé)的業(yè)務(wù)系統(tǒng)。
系統(tǒng)巡檢重點要關(guān)注如下幾點:
系統(tǒng)指標(biāo):系統(tǒng)CPU、負(fù)載、內(nèi)存、網(wǎng)絡(luò)、磁盤有無異常情況波動,確認(rèn)是否由發(fā)布導(dǎo)致,還是系統(tǒng)調(diào)用異常。
慢接口:通常rt大于3s的接口需要重點關(guān)注,極端并發(fā)場景下容易導(dǎo)致整個系統(tǒng)雪崩。
慢查詢:MYSQL慢查詢需要重點關(guān)注,隨著數(shù)據(jù)量上漲,需要對慢查詢進(jìn)行優(yōu)化。
錯誤日志:通過錯誤日志去發(fā)現(xiàn)系統(tǒng)隱藏的一些bug,避免這些bug被放大,甚至極端情況下會導(dǎo)致故障。
技術(shù)規(guī)劃技術(shù)規(guī)劃通常由團(tuán)隊的TL負(fù)責(zé),每個財年TL需要從大局的角度去思考每個季度的技術(shù)優(yōu)化規(guī)劃,去償還技術(shù)債,技術(shù)債也是有利息的,因為利息的存在,技術(shù)債務(wù)不及時償還的話,會在未來呈現(xiàn)出非線性增長,造成始料不及的損失。
這里的技術(shù)規(guī)劃包括如下幾點:
架構(gòu)優(yōu)化:一些結(jié)構(gòu)不良、低內(nèi)聚高耦合的代碼則會使得哪怕是微小的需求變更或功能擴(kuò)展都無從下手,修改的代價很可能超過了重寫的代價。同樣系統(tǒng)之間的耦合也需要重點去關(guān)注,遵循微服務(wù)化的原則,系統(tǒng)也要遵循單一職責(zé)原則,對于職責(zé)不清晰的系統(tǒng)去做解耦優(yōu)化,進(jìn)行一些模塊化改造、服務(wù)隔離、公用服務(wù)抽象。
性能優(yōu)化:基于財年對于業(yè)務(wù)量、數(shù)據(jù)量的發(fā)展評估,根據(jù)目前系統(tǒng)服務(wù)的QPSRT,需要提前規(guī)劃對系統(tǒng)性能進(jìn)行一些升級策略,包括重點關(guān)注對一些慢接口、慢查詢的優(yōu)化。
彈性與可靠性:系統(tǒng)提供的服務(wù)需要保障括數(shù)據(jù)一致性、冪等、防重攻擊,同時也需要從熔斷降級、異地多活的角度去考慮存在哪些問題,目前系統(tǒng)的SLA指標(biāo)是否能夠達(dá)到高可用,需要做哪些優(yōu)化保障系統(tǒng)的高可用。
可伸縮:應(yīng)用服務(wù)是否保證無狀態(tài),關(guān)鍵節(jié)點發(fā)生故障能夠快速轉(zhuǎn)移、擴(kuò)容,避免故障擴(kuò)大化。
總結(jié)大家不知道有沒有類似的經(jīng)歷,某個時間段突然一些線上故障頻發(fā),各種技術(shù)債、業(yè)務(wù)債被業(yè)務(wù)方窮追猛打要求還債,如果出現(xiàn)這種現(xiàn)象很大程度這個TL已經(jīng)失位了,這個團(tuán)隊失控了。也曾經(jīng)有人跟我吐槽他的TL把活都分給他們,而TL自己什么都不干!這個技術(shù)TL真的什么都不干?曾經(jīng)有一段時間我也在思考技術(shù)TL的核心職責(zé)到底是什么?技術(shù)TL應(yīng)該具備哪些素質(zhì)?
首先技術(shù)說到底是為業(yè)務(wù)服務(wù)的,除非技術(shù)就是業(yè)務(wù)本身,必須體現(xiàn)它的商業(yè)價值。在很多公司里技術(shù)研發(fā)真的就成了實現(xiàn)其他部門需求的工具,我覺得這樣的技術(shù)TL肯定是不合格的。首先它不能影響業(yè)務(wù)發(fā)展,需求提出方會經(jīng)過很多轉(zhuǎn)化,如果不是不假思索傳遞需求,整個過程會失真。
第二個,我認(rèn)為最最重要的是架構(gòu)設(shè)計的能力,可能管理能力還次之。對于管理能力我認(rèn)為最重要的是對團(tuán)隊的感知能力,因為一旦到了技術(shù)TL這個級別,不能脫離一線太遠(yuǎn),業(yè)務(wù)細(xì)節(jié)可以不清楚,大的方向必須要明確。如果沒有很細(xì)膩的感知能力,很多的決策會有偏差。
如果他不是一個業(yè)務(wù)架構(gòu)師,不是一個能給團(tuán)隊指明更好方向的人,他最終會淪為一個需求翻譯器,產(chǎn)品經(jīng)理說怎么做就怎么做。他更多的只是負(fù)責(zé)保證產(chǎn)品的質(zhì)量、開發(fā)的速度,最終被肢解成一個很瑣碎的人。一旦團(tuán)隊上了一定的規(guī)模,團(tuán)隊就會從單純的需求實現(xiàn)走向團(tuán)隊運營,而運營是需要方向的,業(yè)務(wù)架構(gòu)就是一個基于運營和數(shù)據(jù)的一種綜合的能力。
關(guān)于技術(shù)層面,技術(shù)TL需要具備如下素養(yǎng):
技術(shù)視野良好,解決問題能力與架構(gòu)設(shè)計能力出色。
技術(shù)TL要有良好的技術(shù)視野,不需要各種技術(shù)都樣樣精通,但是必須要所有涉獵,有所了解,對各種技術(shù)領(lǐng)域的發(fā)展趨勢,主流非主流技術(shù)的應(yīng)用場景要非常了解。知道在什么場景應(yīng)用什么技術(shù),業(yè)務(wù)發(fā)展到什么規(guī)模應(yīng)該預(yù)先做哪些技術(shù)儲備。產(chǎn)品架構(gòu)的設(shè)計要有足夠的彈性,既能夠保證當(dāng)前開發(fā)的高效率,又能夠?qū)ξ磥懋a(chǎn)品架構(gòu)的演進(jìn)留出擴(kuò)展的余地。
動手能力要強(qiáng),學(xué)習(xí)能力出色。
技術(shù)TL并不需要自己親自動手寫代碼,但是如有必要,自己可以隨時動手參與第一線的編碼工作,技術(shù)TL不能長期遠(yuǎn)離一線工作,自廢武功,紙上談兵。否則長此以往,會對技術(shù)的判斷產(chǎn)生嚴(yán)重的失誤。另外,技術(shù)TL也應(yīng)該是一個學(xué)習(xí)能力非常出色的人,畢竟IT行業(yè)的技術(shù)更新?lián)Q代速度非???,如果沒有快速學(xué)習(xí)能力,是沒有資格做好技術(shù)TL的。
技術(shù)TL除了管人和管事之外,其他還有很多事情要做包括建立團(tuán)隊研發(fā)文化、團(tuán)隊人才培養(yǎng)與建設(shè)、跨部門協(xié)調(diào)與溝通等,這樣以要求技術(shù)TL也同時也需要具備良好的溝通和管理能力,以上觀點僅是個人的一些思考和觀點,僅供參考。
閱讀原文
本文來自云棲社區(qū)合作伙伴“?阿里技術(shù)”,如需轉(zhuǎn)載請聯(lián)系原作者。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/11982.html
摘要:前言本文給大家分享的題目是基于微服務(wù)以及的高可用架構(gòu)探索與實現(xiàn)。比如說年大地震的時候我正好在東京,當(dāng)時在做一個金融系統(tǒng)的相關(guān)工作。那次大地震導(dǎo)致很多很多的問題,雖然大地震不是在東京發(fā)生,但是還是給我們的系統(tǒng)造成了影響。 前言 本文給大家分享的題目是《基于DevOps、微服務(wù)以及K8S的高可用架構(gòu)探索與實現(xiàn)》。整個企業(yè)的高可用架構(gòu)面臨很多的挑戰(zhàn),面向微服務(wù)、容器化以及敏態(tài)交付,是我們現(xiàn)在...
摘要:郵件推送是摩杜云自主研發(fā)的一款簡單高效的電子郵件發(fā)送服務(wù),能幫助你快速精準(zhǔn)地實現(xiàn)事務(wù)郵件通知郵件和批量郵件的發(fā)送。電子郵件群發(fā)已經(jīng)成為非常普遍的營銷方式,一般來說,用這種方式來給潛在的客戶發(fā)送信息,可以取得比較好的效果。而且電子郵件的用戶數(shù)量龐大,幾乎懂得互聯(lián)網(wǎng)、懂得上網(wǎng)或者正在工作的人都會使用到電子郵件,而且全球使用電子郵件的人數(shù)早已經(jīng)超過了30億人。 這比單純的一些短視頻平臺的流量...
摘要:很多程序員問我,感覺漲工資不再像以前那么簡單了,感覺現(xiàn)在很迷茫。這也是很多用人單位喜歡高學(xué)歷的學(xué)生。類學(xué)生一般是工作年以內(nèi),或者培訓(xùn)以后年以內(nèi),這類人優(yōu)點是專業(yè)技能上身快,學(xué)習(xí)有針對性,效率高。這個是最重要的,也是很多人不成功的原因。 showImg(https://segmentfault.com/img/bVbgTka?w=1080&h=608);很多程序員問我,感覺漲工資不再像以...
摘要:很多程序員問我,感覺漲工資不再像以前那么簡單了,感覺現(xiàn)在很迷茫。然后換了第二份工作,工資也漲到了。目前基礎(chǔ)如何,對技術(shù)鏈條把我的長短。這個是最重要的,也是很多人不成功的原因。很多人喜歡打嘴炮,說的很好計劃很合理,沒堅持兩天又放棄了。 showImg(https://segmentfault.com/img/bVbgTka?w=1080&h=608);很多程序員問我,感覺漲工資不再像以前...
摘要:很多程序員問我,感覺漲工資不再像以前那么簡單了,感覺現(xiàn)在很迷茫。這也是很多用人單位喜歡高學(xué)歷的學(xué)生。類學(xué)生一般是工作年以內(nèi),或者培訓(xùn)以后年以內(nèi),這類人優(yōu)點是專業(yè)技能上身快,學(xué)習(xí)有針對性,效率高。這個是最重要的,也是很多人不成功的原因。 showImg(https://segmentfault.com/img/bVbgTka?w=1080&h=608);很多程序員問我,感覺漲工資不再像以...
閱讀 2729·2021-10-11 10:58
閱讀 1324·2021-09-29 09:34
閱讀 1746·2021-09-26 09:46
閱讀 3991·2021-09-22 15:31
閱讀 857·2019-08-30 15:54
閱讀 1596·2019-08-30 13:20
閱讀 1375·2019-08-30 13:13
閱讀 1680·2019-08-26 13:52