武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

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

  • 2015-12-03
  • 本文字数:5523 字

    阅读完需:约 18 分钟

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

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

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

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

在锐客网这个项目里扮演了很多角色:主程、架构、产品经理,项目经理,经历了一个互联网项目从无到有的头三年,收获良多。在研发上,搭建了 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 目前还有很多地方需要改进优化,但是只要了解用户需求,提升用户体验,不断的增加实用功能,那这款产品成为成熟产品也就不远了。


受访嘉宾介绍

杜万,Coding.net 全栈工程师。从事了近 10 年以 Java 语言为主的软件开发工作,热衷于整合框架和开发工具,关注交互设计,Linux 拥趸者,喜欢写技术博客( http://codelife.me )。近期开始学习和关注 Elixir 函数语言。目前负责 Coding WebIDE 项目的架构和研发。

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2015-12-03 19:127047
用户头像

发布了 152 篇内容, 共 66.2 次阅读, 收获喜欢 194 次。

关注

评论

发布
暂无评论
发现更多内容

2023年保障企业数据安全几大措施看这里!

行云管家

数据安全 堡垒机 企业数据

工赋开发者社区 | 《工业元宇宙五大应用场景——案例集汇编》发布

工赋开发者社区

为什么说IO密集型业务,线程数是CPU数的2倍?

小小怪下士

Java 线程 io

用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源

华为云开发者联盟

开源 后端 华为云 企业号 1 月 PK 榜

AI科普 | 语音识别准不准?——ASR 效果评测原理与实践

牵着蜗牛去散步

腾讯云 腾讯 最佳实践 语音识别 人工智能’

能将三次握手讲到这个程度,不给你offer给谁

华为云开发者联盟

面试 后端 开发 华为云 企业号 1 月 PK 榜

好气啊!为什么我抓不到 baidu 的数据包?

风铃架构日知录

程序员 Java、 java程序员 抓包 数据包

Python从0到1丨细说图像增强及运算

华为云开发者联盟

Python 人工智能 华为云 企业号 1 月 PK 榜

工赋开发者社区 | “低代码+MOM”,西门子的MES“进化论”

工赋开发者社区

高性能网关基石——OpenResty

C++后台开发

lua nginx openresty 后端开发 高性能网关

可观测产品的最佳实践,涵盖端到端的可观测解决方案丨阿里云用户组深圳站

云布道师

阿里云

寻找中国应用现代化先锋的前1%!CNBPA 2022应用现代化系列评选结果揭晓

云原生技术社区

云原生 应用现代化

百万并发场景中倒排索引与位图计算的实践

京东科技开发者

倒排索引 索引 位图 系统 企业号 1 月 PK 榜

小游戏开发引擎选型建议指南

Onegun

小程序游戏 小游戏引擎

阿里云产品专家陶炳哲:Java应用最佳实验

云布道师

阿里云 Java、

App在苹果上架难吗

雪奈椰子

iOS上架 ios审核

用javascript分类刷leetcode22.字典树(图文视频讲解)

js2030code

JavaScript LeetCode

前端工程师leetcode算法面试必备-简单的二叉树

js2030code

JavaScript LeetCode

前端面试指南之JS面试题总结

loveX001

JavaScript

寻找中国云原生实践先锋的前1%!CNBPA 2022云原生最佳实践评选结果揭晓

云原生技术社区

云原生

CSV:简单格式下隐藏的那些坑

华为云开发者联盟

后端 华为云 csv 企业号 1 月 PK 榜

3D游戏建模在Maya中加快建模速度的5种技巧

Finovy Cloud

云渲染 建模 maya

JavaScript刷LeetCode心得

js2030code

JavaScript LeetCode

Getaverse 2022/12 月报 | 测试网成功上线

Geek_Web3

#区块链# 元宇宙 web3 元宇宙系统开发

和HHOGene主创谈GPods设计理念:用耳机“播放”光

B Impact

开源工作流引擎如何支撑企业级 Serverless 架构?

阿里巴巴云原生

阿里云 Serverless 云原生 KubeVela

2023年成都等级测评机构名单新排名看这里!

行云管家

成都 等保测评 等保测评机构

RocketMQ 5.0 多语言客户端的设计与实现

Apache RocketMQ

RocketMQ 消息

YMatrix 5.0重磅发布,以性能突破引领万物智联下的数据库最佳形态

YMatrix 超融合数据库

Machine Learning 性能提升 超融合数据库 OLTP 场景实践 YMatrix

大厂前端面试考什么?

loveX001

JavaScript

这样回答前端面试题才能拿到offer

loveX001

JavaScript

Coding全栈工程师杜万:打造最好用的在线代码阅读工具CodeInsight_Java_Lucien_InfoQ精选文章