Coding 全栈工程师杜万:打造最好用的在线代码阅读工具 CodeInsight

2015-12-07 11:15:17 +08:00
 CodingNET
微软资深软件设计工程师 Eric Lippert 此前就讲过,读代码远比写代码困难,不仅是因为理解上的问题,还有阅读工具选择的问题。目前在线阅读代码的工具种类杂多,但是要做到用户体验满意的在线工具,实属不易。最近采访了 [Coding]( https://coding.net) 全栈工程师杜万,听他讲讲 Coding 即将发布的在线阅读代码工具 [CodeInsight]( https://src.coding.net) 有哪些功能。

> InfoQ :请介绍一下自己,包括之前的工作经历以及现在所从事的主要工作。

杜万: 2006 年毕业于同济大学地质工程专业。从大学开始接触并沉迷于计算机。毕业以后在上海生物信息中心写了一年程序。之后在上海锐道工作了七年。期间的工作经历包括被外包到客户方解决围绕展现层中间件 Dorado 的技术问题,其次是进入客户研发小组写框架和开发工具( Eclipse 插件)。与此同时也分出部分时间参与锐道公司的 Dorado IDE 的研发,这些都是进入研发部门的前期铺垫。随后组建部门负责搭建锐客网。之所以搭建这个 Web 研发平台,主要是为了解决如下几个问题:

外包出去的程序员和客户之间需要一个平台来反馈产品问题
研发人员需要一个平台来实现远程研发协作工作
Dorado 产品打算以开源的方式运作,需要代码托管服务
方便销售人员进行客户关系管理,发布一些成功案例

在锐客网这个项目里扮演了很多角色:主程、架构、产品经理,项目经理,经历了一个互联网项目从无到有的头三年,收获良多。在研发上,搭建了 Maven 私服, Jinkens 服务,项目 Maven 化,为了让持续集成和持续交付玩得更顺畅,还写了一些 Maven 和 Eclipse 插件,而这部分内容对整个公司层面的研发流程改进产生了深刻影响。在产品上,通过整合 OpenLDAP 将所有的内外账户统一管理,无论是服务器还是应用都可以通过一个统一的账号进行登录,尝试解决面向研发工程师的自有产品的开发,面向客户程序员的学习与答疑问题,以及面向客户技术选型的资料库问题。

目前的工作重心暂时从 IDE 转向了 CodeInsight 项目, CodeInsight 是一个在线的代码阅读工具,其背后是一个语法分析引擎。为什么 Coding 要在 WebIDE 之后,又来重做 CodeInsight 呢?一方面, CodeInsight 和 IDE 一样都是开发工具,符合 Coding 打造好用的云端开发服务的宗旨。另一方面, Coding 打算通过 CodeInsight 来积累一些经验,为 IDE 的 2.0 版本打好基础。现阶段在 CodeInsight 项目里主要是负责产品和架构研发工作。本人很希望通过这个项目来解决一些 WebIDE 项目里没有处理好的问题,比如持续集成。从开发到部署的整个过程进行的很顺利,这也可以把之前的思考和经验积累变成新的代码实践。

> InfoQ :有人说,如果一个公司不太懂全栈工程师的价值,那么全栈工程师的地位将会很尴尬,那么一个全栈工程师如何才能做到“一专多能”?

杜万:对于一个刚入行的工程师来说,专心干好本职工作比较重要,表现出色才会有更多的机会。程序员大多有自学习惯,上班写代码,下班逛论坛,看博客,读些技术书籍。本人更倾向于花大块的时间系统的阅读,扫除知识盲点。看的书和学的技术最好和当下的工作相关,几周以后会用到的。这样学习和实践就能紧密结合在一起。

只有出色的工作才能赢得信任,这样会有更自由的空间,在某些小的技术点上有些决策权。对于这样的机会,一般倾向于选择采用技术上更创新或者契合的方式,而不是“省事的”的解决方案,即使会因为“麻烦一点”而牺牲一些业余时间。高手出于刻意训练,总的来说个人成长的方式是:努力干活,制造问题和解决问题。

> InfoQ :您是 Linux 的坚定拥护者,之前也做过开源平台 bsdn.org ,那么您现在工作中经常使用 Linux 工具吗?您对开源软件有怎样的深刻理解和心得?

杜万:从大学开始就接触 Linux ,工作中部署环境基本都是 Linux ,也曾经在 Ubuntu 的桌面环境下工作了一年多。

喜欢 Linux 是从感受到它强大好用的命令行开始的。 bash , awk , sed , vim 等一系列字符界面的工具串起来可以干很多事情。特别对于本人这种靠 Java 语言启蒙的程序员,分外觉得方便。另外, Linux 很多发行版都内置了包管理器,一行命令就可以安装好想要的软件,这使得大家都很依赖这样的便捷。在 Mac OS 桌面下, Homebrew 也是很受人钟爱的工具。

至于开源软件,个人认为对于行业最大的益处是知识更高效率的重新利用。对开发者来说,帮助最大的三个网站是: Google 、 Github 和 Stackoverflow 。通常遇到问题,都是从 Google 链接到 Stackoverflow ,再链接到 Github 。 Github 上有大量的开源源代码组成的知识仓库,这样才会有大量 Stackoverflow 宝贵问题的答案积累,进而让程序员遇到坑时更有效率的找到解决方案。

> InfoQ :据悉 Coding 最近将会推出一款云端代码阅读工具—— CodeInsight 公测版,目前它所具备的主要功能有哪些?

杜万: CodeInsight 是一个在线代码阅读工具,该工具对版本库中的代码进行语法着色,引用分析,并以文件树的方式向用户展现完整的项目源码。借助该工具用户可以方便地浏览代码,定位变量定义以及理清引用关系。对于一些深奥晦涩的部分可以添加评论,与其他用户共同探讨和推敲。

> InfoQ : CodeInsight 除了支持 PHP 项目之外,还支持哪些别的语言?能不能跨平台阅读托管在 Coding 平台以外的代码?此次推出的 CodeInsight 公开版本,分析了哪些热门的开源项目?

杜万: Coding 新开发的 CodeInsight 公开版是基于 Google 的开源源码分析引擎 Kythe 而实现的。 Kythe 默认支持 C++和 Java 代码的分析。后面会考虑在 Kythe 的基础上扩展对其他语言的支持。从 Java 入手,初期打算分析 Maven 仓库里最热门的 100 个项目。

> InfoQ : CodeInsight 和 WebIDE 是相辅相成的工具,可否具体讲一讲两者之间的关联性?

杜万: WebIDE 非常好理解,就是一个浏览器版本的代码编写工具。 IDE 是集成开发环境( Integrated Development Environment )的缩写。一般来说现代的 IDE 会集成,编辑、档案(版本管理)、编译、调试、执行等开发过程需要的一系列功能,以提高程序员的生产力。 Coding 的 WebIDE 已经具备编辑、版本管理功能,而编译,调试,执行等功能我们通过 Web Terminal 先简单地替代了一下。关于代码编辑方面, IDE 还是有很多好用的功能。比如,语法着色,交叉引用,自动补全,快速定位,错误提示等。而这些功能依赖于对代码的词法和语法分析,这些分析器有些需要自己实现,有些可以依赖于现成的编译工具。但是无论怎么样都是很大的一块功能,需要长期深入的研究。

CodeInsight 是一个主打代码阅读的工具,一份高度可读的代码,除了代码内容本身具备良好的编写风格,比如符合范式、命名规范、有良好的注释以外。如果具备一些辅助工具,比如语法着色,交叉引用,快速定位,可以让阅读和理解变得更容易。而这些好用的功能也依赖于后端的分析引擎。词法和语法分析引擎是 WebIDE 和 CodeInsight 共同的基础,或者说就核心技术而言, CodeInsight 只是 WebIDE 的一个功能子集。所以我们先去研发 CodeInsight ,以期待在漫长的道路上有一个阶段性的成果可以服务于 Coding 用户。

> InfoQ :可否详细谈谈 Coding WebIDE 项目的架构和研发过程? WebIDE 有哪些核心功能,可以完成哪些工作?

杜万: Coding WebIDE 采用了前后端分离的架构,前后端之间通过 Restful API 进行交互。前端做了两版。第一版是基于 BackboneJS 做的,第二版是基于 ReactJS 做的。后端主要是用 Java 和 Go 语言实现的。 Java 采用了 Spring framework/MVC/Security/Data 全套框架。 Java 部分主要是提供 Restful 的 API ,权限认证和数据库相关的操作。 Go 部分主要负责和操作系统相关的工作,如工作空间管理。

参与研发的同事身处各地,本人当时在上海,有同事在南京读书,有同事在深圳总部,有同事在湛江老家,大家通过 Coding 平台的代码仓库和任务系统进行远程协作。研发过程中团队特别推崇两件事: Peer Review (同行评审)和 Unit Test (单元测试)。这两件事情是为了让 WebIDE 得以快速迭代。团队一直在微调架构,除了直面问题的勇气,同事间的代码审查和绿色的 bar 是大家最大的信心。

WebIDE 的核心功能包括代码编辑,版本库集成,全功能的 Terminal ,开发环境分享等等。目前 WebIDE 方便做一些轻量级的动态语言项目;有的时候,即使电脑不在身边也可以通过 WebIDE 的功能修改代码。

> InfoQ : Coding WebIDE 和同类产品之间有哪些区别和优势?同类产品中又有哪些方面值得 Coding WebIDE 借鉴?

杜万: Coding 的 WebIDE 和同类产品比,最大的优势是速度快。市面上的其他 IDE 产品多是采用 VM 作为后端,而 Coding WebIDE 是建立在 Docker 之上,所以启动和打开速度要快不少。也正因为 WebIDE 是在新兴的 Docker 之上,所以不能像其他 IDE 产品一样随时 hibernate ,完美的保持状态。

Coding 的 IDE 功能还有点弱,代码分析还没有完善,自动补全也不够好,缺少对 Debug 的支持,这些都是我们需要学习和借鉴的。

> InfoQ :《 Docker 在 Coding WebIDE 项目中的运用》一文中,您提到 WebIDE 在架构初期,考虑全面 Dockerize 的方案,最后因为“ Nginx 是否也要放进 Container 里”存在不同的声音,而放弃了全面 Dockerize 。根据您的经验,如果实施全面 Dockerize 方案的话,能带来哪些效果?

杜万:做 WebIDE 的时候最早是把所有的服务都放进了 Container 。统一的封装方式很适合管理,但是上线的时候运维不同意,他们说,物理机上了 MySQL 已经有自动的备份功能, Container 里的服务需要重新做。已有的 Nginx 里加一行配置就可以,所以没必要封装成独立的。其实他们说得有道理,所以最后就同意了。

另外, Container 中的服务也是存在一些问题的,被迫拿出来。有个服务依赖动态 mount 的目录,而由于 mount namespace 的隔离,一个已经启动的 Container 是无法感知到宿主机的 mount 变化。

> InfoQ :目前, WebIDE 还是存在部分不足之处的,例如:不支持 debug 断点调试功能、不能像 Web 开发者那样直接运行查看、菜单不支持中文、还无法承担大型应用的开发等,对于这些, Coding 在接下来会做哪些技术上的改进?在未来还有哪些目标需要突破?

杜万:中文菜单已经有了,其实早就有了,只是当初开发人员用惯了英文的 IDE 菜单,感觉中文的菜单太别扭,就去掉的。

为了适应这个快速变化的互联网时代,最初的 IDE 基本是弄出一个雏形就匆匆上线了。对于资源的限制,比如 CPU 和磁盘的限制,这些都是后半年慢慢加上的。在 Docker 技术上搞这些限制,都是些新兴的课题,团队做了许多试验,也踩了些坑,最终短板还是补上了。目前整个团队致力于研究在线协作,希望能像国外同类产品一样,实现多人的同时编辑、远程结对编程。

其次就是,回放操作历史在教学方面的需求很强烈, Coding 团队也在做这方面的技术储备和研究。

> InfoQ :作为一位资深的全栈工程师,您在开发过程中都遇到过哪些典型的坑,又是如何克服的?可否为其他全栈工程师分享一些引以为鉴的案例。

杜万:一个手指不离键盘的码农,一路踏坑而来。

最近遇到过一个比较严重的案例。为了挂载支持动态扩展的镜像问题,研发团队选用了 KVM 内置的 NBD 模块。前期调研发现很好用,本地实现没有异常, staging 上没有问题。生产机上线以后,隔三差五地出现进程内核态 CPU100 %,这是一个非常头痛的问题,进程在内核态是无法被 kill 的,而且占满了 CPU 资源,每每出现这种情况,就只能无奈的重启服务器。这对于云计算是很难接受的。 Google 查询了很久,多次升级内核,无果。最终改了方案,放弃了不稳定的 NBD 。引入新技术解决问题,都是程序员乐于去做的。但是每引入一种新技术,都同时增加了不稳地的风险。

对于创业公司来说,最关注的应该是业务,解决用户的痛点。所以,有时候技术栈纯粹一点是明智的选择。

> InfoQ :您现在关注 Elixir 函数语言,且有十多年的软件开发经验,可否分享一下这些年的垒码心得、学习感悟,以激励后者!

杜万:语言大战经常是技术人热爱的战场,有人说 PHP 是最好的语言,有人接受不了 Golang 的变量声明格式,一些同事鄙视三个等号的语言,还有讽刺 Lisp 括号太多的。

刚开始学 C 系语言的时候,觉得语言都差不多,编程思想很重要,应该精通设计模式。后来接触了 Ruby ,被 DSL 的魅力深深吸引,灵活动态的语法让设计模式变得不是那么重要。再后来学习了 Prolog 和 Clojure 才意识到同像性( Homoiconicity )才是真正地让人着迷的原因所在。

最开始听说 Elixir ,是来自于同事在 Coding 发的一条消息:“不要咖啡,不要大象,不要蟒蛇,不要红宝石,只要万金油”,我们知道咖啡表示 Java ,大象表示 PHP ,蟒蛇表示 Python ,红宝石表示 Ruby ,那万金油是什么。 Google 一下,才知道万金油是 Erlang 虚拟机上的一门语言。相当于 Scala 之于 Java 虚拟机。英文名字叫 Elixir 。 Elixir 是函数式语言,支持元编程,先天的分布式支持,借助于 OPT 框架可以替换代码。也就是可以不停机,升级业务代码。类似于 nginx -s reload ,但是这是应用级别的特性,无需架构支持,简直太棒了。

感觉发现了新大陆了,赶紧吆喝大家一起来开荒吧。但是没有中文版的资料呀。于是和同事一起联系出版社合作翻译了《 Programming Elixir 》,目前已经交稿了,估计不时就能出版了。当大家在编程语言的选用上发起争执的时候,建议大家多学几门语言,慢慢你就会发现,每种语言都有擅长的问题领域,用得好才能站在鄙视链的上端。

#### 写在最后

正如杜万所说,虽然 CodeInsight 和 WebIDE 目前还有很多地方需要改进优化,但是只要了解用户需求,提升用户体验,不断的增加实用功能,那这款产品成为成熟产品也就不远了。
3064 次点击
所在节点    程序员
4 条回复
lydhr
2015-12-07 11:35:27 +08:00
想要 upload 自己的 project ,没有找到这个
saberpowermo
2015-12-07 11:37:53 +08:00
前几天看了看 感觉还不错
mintist
2015-12-07 23:48:05 +08:00
就想问一句: CodeInsight 对 C 的支持和 SourceInsight 相比,何如?
wsy2220
2015-12-08 01:50:01 +08:00
同楼上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241658

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX