本篇文章主要是記錄整體調(diào)整Python數(shù)據(jù)統(tǒng)計(jì)分析項(xiàng)目規(guī)范性的過(guò)程,以及自己的一些思考。
為什么要調(diào)整?
- 主要是為了解決數(shù)據(jù)類(lèi)程序不容易測(cè)試發(fā)現(xiàn)錯(cuò)誤的現(xiàn)狀。調(diào)整公共模塊出錯(cuò)時(shí)拋出錯(cuò)誤到業(yè)務(wù)層,便于報(bào)警模塊上傳錯(cuò)誤信息到kafka,最后能主動(dòng)發(fā)出報(bào)警郵件。以及方便加入報(bào)警之外的其他程序埋點(diǎn)。
- 調(diào)整所有Python數(shù)據(jù)統(tǒng)計(jì)分析程序滿足pep8規(guī)范和Google Python風(fēng)格規(guī)范,減少I(mǎi)DE提示。
- 完善代碼注釋和文檔便于后續(xù)維護(hù)(之前的開(kāi)發(fā)人員是Erlang風(fēng)格,主張不寫(xiě)或者少寫(xiě)注釋?zhuān)?/li>
認(rèn)清程序當(dāng)前現(xiàn)狀
- 項(xiàng)目結(jié)構(gòu):目前整個(gè)數(shù)據(jù)統(tǒng)計(jì)分析項(xiàng)目的整體模式是各個(gè)以數(shù)據(jù)業(yè)務(wù)為導(dǎo)向的統(tǒng)計(jì)分析程序之間互相獨(dú)立。各個(gè)數(shù)據(jù)統(tǒng)計(jì)分析程序幾乎都依賴(lài)于底層的各個(gè)公共模塊。包括數(shù)據(jù)庫(kù)模塊,日志模塊,cdn相關(guān)模塊、心跳模塊、封裝的阿里云各個(gè)產(chǎn)品的模塊,封裝的網(wǎng)宿云各個(gè)產(chǎn)品模塊等等。
- 各個(gè)公共模塊和各個(gè)統(tǒng)計(jì)分析程序前前后后經(jīng)過(guò)熟人編寫(xiě),風(fēng)格完全不同,有C++風(fēng)格,有Erlang風(fēng)格,有Python,在IDE中出現(xiàn)各種不符合規(guī)范的提示。
- 對(duì)于公共模塊中出現(xiàn)的錯(cuò)誤,為了不影響業(yè)務(wù)層(原因是猜的),通常在本模塊就直接捕獲掉了,并沒(méi)有拋出到業(yè)務(wù)層,也沒(méi)有做過(guò)多處理,導(dǎo)致錯(cuò)誤非常難以被發(fā)現(xiàn)。
- 有不少函數(shù)的返回值在處理成功和處理失敗時(shí),返回值的個(gè)數(shù)并不一致,導(dǎo)致低概率程序出現(xiàn)各種unpack錯(cuò)誤。這類(lèi)多返回值語(yǔ)言常見(jiàn)的bug錯(cuò)誤全部需要調(diào)整。
確定程序調(diào)整原則
- 底層公共模塊返回值需要保持個(gè)數(shù)一致。
- 和外界交互(數(shù)據(jù)庫(kù),oss,日志服務(wù)等等)的公共模塊必須返回是否執(zhí)行成功的狀態(tài),如果錯(cuò)誤需要返回錯(cuò)誤狀態(tài)和錯(cuò)誤原因到上一層。
- 公共模塊封裝的時(shí)候可以使用類(lèi),但是對(duì)外提供的功能接口優(yōu)先使用函數(shù)形式。
- 所有的類(lèi)統(tǒng)一調(diào)整成新式類(lèi)。
- 刪除公共模塊中的無(wú)效代碼。
- 完善注釋。
- 完善文檔。
記錄程序調(diào)整過(guò)程
- qk_agent_praser改名為qk_agent_parser,需要在使用到此模塊的地方進(jìn)行一個(gè)調(diào)整。原因:拼寫(xiě)錯(cuò)誤需要及時(shí)調(diào)整。qk_agent_praser對(duì)外函數(shù)接口沒(méi)有調(diào)整,只有內(nèi)部調(diào)整(減少split解析次數(shù)),對(duì)外無(wú)影響。
- check_up只改動(dòng)少量格式(由于使用loop調(diào)度,程序退出后,存在sock綁定的addr沒(méi)有釋放的問(wèn)題,導(dǎo)致下次單元測(cè)試時(shí)需要等待sock回收)。
- qk_email提供函數(shù)式對(duì)外接口,因此需要修改監(jiān)控程序中使用到郵件的部分代碼。
- qk_heartbeat增加兩個(gè)函數(shù)式對(duì)外接口。修改心跳間隔為可配置,因此使用心跳模塊需要調(diào)整調(diào)用方式。
- qk_ipdb調(diào)整類(lèi)名和返回值,使用到ip數(shù)據(jù)庫(kù)對(duì)應(yīng)方法的地方都需要修改(ip查詢(xún)以及數(shù)據(jù)統(tǒng)計(jì)程序)。
- 數(shù)據(jù)庫(kù)連接池初始化返回值改動(dòng)(返回連接池是否成功創(chuàng)建標(biāo)志和創(chuàng)建失敗的返回)。mysql_query的返回值有修改,查詢(xún)失敗時(shí)不是返回空列表而是返回False, str(e)。
- aliyun_oss:oss相關(guān)的返回格式,全部修改(對(duì)應(yīng)的使用到oss的程序改動(dòng)較大)。
- aliyun_cdn:返回值中返回請(qǐng)求狀態(tài)碼,請(qǐng)求text。
- aliyun_kafka:生產(chǎn)和消費(fèi)都有返回值。
- aliyun其余各個(gè)模塊返回值都有修改。
- 網(wǎng)宿查詢(xún)帶寬模塊增加指定時(shí)間段查詢(xún),但時(shí)間不宜過(guò)長(zhǎng),否則會(huì)出現(xiàn)數(shù)據(jù)不完全(網(wǎng)速接口導(dǎo)致)。
- 根據(jù)公告模塊修改對(duì)應(yīng)的調(diào)用方法
- 調(diào)整所有的模塊、類(lèi)、方法、函數(shù)的注釋?zhuān)鞔_參數(shù)含義和返回值
- 補(bǔ)全文檔
思考與感悟
或許以上的這些調(diào)整在現(xiàn)在看來(lái)是理所當(dāng)然,是一開(kāi)始寫(xiě)程序的時(shí)候就應(yīng)該全部考慮到的,但是現(xiàn)實(shí)卻由于各種原因,導(dǎo)致程序成為一個(gè)需要整體調(diào)整的鬼樣子。
在調(diào)整的過(guò)程中,也會(huì)發(fā)現(xiàn)之前指定的一些調(diào)整原則存在某種程度的問(wèn)題,導(dǎo)致最后棄用。比如其中的一個(gè)原則:
- 業(yè)務(wù)層需要全部封裝成類(lèi)的形式,不能是純函數(shù),方便MixIn新增的額外功能,比如數(shù)據(jù)埋點(diǎn)接口、添加日志、屬性檢查等等任何你想MixIn的功能
乍一想來(lái)這個(gè)原則帶來(lái)的好處很多,但是實(shí)際上帶來(lái)的改動(dòng)很大,這包括整個(gè)程序結(jié)構(gòu)以及程序的表現(xiàn)形式和調(diào)用方法。最終還是棄用了這項(xiàng)原則。
最后,所有的開(kāi)發(fā)人員都應(yīng)該盡可能的參與需求分析,理解需求,明確自己要做的目的,牢記需求分析時(shí)女神李若彤的模樣,而不是到驗(yàn)收交付時(shí)小籠包陳妍希的模樣。

參考:
念念不忘,必有回響,小伙伴們幫我點(diǎn)個(gè)贊吧,非常感謝。
我是職場(chǎng)亮哥,YY高級(jí)軟件工程師、四年工作經(jīng)驗(yàn),拒絕咸魚(yú)爭(zhēng)當(dāng)龍頭的斜杠程序員。
聽(tīng)我說(shuō),進(jìn)步多,程序人生一把梭
如果有幸能幫到你,請(qǐng)幫我點(diǎn)個(gè)【贊】,給個(gè)關(guān)注,如果能順帶評(píng)論給個(gè)鼓勵(lì),將不勝感激。
職場(chǎng)亮哥文章列表:更多文章
本人所有文章、回答都與版權(quán)保護(hù)平臺(tái)有合作,著作權(quán)歸職場(chǎng)亮哥所有,未經(jīng)授權(quán),轉(zhuǎn)載必究!