一線大廠老司機談大數據代碼走查專題
1.什么是CR(代碼走查)?
Code Review(CR)即代碼評審,又名代碼走查,是一種通過復查代碼來提高代碼質量的過程,一般體現在一個團隊的開發(fā)過程中。CR要求團隊成員有意識地、系統(tǒng)地檢查彼此的代碼,從而驗證需求、發(fā)現錯誤,同時指出其中不合規(guī)范的“低質量”代碼,從而提高整個團隊的代碼質量。一次CR可以是一次Commit,也可以是一次Merge Request。

2.為什么要CodeReview?
(1)旁觀者清。對于同一段業(yè)務代碼,由于看待問題的角度不同,評審者可能會比開發(fā)者更容易發(fā)現其中的問題,或是找到更有效的解決方案,共同維護團隊的代碼質量。提高代碼質量和可維護性,可讀性等。查漏補缺,發(fā)現一些潛在的問題點等。最佳實踐,能夠更好更快的完成任務的方法。知識分享, Review他人代碼時,其實也是一個學習的過程,自己也會反思&總結。
(2)快速了解業(yè)務。理想狀態(tài)下,團隊中的每個人都需要對整個項目的各個部分都很熟悉,當然,在項目很大時這是不現實的。通過代碼審查至少可以讓每個人了解更多的業(yè)務模塊,同時也能達到人員互備的目的。人員互備:通過CR,評審者也相當于參與了這次開發(fā),相當于一種人力“備份”,當你休假或正在忙別的需求的時候,這時“備份”或許就能幫上你的忙了。
(3)開發(fā)者能夠獲得什么?對需求的理解得到加深。表達能力得到加強。邏輯能力得到訓練。心理承受能力得到提高。
(4)評審者能夠獲得什么?快速上手業(yè)務需求和全局的架構。統(tǒng)一大家約定俗成的代碼風格。優(yōu)秀的設計思路和業(yè)務邏輯。
3.CodeReview的原則
(1)CR是必要的,但也需要結合團隊現狀。當你的團隊開發(fā)任務極其緊張,再耗費一部分人力去進行CR,是不明智的。
(2)所有的代碼都應被贊成。因為團隊代碼庫的每一次改動(Change List,以下簡稱CL),都必定會提高當前系統(tǒng)的整體質量,即使這個CL并不完美。
(3)CR不應該追求完美,而應追求持續(xù)改進。要知道,沒有完美的代碼,只有更好的代碼,“慢即是快”。
(4)CR不是挑刺,更不是證明誰的能力更強。CR是為了提高整個團隊的能力,而不是針對個體設置的檢查“關卡”,僅具有指導意義。
(5)評審者也需要對這個CL負責。CR不應設置獎懲機制,即便是有,也是對評審者和開發(fā)者同時的獎勵或處罰。
(6)時刻保持謙虛。無論是評審者還是開發(fā)者,都可以在CR中提升自己的能力。
(7)合理解決問題解決沖突難以達成共識時,需要面對面或者拉起更大的團隊討論,帶上leader。
4.大數據代碼的走查
?首先我們來看看阿里內部代碼評審的內容:主要包括數據一致性檢查、數據完整性檢查和指標間邏輯檢查。

那么,在進行code review之前的需求評審階段,我們先要明確數據統(tǒng)計的詳細口徑是什么,下面舉兩個實際的需求例子。
需求1:(錯誤示例)統(tǒng)計時間內店鋪內所有用戶的支付訂單數。問題所在:需求描述太過于簡潔,沒有闡述清楚數據統(tǒng)計的時間維度以及過濾條件,導致統(tǒng)計口徑不清晰,要求產品明確口徑。
需求2:(正確示例)某APP商家域店鋪維度的離線支付金額。支持自然日、自然周、自然月。統(tǒng)計時間內,所有付款訂單金額之和(剔除優(yōu)惠促銷、剔除抽獎訂單)。
明確需求之后,下面詳細介紹code review的一些常見關注點:
1)關聯(lián)關系?&?過濾條件
l?關聯(lián)表使用?outer join?還是?join,要看數據是否需要做過濾。
l?關聯(lián)關系?on?字句中,左右值類型是否一致。
l?關聯(lián)關系如果是1:1,那么兩張表的關聯(lián)鍵是否唯一。如果不唯一,那么關聯(lián)會產生笛卡爾導致數據膨脹。
l?where?條件是否正確過濾,以上述需求為例子,關注sql中是否正確剔除優(yōu)惠促銷、剔除抽獎訂單。

2)指標的統(tǒng)計口徑處理
數據指標的統(tǒng)計涉及到兩個基本概念:
l?可累加指標:比如訂單金額,頁面流量等,可以通過數值相加來進行統(tǒng)計的指標,針對這類指標,sql中使用的函數一般是sum。
l?不可累加指標:比如訪客數,不能通過簡單相加,而是需要先去重再求和的方式進行統(tǒng)計,針對這類指標,sql中一般使用count(distinct )。

3)insert插入數據
是否支持重跑。等價于看插入時是否有overwrite關鍵字,如果沒有該關鍵字,重跑數據(多次執(zhí)行該工作流)時不會覆蓋臟數據,而是增量往表插入數據,進而可能會導致最終數據統(tǒng)計翻倍。
插入的數據順序和被插入表結構順序是否完全一致。我們要保證數據字段寫入順序沒有出錯,否則會導致插入值錯亂。
