維護VS Code 開源項目背後的那些事情

2020-12-17 開源中國

本文來自於知乎上《維護一個大型開源項目是怎樣的體驗?》中的 rebomix 的回答。本文作者 rebomix 是微軟重要的開源項目之一 Visual Studio Code (常簡稱 VS Code)的維護團隊成員,在此分享了維護 VS Code 過程中的一些見聞和感想,可以讓我們一窺這種由企業支持的大型開源項目是如何運作的。

也希望此文可以讓國內對 VS Code 開發、使用感興趣的同學更多的了解和參與 VS Code 的社區開發。

加入 Visual Studio Code 快一年,趁這個機會聊一聊開發和維護這個項目的感受。以下為個人理解,不代表公司也不代表團隊。

項目

Visual Studio Code 的目標是做一個 Lightweight Editor,通過的擴展 api,讓用戶在 VS Code 中達到和 IDE 中接近的開發體驗(效率)。

不過很多群眾對 VS Code 有諸多誤解,我先來一一解答

  1. 「VS Code 師出 VS,是 VS 找了一群人來重寫的,復用了很多 VS 的代碼,等等「。
    很抱歉,並不是這樣半毛錢關係也沒有。VS Code 的核心代碼,也就是 Microsoft/monaco-editor是 Erich Gamma 2011 年加入微軟後,招聘的一支「全新」的隊伍進行開發的。Monaco editor 從一開始就是一個基於瀏覽器的編輯器,早期一直服務於各個微軟系統中(比如 Visual Studio Online,OneDrive online)。招聘的這支隊伍對於 Erich 來說並不是新的,因為大部分成員都是其原先 IBM 的老部下,其中幾位大爺跟著 Erich 擼了二十多年代碼了。

  2. "VS Code 是 Atom 的復刻,是對 Atom 的魔改,是 Atom 的一個主題!"。
    很抱歉,並不是這樣,但還是有幾毛錢關係的。Monaco Editor 在經歷幾年的高光期,進入了一個小小的黑暗時代。這時候團隊成員開始調研將 Monaco Editor 做成桌面應用,和 Atom 一樣,我們首先關注到的就是 node-webkit。必須說 node-webkit 是業界的一縷清風,給這個產業帶來了太多的可能性。當然最後我們選用了 atom-shell,也就是後來的 Electron。但就是這個 atom-shell,給大家帶來了以上的誤導。

最後,我們一定要尋根問祖的話,VS Code 應該是師出 Eclipse(同志們,哎你們怎麼扭頭走人了,別怕,我話沒說完呢)。團隊核心的幾位大爺,早年就跟著 Erich,在寫了幾個 Editor/IDE 之後,創造了 Eclipse。正是因為見證了 Eclipse 的興衰,所以這一次在設計 Monaco/VS Code 的時候,才會如此的克制。Extensibility 不好嗎?當然好,但是 Eclipse 的弊端已經在一些競爭對手身上出現啦。

開發/維護

我 13 年加入微軟後,就開始接觸到 Monaco 了。在使用的過程中踩了一些坑,研究過代碼,做過好一些擴展。所以在 VS Code 正式開源後以及上線 Marketplace 後,我就開始動手寫一點插件和發 Pull Request。去年五月得空和團隊結對編程了兩個禮拜後,就加入了 VS Code。

VS Code 的開發幾乎完全是公開的。早期我們還通過 User Voice 收集反饋,但我們早就把它關掉了,所有問題的處理都放在 GitHub 上。我們的 Yearly/Monthly plan 都以 issue 的形式呈現在 Microsoft/vscode 上,而我個人正常的開發節奏是這樣的:

計劃

在上一個 milestone 快結束、新的 milestone 開始的第一周,和老闆溝通新的 milestone 自己想做的功能。以及自己要不要休假。

Debt Week

我們把新 Milestone 的一周當作 debt week,集中處理一些技術債,以及為一些插件做點微小的貢獻。我一般會花一點時間在 Vim 插件以及我自己的 Ruby 插件上。

開發

這之後就是兩到三周正常的開發。每天起床得先把自己頭上的新 issue 都 triage 一遍,遇到緊急的得先修,不然就繼續完成自己的 feature。

Inbox Tracking

我加入團隊的時候,我們只有 1700 個左右的 issue,現在已經破 4000 了(大部分都是 feature request)。GitHub Inbox 在這種情況下是無用的,我們的做法是每周會有一名同事,負責 GitHub 的新 issue,assign 給合適的 owner。我已經當過三次 Inbox Tracker,只能用可怕來形容。每天一睜眼就是一百多個 issue 要處理,一點都不想起床。

Endgame

我們在 milestone 的最後一周 endgame 會對新 feature 進行各種花樣的測試,對這個 milestone 關掉的所有 issue 進行驗證。全部完成後,每個成員書寫自己負責部分的 release note。最後 Endgame master 會到後臺網站發布新的 Stable 版本。

印象深刻的事

當之無愧就是「在空閒時,VS Code 由於渲染閃爍的光標而佔用了 13% 的 CPU」。VS Code 是基於 Electron 的,而 Electron 則基於 Chromium。這樣的話,Chromium 的鍋有時候得我們來背。

VS Code 裡的編輯區域並不是 textarea ,全都是 mock 的,這也是主流做法,Ace、CodeMirror、Atom 無不例外。理由也很簡單,要實現 Tokenize、高亮、Partial Render、Line Wrap,自己控制渲染肯定是最方便的。為了儘可能模擬 textarea,我們模擬了光標。最開始這個光標的跳動,是通過 JavaScript 來控制光標的 opacity。後來社區給我們貢獻了一個 pull request,使用 CSS animation 來調整 opacity。實現上來說肯定是比 JavaScript 版本更優雅,同時也提供了四五種不同的光標跳動的選項。

但誰知道,Chromium 對於 CSS Animation 是有巨大的坑的。比如你寫的 animation 是每秒改變一次 opacity,但是 Chromium 會根據刷新率(比如 60hz)來檢測頁面上的 animation。雖然我不知道 Chromium 做了什麼,但是你可以看到每16ms,Chromium 就會吃掉一點你的 CPU 和 Battery


真的是一點辦法沒有。我們起初沒有發現這個問題,直到 broccoli 的作者 Jo Liss 給我們發了 issue,並且在 Twitter 上爆我們,瞬間就成了 Twitter 上大新聞。連 Miguel de Icaza 都點讚了,真的是……

當時我剛吃完晚飯,但是由於這個事情在我的防區,我只好開電腦 troubleshoot。最後發現是 Chromium 的 bug,開了兩年多了,我只好告訴 Jo Liss,這鍋我們不背,但是我們會修的。

結果之後好事者把事情捅到了 HackerNews,瞬間成了當天大新聞,還上了 TheRegister 小報。所有人都開始討論使用 Browser 技術做桌面應用是不是正確的選擇,撕的不亦樂乎。

你們撕的倒是開心了,我那幾天給各種老闆解釋什麼是跳動的光標,忙的跟狗一樣。好在後來 Chromium 的 PM lead Paul Irish 留言表示這是他們的 bug,算是完美收官了。

有沒有什麼奇葩的 issue 或者 PR?

  1. 你們猜大家看到中文寫的 issue 會找誰來翻譯?

  2. 有些朋友提交了 PR,根本不管你給的建議,自顧自的更新修改。這樣的 PR 根本不可能 merge,但是我們給的儘可能 polite 的建議,有些朋友真的把它們只當成建議……

  3. 再一次說到跳動的光標,這個始作俑者是社區的朋友,看起來也是非常 neat 的實現,誰知道就踩了 Chromium 的坑呢……

關於中文 issue 的問題,VS Code contribution guide 寫的是比較清楚的,請大家用英文提問。但是鑑於中文用戶量巨大,加之人總有英文不夠用的時候,VS Code 也會經常看到中文問題。我有這樣一些想法:

  1. 寫中文我個人覺得問題不大,畢竟 GitHub 是我們幾乎唯一的反饋渠道,不能要求用戶必須會英文。

  2. 寫中文的確增加了我本人的工作量,所以能寫英文,還是儘量寫。

  3. 但如果你覺得需要嚴重的 Google Translate 的幫助,我建議還是寫中文,並且 cc 我。不然可能翻譯出來最後誰也看不明白,或者誤解。

  4. 我老闆問我,為啥中文 issue 幾乎把所有東西都寫在標題裡,然後 issue 描述留空。我真的不知道該如何回答。如果用中文寫 issue,並 cc 我,請保證把reproduce steps 寫好,一步一步用中文寫清楚,這總沒難度吧?

  5. 如果第四步做不到,還要我解決問題,請考慮請我喝啤酒吧。

生活

大家都喜歡開源,但開源貢獻者大部分時候是在做義務貢獻。這麼來看在微軟搞 VS Code 就是一件愉快的事情,畢竟有人給你付工資讓你做 open source。而且再也不用上班搞一套代碼,回家之後私下自己在 GitHub 上面逛遊,搞別的項目,上班和下班後可以在同一塊土地上耕耘。

當然這樣缺點也很明顯,就是生活和工作往往難以分開。工作是一周五天,一天八小時,但是 GiHub issue 從來都是 7*24。遇到棘手的問題的時候,很難放任不管,哪怕已經回了家。不過也正是因為項目的特殊性,我們組還是有比較好的 remote 和自由工作時間的文化的。

(題圖:Pixabay,CC0)

轉載自:知乎,作者: Daniel Stori,via:Linux 中國

相關焦點

  • python入門:環境搭建(神器Anaconda+Vs Code)下載與配置
    大家好,我是涼拌本篇文章主要講python神器:anaconda和vs code這兩樣神器的安裝與配置。我馬上要講的東西呢,比較適合那些已經學會了python語法的小白們。然而,正是由於庫的數量龐大,對於管理這些庫以及對庫作及時的維護成為既重要但複雜度又高的事情。對於我們這些小白來說,只需要了解庫的使用即可,維護庫是別人的事情啦。然而,我們要使用的庫實在太多了。如果一個個安裝,想一想就很沒有動力。並且,有些庫的下載安裝速度真是讓人鬱悶,有時候通過pip安裝能安一個小時,甚至到最後還失敗了。
  • vs code配合Anaconda寫Python?掌握這些技巧讓數據分析事半功倍
    Anaconda是一個著名的開源Python發行版本,內含多個Python的科學計算庫,相信使用Python做數據分析或數據挖掘的小夥伴對他不會陌生。vs code配置python插件打開vs code,左邊選擇應用商店輸入Python,選擇安裝上圖的插件安裝後你會發現左下方即可選擇使用本機的哪個python環境,是不是很方便vs code中使用交互式輸入很多小夥伴在寫探索性代碼時(特別是探索性數據分析)都會選擇使用交互式環境,比如jupyter notebook,因為可以隨時修改一個區域的代碼並且立即看到代碼效果
  • VS Code 搭建 Rust 開發環境
    VS Code 安裝 Rust 插件打開 vs code 找到插件工具欄單擊打開並在搜索欄輸入 「rust」 搜索 Rust 插件上面你看到的圖片是我的電腦已經安裝過了,第一次安裝點擊右邊的 install 安裝。
  • Github、VS Code 的開源替代品來咯!
    它提供了代碼和項目管理工具問題報告、持續交付和監控,幾乎是軟體開發機構必備的基礎設施。它致力於開源,不管是在其代碼和背後的組織,還是在Git本身都發布了大量的業務文檔,作為一個網站,GitLab非常熱衷於推廣Git。從代碼的私有性上來看,GitLab 是一個更好的選擇。
  • VS Code上那些好用的JS代碼片段
    【IT168 技術】Visual Studio Code是一個免費跨平臺的開原始碼編輯器,具有廣泛的預構建擴展庫,具備很多有用的附加功能。  由於 VS Code是運行在Windows、Linux和MacOS上的跨平臺工具,而JavaScript正在成為各種跨平臺項目的首選程式語言,所以今天就為大家推薦一些實用的JavaScript代碼片段。評選標準主要是基於下載次數、評級以及個人主觀評估。
  • 微軟開源新字體 Cascadia Code,與 Terminal 一起開發
    微軟開源了一套新的字體 Cascadia Code。
  • 極速體驗|VS Code+Python敏捷開發
    VS Code在前端開發中,有一個非常好用的工具——Visual Studio Code,簡稱VS code。很多人使用後都會感嘆「用VS Code 寫代碼是真好用、真爽。」它是一款當下流行、十分出色的ide開發工具。
  • 編寫Windows Kernel Shellcode
    最近有個想法,直接利用內核代碼執行權限,來寫文件,於是就抄起了VS,開始寫shellcode,開始以為和R3下面寫shellcode一樣簡單。新建個驅動的項目,按照下面修改項目的屬性,然後動態獲取API,再調API完成自己的功能。項目屬性配置好以後,開始寫shellcode,計算要使用的內核API的名稱hash,為了方便計算,我寫了一個簡單的MFC程序。
  • 說說開源那些事兒
    之後這位導師在文章評論裡聯繫了我,表示該機構課程涉嫌開源侵權他的 GitHub 開源項目。我們後臺私信加上了微信,轉接了他與機構方,在這個過程中我說了大概有十句抱歉。或許法律責任上這件事情我是沒有責任的,但我仍然抱歉,我為所有開源工作者遇到的不公平的待遇感到抱歉。你們明明是世界的 Contributor。開源,到底有版權嗎?
  • 分享幾個我日常使用的VS Code插件
    這可以提供很多幫助,尤其是當你的項目變得很大,並且在package.json中包含很多依賴項時。我不想再錯過這個插件了,強烈推薦!連結:https://github.com/ChristianKohler/NpmIntellisenseMarketplace:https://marketplace.visualstudio.com/items?
  • [開源推薦]Google開源基於Deep Learning的word2vec工具
    word2vec為計算向量詞提供了一種有效的連續詞袋(bag-of-words)和skip-gram架構實現,word2vec遵循Apache License 2.0開源協議。如何轉換?word2vec主要是將文本語料庫轉換成詞向量。
  • 微軟VS Code 或將取代 Visual Studio!
    「免費」、「開源」、「顏值高」、「比atom更快」、「比webstorm更輕」……這均是開發者給出的最高評價。作為一款代碼編輯工具,VS Code本質上與Visual Studio、WebStorm、Eclipse、myEclipse等集成的開發環境並不是一個概念。不過,仍然有不少開發者仍然給出了VS Code會替代Visual Studio的聲音。
  • Leecode題解 :7. Reverse Integer
    x/=10;        }        if(s>INT_MAX || s<INT_MIN)            return 0;        else            return s;    }};推薦閱讀Leecode
  • 程式設計師請收好:10 個實用的 VS Code 插件
    https://marketplace.visualstudio.com/0、Visual Studio Intellicode下載超過 320 萬次的 Visual Studio Intellicode,是 VS Marketplace
  • visual studio code(vs code)函數跳轉跟蹤:php intelliSense
    那麼你還差最後一步,「文件 -> 將工作區另存為」,也有人說重啟vs code也可以,後者沒試驗,前者本人親測可用。eclipse中或者vc code中跳轉到其它函數方法後如何快速返回原處快捷鍵:ctrl + 滑鼠左鍵:跳轉到引用的方法。alt + left :從所跳轉到引用的方法返回原方法。
  • 2015年最值得推薦的10個開源新秀項目
    【IT168 資訊】每年大家都能看到成千上萬個新的開源項目啟動,然而只有少數能夠真正實施成功。其中一些項目在現有核心技術基礎上有了新的推進,另一些在新的領域也有了很大突破。對於多數開源項目來說,其目的都在於處理並解決簡單的開發問題,部分開源項目意在與世界各地誌同道合的開發者共享信息和資源。
  • 從28 萬個開源項目中,我們能夠學到一些什麼?
    這裡聲明一下,僅僅是學習一下:他們是用哪些工具,來管理自己的項目的?開源項目多如牛毛,值得分析的項目也很多很多。從哪裡入手呢?幸運的是,在開源社區,有一個著名的網站,過去叫oloho,現在改名叫openhub。
  • Code Runner for VS Code 突破 2000 萬下載量!支持超過 50 種語言
    code-runner.executorMap{ "code-runner.executorMap": { "javascript": "node", "php": "C:\\php\\php.exe", "python": "python", "perl": "perl
  • VS Code上也能玩轉Jupyter Notebook,這是一份完整教程
    作者:Yong Cui機器之心編譯參與:王子嘉、蛋醬自從 2019 年 VS Code Python 插件更新以後,VS Code 已經提供了對 Jupyter Notebook 的本地支持,對於那些經常處理合作項目
  • SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)
    HTTP 200和HTTP 304理論上的差異解析,網上一搜一大把:https://stackoverflow.com/questions/1665082/what-is-the-difference-between-http-status-code-200-cache-vs-status-code