写点什么

TeamToy2 的开发故事:面向移动的 API 设计,代码重用,快速迭代

2013 年 3 月 04 日

2013 年的元旦后,一个名叫 TeamToy 的项目再次进入了人们的视野。跟 BaseCamp、TeamBox、Asana 等服务类似,TeamToy 是一个面向团队的 Todo 类产品,目的在于促进团队沟通、提升协同做事的效率。

TeamToy 项目的启动在 2008 年前后。早期的 TeamToy 在产品设计层面走过很多弯路,也积累了很多经验。TeamToy 的作者陈理捷专门为此写过一篇产品备忘录,透露了很多 TeamToy 产品诞生与发展的故事。对于 TeamToy 项目本身,2013 年是个极大的转折点:

  1. 整体架构进行了重写,重写后的项目发布为 TeamToy2。
  2. 有了一个靓丽的产品主页,不仅分别提供了自架设版本的源码下载和新浪云商店版本的一键安装入口,而且还加入了大量产品介绍和 FAQs 等说明。
  3. 整个项目的代码转移到了 GitHub 上,从代码本身到整个开发流程,都彻底开源。
  4. 版本迭代速度较之前大大加快,采用了“小步快跑”的模式。
  5. 专门针对智能手机发布了移动版本: TeamToyPocket ,并且也完全开源。

目前,TeamToy2 仍处于快速更新、完善产品的阶段,用户基数也在不断增长。其移动版本 TeamToyPocket 刚刚在昨天宣布开源,为此,InfoQ 中文站联系到了TeamToy 的作者陈理捷,请他谈谈整个TeamToy2 开发中的一些想法和经验,以及移动版本的选型、整个项目开源这一决策的考量。

陈理捷( @Easy ),80 后,宅,重度萌物控。现任新浪云平台产品主管,负责过 SAE、新浪移动云、新浪云商店、微盘等产品。个人博客:《方糖气球》。

InfoQ:从 TeamToy v1 到 v2,整体进行了重写。做出这个决定,都考虑到哪些因素?

Easy:

最主要的是考虑到移动端的强烈需求,这要求提供客户端可用的 API,Web 页面需要进行自适应设计,而 TeamToy V1 写于 08 年,并没有面向 API 设计,使用的一些周边库也比较陈旧。另外就是产品设计上,TeamToy v1 更多的是去追求功能,而 V2 更多的是希望简捷,整个前端界面的风格都需要重做。

考虑这些因素后,我觉得重写的成本虽然不低,但更利于项目的长期发展。实际上在重写过程中,我还顺便把它所用的框架 LazyPHP 升级到 3,换上了 JQuery、Bootstrap 等主流的前端库和框架,最后节省了大量的时间。

InfoQ:在重写 TeamToy 的过程中,有没有哪些地方觉得自己跟写第一版的时候相比的处理更好,或者眼界更高的情况?

Easy:

重写开始时我就定下了几个规矩,这是之前在第一个版本上后悔莫及的:(1) 完全面向 API 设计,即使是 Web 版,也调用标准 API 接口实现。(2)坚持写单元测试,这样在项目中后期,上线新功能后才能监测对原有功能是否有影响。(3)让项目支持一键升级,这样才能将 BUG 的危害降到最低。

第一点保证了系统的扩展性,收获了不少的第三方插件;第二和第三则保证了项目的快速迭代,现在从一个 bug 修复到用户代码更新通常只需要 1~2 个小时,这点让 TeamToy 更具竞争力。

其实写第二版时,我并没有比第一版聪明多少,但血泪教训让我保持了更好的习惯,所以开发起来轻松了很多。

InfoQ:从 TeamToy v2 发布以来,开发的迭代速度很快(Github 上的 commit 频率从 1 月开始就很高)。目前在这个项目上的时间规划是如何安排的?

Easy:

因为 TeamToy 主要是用业余时间来开发,所以我在功能上一直坚持“小步快跑”和“需求拉动”的原则。可能你已经注意到了,TeamToy2 直接使用 reversion 当版本号,即使 3~5 行的代码的一个更新,也会作为一个版本发布出来。一方面这样产品的质量会更高,另一方面也更容易获得成就感,Bug 这种东西,即使是很小的几个,清理掉以后会感觉世界都变美好了。在需求管理上,我一般是只有用户多次遇到的小需求才会慢慢迭代进去,而大块的需求一般会考虑很久,最后放到长假时去做 (T__T)

InfoQ:TeamToy Pocket 选用了 PhoneGap 进行打包。在做这个选型时,都考虑过哪些因素,PhoneGap 的优势在哪里?

Easy:

选择用 PhoneGap 进行打包,最主要还是因为采用 HTML5 技术可以重用大量的代码;比如在 TeamToyPocket 的 TODO 页面,TODO 的样式和事件绑定的 JS 其实重用了 Web 版的。当然也有其他的打包工具,但显然 PhoneGap 是其中发展最快的一个,实际上借助 PhoneGap,TeamToyPocket 不但可以支持 Android 和 iOS 平台,新的 Tizen 平台、甚至 Mac 桌面都是支持的。对于一个以跨平台为卖点的客户端来讲,这是非常重要的。

InfoQ:移动版的开发有没有遇到什么难点?如何解决的?

Easy:

最开始使用了 JQueryMobile 做框架,但实测时发现整体表现相当差,于是后来我自己重写了一个简单的框架,主要思想是通过 div 切换来避免 ajax 载入,实际使用起来流畅度好了不少。

另外因为 PhoneGap 实际上是使用移动设备默认的浏览器内核,所以要处理各种兼容性问题。比如 Android2.3 和 4.1 以后对 touch 事件不同处理方式。

不过整体上来讲,采用 HTML5 开发还是很自由的,可以很容易的实现自己想要的效果。

InfoQ:对于开源,有些人觉得是一种文化信仰,有些人觉得就是一种开发协作的模式。你如何定义开源?你认为开源对 TeamToy 这个项目最大的好处是什么?

Easy:

开源对我来讲,更多的是一种推动我们积累知识向前进步的方式。

为什么这么说呢?现在的很多协作是基于开放平台的,Facebook 和新浪微博上有很多的应用,让我们的工作和生活都更加方便了。但如果 Facebook 倒闭了呢?如果新浪微博把你的 APPKey 收回了呢?我们就瞬间回到了原始时代,而第三方在这些平台上花费的精力就完全报废了。

但 TeamToy 不一样,因为通过开源,我释放了控制权,使得任何人都可以自行架设它。只要你能找到服务器,你就能继续你已经习惯了的高效工作环境。不会因为开发商的问题而无法继续;而你为 TeamToy 贡献的所有插件,都会成为整个 TeamToy 用户群的财富。

这就是开源对 TeamToy 的意义,它保证了这个项目不会退步,保证了用户得到的不会失去。

2013 年 3 月 04 日 23:076229

评论

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

Week5

丿淡忘

技术选型(上)

eazonshaw

极客大学架构师训练营

总结-05-缓存

梦子说

学习

第五周总结

changtai

极客大学架构师训练营

第五周作业 - 命题作业

molly

极客大学架构师训练营

架构师训练营第五周课后作业

竹森先生

极客大学 极客大学架构师训练营

第5周总结

ruettiger

架构师训练营(第 5 周作业)

李德政

极客大学架构师训练营

一致性hash算法-java

jason

技术选型 一

_MISSYOURLOVE

极客大学架构师训练营

架构师训练营第五周-总结

人世间

极客大学架构师训练营

架构师训练营 - 第五周作业

teslə

Week 05学习总结

Jeremy

架构师训练营 - 第五周总结

teslə

架构师训练营 week5 - 学习总结

devfan

vue3.0 全局API的变化

志学Python

Vue Vue3

一致性hash算法

WW

架构师训练营Week5命题作业

小高

架构技术选型一(总结)

小叶

极客大学架构师训练营

一致性Hash实现

olderwei

极客大学架构师训练营

Week 004 总结

徐培

极客大学架构师训练营第五周学习总结

竹森先生

【架构师训练营 - week5 -1】作业

早睡早起

科技为翼,让普惠金融拂过烟火人间

脑极体

架构师训练营第五周总结

Geek_2dfa9a

产学研结合打牢技术基础为“数字云南”建设赋能

CECBC区块链专委会

Week5-作业

龙7

Week 5 作业

Jeremy

Week 004 作业

徐培

第5周作业

架构师训练营 -Week 05 学习总结

华乐彬

学习 极客大学架构师训练营

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

TeamToy2的开发故事:面向移动的API设计,代码重用,快速迭代-InfoQ