如何利用Github進行代碼審查
來自: https://realm.io/cn/news/codereview-howto/
當問到你們的團隊是否進行代碼審查這個問題時,大部分人的回答會是 ”項目進度跟的這么緊,哪還有時間進行代碼審查啊?“。如果再加上頻繁的人事變動和組織結構調整導致很多人對代碼審查的可行性及意義產生了巨大的疑問。并且讓團隊的所有成員熟悉代碼審查工具和流程本身也是一項費時費力的工作。那么,就讓我們通過Realm團隊的例子來看看他們是怎么進行代碼審查的。
我的第一次代碼審查經歷
筆者回想起在當年在某韓企工作時,第一次進行代碼審查的過程。
- 提出代碼審查會議請求
- 與團隊成員共享審查代碼的范圍,會議室,時間等信息。
- 在指定會議室進行代碼審查之前分析并審查所有代碼。
是的。這并不是一次成功的代碼審查。因為大家都專注于自己的開發任務,根本就不主動提出代碼審查請求。并且在進行代碼審查會議之前,大家基本上對即將要審閱的代碼一無所知。導致了會議的大部分時間浪費在對代碼的說明上,并且大家也只能提出類似于拼寫錯誤和命名規范這樣簡單的錯誤和改善建議。代碼審查本身可以提高開發者的能力,讓其從自身犯過的錯誤中學習,從他人的思路中學習。但是不當的流程可能會使代碼審查的意義變的微乎其微。
使用代碼審查工具
如果說上面所提及的代碼審查方式是同步的代碼審查,那么使用代碼審查工具的結果就是異步的代碼審查。代碼審查工具在不對源代碼造成任何修改的情況下,團隊成員可以對指定代碼進行批注和評論。為了進行高效的代碼審查,我們可以使用的工具不僅有Gerrit, Review Board, Phabricator等這樣的開源軟件,而且對于一個預算比較充足的團隊來說,JetBrains的 Upsource 和 Atlassian的 Crucible 都是不錯的選擇,可以在LDAP服務器上方便的搭建并且和JIRA缺陷管理工具,代碼版本管理工具(git,svn)關聯進行代碼審查。利用這些工具來管理和追蹤審查由于住團隊更好的起步。下面是Upsource的官方示例。
使用Github的 Pull Request 進行代碼審查
Github的 Pull Request 可以作為一個非常有用的代碼審查工具。很多開發者了解[git flow](http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html)分支管理策略。但是由于它比較復雜,所以很難在短時間內使團隊熟悉這套管理策略。相比于git flow,Github 提出更為簡潔的 Github Flow 的分支管理策略,重點就是不直接對master分支進行提交或合并,而是通過提交 Pull Request,并且進行審閱和討論后最終合并到master。 Github聲稱代碼審查功能是Github的核心功能之一。
通過Pull Request @提及團隊成員 讓對方審閱自己的代碼,指定成員跳轉到指定分支后可以對代碼進行評論,提出改善建議。并且幫助改善邏輯及缺陷。還可以通過觸發器觸發CI(持續集成服務器)自動進行集成測試。
那么讓我們了解一下開發移動端數據庫的Realm到底是怎么進行代碼審查的?讓我舉一個 添加 isEmpty 功能的 Pull Request 作為例子說明,因為這個 Pull Request 已經被合并了,所以很多評論被顯示成為‘outdated diff‘,如果想查看評論請點擊’Show outdated diff’。
我們可以對指定代碼進行提問及評論,回答并展開討論。界面和我們熟知的社交網站也非常相似。

通過ci確保所有測試用例都通過測試,并且有2名以上的審閱人對代碼進行審查后才能進行最終合并。在此之前,通過討論和評論的方式對代碼進行不斷的重構和改善。

Git本身并不提供 Pull Request 功能。我們只能使用Github或者 Github Enterprise 提供的 Pull Request 功能進行代碼審查。
還有Bitbucket 也提供類似的功能, 在Bitbucket中使用 Pull Request 。
Github官方提供的文檔 關于 Pull Request 的說明 也可供我們參考。
是否應該一字不落的對所有的代碼進行代碼審查呢?
筆者認為應視情況而定,例如,當遇到一些緊急的UI更新,或者只有1名開發者的情況下進行代碼審查顯得有點不太合適。Realm的情況也差不多,關于產品的所有代碼都會進行代碼審查進行反復迭代,但是一些不重要的代碼倉庫(例如網頁,示例代碼等)就會視情況進行選擇性的代碼審查。在多名開發者同時開發一個項目的情況下,一些重要的的核心業務邏輯開發完成后,通過進行代碼審查事先發現潛在的錯誤(查找邏輯上的瑕疵,寫反了的布爾判斷,潛在的對象的錯誤選擇,類型不匹配,等等)從而提高代碼的質量。
讓代碼審查成為一種習慣,一種文化。
讓代碼審查稱為一種習慣,通過相互討論和學習來提高自己的開發能力最好不過。想著我寫的代碼會讓別人去審查,開發者會不由自主的更注重代碼的可讀性和邏輯性。相比強制性的進行代碼審查,首先培養團隊以產品和人為中心的開發文化顯得更為重要。雖然說不容易但是值得一試。相比其他的各種福利,多數開發者更為看重公司的開發文化。即為了公司,也為了開發者自己更高效的開發。—————————————————————————————-
Realm是可以替代 SQLite和 Core Data 的移動端數據庫
并且支持Swift了解詳細信息