【CTO讲堂】揭秘高效协作工具背后的技术架构

如何做到基于Web的跨平台设计?实时消息系统的设计是怎样的?Worktile的整个技术架构是什么样的,都用到了哪些技术?本文是Worktile联合创始人兼CTO李会军在CSDN打造的CTO讲堂的干货分享整理。

以下是12月4日CTO讲堂现场完整速记:

CSND:讲堂开始欢迎今天嘉宾Worktile联合创始人兼CTO李会军,李总给大家做自我介绍

李会军:大家好,我是Worktile的李会军,目前负责Worktile产品和研发方面的工作。

在2011年的时候我离开了当时的飞信团队,开始人生第一次创业,可惜那一次只坚持了8个月的时间就面临着产品失败,人员解散。在2013年初,又开始了第二次创业,所做的产品就是现在的Worktile。

CSDN:您决定开始Worktile的创业是看到了什么发展机遇么?最初的想法是怎样的?

李会军:第一次创业时我们做一款个性化资讯阅读方面的产品,当时我们团队只有10个人左右,但是我们也需要团队成员之间互相协作的工具,于是我们自己利用开源项目自己搭建了团队内部的Wiki,买了台服务作为公司的文件共享服务器等等,但是维护这些开源项目和服务器,也花去了我们团队不少的时间。

第二次创业时,我们自然而然的就想解决中小团队成员之间协作的问题,于是选了Worktile作为方向,简单的说,Worktile想解决的是中小团队成员之间的沟通、效率问题,我们希望把Worktile打造成成邮件一样简单,让大家在日常工作中能够随时使用的产品,这就是我们当时做Worktile的初衷。

CSDN:目前Worktile的情况以及技术团队构成是怎样的呢?

李会军:目前已经有超过15万家中小团队在Worktile上进行协作,主要的行业有互联网行业、律师咨询团队、电商团队、广告行业以及制造行业等等。现在的版本为免费版,并且会保持永久免费,我们会在今年年底的时候推出企业版本,走出商业化尝试的第一步。

现在Worktile团队的构成主要是研发人员,占到公司总人数的70%左右,只有很少市场运营方面的人员,其中研发人员中前端和服务端的比例基本为1:1。

CSDN:简单介绍下Worktile目前提供的产品和服务吧。

李会军:现在Worktile提供的是全免费版本,主要包括任务管理、日程安排、文件共享以及在线文档协作,同时在这些基础功能上,根据用户的使用数据,自动生成项目级别和团队级别的统计报表,我们称之为简报。

而另一款产品纷云主要解决团队成员之间的沟通以及和外部第三方服务的整合,你可以把微信公众号中用户的发言、或者微博等等,各种外部服务中的消息都汇总到纷云,目前已经支持120多家服务。

在年底推出的Worktile企业版中,我们会在免费版的基础功能上进一步整合协作、沟通这两大块功能。

CSDN:可否从具体产品适用场景或者客户案例方面来阐述一下使用Worktile的便捷流程。

李会军:Worktile目前提供的功能都是非常通用的,跟电子邮件一样,并没有针对某个特定垂直行业的工作场景。如律师团队可以在Worktile上跟进某一个诉讼案件的流程,研发团队可以使用Worktile进行产品的研发流程管理,电商团队可以使用Worktile进行团队内部各个小组之间的协作。

同时我们也针对不同的行业提供了相应的案例解决方案,关于电商团队具体使用场景可以参考我们整理的:https://worktile.com/can/ecommerce。

CSDN:Worktile的产品有什么独特之处?国内外市面上是否有同类型的服务公司?

李会军:Worktile之所以得到用户认可,很大程度上取决于产品的品质,第一,以前的企业级产品首先关注的是老板的使用体验,而Worktile首先关注的是员工的使用体验,因为产品的使用主体是员工,如果员工不愿意使用,在团队内部很难推广。

第二,很多企业级产品重销售和推广而轻产品,Worktile把重心放在了产品体验上,如任务的看板式视图,拖拽操作,页面实时更新等,只有当产品的体验非常好的时候,才有可能在用户之间形成口碑传播,事实上目前Worktile很少做广告,绝大部分用户都来自于老用户的推荐。

在国内外与Worktile一样的公司有好多家,如Basecamp算是项目管理领域的鼻祖,Trello专注于看板式任务管理,Asana专注于任务管理,推崇取代电子邮件的工作方式,国内也有几家同类型的公司,总之大家各有优势。

CSDN:Worktile的整个技术架构是怎样的?

李会军:Worktile的整个技术架构上首先是SPA,单页应用程序,这对于Worktile这样的产品来说是最重要的一点,避免用户在不同页面间的跳转,最终我们选用了Google 出品的AngularJs作为SPA的实现技术。

另一个重点在于消息推送,当页面显示的数据有变化时,实时更新页面的显示,如团队中一个成员完成了某个任务,需要在其他成员那边也实时显示为任务已完成,为了达到这种效果,需要在Web客户端和服务器之间维持一个长连接,当有任何改变发生时,给客户端发送不同的消息,告知客户端哪些数据发生了变化。

我用一幅图给大家解释一下Worktile的整体架构:

这几部分我分别解释一下:

  • 1)API服务,包括Web API、Mobile API、Open API,这些都运行于NodeJS之上,选用NodeJS的原因主要是它的异步事件驱动,对于高并发的支持比较好,另外一个原因是使用简单,对于前后端可以使用同一门语言去开发。
  • 2)缓存和队列服务,Worktile中的缓存和队列服务都是基于Redis来实现,Redis是一款非常优秀的开源缓存服务,并且可以选择基于内存还是进行数据持久化,它提供的pub/sub模型对于Worktile来说非常重要,对于一些实时性要求不高的处理,我们都是在Redis中pub一条消息,告知其他服务有数据发生了变化,那些服务在接收到Redis中的消息后,根据消息的类型决定应该如何做出处理。
  • 3)数据库服务,Worktile产品本身的特点决定了它是一个对实时性和性能的要求,远超过对事务性要求的产品,所以在选择数据库时,我们选用了MongoDB数据库,性能高,集群方便,数据以BSON结构存储,和Node.js天生完美结合。
  • 4)文件预览服务,使用Worktile的同学肯定知道在Worktile中所有的文件都可以做到无需下载到本地,而直接在线查看,这一切都是预览服务的功劳,因为文件类型的各种各样,在实现文件预览时也要根据文件的类型做出不同的处理,针对txt、pdf、代码片段等文本型的文件,我们只需要读取文件中的内容,然后在前端用相应的视图展现出来即可,相对比较简单。但是对于Office类型的文件,如ppt、doc、xls等文件,就不能这么简单的处理,我们希望文件在Worktile中查看的效果和用户在本地使用Word、Excel、PowerPoint查看的效果差不多,经过我们的调研,最终选用了微软官方提供的Office Web App服务。

CSDN:可否分享一下在技术方面Worktile都做了哪些探索,用到了什么技术?

李会军:从一开始我们就确定了几个原则,作为团队协作工具,从技术上分析首先要解决如下几个问题:

  • 1) 基于Web的跨平台设计,让用户在任何地方都可以随时通过浏览器访问
  • 2) Web形态的产品要具有原生客户端的体验,如任务的拖拽等
  • 3) 具有高效的实时消息系统,每个团队成员在Worktile中所做的任何操作,都要实时在其他成员的客户端中自动刷新
  • 4) 服务要稳定,稳定压倒一切

在选择使用AngularJS之前,我们首先考虑使用大名鼎鼎的Backbone.js,但是很快又抛弃了,因为在实际使用中Backbone.js太复杂,另一方面开发效率太低。而最终选择AngularJS主要基于如下几点:

  • 1)自动化双向数据绑定功能,这一点在Worktile中非常重要,如任务的状态变化都要实时变更到其他成员,如果具有自动化双向数据绑定功能,只需要绑定到UI的数据源发生变化,UI会自动发生改变,不需要工程师再通过代码去修改UI元素的改变。
  • 2)模块化设计,AngularJS堪称模块化设计方面的典范,通过模块化设计我们可以非常好的实现Worktile的工程化,在Worktile中涉及的元素非常多,如有项目、任务、日程、文件、话题、文档等等,而这每一个元素都可以设计为一个模块。
  • 3)语义化标签,AngularJS在设计之初信奉的理念就是:当编写UI的同时又需要编写业务逻辑时,声明式的代码远比命令式代码要好,命令式的代码更适合写业务逻辑,AngularJS在设计上就通过语义化的标签把对DOM元素的操作和逻辑代码分离。
  • 4)引入依赖注入,依赖注入是面向对象中比较成熟的设计模式之一,为了解决面向对象中依赖问题,得到了广泛的应用,AngularJS中大胆使用了依赖注入,极大的减少了各个模块之间的耦合问题。

CSDN:请介绍下实时消息系统的设计。

李会军:前面已经说过,实时消息系统是Worktile整个架构中最重要的两个体系之一,我们想解决的问题很简单就是让页面数据能够实时更新,基于这个需求有如下几个选择:

  • 1) 短轮询,页面端通过js定时异步刷新,这种方式优点在于实现简单,但实时效果较差。
  • 2) 长轮询。页面端通过js异步请求服务端,服务端在接收到请求后,如果该次请求没有数据,则挂起这次请求,直到有数据到达或时间片(服务端设定)到,则返回本次请求,客户端接着下一次请求,这种方式对于服务的要求较高,尤其在并发量很大的情况下,对服务端的压力很大。
  • 3) Websocket。浏览器通过websocket协议连接服务端,实现了浏览器和服务器端的全双工通信。需要服务端和浏览器都支持websocket协议。

在Worktile一开始我们选用了Socket.IO作为消息服务,但是随着访问量的增大,需要做集群化的时候感觉到力不从心,尤其对于Socket.IO状态数据的存储,由于并没有官方的解决方案,当时我们采用了一个第三方的开源项目,使用Redis来存储,引起了一些性能上的问题,在后来重构时选用了基于Erlang语言的开源XMPP服务ejabberd作为我们的实时消息服务。

简单介绍一下ejabberd,ejabberd是xmpp协议的一种实现, xmpp广泛应用于即时通信领域。Xmpp协议的实现有很多种,比如java的openfire,但相较其他实现,ejabberd的并发性能无疑使最优秀的。Xmpp协议的前身是jabber协议,早期的jabber协议主要包括在线状态(presence)、好友花名册(roster)、IQ(Info/Query)几个部分。现在jabber已经成为rfc的官方标准,如rfc2799, rfc4622, rfc6121,以及xmpp的扩展协议(xep)。Worktile就是基于XEP-0124、XEP-0206定义的BOSH扩展协议。

由于自身业务的需要,我们对ejabberd的用户认证和好友列表模块的源码进行修改,通过redis保存用户的在线状态,而不是mnesia和mysql。另外好友这块我们是从已有的数据库中(mongodb)中获取Worktile中项目或团队的成员。Web端通过strophe.js来连接(http-bind),strophe.js可以以长轮询和websocket两种方式来连接,由于ejabberd还没有好的websocket的实现,就采用了BOSH的方式模拟长连接。

CSDN:怎么使得Web形态的产品要具有原生客户端的体验?可否举例详细谈谈。

李会军:Web形态的产品具有原生客户端的体验,在前面讲技术架构的时候已经聊过,要做好这点需要解决两个问题:第一是实时消息推送,任何数据的变化都需要及时变更到团队所有成员当前所在的视图,如一个典型的任务看板,团队所有成员可能同时在操作当前项目中的任务,每个操作引起看板的变化都会实时更新,不需要用户做任何刷新操作,下面这幅图就是一个典型的任务看板:

第二是操作体验,比如拖拽在以前只有原生客户端才能实现的体验,现在在Web产品上也可以实现的非常好,Worktile中有大量的使用拖拽的场景,如给任务分配成员、任务从一个阶段进入到另一个阶段等等。

CSDN:您怎么看国内外团队协作产品的发展? 如何才能让团队运作更有效率?

李会军:团队协作产品在Worktile开始做的时候,这个市场国内相对还比较冷门,到了今年的时候已经到了火爆的程度,尤其是Slack的出现,进一步把这个市场推向了高潮,所以大家都把2015年称之为企业服务元年。

总体来说,团队协作产品目前在国内还是一个百花齐放的态势,没有一家独大,产品之间的差异化不是特别明显,随着这个市场进一步的成熟,谁能最好的解决协作中的:效率、沟通、存储、共享等几个要素,就能够首先破局。

而国外的市场相对比较成熟一些,Slack偏重在团队沟通和信息聚合方面,Basecamp、Asana、Trello都偏重于项目管理方面。

CSDN:看到您曾经连续4届是“微软MVP”,还著有技术畅销书《Silverlight 2 完美征程》,请结合这些年您自己在技术之路上的积累,谈谈技术人该如何做到高效学习和提升技能?

李会军:首先我认为是打好基础,练好内功,在技术这个行业中基础决定了将来的高度。编程语言只是一种工具,在具体工作中使用哪种语言或者框架只是个选择问题,也许跟公司的技术负责人的背景有关,也许跟某个语言的特点有关,总之这个是在变化的,比如我自己在很多年前还是微软的MVP,而现在已经彻底拥抱开源世界。但是不管选择什么,不变的是数据结构、算法、底层的一些机制等等,打好扎实的基础能够让你事半功倍。

其次,互相借鉴,互相学习,多跟圈子里的大牛们学习,研究学习优秀的开源项目,在几年前我研究过几个优秀开源项目的源代码,这段经历对我影响很大。

第三,读书,读经典的书,现在市场上技术类的书籍鱼龙混杂,各种速成类书籍层出不群,如二十一天精通某某某等,这类书应该敬而远之,多读一些经典的书籍,后面我会推荐一些书籍给大家。

CSDN:请结合您的切身体会谈谈一名合格的CTO或技术团队管理者应该是怎样的?

李会军:在我看来,作为一名合格的技术CTO,要做好如下几件事情:第一,对研发团队负责,CTO更多的是管理和规划工作,具体的架构设计也许有首席架构师等人负责,但是把架构师、前端工程师、服务端工程师以及产品经理、设计师等不同角色的成员管理好,让不同角色之间互相协调配合,达到效率最大化是第一要务;

第二,对公司负责,从公司长远的发展规划团队的技术选型,以及人员组成,产品上线时间越久,团队越大,后期再改变技术方案的成本就会越高。同时CTO还要从公司角度考虑研发团队的人员组成,人才阶梯计划,关注团队成员的成长。

第三,对产品管理负责,在我们团队中CTO同时还要负责产品管理,所以规划产品的版本,迭代的频率,产品上线质量等事情都需要CTO去负责。

CSDN:对想在技术路线上走得更远的人,您都有什么建议和忠告?推荐一些您觉得非常不错的资料或者书籍吧。

李会军:建议其实在谈技术人该如何做到高效学习和提升技能的问题时已经说过了,我还是给大家推荐几本对我影响比较大的经典技术书籍吧:

  • 《UNIX网络编程》
  • 《UNIX环境高级编程》
  • 《UNIX编程艺术》
  • 《程序设计语言 : 实践之路》
  • 《深入理解计算机系统》
  • 《用TCP/IP进行网际互联》
  • 《深度探索C++对象模型》

互动环节:worktile作为一个协作工具,对于需求端到端的交付流程,里面有严格的步骤要求;还是可以用户自定义,有没有指导流程,这个流程的开源是什么?另外,worktile是否提供第三方的接口,用于与其他应用的交互?
李会军:这个流程用户是可以自定义的,你可以根据自己团队的实际情况,自行定义。Worktile现在已经提供OpenAPI,可以与外部服务进行集成。具体可以参考:http://open.worktile.com。

互动环节:其实我最好奇的是,worktile公司会招聘刚毕业的大学生吗?如果招的话,输出方向是怎么样的呢?
李会军:其实我们团队有很多都是刚毕业的大学生,研发、运营方面都有,如果对在Worktile工作感兴趣的话,可以加我微信,我们进一步联系。

互动环节:请问一下用户隐私方面是怎么处理的,譬如数据加密。
李会军:关于用户隐私和数据安全其实一直是SAAS类产品推广最大的难点,目前免费版中只对一些关键敏感数据进行了加密,而在企业版中,我们会进一步加强数据安全和用户隐私方面的考虑。对用户上传的文件等所有数据都进行加密处理。

互动环节:worklite有多个端的产品,不知道是怎么保证多端的开发的?有没有哪些需要特别注意的地方?
李会军:多端开发其实也没有什么特别的地方,我们团队采取的策略是,对于一个新的功能点首先在Web端推出,进行用户测试,如果测试通过,其它端再跟进。如果测试不通过,最终砍掉了这个功能,其他端根本不需要做什么。
问:可能没问清楚,多端开发成本是比较高的,现在是统一嵌h5还是分平台开发?基于什么考虑?感谢。
李会军:我们目前是各平台开发的,没有采用嵌入H5的技术方案,主要还是基于用户体验的考虑,用H5实现的话有一些体验还是不能达到最好。

互动环节:请问下worktile 和 tower 这样的产品有什么 相同和不同点呢?
李会军:tower和worktile算是同类型的产品,在功能上彼此差不多,Worktile免费版的优势在于任务看板视图,而tower则主要是todo-list的方式管理任务。至于Worktile企业版,因为现在还在内测,没有推出,所以暂时不方面透露太多和tower的相同和不同:)

互动环节:您说您研究开源代码, 我也在做同样的事。 但是想请教一下 您有一个比较好的项目列表;还有是怎么研究的, 代码光看也不行啊。
李会军:比如Redis的源代码,我认为写的非常优秀,其实不仅仅是看源代码,通过源代码理解他们在写这些开源项目时所做的思考,里面蕴含的思想等等。

互动环节:老师我之前用过websocket做他人登录自己账号提示的推送 可是当页面刷新或者后退前进的话链接就会断掉再重新连  咱们这个系统是怎么控制多人用同一账号同时登录的。
李会军:多人用同一个帐号,在Worktile中并不需要做特别的控制,基于ejabberd每个客户端跟服务的连接都是一个唯一的标识,不太明白你想解决什么问题。
问:就是想问当我在线的时候突然别人用我的账号登陆了 会有什么提示?
李会军:目前Worktile是允许一个通过帐户同时在多个地方登录的,并没有限制,只是提供了每一次的登录时间、登录地点和IP供用户查询。

互动环节:Worktile等同类的这些SaaS服务,盈利模式是怎样的呢?不太好理解 :-)目前国内SaaS领域一片红海,有很多的资本跟进,未来会怎样的发展趋势?
李会军:企业SaaS类服务,在国外已经相当成熟,如salesforce、slack等,盈利模式无非就几种:免费功能+增值服务,或者是完全收费,免费体验一段时间。相比较而言,ToB类服务反而比ToC类的更好实现商业一些,我们在年底即将推出的企业版也是走出商业化的考虑。

互动环节:tob的推广会是一个大问题,你们在推广方面有哪些挑战?采取了哪些方案呢?
李会军:在推广方面,主要还是要解决用户的启动问题,因为ToB类服务不像Toc,企业用户选择相对比较理性,会有一个决策的过程,所以ToB类产品只看用户绝对数增长是毫无意义的,用户是否真正在使用这个产品更加重要,我们在推广上目前更多的是维护好老用户,保证产品品质,通过老用户的口碑传播。

互动环节:企业版主要是一些哪方面的改变
李会军:关于Worktile企业版目前还在内测中,只能说体验比免费版的棒,功能比免费版强大,更多细节现在不方面透露,如果感兴趣的话,在开始测试时,邀请你来参与测试。
问:好的,多谢。我们使用worktile已经挺长时间了,但是随着团队扩大,内部的系统也越来越多,如果互相之间不能整合就非常麻烦,所以在选型方面更倾向于开放的系统,期望worktile在这方面能够加强。
李会军:不管是免费版还是企业版,在和外部系统整合上,我们会保持一如既往的开放。

互动环节:李总您好,面向企业的版本会在哪些方面加强?使用什么策略吸引企业付费呢?会是从现有用户中转换一批吗?
李会军:企业版目前还在内测中,只能说体验比免费版的棒,功能比免费版强大,在协作和沟通两个方面都有很大提升,如果现在免费版用户想使用企业版,可以无缝的迁移到企业版中。
问:会强制升级吗?
李会军:不会,免费版和企业版会同时存在。

互动环节:国内的公司(有钱的公司 )普遍存在的是管理水平较为低下,管理团队成员素质不高的问题。而新兴的互联网公司毕竟有钱的不太多,多数互联网公司虽然多,但是没钱:)。您觉得toB方向是不是还存在一个适应期的问题呢?
李会军:这个适应期确实是存在的,只不过这种情况在逐渐好转,尤其到了2015年的时候,在几年前,大家没法想象公司内部会使用第三方的办公平台,而现在越来越多的团队已经选择SaaS这种更方面简单的服务。所以这个适应期存在,但不会太长。

互动环节:tower我用过,里面有个跟微信绑定,在任务到期未完成的时候进行微信提醒的功能还不错,不知道贵公司目前做没做,没做的话到是可以考虑。
李会军:这个Worktile里面也是支持的,当任务快过期或者日程开始时,如果绑定了微信,可以在微信上收到消息。

互动环节:看到你们后端采用的node技术,该技术目前是不是还不够成熟。因为没听到哪家大公司在用。
李会军:其实也不会,近几年来发展最快的技术我认为就是node了,现在也有很多大公司在使用,但由于很多公司产品历史上遗留下来的问题,要做技术转型是一件很痛苦的事情。国外的Trello用的就是nodeJS。