Facebook、Google這樣的巨頭IT公司都具備完善的代碼庫管理、代碼審計(Code Review)制度。代碼審計能夠消除一些Bug,不過事實上,這不是代碼審計最主要的目的,因為Reviewer很難通過審閱代碼來發現深層次的Bug。代碼審計更重要的是,它有助于維護代碼的品質,因為Reviewer可以發現代碼編寫的是否規範,可以從審計過程中互相學習,也可以指出代碼存在的問題。此外,開發人員也會有更多的意識來編寫更高品質的代碼,被别人指出太多問題或者低級問題,顯示是很沒有面子的,:)。是以,我認為代碼審計對于産品的維護過程是非常重要的一環。Facebook采用謹慎的審計來防止代碼出現一些問題。
Facebook 有非常牢靠的安全保障,以免有人(你可以想象内部有人有這個權限的)不小心/故意做了些糟糕的的事。如果你已經"成為"了需要别人支援的人,事由将被記錄,并且有謹慎的審計。這裡不允許鑽空子。
首先,確定代碼審計嚴格實施基于我們産品開發過程中對Check in的兩個限制,如下:
沒有一個BugID,那麼任何東西都不可以Check in到代碼庫;
如果代碼對應的Bug所處的狀态不是“Review Passed”,那麼任何東西都不可以Check in到代碼庫。
這兩個限制能夠來避免開發人員不經過審查就将代碼非法的Check in到倉庫。是以,當沒有指定Bug/BugId不存在/Bug不處于Review Passed狀态時,将阻止開發者Check in代碼,向其提示錯誤消息。

要實作Check in之前的限制,我們需要通過向VisualSVN的代碼倉庫中注冊一個Pre-Commit的Hook,通過這個Hook來檢查要Check in的代碼是否處于正确的狀态。以下是執行這個操作的Hook。這個Hook會擷取目前BugId,然後傳遞給BugTracker.NET中的svn_hook.aspx執行對Bug狀态的查詢,如果允許簽入,則傳回包含“OK:”的響應碼,否則,傳回“ERROR:”。
#!/usr/local/bin/python
import sys
import subprocess
import re
import urllib
import os
svnlook='C://Progra~1//Visual~1//bin//svnlook.exe'
this_repository_url = "https://LADANFKING:8443/svn/monoaddins"
btnet_url = "http://ladanfking/btnet/svn_hook.aspx"
btnet_username = "admin"
btnet_password = "admin"
repos=sys.argv[1]
txn=sys.argv[2]
# Pre-commit tag
status = -1
bDebug = False
def debug_out(s):
if (bDebug):
f = open('d:\\btnet_svn_hook_log.txt', 'a')
f.write(s)
f.write('\n')
f.close
print s
log_cmd = svnlook + ' log -t "' + txn + '" "' + repos + '"'
process = subprocess.Popen(log_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
log_string = process.stdout.read()
debug_out(log_string)
params = urllib.urlencode({
'svn_log': log_string,
'repo': this_repository_url,
'username': btnet_username,
'password': btnet_password,
'status':status})
response = urllib.urlopen(btnet_url, params)
data = response.read()
debug_out(data)
nPos = data.find('OK:')
print data
if nPos >= 0 and nPos == (len(data) - 3):
sys.exit(0)
else:
sys.exit(1)
是以,開發者想要Check in之前,必須建立一個Bug,并将這個Bug賦給某個人進行Review。這個步驟如下:
1 Create Bug:這一步驟一般是由QA來完成的,開發者也可以自己來建立Bug。如下所示。
2 Assign Review
(1)建立一個Patch:進入到你的代碼工作目錄,然後右鍵,使用TotoiseSVN的“Create Patch”來建立一個更新檔。
這個更新檔打開後就是前後代碼的變更情況。
(2)Assign Review:這一步就是将這個Patch檔案通過BugTracker.NET作為附件上傳給指定Bug,并将這個Bug賦給某個人來審計。
3 Review:審計人員進入BugTracker.NET,檢視Patch檔案,如果審計通過,則将狀态改為“Review Passed”,否則更改為“Review Failed”,這樣開發人員需要重新進行代碼變更并申請新的審計。
當要Check in的代碼對應的Bug通過了審計之後,開發者就可以Check in了。以下是代碼Check in之後的情況了。
另外,其他人可以通過點選“svn revisions”來檢視本次的更新,如下。
這樣,引入強制的代碼審計就可以限制了開發者不可以随意Check in代碼,不可以Check in不符合品質要求的代碼,而且,其他開發人員可以查詢BugTracker.NET倉庫來看看相似的Bug是如何修複的。
本文轉自道法自然部落格園部落格,原文連結:http://www.cnblogs.com/baihmpgy/archive/2011/09/09/2172425.html,如需轉載請自行聯系原作者