Azure DevOps in Action - 透過 Fork 實現 InnerSource

Fork在Github中是常見的功能,使用的情境大多是我們想修改或學習他人的程式碼時。只要我們有權限,就可以Fork他人的Repos到自己的帳號底下。Fork和Clone不同,Fork可以追朔到來源的Repo,讓新建立的Repo與來源之間有所連結。

對於開源的open source專案來說,Fork是很有意義的功能,但對於企業來說也有需要嗎? 有的。

這幾年企業內部盛行InnerSource[1]的觀念,過去企業常常把source code視為不可觸碰的機密,甚至要求source code不可離開Lab(或特定部門)。在那個年代,你可能在某大型軟體公司工作了好幾年,卻還是看不到與自己部門(所開發的產品)無關的其他系統的任何一行程式碼。

但,現在時代不同了。

近年來,開發人員(和他們的主管)明顯地發現了open source所帶來的價值。同時,對於程式碼的安全性與開發規範也日漸成熟(如今,上道的程式設計師幾乎都懂得機密資料不該寫死在程式碼中),這使得企業也開始對於程式碼的開放不再感到懼怕。因此也在對企業內部員工開放程式碼後,獲取了很多前所未有的好處。

最顯著的好處是,員工可以透過檢視同事的程式碼進而學習和成長,回顧你自己過去的學習經驗,你會發現,其實大部分的程式設計師,都是透過看別人的程式碼來學習的(而非單單只是看書、上課、或是自學)。一旦停止觀摩,開發人員的成長就遇到瓶頸了,也就是說,觀摩其他人寫的程式碼,可以說是最好的學習方式(沒有之一)。

如果你覺得這沒什麼,認為讓員工成長這種事情對企業也沒啥好處,那你可以再反過來想。當企業內的所有開發人員,都知道自己的程式碼有可能會被其他人檢視(review)時,對於一個稍有廉恥心的開發人員來說,這是一個很大的提醒。當企業內培養出這個文化之後,大部分有自尊心的開發人員,都會在簽入程式碼之前,再看一下有沒有不該出現的code,以及是否有因為偷懶或取巧而品質不佳的程式碼。這使得軟體開發人員無形中更加的謹慎,對程式碼的自我要求將提高,而不只是讓程式能動就好。久而久之一旦養成習慣,在無形之間也提升了程式碼品質。

還有另一個典型的情境,也非常有價值。

近代的軟體開發往往是基於組件或套件的重用,在企業內也是,我們常常會用到他人所撰寫的套件或工具,這可以讓開發速度和時程加快,同時也提高重用性(提高重用性就是意謂著降低成本,切記)。

但,如果你同事所開發的套件有bug呢?怎麼辦?反映給他,等對方處理? 又或者,你需要在某一個套件上增加一些新功能,那又該怎麼辦呢? 等對方修改恐怕會曠日廢時,且對方也不見得有空花時間跟你討論需求…

更好的方式是,直接fork對方所撰寫的這個套件的Repo,直接幫對方修改,改完後只需要發個PR給對方即可。這讓企業內的合作自然且順暢的發生。身為Developer的你可能並不知道,『合作』這件事要想在企業的其他部門或領域推動有多困難,而軟體開發部門的宅宅們,卻只需要透過Fork + PR就可以自然的實現跨團隊的合作了。

資訊工具的進步,讓團隊合作可以在遠端順暢且自然的發生,這恐怕是過去沒有資訊工具的時代所無法想像的。如今,多人同時在wiki或HackMd等工具上一起撰寫會議紀錄,開發人員透過線上code review和協同開發,都已經慢慢變成像喝水一樣自然。

有了InnerSource的觀念之後,我們來看看怎麼在企業內透過Azure DevOps進行Fork與合作。

在Azure DevOps中使用Fork

好,在前面知道了Fork在企業內的價值之後,我們來看具體怎麼實現。

一般來說,只要你有權限檢視某個repo,就會看到右上角的選單中有一個Fork選項:

當你點選該選項,就會出現底下畫面,可以讓你把特定repo複製到你自己已經建立好的Azure DevOps Project[2]當中(下圖B):

複製過去的時候,會帶出原本此Repo的名字(上圖A),當你確定無誤按下Fork鈕,就會看到該repo被複製到你的專案中了:

從上圖中你會看見,該Repo被複製到newProject2(上圖A)這個Project底下,Repo名稱變成了myFirst.twdeveloper(上圖B),myFirst是原先的Repo名稱,twdeveloper則是你的帳號名稱。

就這樣,你可以開始修改或檢視程式碼了。所有的操作都跟你原本操作Repo的方式完全一樣。

前面說過,Fork和Clone某一個Repo有一個很大的不同,就是Fork之後,新產生的Repo和來源的Repo之間是有關聯的。因此你會發現,當你修改了這個Repo中的程式碼,並且Commit/Push之後,Azure DevOps一樣會建議你開立PR單,但仔細看PR單的內容,你是可以把PR的Merge給送回到來源Repo的:

你會發現,(上圖A)的選項,不僅可以選到 Fork過來後新建立的Repo,也可以選到來源原始Repo,當你選到原始Repo的時候,就可以把你的貢獻,反饋給最初該套件(或系統)的開發人員,達成企業內資訊共享與跨部門協同合作的成效,讓InnerSource真的發生。

這很不錯吧? 過去要在企業內實現這樣的程式碼協同運作,或是跨團隊之間的合作,有著一定程度的困難,要培養這樣的文化更是難事,但透過Fork機制讓InnerSource很自然地在企業內發生了,這是一個很值得推廣的功能。


[1] InnerSource這個字眼是Tim O'Reilly在2000年發明的,意指在企業內,對內部開發人員進行組織內的開源文化。相對於過去很多企業把source code保護的死死的,如經已有不少企業開始風行這個概念。

[2] 請留意,即便你的帳號跨多個組織,也是不能把Repo給Fork到另一個組織底下的。Fork這個行為在Azure DevOps中,只能在單一一個組織底下運作。

---------------------------
相關課程:http://www.studyhost.tw/NewCourses/ALM
節錄自『Azure DevOps敏捷開發與專案管理實戰

留言

這個網誌中的熱門文章

在POC或迷你專案中使用 LiteDB

使用Qdrant向量資料庫實作語意相似度比對

使用 Airtable 在小型需求上取代傳統資料庫

專業的價值...

周末讀書會 - 一如既往