跳到主要內容

[科技]如何讓 6 萬個工程師順暢合作不互雷?微軟法寶「完整程式碼審查」揭密!


  全球最大的軟體公司之一微軟擁有約 140,000 名員工,其中大約 44%,即超過 60,000 名員工,是工程師。

  Office、Visual Studio 或 Windows 等幾種產品,都是由數千名同時在同一程式碼庫上工作的工程師開發的。確保由不同子團隊開發的程式碼完美地協同工作是一件非常重要的任務。

  那麼你想過嗎,如此大的工程師規模下,微軟是如何確保程式碼品質的呢?

  微軟程式碼審查是一種被廣泛採用的工程實踐。成千上萬的工程師認為這是一個偉大的最佳實踐。大多數高績效團隊花費大量時間進行程式碼審查。

  在微軟程式碼審查的大規模研究中,我們採訪、觀察並調查了 900 多名開發人員。

  我們的目的是了解如何在微軟完成程式碼審查。我們想知道,在進行程式碼審查的時候,開發人員面臨哪些陷阱,以及他們為克服這些挑戰而開發的最佳實踐。

  大多數經驗教訓對於小型或大型團隊組織都很有價值。如果您的團隊尚未進行程式碼審查,我會向您展示該實踐的好處。如果您的團隊已經有了程式碼審查機制,您可以將您的實踐與微軟的程式碼審查實踐進行比較。

  在這項研究中,36% 的開發人員表示他們每天進行多次程式碼審查。另有 39% 的開發人員表示,他們每天至少進行一次程式碼審查。12% 的人每週多次進行程式碼審查,只有 13%的人表示過去一週他們沒有進行程式碼審查。

  這意味著, 微軟的開發人員將大量時間花在程式碼審查上 。因此,確保有效使用這段時間非常重要。

  程式碼審查最重要的好處是,提高程式碼品質並找到程式碼中的缺陷,另一個重要好處是知識轉移 。

  「知識轉移」意味著,審核彼此程式碼的團隊成員熟悉程式碼庫的大部分內容。但是,這也意味著程式碼審查最好在團隊內部實施。另一個優點是,新的團隊成員和初級開發人員可以在審閱或獲得反饋的同時學習和提高他們的編碼技能。

  如果開發人員在程式碼審查期間討論替代解決方案,它不僅可以改善程式碼庫,還可以為所有相關人員提供學習機會。因此,學習、指導和自我改進是程式碼審查之所以被認為是微軟的一種有益實踐的主要原因。

  程式碼審查可以通過多種方式執行。有時,可以很不正式, 比如一位開發人員走到另一位開發人員的桌邊一起看一些程式碼。其他時候,團隊一起審核程式碼。但是,您在微軟的程式碼審查中遇到的最可能的情況是:程式碼審查是在藉助工具的幫助下完成的。

  程式碼審查的工具有很多種。在微軟,團隊可以自由選擇他們的工具。至 2016 年, 89% 的開發人員表示使用 CodeFlow 程式碼審查工具。稍後我將解釋更多有關此程式碼審查工具的信息。從那時起,隨著 Git 的興起,工具領域發生了變化。

  現在,讓我們考慮一個典型的程式碼審查案例: 微軟的開發人員 Rose 剛剛完成了一個功能,現在想要得到她同行的反饋。

  Rose 首先要為程式碼審查做準備。這一步包括打開程式碼審查工具,允許她預覽程式碼更改。程式碼審查工具可以執行差異化對比任務,幫助羅斯確切了解她做了哪些更改。

  在仔細審查了這些變化之後,她標記了一些備註,告訴評審人她做了什麼以及為什麼這樣做。備註說明有助於審閱者了解程式碼更改的目的和動機。至此,程式碼已準備好可以發送給審閱者了。

  許多經驗豐富的開發人員都知道應該選誰作為程式碼審閱者。然而,對於團隊中的新人或新的工作領域,選擇可能會更棘手。如果 Rose 不知道她應該添加誰,她會查看團隊規定或詢問她的同事。她還可以使用程式碼審查工具的推薦功能,該工具可以根據程式碼庫的經驗和知識幫助選擇審閱者。

  Rose 選擇她認為可以為這段程式碼貢獻知識的審閱者。審閱者通常是其他開發人員,但也可以包括其他利益相關者,例如開發人員工程師,UI 專家或經理。一些評審員被選是基於他們的專業知識,其他評審員被選是為了讓他們能隨了解即將發生的變化。

  一旦選中每個人,Rose 就會發出程式碼審查。程式碼審查工具會自動發送創建評審的通知到每個人。通知對像不僅包括所有審閱者,也會包括其他人員,例如相關團隊的經理或產品經理。這些通知允許他們的信息保持同步,即使他們不需要執行評審。

  Rose 的同事們有時間就會審查程式碼。每個審查者都能評註程式碼,完事後把程式碼發回 Rose,Rose 可以據此修改程式碼。

  審查者通常關注的點包括:程式碼有 bug 嗎?程式結構有問題嗎?程式碼有拼寫錯誤、少個冒號之類的小毛病嗎?不是所有的評註都重要,但是有幾個小技巧可用來提升程式碼評註。

  Rose 根據評註修改程式碼。如果有的地方弄錯了或有爭議,Rose 可能直接去跟審查者面談,或者通過審查工具交流會更私人化一點。

  不管怎樣,一旦 Rose 根據反饋完成了程式碼修改,她可以發一份新版本的程式碼給審查者,這份程式碼叫修訂版。

  若有必要,她還會收到反饋。這個循環視情況而定會持續好幾輪,一般的小程式碼審查一次即可,複雜的程式碼可能得審查多輪。

  這樣的工作是很常見的,還可能在作者和審查者之間擦出思維的火花。

  完事之後,審查者標記程式碼為 okay,Rose 終於可以把程式碼補充到公共程式碼庫了。有些團隊會允許開發者在審查結束前就把程式碼上傳到程式碼庫。這種情況通常在程式碼只需小修小改的時候發生,這樣可以異步審查並加速開發。

  上面說的所有步驟都是 Microsoft 程式碼審查週期的正常程序,被所有團隊執行,根據團隊不同而略有出入。

  如果開發者把使用者交互介面也改了,那 TA 最好截個屏給別人看下。這樣審查者就省的跑程式碼了,直接看圖片就行,審查者也可以方便檢查因運行環境不同而產生的差異。

  靜態分析對規範程式碼樣式來說尤其有效。微軟的一些團隊使用自動化的靜態和動態分析工具作為專用的機器人評審員。這些機器人評論程式碼樣式和其他靜態問題。這樣就能騰出時間讓人工程式碼審閱者執行更有趣的任務。

  多年來,微軟實際上的程式碼審查標準之一是一個名為 Codeflow 的內部工具。這是一個複雜的程式碼審查工具,它支持開發人員並指導他們完成程式碼審查的所有步驟。

  隨著 Micorosft 的參與和對 GitHub 的收購,改變是不可避免的。例如,在 Microsof t 中廣泛採用 git 作為源程式碼管理工具,就可以看出這種變化。但是,這也意味著在微軟,以「pull request」的形式進行的程式碼審查正在上升。

這個網誌中的熱門文章

[娛樂]玩了多年的撲克牌,其實背後是結合工程、歷史、設計的大學問!

  全世界各地的人們都知道撲克牌,也都有和撲克牌打過交道,幾乎每個地方都宣稱撲克牌是自己的發明成果。中國人認為撲克牌最早起源於十二、十三世紀南宋時期傳出的中國的葉子戲(按照四季分為四種類別)。法國人則認為撲克牌是由塔羅牌演變而成,而英國人則表示自己是在所有經過認證的記錄資料中最早提到紙牌遊戲的國家。   現在,大家可能都知道怎樣玩「二十一點」或者是橋牌,但很少有人會靜下心來想一下,一副撲克牌其實是工程學、設計和歷史多方面融合而成的一個奇蹟。撲克牌不僅是一種休閒娛樂時的消遣工具,也是高額賭博和魔術技巧的練習和展示工具,不僅是一種數學概率模型,甚至有時候也會被當作貨幣或者是機密訊息的傳播媒介。   在這個過程中,撲克牌不同起源的獨特之處也展現了出來。撲克牌的名稱、顏色、標誌和設計根據不同的出處以及玩家不同的想法而發生變化。這一張張的圖形卡片不僅僅是玩具,或者是工具,他們更是展現不同習俗的一種文化印記:   有關撲克牌的誕生地一直眾說紛紜,外界也沒有達成一個確定的共識,但就像火藥、茶和瓷器這些發明一樣,幾乎可以肯定的是撲克牌也是起源於東方。國際撲克牌協會(IPCS)主席 Gejus Van Diggele 也表示:「學者們和歷史學家對撲克牌的確切起源存在分歧,但他們普遍認為撲克牌是由東方向西方進行擴散傳播的。」   中國唐朝時期有史料提到了一種紙牌遊戲,雖然這種遊戲更像是現在的多米諾骨牌,但專家認為這是有關紙牌最早的書面記載材料。歐洲 14 世紀末期的一些參考文獻曾提到一種「撒拉遜人(阿拉伯人的古稱)玩的遊戲」突然傳入歐洲,這表明紙牌不是來源於中國,而是來自阿拉伯半島。   此外,還有一種說法是,紙牌最早是由游牧民族從印度帶來的一種能夠預測命運的卡片,為紙牌的起源打上了更為久遠的一個印記。但無論是哪一種起源,應該都是有一定的商業契機促進了紙牌在遙遠的東方與歐洲之間的傳播,與此同時印刷技術的發展也加速了紙牌跨國界的生產和傳播。   在中世紀的歐洲,紙牌遊戲多是與喝酒、賭博還有其他的一些陋習聯繫在一起。由於紙牌遊戲傳播的廣泛性,以及它給當地所帶來的破壞性,當局決定禁止紙牌遊戲。歷史學家 Michael Dummett 在他的《塔羅牌遊戲》一書中提到了巴黎的一項法令,禁止公民在工作日玩紙牌。後來,紙牌遊戲被教會視為異端邪說,傳教士也紛紛遊說,認為「

[遊戲]中國網友跟魔獸世界說掰了!動視暴雪分手 14 年夥伴網易,出了什麼事?

  動視暴雪上週宣布,2023 年 1 月與網易的授權合約到期後,將不再續約,終止雙方長達 14 年的合作。這代表包括《魔獸世界》、《爐石戰記》、《魔獸爭霸 III:淬鍊重生》、《鬥陣特攻》、《星海爭霸》系列、《暗黑破壞神 III》和《暴雪英霸》等熱門遊戲的中國玩家,只能放棄苦心經營的遊戲成果。   未獲動視暴雪授權續約的消息一出,網易股價在港股應聲下跌了約 11%。網易執行長丁磊回應表示,在和暴雪洽談續約的過程針對關鍵條款存在重大分歧,因此未能獲得授權續約。   不過,動視暴雪和網易在今年攜手推出的手遊《暗黑破壞神:永生不朽》,因為雙方的協議是獨立於《魔獸世界》等遊戲的授權外,因此並不影響未來在中國的發行計畫;同時原訂今年在中國推出的《魔獸世界:龍之軍團》、《爐石傳說:巫妖王進行曲》和《鬥陣特工 2》也將不受影響。   過去 14 年來,網易不僅為動視暴雪在中國發行數款熱門長銷的 PC 遊戲,隨著手機遊戲蓬勃發展,近年更將合作領域擴展至手遊市場,合作關係十分深厚。   而從暴雪的新聞稿可見,雙方停止授權續約是因為對於協議中「符合暴雪營運原則以及對玩家、員工的承諾的條款內容未有共識」而造成,因此推測兩家大型遊戲發行公司終止主要的授權合作,與中國監管單位對科技公司內容及業務縮限有很大的關係。   中國遊戲市場才剛走出監管單位長達數月暫停審核新遊戲的狀況,這個新變化無疑是雪上加霜。   中國政府近年來雷厲風行整肅遊戲產業,不僅暫停遊戲版號審查(在中國發行遊戲必須先經過政府相關單位的內容審查核可後方可上線)、限制未成年上線玩遊戲的時間等,以嚴格的手段把控市場發行遊戲的數量及內容,對於想進入搶攻中國市場大餅的海外遊戲公司來說,更是嚴格把關,不僅一年只開放一次審核申請,在內容審核上更是掐緊遊戲商的脖子。   但就算是這樣,中國,背靠著人口優勢,遊戲產業的成長力道仍十分強勁,也讓海外遊戲商無不努力排除萬難搶佔中國市場。但若是如此,為何動視暴雪會直接放棄與網易的長期授權合作呢?   從動視暴雪的新聞稿提到「正尋找替代方案,讓動視暴雪的熱門遊戲能重回中國」可推測,動視暴雪正積極尋找替代網易的發行合作夥伴。事實上,動視暴雪過去持續透過不同的遊戲開發或發行專案,多元地與不同的中國遊戲公司合作,要找個網易的「備胎」看似不難,但實際上中國的大型遊戲公司網易、

[開發]如何讓 Unicode 圖案 (特殊符號) 在網頁上正常顯示?

展示了許多可以取代網站小圖示的 UNICODE,其優點非常顯而易見: ① 字元的傳輸量遠低於圖片的傳輸量。 ② 可以減少許多小圖示的 http 請求量。 那麼接下來的問題會是,要怎麼讓網站所使用的 UNICODE 表情圖案、特殊字元,都能讓所有訪客看到呢? ⑴ 符號數量。 符號數量越多,代表字型檔案越大。目前 Unicode 各國文字的數量太多先略過,屬於圖案的部分超過一千個,持續有新圖案推出。 ⑵ 編碼為 UTF8。 1 2 3 4 5 <!-- HTML4 --> <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" > <!-- HTML5 --> <meta charset= "utf-8" > ⑶  使用方式 使用 Unicode 的話,這一切就能懶人化,先查閱 Unicode 特殊符號一覽表,找到對應的圖案,例如西洋棋黑騎士圖案,那麼在網頁想顯示的地方,直接擺上 Html 代碼: 1 &#9822; 輸入以上字元就行,但是為方便維護,建議還是將該內容直接貼上「♞」。 注意:在使用不同的字體時,渲染出來的符號可能會有所不同,因此,iOS 和 Android 將一些unicode字元轉換為表情符號。在您使用這些 unicode 字元之前,最好測試一下它們,確定不會出現在不同瀏覽器表現不同的情況出現。