所以要考慮如何解決人性化,人與人溝通的問題,這是解決業(yè)務研發(fā)效率的關鍵所在。
1.溝通效率問題
有合作必然就有溝通,提升溝通效率最好的辦法就是形成默契,要形成默契就要通過規(guī)范和約定等手段把大家圈在同個語言頻道上。
需求階段的溝通比較多,如統(tǒng)術語,需求結構化表達,統(tǒng)業(yè)務身份。
(1)統(tǒng)一術語。這在一個公司非常重要,比如在某些公司,“PM"這個詞是指產品經理,而在另外些公司是指項目經理;還有諸如應用,系統(tǒng),模塊這些基本的稱謂,如果大家理解不一樣的話會很糟糕。
在公司中形成術語也有些技巧。比如給產品取一個好名字,名字既可成為術講也可以是很好的傳播符號,像滴滴的個服務框架叫DiSF ( didi service framework,滴師傅),這個名字有內容、有含義很容易被記住。在公司中與人溝通也是一樣,如果很難一句話向別人說清楚某個產品或者項目,那么推廣起來就會比較費勁,因此,把自己的產品,項目或任何需要向別人表達的事情術語化可以減少溝通的成個。
(2)結構化表達需求?;ヂ?lián)網(wǎng)公同中都是需求驅動產品和技術的,提出需求的人大多都是運營和產品經理而非技術人員,這就不可避免地存在不同崗位人員的溝通理解問題。需求的結構化表達就是把需求用“ 系列的術語、圖標、頁面等可以更好理解和呈現(xiàn)的方式(一般產出就是PRD)在同一個語境中表達出來,讓對方更好的理解。溝通需求的過程就是把不確定性確定下來的過程,需求越具體溝通越容易。把需求結構化,和把系統(tǒng)中需要經常改動的邏輯配置化要達到的效果是樣的,最終產生的結果就是一個變更記錄。
(3)統(tǒng)業(yè)務身份。業(yè)務身份是管理一個業(yè)務在各個業(yè)務城中定義的業(yè)務規(guī)則索引,是一串平臺可識別的編碼,該編碼由構成業(yè)務的要素經過一定組合關系運算生成,在平臺的運行城中,各個業(yè)務域的系統(tǒng)根據(jù)輸人的參數(shù)條件,進行業(yè)務身份判斷運算,最終根據(jù)識別出的業(yè)務身份結果,執(zhí)行該業(yè)務在本系統(tǒng)定義的業(yè)務規(guī)則。要實現(xiàn)統(tǒng)一業(yè) 務身份必須要解決:
系統(tǒng)之間同一項業(yè)務的聯(lián)通性問題,讓系統(tǒng)自動呈現(xiàn)業(yè)務整體視圖;
業(yè)務條件沒有生命周期管理、系統(tǒng)長期維護困難的問題,要統(tǒng)一業(yè)條件識別;
業(yè)務上下線相互影響、回歸工作量大和效率較低的問題。這就要對業(yè)務邏輯進行能力抽象,建立封閉性,從而隔離業(yè)務。要對業(yè)務身份進行統(tǒng)一管理,需要實現(xiàn):
對業(yè)務身份標識的統(tǒng)一注冊和管理,一般需要構建一個運營平臺;。有業(yè)務規(guī)則的配置界面;規(guī)則的執(zhí)行引擎。
所以統(tǒng)一業(yè)務身份需要人口的注冊管理、規(guī)則的配置與變更,以及規(guī)則的運行域,缺一不可。
2.開發(fā)效率
如何高效地寫代碼是程序員永恒的話題。這涉及很多因素,如程序員對代碼語言本身的掌握程度(比如JDK8中引人閉包代碼可以使代碼更簡潔),寫代碼所用的IDE以及快捷鍵的使用程度,等等。筆者在這里先拋開這些問題,闡述下從開發(fā)到測試再到運維的整個效率問題。
開發(fā),人員都不希望別人亂碰自己寫的代碼,對代碼有絕對的控制權,所以一般都喜歡掌控(Owner)系統(tǒng),即這個系統(tǒng)我說了算。在這種情況下,曾有一段時間我們把系統(tǒng)拆得很小,結果誕生了很多同質的系統(tǒng),越來越多地在做重復的事情;此后又經歷了系統(tǒng)合并的階段。但是,系統(tǒng)合并也會帶來新問題,即開放過程中沖突比較厲害,包括打包部署的效率都很低,在這種情況下會有兩種解決方案:一是開發(fā)態(tài)和運行態(tài)分離;二是對系統(tǒng)進行分層和抽象建模。
所謂開發(fā)態(tài)和運行態(tài)分離,就是大家線下的開發(fā)都是獨立進行的,包括打包和部署,接口的調用分開,走遠程調用。但是在線上部署時,都是部署在同一個容器中,把遠程調用變成本地調用。這種思路我們在“合并部署”一章中有介紹,本質上可以做到開發(fā)態(tài)和運行態(tài)的分離,同時兼顧開發(fā)效率和運行效率。
3.測試效率
整個軟件生命周期涉及很多環(huán)節(jié):需求、開發(fā)、測試、上線、運維…涉及很多協(xié)作。這些環(huán)節(jié)都會對效果有影響。其中,測試效率非常重要,因為測試花費的時間幾乎和開發(fā)所花的時間是一樣的。關于如何提升測試效率,我們總結了一些實踐經驗,分述如下。
(1)全鏈路Beta測試
繼續(xù)保持Beta環(huán)境與線上環(huán)境的一致性,將核心鏈路上的應用,Beta環(huán)境HSF打通,減少90%由于環(huán)境問題導致的P1、P2故障。
打通之后,可以實現(xiàn)以下效果
測試環(huán)境可以做到召之即來,揮之即去;
在分批發(fā)布前,可以在極短的時間內有針對性地驗證核心功能;也可以選擇性地屏蔽 Cache的訪問;數(shù)據(jù)軌跡可以實時透出。
4.運維效率
運維包括線上和線下兩部分,運維效率會在兩個環(huán)節(jié)表現(xiàn)得最明顯,一個是線下的打包編譯步驟、代碼分發(fā)步驟;一個是線上的下線一重啟一上線步驟、發(fā)布檢查步驟和回滾步驟。下面我們分別看看在這些環(huán)節(jié)有哪些地方可以優(yōu)化。
1)打包編譯環(huán)節(jié)
優(yōu)化流程。環(huán)境分配,可以預先分配好代碼copy,要主動準備而不用每次編譯代碼時再做環(huán)境方面的準備工作;
預處理。監(jiān)控代碼版本修改,當代碼被修改后,自動觸發(fā)代碼合并沖突檢查做代碼編譯和打包操作,不要等到用戶點擊再觸發(fā);每個分支代碼更新主動和主干做 Merge,發(fā)現(xiàn)有沖突要主動通知相應開發(fā)人員修改,不要等到打包部署時再臨時修改;
代碼編譯優(yōu)化。規(guī)則檢查,業(yè)務依賴的包要做依賴規(guī)范化管理,通過工具識別依賴;減少應用依賴 SNAPSHOT版本Jar,可以節(jié)省 Maven編譯時間; Maven打包優(yōu)化,優(yōu)化 Maven配置減少不必要的消耗;
增量編譯。減少編譯時間的辦法之一就是只編譯變化的部分;比較代碼修改時間和編譯的代碼更新時間可以區(qū)分那些修改的類,并針對它們做增量編譯,大大減少編譯時間。
打包機器硬件升級。提升編譯速度的另一個辦法是升級機器硬件,使用更多的CPU或者更多的內存可以明顯提升編譯速度;多組機器 standby以處理并發(fā)修改情況,并始終保持應用處于可用狀態(tài),減少開發(fā)上廁所的次數(shù)。
(2)代碼分發(fā)步驟
代碼分發(fā)主要考慮兩個問題,一個是代碼的下載,最好是支持P2P下載,這樣的下載效率最高(雖然大部分情況是HTTP下載較多,但真心不建議采用);二是如果代碼包比較大且同時下載的機器比較多時,要考慮下載機器的網(wǎng)卡流量是否滿足,這點必須特別留意。
(3)下線、重啟、上線步驟
下線環(huán)節(jié)。下線被動等待15秒健康檢查失敗,能否主動通知LVS下線,而不是被動等待3次3秒的檢查失敗后再下線;
重啟。初始化各種服務,去掉不必要的服務初始化,將一些服務改成慢加載,部分服務可以并行初始化。
(4)回滾
回滾等于重新發(fā)布,直接利用本機的老war包快速重啟,不需要再走包分發(fā)網(wǎng)站建設步驟,要有手動回滾腳本。如果回滾時間長則減少回滾批次,采用發(fā)布一批機器就下線一批機器的方式:下線的機器保持 standby,老代碼不提供服務,出現(xiàn)問題后再立即下線新發(fā)布的機器,將 standby的機器立即上線。這樣可以快速達到回滾的目的,在30秒內就能完成回滾。
本文地址:http://m.cdrpkj.cn//article/4465.html