写点什么

探索全栈工程师团队的开发协作模式

  • 2014-01-26
  • 本文字数:3412 字

    阅读完需:约 11 分钟

他是 2013 年 QCon 北京云计算专题的出品人,也是 2014 年 QCon 北京移动应用专题的出品人。他的团队往下做到云计算基础架构,往上做到客户端。他本人从 80 年代末起接触编程,在大数据处理、云计算、以及分布式系统等方面都玩过一圈。他是蒋炜航,网易技术总监,目前全面负责有道云笔记业务。

在这样一个团队中,后端和前端团队在同一个产品上工作,有紧密的协作关系。但是,底层的软件研发和应用层的软件研发毕竟有很大的区别,他们在代码提交和管理模式、测试机制、代码的交付周期、反馈和监控体系方面都有怎样的异同?在本次采访中,蒋炜航博士会介绍有道云笔记团队的一些实践。

InfoQ:您在去年 QCon 北京出品云计算专题,今年则出品移动 App 的专题。这也对应了有道云笔记在技术上的一个特点,就是从底层到客户端都是你们自己来研发、维护、运营的。能先简单介绍一下跟有道云笔记相关的技术团队都有哪些,各自负责哪些方面吗?

蒋炜航:我们底层有基础架构组,这个组在云笔记业务之前就建立了,服务的对象不单单是云笔记,还服务有道的很多业务。这个组也在我的团队,做的东西跟 Hadoop(HDFS、HBase、MapReduce)这些差不多,是自己研发的一套系统。底层提供的东西比较基础,只是存储和计算服务,对所有业务通用,本身不包含业务逻辑。

业务逻辑的开发都在服务器端的团队,这个团队专门是负责云笔记的服务器端的,负责处理同步、多版本、提供 API 等服务。

客户端包括 PC、Mac、iOS、Android、Windows Phone 的客户端,以及 web 端和浏览器插件。基本上每一层的团队都是几个人来做,不是很多。

此外我们还有个精干的研究团队,这个部门做的是一些三到六个月才有成绩的东西。方向主要是应用研究,研究的目标不是发论文,而是把成熟的技术做到产品中。比如编辑器,我们需要做跨平台的编辑器,过去大家比较熟悉的就是 Office 和 Google Doc,而以前很多 Web based 的编辑器并不适合跨平台终端的需求。我们一开始也是用 Web 编辑器做起来的,但是并不是很适合。我们也不可能像 Office 那样用几百个人去做一个编辑器出来,所以研究部门做的事情就是,花一定的时间找到合适的方法来提升编辑器的体验。提高跨平台的体验是一个很模糊的目标,不确定性很大,具体用什么做法要很多研究和尝试。这个团队还研究一些 NLP 和手写输入方面的项目。

InfoQ:有些软件产品的发展思路是求快,尤其在产品推出初期,要以最快的速度推出新的特性以验证产品的可行性;有些软件产品的思路是求稳,尤其在产品积累了一定用户量的时候,会更加关注软件的稳定性、安全性,升级的时候不要对现有用户造成负面影响。有道云笔记现在处于怎样的阶段,是偏重求快还是求稳?

蒋炜航:做互联网产品永远是要快的。同时,云笔记是个人的信息、知识管理工具,稳定性非常重要。要快,同时也要坚守产品质量,我们必须要两者兼顾。

可以这么说:我们的目标就是,最大化高质量产品的输出。我们无论做什么事,都要以优化它为目标来做。敏捷、测试、监控,都是很重要的手段,但相比之下,清晰的目标才是更加重要的。比如,什么叫做快?新版本发布多了就是快吗?引入新特性的频率高就是快吗?我觉得不是。新版本发布,可能会有很多 bug;新特性引入,可能是用户根本不关心的,可能你 80% 的用户从来都不会用到。所以这样的快是没有意义的。

我们对快的定义是,要让有效的产品尝试的速度尽量的快。你发一个新版本来测试,是否获得了更多对用户的理解?新功能是否让用户在某个场景下的需求得到更好的满足?用户是否更加活跃了?有效的快速是满足业务目标的速度,这是通过不断为用户提供更合适的功能来实现的。

我们现在发布重要的版本,会先在内部做高保真原型,在内部试用,从内部非常快的得到有效的反馈。然后我们会做很多的小范围用户测试和 AB 测试,比如在不同的渠道分发不同的软件包,来验证新的交互、新的功能,改掉原有的问题。另外我们还有一个很简单的原则:我们客户端覆盖这么多的平台,但是一个新功能的引入可能先只在一个平台上做,这样我们可以很快通过用户分析,了解用户是否需要这个功能,确认有用了才在全平台铺开。否则,就不引入其他平台,这样其他平台可以有更多机会尝试其他的东西。

在这样的思路下,我们测试阶段的服务器端也可以做的很简单,比如我测试覆盖就几百几千人,那就先用 Node.js 搭一个服务给他们用就好了,性能问题可以以后再考虑。很多时候,做面向三五个专家用户(资深产品经理)的内测也已经足够了。

做软件开发不是做选择题,要么选 A 要么选 B。只要目标明确,具体用什么手段都可以的。

InfoQ:你们后端研发团队和客户端研发团队在开发模式上的差异大么?

蒋炜航:本质上没有任何差别,大家都是为了业务的发展。实际上,我们有很多好的移动端研发工程师是从服务器端转过去的。很多应届毕业生是没做过前端和移动端,他们一开始就是对服务器端感兴趣。我们就会让他先做服务器,其中一些人就会转岗到客户端去。基本上,优秀的工程师在哪里都是优秀的,所以我们内部鼓励 full stack 工程师,可以从头到尾把高保真原型做出来,包括前端的 JS、iOS、Android App、后台服务。我们所有的工程师都要有敏捷的思路,以及以用户为中心的认同感,这些方面是一致的。

当然,因为前后端软件的特性不同,肯定会有一些差异。比如,服务器端对性能更加敏感,所以会关注很多提高性能的手段。当然这些思路,客户端也可以引入。另一方面,敏捷在客户端是比较常见的,因为客户端是功能驱动开发,对交付速度要求更高。当然,服务器端也要有一定的敏捷思路,不能说要我提供十个接口,我就要做俩月。我完全可以用一周时间,用一些现成的技术,比如 MySQL,把这个接口先提供出来,让客户端的开发能够用起来,之后再考虑性能问题,是不是要移到并行文件系统上面去,等等。

总之,在规定的 Sprint 之内,我们一定要做出一个完整的版本。无论是客户端工程师还是服务器端工程师,他们的工作质量都是很容易判断的。

InfoQ:两个团队的交付周期是一样的吗?

蒋炜航:交付周期都是一样的,我们的节奏是一个月,也就是每个月都会有新版本出来,只不过有些不对外发布。

我负责这个业务,具体来说我并不关心客户端团队是不是在满负荷工作,或者服务器端团队是不是在满负荷工作,我关心的是我们在这个周期内,产品经理想要展现给用户的价值是否高质量的完成了,是否能给用户提供一个高质量的版本,这是最重要的。

InfoQ:两个团队的代码提交方式、代码 review 机制、测试机制是怎样的?

蒋炜航:我们内部用 SVN 提交代码,每个项目提交到各自的 repo 里面。代码审查是结对 review 的方式。

测试方面,主要由工程师自己写单元测试,交到自动化测试系统里去跑。我们有强制的测试覆盖率的要求。当然,服务器端和客户端跑的测试是不一样的,服务器端需要做更多的压力测试,而客户端在自动测试外还要做很多功能测试。

InfoQ:在监控和反馈机制方面,两个团队又分别是如何去做的?

蒋炜航:服务器端主要是服务器健康状态的监控。客户端有我们自己写的 crash report 机制,还有一套自己的 BI 系统,用于收集业务方面的指标。

整个产品的日志跟功能是一样重要的,一起开发、测试。有健康的日志系统,才能了解用户的使用情况。这套日志系统检测的指标有几百项,其中一些比较重要的指标包括日活跃用户量、各个功能的使用率、用户满意度等等。其中用户满意度是关键指标,也就是 NPS(net promoter score),我们所有的产品中都有这个分数,这个分数体现了用户对产品的喜爱度。

InfoQ:客户端团队相当于是底层团队的客户,这两个团队之间是如何进行沟通的?

蒋炜航:一个一个 sprint 来走。我们每个 sprint 先开客户端的会议,事先跟 server 端沟通好,要做什么功能,可能有哪些接口,之后就是非常自主的形式了。比如客户端安排要做功能 A,server 端做接口 A,那么这两边的人就会自己去沟通,讨论 API 该如何设计,协议如何做。

敏捷小组的特性就是自发性,我们没有规定谁是谁的客户,或者谁 lead 谁。我们就是设定了目标,分配任务到每个组,之后任何人都能驱动。比如很常见的,客户端说某个接口做的不对,会跟 server 端一起去改接口,不会说客户端不管 API 的设计,给什么用什么,大家肯定是一起来设计的。因为我们的工程师是 full stack,所以这点是比较自然的。

另外,我们的产品、测试、运营也都跟研发团队是坐在一起的,这几个团队之间的沟通都很多。我自己现在是 60% 在产品上,20% 盯研发进度,20% 在运营和市场上。

2014-01-26 08:082634

评论

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

【论文速读】| 越狱:大语言模型安全训练是如何失败的?

云起无垠

【京东云新品发布月刊】2024年3月产品动态

京东科技开发者

独立站如何做好移动端的优化处理呢?

技术冰糖葫芦

API 接口

咸鱼翻身啦!咸鱼之王完美内购版架设教程

echeverra

咸鱼之王

2024 BOE(京东方)全球供应商合作伙伴大会举行 开启全球显示产业融合共生新篇章

爱极客侠

2024陕西省等级保护测评机构一览表【新】

行云管家

等保 等保测评

火山引擎VeDI:A/B测试开放平台正式上线,企业个性化平台一键定制

字节跳动数据平台

大数据 A/B测试 企业号 3 月 PK 榜 对比试验 数字化增长

XPath攻略:从入门到精通,告别查找困难!

测试人

软件测试

MappedByteBuffer VS FileChannel:从内核层面对比两者的性能差异

bin的技术小屋

jdk Linux Kenel FileChannel mmap内存映射

IPQ9574 vs. IPQ8074: A comparison and selection guide between the two chips

wifi6-yiyi

IPQ8074 ipq9574

java线程池原理浅析

京东科技开发者

百度智能云千帆,产业创新新引擎

百度Geek说

AI 百度智能云 千帆大模型平台

AI能代替软件工程师吗?

小魏写代码

京东商品列表数据接口

tbapi

京东 京东API接口 京东商品列表数据接口

solana链土狗抢单机器人

区块链技术

2024南京国际自动驾驶技术展览会

AIOTE智博会

自动驾驶展 智能驾驶展

BOE(京东方)国内首条第8.6代AMOLED生产线奠基 推动中国OLED显示产业再飞跃

爱极客侠

IO模型介绍(select、poll、epoll)

京东科技开发者

Python数据库编程全指南SQLite和MySQL实践

华为云开发者联盟

Python MySQL 开发 华为云 华为云开发者联盟

大型IM工程重构实践:企业微信Android端的重构之路

JackJiang

即时通讯;IM;网络编程

火山引擎发布ByteHouse性能白皮书,揭秘OLAP性能突破的关键技术

字节跳动数据平台

数据库 大数据 云原生 数仓 企业号 3 月 PK 榜

网络空间测绘系统的商业应用

郑州埃文科技

网络空间测绘技术

《自动机理论、语言和计算导论》阅读笔记:p49-p67

codists

编译原理

2024运维堡垒机品牌排名看这里!

行云管家

运维 堡垒机 IT运维 运维堡垒机 网咯安全

"线程池中线程异常后:销毁还是复用?"

京东科技开发者

探索全栈工程师团队的开发协作模式_QCon_sai_InfoQ精选文章