初創(chuàng)的技術(shù)團(tuán)隊(duì)瘸洛,一切從0開始耍休,一切看似那么美好,前景如此令人向往货矮。市場不等人,需要快速的搶占先機(jī)斯够,所以產(chǎn)品如果能夠早點(diǎn)面市囚玫,就比別人多了一絲活下去的希望。但是磨刀不誤砍柴工读规,如果不做好基礎(chǔ)的技術(shù)準(zhǔn)備工作抓督,就一頭扎進(jìn)業(yè)務(wù)代碼中,看似如火如荼束亏,實(shí)際會(huì)帶來各種各樣的隱患(當(dāng)初創(chuàng)團(tuán)隊(duì)的團(tuán)隊(duì)成員并非是那種并肩在其他平臺(tái)很長時(shí)間形成默契的戰(zhàn)友的話铃在,問題會(huì)更多)。在此定铜,把我們的經(jīng)驗(yàn)總結(jié)一下阳液,避免踩坑。
總結(jié)下來揣炕,一個(gè)團(tuán)隊(duì)的建設(shè)要包括以下幾個(gè)大的方面:
在團(tuán)隊(duì)協(xié)作方面帘皿,要搭建或者使用一些有利于團(tuán)隊(duì)協(xié)作的業(yè)務(wù)平臺(tái),減少大家之間溝通等帶來的成本畸陡。
建立一系列良好的規(guī)范和制度并保證執(zhí)行下去鹰溜,包括編碼規(guī)范、命名規(guī)范丁恭、晨會(huì)制度曹动、周報(bào)制度等。
建立一套良好的研發(fā)流程
搭建一些基礎(chǔ)的研發(fā)平臺(tái)牲览,以保證快速迭代墓陈,持續(xù)交付
如果不是土豪和專家,我們的建議是都用云服務(wù)竭恬,比如阿里云的ECS跛蛋,RDS,開放搜索痊硕,Quick BI赊级,redis,OSS岔绸,SLS等理逊。
下面會(huì)從協(xié)作,規(guī)范盒揉,流程以及持續(xù)交付這四個(gè)方面來講講晋被,我們在動(dòng)手開干之前,技術(shù)團(tuán)隊(duì)要做好哪些準(zhǔn)備刚盈。
搭建團(tuán)隊(duì)協(xié)作基礎(chǔ)設(shè)施
開篇提到團(tuán)隊(duì)協(xié)作的基礎(chǔ)設(shè)施能夠減少團(tuán)隊(duì)協(xié)作間溝通等成本羡洛,下面從一些我們認(rèn)為必須要有的基礎(chǔ)設(shè)施來講講他們的用處。
私有g(shù)itlab的搭建
現(xiàn)在有很多的免費(fèi)或者收費(fèi)的平臺(tái)能夠提供相關(guān)的代碼托管服務(wù)藕漱,那為什么一定要自己來搭建呢欲侮?
最早,我們團(tuán)隊(duì)使用過一家云代碼托管服務(wù)肋联,一周內(nèi)好幾次無法提交或者拉取代碼威蕉,導(dǎo)致大家工作受到了影響。GITHUB也老不穩(wěn)定橄仍,說不定哪天就被墻韧涨。再加上自己搭一個(gè)Gitlab并不麻煩牍戚,所以就自己搭建了。
maven私庫的搭建
團(tuán)隊(duì)很大程度上會(huì)沉淀一些公用的jar虑粥,加上采用微服務(wù)架構(gòu)如孝,每個(gè)服務(wù)定義的接口都以jar包的形式給到調(diào)用方。這些jar包放置在團(tuán)隊(duì)私有的maven庫上再合適不過舀奶。
共享文檔庫
大家可以把一些需求的理解以及設(shè)計(jì)方案放在這個(gè)地方暑竟,以便于其他人快速了解,也為了沉淀知識(shí)育勺,比如團(tuán)隊(duì)擴(kuò)張或者新人進(jìn)來之后但荤,能有地方讓他們快速的學(xué)習(xí)和上手。
在這里推薦一款SaaS產(chǎn)品涧至,叫語雀腹躁。目前是免費(fèi)使用階段,支持markdown南蓬,寫起文檔來感覺很爽纺非。
項(xiàng)目、測試用例赘方、缺陷管理工具
現(xiàn)在大多數(shù)初創(chuàng)團(tuán)隊(duì)都會(huì)采用敏捷的開發(fā)模式烧颖,以MVP的思路,快速迭代窄陡,不斷完善產(chǎn)品炕淮。在一個(gè)迭代中,需要能夠清晰的看到每天每個(gè)人有什么任務(wù)跳夭,每個(gè)任務(wù)處于什么階段涂圆,是需求階段,開發(fā)階段币叹,測試階段還是已完成润歉?類似Scrum中的看板的那種。還有測試的用例和缺陷也需要有一個(gè)系統(tǒng)能夠進(jìn)行維護(hù)和管理颈抚。目前我們團(tuán)隊(duì)正在用云效踩衩。當(dāng)然云效能做的不只是這些,但是我們只是用了云效最基礎(chǔ)的項(xiàng)目管理和缺陷以及用例管理的功能贩汉。
建立規(guī)范
一個(gè)團(tuán)隊(duì)如果沒有規(guī)范九妈,大家按照各自的習(xí)慣寫代碼,那么相互之間理解對(duì)方的代碼的成本就會(huì)變高雾鬼。規(guī)范就是為了把這種大家溝通,理解上的門檻和成本降低宴树。讓研發(fā)的同學(xué)關(guān)注在開心的寫業(yè)務(wù)代碼上策菜。
編碼規(guī)范
后端編碼規(guī)范
幸運(yùn)的是我們用的是java,我們完全按照阿里巴巴的規(guī)范進(jìn)行后臺(tái)代碼的編寫。也不用費(fèi)勁腦子和嘴皮子來統(tǒng)一大家的語言規(guī)范了又憨。按照阿里巴巴的規(guī)范來就好翠霍。
IDEA插件下載:https://github.com/alibaba/p3c
前端編碼規(guī)范
命名規(guī)范
變量
表結(jié)構(gòu)
表字段
數(shù)據(jù)庫相關(guān)的規(guī)范,可以看看58沈劍的58的數(shù)據(jù)庫軍規(guī)
項(xiàng)目結(jié)構(gòu)規(guī)范
在之前蠢莺,都是單體應(yīng)用寒匙,大家定義好包的層級(jí)結(jié)構(gòu)就好了。比如我們經(jīng)常用的
Controller
Service
Dao
Model
Common
這種分package的模式躏将,后來演進(jìn)成采用不同的module來表達(dá)不同的職責(zé)锄弱。
隨著服務(wù)化的思路,我們的項(xiàng)目數(shù)量增多祸憋。那么每個(gè)項(xiàng)目要是有不同的這種結(jié)構(gòu)会宪,其實(shí)大家理解起來還是比較費(fèi)勁的。所以蚯窥,我們對(duì)每個(gè)項(xiàng)目的module都有約定(比如在哪寫倉儲(chǔ)代碼掸鹅,哪里寫DAO代碼各個(gè)層是如何依賴的),我們定義了一套自己的maven骨架拦赠,大家都用它來生成服務(wù)項(xiàng)目巍沙。這些大家在相互了解別人的代碼的時(shí)候,即使不知道業(yè)務(wù)荷鼠,也能很清晰的知道比如它定義的接口應(yīng)該在哪個(gè)module里面句携,它引用別人的服務(wù)是在哪個(gè)module中定義的。
統(tǒng)一開發(fā)工具
團(tuán)隊(duì)最好是用一種開發(fā)工具颊咬,但是不強(qiáng)求务甥。
建立研發(fā)流程
一套好的研發(fā)流程,能夠讓研發(fā)的效率以及質(zhì)量提升數(shù)倍喳篇。雖然看起來敞临,好像不是那么回事兒。但是經(jīng)過實(shí)踐對(duì)比后麸澜,有流程控制的項(xiàng)目確實(shí)從進(jìn)度和質(zhì)量上要超出沒有流程的項(xiàng)目好幾倍挺尿。
我們團(tuán)隊(duì)流程如下:
需求和設(shè)計(jì)評(píng)審
需求由PD產(chǎn)出后,一定要經(jīng)過幾輪的討論(包括跟業(yè)務(wù)方炊邦,UED等)编矾,需要最終定稿,確定范圍馁害,并且研發(fā)的同學(xué)已經(jīng)充分的理解要做什么窄俏。
在需求評(píng)審?fù)瓿珊螅枰M(jìn)行設(shè)計(jì)評(píng)審碘菜。主要是設(shè)計(jì)上是否邏輯完成凹蜈,滿足交互需求限寞,并且定義好交互頁面的規(guī)范和樣式。
這兩個(gè)評(píng)審是必須要有且不能隨便的仰坦。
我們經(jīng)歷過開發(fā)到一半履植,需求推翻重來的情況,也經(jīng)歷過開發(fā)某個(gè)流程悄晃,發(fā)現(xiàn)PRD上遺漏了一種場景玫霎,又需要跟PD,業(yè)務(wù)方進(jìn)行溝通妈橄,而且有些時(shí)候庶近,這種未考慮到的場景在重新進(jìn)行設(shè)計(jì)思考的時(shí)候還影響到了之前的代碼架構(gòu)設(shè)計(jì),不得不修改之前的架構(gòu)設(shè)計(jì)或者表結(jié)構(gòu)等眷细,造成大量的人力浪費(fèi)拦盹。
我們也經(jīng)歷過前端的同學(xué)按照原型開發(fā)出來的頁面,卻并非是了產(chǎn)品和設(shè)計(jì)的想要的界面溪椎。很多原型工具并不是那么完整的表達(dá)出PD和UED腦子里的東西普舆。 那么需要把這些規(guī)范,比如字體校读,字號(hào)沼侣,邊距等都進(jìn)行標(biāo)注,來減少大家對(duì)同一個(gè)事物的理解不一致的情況發(fā)生歉秫。
系統(tǒng)設(shè)計(jì)
需求和設(shè)計(jì)確定后蛾洛,基本上整個(gè)產(chǎn)品的形態(tài)都已經(jīng)出現(xiàn)在我們研發(fā)的腦子中了。
系統(tǒng)設(shè)計(jì)階段雁芙,需要研發(fā)對(duì)用例進(jìn)行分析轧膘,確定自己腦子中的那個(gè)理解與定稿的需求是一致的。同時(shí)兔甘,研發(fā)還需要花點(diǎn)時(shí)間在對(duì)domain以及流程的設(shè)計(jì)上谎碍,盡可能的把一個(gè)業(yè)務(wù)場景考慮得周全。
系統(tǒng)設(shè)計(jì)階段洞焙,就是讓研發(fā)盡可能的推遲寫代碼的沖動(dòng)蟆淀,先把一個(gè)需求一個(gè)功能如何用代碼實(shí)現(xiàn),思考得深刻一點(diǎn)澡匪,把各種情況思考得全面一些熔任,避免來回來去的返工。
我自己曾經(jīng)也經(jīng)歷過唁情,不做設(shè)計(jì)直接寫代碼疑苔。當(dāng)初認(rèn)為這個(gè)需求簡單,所以就沒有設(shè)計(jì)甸鸟。后來代碼寫著寫著夯巷,發(fā)現(xiàn)需求沒有想象的簡單赛惩,還要考慮一些場景,于是把寫好的代碼刪了重寫趁餐,反復(fù)好幾次,每次都是發(fā)現(xiàn)了新的需要考慮的場景導(dǎo)致設(shè)計(jì)推倒重來篮绰。 后來索性后雷,停下來,利用半天的時(shí)間吠各,把問題思考全面了臀突,再開始寫代碼,后面就是一氣呵成了贾漏。
系統(tǒng)設(shè)計(jì)中候学,需要定義好兩種接口。
與前端的接口 (包括入?yún)⒆萆ⅲ祷刂凳崧耄e(cuò)誤碼)
與其他服務(wù)系統(tǒng)的接口(包括入?yún)ⅲ祷刂滴橄疲e(cuò)誤碼)
編碼
按照規(guī)范編碼掰茶,不要施展奇技淫巧。盡可能的抽象和收斂蜜笤。
CR
CR一定要做濒蒋,CR是團(tuán)隊(duì)成員之間相互了解對(duì)方的編碼習(xí)慣和思路的一個(gè)很好的過程。
單元測試
利用mockito來進(jìn)行單元測試的編寫把兔。研發(fā)的同學(xué)要考慮一個(gè)功能的正常和異常場景沪伙。 異常場景又需要根據(jù)各種情景來編寫不同的測試用例。比如DB異常县好,RPC超時(shí)围橡,下游返回調(diào)用錯(cuò)誤等等。
為持續(xù)交付搭建基礎(chǔ)設(shè)施
服務(wù)化之后聘惦,系統(tǒng)拆分得很小某饰。每個(gè)系統(tǒng)上線需要能做到隨時(shí)隨地且自動(dòng)化。借助之前的經(jīng)驗(yàn)善绎,我們搭建了一套基于JENKINS + MESOS+MARATHON+DOCKER的持續(xù)交付的基礎(chǔ)設(shè)施黔漂,來保證我們的系統(tǒng)能夠快速上線。研發(fā)只需要點(diǎn)擊一下按鈕即可實(shí)現(xiàn)從編譯到部署的過程禀酱。
后續(xù)我們會(huì)針對(duì)如何搭建持續(xù)交付的基礎(chǔ)設(shè)施炬守,如何使用阿里云的服務(wù)等等進(jìn)行專題分享。