首先 規(guī)范不是無(wú)中生有萌庆,它是在一定條件下產(chǎn)生的埃儿,如果大家都有標(biāo)準(zhǔn)的認(rèn)知 約定習(xí)慣截亦,則規(guī)范可能并不需要明文規(guī)定肮疗,由于小組成員擅長(zhǎng)的語(yǔ)言和領(lǐng)域不同晶姊,專業(yè)和培訓(xùn) 學(xué)習(xí) 履歷經(jīng)歷不同,工作經(jīng)驗(yàn)積累層次不同伪货,經(jīng)過(guò)三個(gè)月的磨合们衙,發(fā)覺(jué)大部分工作中 仍舊存在一些糟糕混亂的現(xiàn)象,這些混亂雖然不至于導(dǎo)致項(xiàng)目徹底失敗超歌,甚至在庸碌的開(kāi)發(fā)和低效固執(zhí)的溝通中僥幸維持項(xiàng)目正常運(yùn)行的局面砍艾。
小組中成員大部分所遇到的沖突為工作中認(rèn)知沖突,由于大部分時(shí)間成員或固守己見(jiàn)巍举,則由認(rèn)知沖突又極其容易上升到個(gè)人的情感對(duì)立脆荷,使項(xiàng)目的有效推行又添加了阻塞。
所以為了解決一系列沖突和借鑒成熟應(yīng)用廣泛的開(kāi)發(fā)模式,將對(duì)沖突的反思 梳理為規(guī)范蜓谋,最后行程小組乃至整個(gè)團(tuán)隊(duì)的工作行為規(guī)范梦皮,特制定 小組代碼規(guī)范,規(guī)范最終的目的不是為了撰寫(xiě) 是為了 貫徹落實(shí)執(zhí)行桃焕,為項(xiàng)目 穩(wěn)定高效運(yùn)行提供最優(yōu)解剑肯,為團(tuán)隊(duì) 組織溝通開(kāi)發(fā)提供高效模式,為公司和股東節(jié)約時(shí)間按和成本帶來(lái)更高的效益
以下規(guī)范 不代表最終規(guī)范观堂,由于 認(rèn)知沖突隱蔽性很高让网,每遭遇一次影響到高效開(kāi)發(fā)的認(rèn)知沖突都可能被規(guī)范約定起來(lái),規(guī)范會(huì)不斷迭代师痕,不斷添加更新更多內(nèi)容
規(guī)范的制定不是為了限制團(tuán)隊(duì)成員的自由溃睹,規(guī)范是對(duì)自己的保護(hù),當(dāng)別人按照一定的秩序規(guī)范操作 有底線 有章可循胰坟,則自己受傷害的程度和可能性才能降低到最小因篇。
需要解釋的內(nèi)容
1.這個(gè)規(guī)范是針對(duì)某些人而“量身定制”的嗎?
回答:不是笔横,首先前提內(nèi)容已經(jīng)說(shuō)過(guò)了竞滓,原來(lái)的正規(guī)開(kāi)發(fā)就是這樣,現(xiàn)在沒(méi)有規(guī)范吹缔,所以混亂商佑,不是說(shuō)誰(shuí)暴露出來(lái),規(guī)范就是針對(duì)誰(shuí)的涛菠,暴露不按規(guī)范操作的成員其實(shí)只是一個(gè)不規(guī)范的載體而已莉御,工作做事不是要針對(duì)個(gè)人,規(guī)范不是為了挑刺和整人俗冻,因?yàn)槭芎φ吆褪┖φ叨纪蓱z的。
我們?cè)诠緶贤ㄖ挥泄ぷ魃系慕患咕保瑔蝹€(gè)違反規(guī)范的成員會(huì)影響到我和團(tuán)隊(duì)的整體工作效率迄薄,首要考慮的最終目標(biāo)是優(yōu)質(zhì)產(chǎn)出,次要保證產(chǎn)出的前提下再談團(tuán)隊(duì)友誼和感情煮岁,同樣的錯(cuò)誤讥蔽,你會(huì)犯 我會(huì)犯 大家 不熟悉規(guī)范都會(huì)無(wú)意識(shí)觸犯,在沒(méi)有規(guī)范前画机,大家的沖突只是認(rèn)知有分歧冶伞,在有規(guī)范后,再犯可能就是疏忽和沒(méi)有遵守步氏,如果某些成員 能感受到 某一條是為【“我”】量身定制的响禽,說(shuō)明你在進(jìn)步,你已經(jīng)意識(shí)到自己行為對(duì)團(tuán)隊(duì)整體認(rèn)知和流程中帶來(lái)的沖突,可以選擇的方式是融入和抵制芋类,如果你有更優(yōu)秀的規(guī)范可以闡述隆嗅,非常歡迎來(lái)補(bǔ)充我們現(xiàn)在這份比較初級(jí)的規(guī)范,讓他更豐滿更具有操作性侯繁。we are the team ,規(guī)范的作用統(tǒng)一思想 統(tǒng)一大家的認(rèn)知 更好的產(chǎn)出
2.這個(gè)規(guī)范是個(gè)人臆想出來(lái)的嗎胖喳?
回答: 工作五年 經(jīng)歷和教訓(xùn)很多,總結(jié)和反思的內(nèi)容很多贮竟,每一條都是切身體會(huì)到遵守后帶來(lái)的高效開(kāi)發(fā) 的成就感不遵守帶來(lái)種種開(kāi)發(fā)事故 的苦果丽焊。每一條都是有充分的理由 背后的場(chǎng)景支撐,不保證是最有效的規(guī)范咕别,但是他在規(guī)范無(wú)秩序的初始化狀態(tài)是完全有效的技健,
每一條都可以在現(xiàn)實(shí)中找到 國(guó)內(nèi)互聯(lián)網(wǎng)公司在應(yīng)用的實(shí)例和技術(shù)管理書(shū)籍 博客中類似思想的規(guī)范
3.規(guī)范制定的標(biāo)準(zhǔn)和原則都有哪些
回答: 1.是否有國(guó)內(nèi)現(xiàn)在成熟的互聯(lián)網(wǎng)公司在應(yīng)用開(kāi)源組織在使用 2.是否代表較為先進(jìn)的生產(chǎn)方式或生產(chǎn)力 3 是否可以有效解決團(tuán)隊(duì)成員認(rèn)知沖突和情感沖突 4.是否符合現(xiàn)階段公司技術(shù)團(tuán)隊(duì)水平要求,是否會(huì)給大家?guī)?lái)沉重學(xué)習(xí)負(fù)擔(dān)
5 如何督導(dǎo)檢驗(yàn)規(guī)范團(tuán)隊(duì)成員的執(zhí)行標(biāo)準(zhǔn) 6 每一項(xiàng)規(guī)范要求是否有足夠的說(shuō)服力和有效降低風(fēng)險(xiǎn)和開(kāi)發(fā)成本及溝通成本 6.對(duì)規(guī)范操作是否設(shè)置了一定的激勵(lì)機(jī)制和懲罰機(jī)制顷级,如何規(guī)范團(tuán)隊(duì)每一個(gè)人的責(zé)任和義務(wù)
7 規(guī)范操作推行中會(huì)與舊的開(kāi)發(fā)模式的抵制沖突凫乖,如何有效推行 8 如何解決規(guī)范執(zhí)行中客觀環(huán)境不友好支持的狀況 9每一項(xiàng)規(guī)范都是要解決現(xiàn)實(shí)和未來(lái)要遇到的問(wèn)題和風(fēng)險(xiǎn),對(duì)應(yīng)著具體要解決的問(wèn)題
4.關(guān)于規(guī)范中頻繁出現(xiàn)的情感詞
規(guī)范中出現(xiàn) 【必須 需要 不允許 不承認(rèn) 不接受 推薦 建議】等詞 是為了告知和強(qiáng)調(diào) 每一條規(guī)范在執(zhí)行中的迫切性程度 弓颈,情感詞不針對(duì)團(tuán)隊(duì)成員單個(gè)人帽芽,他只是一個(gè)語(yǔ)氣詞
5.這些規(guī)范會(huì)給我?guī)?lái)學(xué)習(xí)負(fù)擔(dān)嗎
回答:肯定會(huì)的,尤其當(dāng)你剛開(kāi)始很多無(wú)意識(shí)的開(kāi)發(fā)習(xí)慣都與規(guī)范沖突的時(shí)候翔冀,他會(huì)給你帶來(lái)一定的壓力导街,但是學(xué)習(xí)是一種過(guò)程,當(dāng)你不斷通過(guò)自身努力纤子,一條條實(shí)現(xiàn)了搬瑰,成為一種習(xí)慣,反而它會(huì)成為你的一種軟性資產(chǎn)控硼,會(huì)在未來(lái)的工作和挑戰(zhàn)中受益匪淺
1.etl_ml 相關(guān)的 java python 邏輯代碼 需要使用公司的git 做版本管理【保證多環(huán)境部署時(shí) 所有環(huán)境下單一項(xiàng)目的代碼是完全一致的】 這個(gè)是必須的
2.所有涉及到 接口 的請(qǐng)求使用統(tǒng)一 restful post 方式泽论,不推薦使用get 方式 ,如果data 內(nèi)容是 數(shù)組 或列表 卡乾,必須使用post 翼悴,涉及敏感信息 外網(wǎng)可觸達(dá) 必須使用post 返回報(bào)文格式 必須是
{
"flag":
{},
"data":
{},
"msg":
{},
}
或
{
"status":
{
"msg":" ",
"code": "200"
},
"data" :
{}
}
其中 flag 必須是 整型數(shù)字幔妨,如果是 true false 鹦赎,則使用 1 代表true ,0 代表 false误堡,不可以是整型數(shù)字字符串 例如 “1”古话,錯(cuò)誤異常 有標(biāo)記 不可為空
msg 是字符串,必須是英文 或者 字母拼音锁施,不允許使用漢字陪踩,錯(cuò)誤異常 有標(biāo)記 不可為空
data 返回請(qǐng)求的邏輯數(shù)據(jù)杖们,合理裝配,錯(cuò)誤異常及無(wú)數(shù)據(jù) 返回為 null
flag 和msg 必須是一一對(duì)應(yīng)的 kv 結(jié)構(gòu)
msg和code 必須是 一一對(duì)應(yīng)的 kv 結(jié)構(gòu)
3.所有的接口 被調(diào)用方【生產(chǎn)者】膊毁, 自己的接口 必須自測(cè) 自檢胀莹,自檢自測(cè) 必須是發(fā)送真實(shí) restful http請(qǐng)求,不承認(rèn)不接受 jupyter zeppelin ipython 的notebook 測(cè)試方式【會(huì)與接口調(diào)用真實(shí)的標(biāo)準(zhǔn)輸出的有較大格式和編碼差異】婚温,承認(rèn)標(biāo)準(zhǔn)的 瀏覽器chrome fixbox safari 等 url 測(cè)試 和 專業(yè)的 接口測(cè)試工具 Postman等 接口測(cè)試描焰,
接口測(cè)試成功 后需要將 測(cè)試的 url header 和參數(shù) 及返回結(jié)果相關(guān) 測(cè)試用例 以文本txt 或 word 文檔形式 發(fā)送給調(diào)用方 【下游消費(fèi)者】驗(yàn)證并寫(xiě)在wiki上,多個(gè)部署環(huán)境 需要說(shuō)明 具體機(jī)器和測(cè)試環(huán)境 等相關(guān)參數(shù),推薦包含閾值和狀態(tài)臨界值 的測(cè)試用例驗(yàn)證
4.接口被調(diào)用方 必須有標(biāo)準(zhǔn)的日志栅螟,按天分割 存儲(chǔ)日志文件荆秦,不接受 nohup.out的日志查驗(yàn) 【無(wú)法做到日志分割,精準(zhǔn)查驗(yàn)非常繁瑣】
5.項(xiàng)目相關(guān)的java python scala 代碼力图,每個(gè)業(yè)務(wù)類都需要有日志屬性步绸,每個(gè)業(yè)務(wù)方法都必須至少一行 有日志輸出,開(kāi)發(fā)模式 寫(xiě)代碼-->添加日志-->單元測(cè)試
6.日志的輸出格式 吃媒,三類 info warn error瓤介,
日志內(nèi)容【打印執(zhí)行時(shí)間 | 記錄的邏輯類名稱 | 輸入?yún)?shù)變量列表|日志特殊標(biāo)記內(nèi)容| 輸出參數(shù)列表|異常打印內(nèi)容】,日志可以使用中文赘那,推薦全部?jī)?nèi)容使用英文
例如:
2018-10-30 09:48:54.093 INFO 134270 --- [lTaskExecutor-5] com.rms.quartz.Config.PredictVariable : 125527 mate file path : /data/rms/rms_train/rms_plus/saved_pmmls/pms/dt=all/mat/rule_125527.txt
2018-10-30 09:48:56.123 WARN 134270 --- [lTaskExecutor-5] com.rms.service.HttpReq : json body data some part : "flag": 6, "data": [{"hotel_id": "125527", "observe_date": "2018-10-30", "live_dt": "2018-10-30", "
8.單項(xiàng)目的日志不可以存放歸檔于項(xiàng)目根目錄刑桑,必須有單獨(dú)的 ./logs文件目錄存放,且推薦歸檔壓縮為 .zip gz 或 tar.gz
9.日志記錄變量中含有數(shù)組變量 非常龐大的募舟,推薦 對(duì)其做字符的截取祠斧,比如只記錄前一百個(gè)字符,或者只記錄關(guān)鍵狀態(tài)信號(hào)量
10.接口生產(chǎn)者 需要對(duì)因?yàn)檎{(diào)用產(chǎn)生的異常 進(jìn)行 try catch 捕捉拱礁,可以返回 異常信息的 輸出琢锋,但必須保證 返回的格式不變,不可以將異常拋給下游調(diào)用者 或返回異常錯(cuò)亂信息呢灶,導(dǎo)致下游無(wú)法解析
11.接口調(diào)用協(xié)議 可以 是 restful http socket tcp 吴超,可以是protobuffer grpc 可以是 thrift ,restful http 協(xié)議數(shù)據(jù)傳輸數(shù)據(jù)必須是json 格式
11.邏輯代碼 涉及到打包鸯乃,在不影響生產(chǎn)服務(wù)的情況下推薦在服務(wù)器打包烛芬,減少 本地到服務(wù)器 的流量傳輸,及部署環(huán)境差異帶來(lái)的不穩(wěn)定性飒责,使用git 管理項(xiàng)目 ,git pull后然后打包
12.測(cè)試部署和正式部署的流水線操作 歸一為一個(gè)bash shell 腳本仆潮,每次執(zhí)行時(shí) 使用腳本運(yùn)行代替 一些繁瑣批量的操作
13.項(xiàng)目在多個(gè)環(huán)境 部署時(shí) ps -ef |grep ** ,必須可以看到 全局機(jī)器機(jī)器變量宏蛉,
例如 39 就是機(jī)器代號(hào) test 是測(cè)試環(huán)境
nlpdev 168248 java -jar etl_ml-0.1.0.jar --spring.profiles.active=39-test
14.正式部署 的python 腳本 java jar 不允許出現(xiàn)類似 test snapshot 等非正式字眼【防止被其他人錯(cuò)誤kill】
15.未來(lái)每個(gè)角色對(duì)自己負(fù)責(zé)的項(xiàng)目 需要撰寫(xiě)和維護(hù)自己項(xiàng)目的相關(guān) 調(diào)試部署文檔,寫(xiě)明相關(guān)的具體變量和可能需要注意點(diǎn) 及異常情況的處理性置,檢驗(yàn)標(biāo)準(zhǔn)是:團(tuán)隊(duì)成員可以通過(guò)你的部署文檔可以獨(dú)立部署 服務(wù)不出問(wèn)題拾并,部分還可以根據(jù)文檔定位問(wèn)題的位置
16.所有涉及到 具體可以修改 可以配置的常量及敏感信息 ,必須脫離業(yè)務(wù)邏輯代碼,寫(xiě)入到配置文件文件并讀取嗅义,多個(gè)環(huán)境則必須有多個(gè)一一對(duì)應(yīng)的配置文件屏歹,不允許多環(huán)境共用同一個(gè)配置文件。
17.團(tuán)隊(duì)成員溝通 不允許使用不禮貌 不友好用語(yǔ) 比如【然后呢】之碗,或帶有個(gè)人偏見(jiàn)情緒 挑釁 用語(yǔ)蝙眶,不允許答非所問(wèn),不明白不清楚用意褪那,可以直接禮貌詢問(wèn)
18.代碼必須模塊化 必須是面向?qū)ο蠡蛎嫦蚝瘮?shù)式編程幽纷,模塊必須封裝為 class 或 namespace 或module ,生產(chǎn)環(huán)境不允許使用面向過(guò)程調(diào)用博敬,測(cè)試 和單元測(cè)試可以面向過(guò)程
19.代碼必須時(shí)刻保有重構(gòu)的想法友浸,自己有意識(shí)做code review,單一函數(shù) 不允許超過(guò)60行代碼偏窝,if else 有四個(gè)連續(xù) 必須使用 switch case 收恢,單個(gè)控制流程片段不允許超過(guò)25行代碼
20 項(xiàng)目有高并發(fā)請(qǐng)求場(chǎng)景的,自己必須做高并發(fā)壓力測(cè)試
21.項(xiàng)目結(jié)構(gòu) 要有意識(shí) 使用成熟的設(shè)計(jì)模式來(lái)替代無(wú)意識(shí)松散的代碼結(jié)構(gòu)祭往,推薦 單例模式 工廠模式 生產(chǎn)者模式 策略模式 裝飾模式 觀察者模式在代碼中的應(yīng)用