作者:rebornix
链接:https://www.zhihu.com/question/36292298/answer/160028010
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

加入 Visual Studio Code - Code Editing. Redefined 快一年,趁这个机会聊一聊开发和维护这个项目的感受,如果大家不反对这是一个 大型 开源项目的话。以下为个人理解,不代表公司也不代表团队。

项目

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 从一开始就是一个 browser based 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 uses 13% CPU when idle due to blinking cursor rendering . 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 和自由工作时间的文化的。

维护一个大型开源项目,例如vscode是怎样的体验?相关推荐

  1. 如何规划创建并长期维护一个Github开源项目?

    title: 如何规划创建并长期维护一个Github开源项目? tags: 开源 程序 Github zhaoolee categories: 极客 2021年, 国内各路论坛已经铺满屠龙宝刀点击就送 ...

  2. 以 VS Code为例,看大型开源项目是如何应用软件工程的?

    以 VS Code为例,看大型开源项目是如何应用软件工程的? 作者宝玉,Groupon资深工程师,微软专家:以下文章摘自<软件工程之美>. 你好,我是宝玉. 如果你所在的团队在日常的软件项 ...

  3. 怎样维护成功的开源项目

    开源可不仅仅是将代码扔到网上就万事大吉了,将开源项目变成能让自己引以为豪的东西才算成功.那么,你需要注意哪些方面呢? 写好指导性文字 每一个开源项目有三样东西是少不了的:项目目标和方法的简要说明.如何 ...

  4. 小姐姐:如何参与大型开源项目-Taro 共建

    大家好,我是若川.持续组织了5个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  5. 前端大型开源项目_在大型开源项目中管理问题

    前端大型开源项目 We're honored by the amount of positive feedback we get from folks using Flutter. As one of ...

  6. Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了

    阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...

  7. 最近发现一个爬虫开源项目weixin_crawler

    最近发现一个爬虫开源项目weixin_crawler weixin_crawler weixin_crawler是一款使用Scrapy.Flask.Echarts.Elasticsearch等实现的微 ...

  8. 如何参与一个GitHub开源项目

    Github作为开源项目的著名托管地,可谓无人不知,越来越多的个人和公司纷纷加入到Github的大家族里来,为开源尽一份绵薄之力.对于个人来讲,你把自己的项目托管到Github上并不表示你参与了Git ...

  9. 如何参与一个GitHub开源项目?

    最近一年开源项目特别的热,很多技术大会或论坛都以开源项目作为主题进行探讨,可见这是一种趋势.而Github作为开源项目的著名托管地,可谓无人不知,越来越多的个人和公司纷纷加入到Github的大家族里来 ...

最新文章

  1. SpringBoot之get请求404
  2. 【免费下载】2022年1月热门报告盘点(附热门报告列表及下载链接)
  3. linux 下防火墙开启端口
  4. python自动视频摘要_专栏丨深度学习之视频摘要简述
  5. caffe和caffe-yolov3编译出错:fatal error: caffe/proto/caffe.pb.h: No such file or directory
  6. 塔设备设计手册_石油化工设备设计选用手册 塔器
  7. Ubuntu Thinkphp page not found
  8. 执行stap测试例报错:“insmod: can‘t insert ‘xx.ko‘: invalid module format”
  9. 中国天气预报网城市对应代码
  10. python 打印下标和值
  11. matlab 求拟合直线的斜率_如何用matlab求出图中各条直线的斜率
  12. java邮件发送代码报错_javamail发送附件不通过也不报错
  13. 数据结构与算法—前导
  14. 论文解读:NSGA-II, EFR, EFR-RR
  15. 三七总皂苷脂质体纳米粒子修饰负载RNA核糖核酸(实验注意事项)
  16. 在计算机中 音乐被数字化了 被一,音乐课题:浅谈数字化资源在幼儿园音乐教学中的运用...
  17. 马尔受伤后,巴西媒体透露斯科拉里在训练中演练了三后腰阵型
  18. Android学习之手机传感器的获取
  19. Predis\ClientException: Command ‘ZPOPMAX‘ is not a registered Redis command
  20. SpringMvc参数传递

热门文章

  1. android自带中文字体,Android中的默认字体系列是什么?
  2. 浏览器服务器协议,浏览器工作原理之HTTP协议
  3. ERP系统有哪些品牌?
  4. JAVA连接SQL2005
  5. Proxifier+secureCRT建立隧道
  6. grep命令 linux
  7. Matlab中的匿名函数如何使用?
  8. 欧拉角的概念理解和欧拉角旋转矩阵推导
  9. Focal loss 损失函数详解
  10. Android6.0以上应用在长时间在后台,因为内存不足导致系统回收内存,当再次启动应用出现Fragment重叠或者空白、异常解决方案(提供模拟内存不足导致系统回收内存的方案)。