快生活 - 生活常识大全

以互联网思维做好客户端软件


  加入爱奇艺的时间不长,但我感受到的震撼却不小。在外企打拼了十几个春秋,今年终于有机会进入一家国内顶尖的互联网企业,真真切切地有一番不太一样的体验。不过,我今天并不想说在外企工作与国内企业的差别。目前,我负责"爱奇艺PPS影音"PC客户端软件的研发。也许有人会有疑问:怎么还在做PC软件?大家不都一窝蜂似的转去做移动开发了吗?然而,大家要明白的是,虽然PC行业已经风光不再,但PC饱有的体量仍然是巨大的,并且PC自有其不可替代的价值;PC软件还要继续做,今天我想说一说的是,怎样以互联网思维来做好客户端软件。
  说起互联网,大家自然便会想起网站。(顺便提一下,爱奇艺就是以网站起家的;现如今,爱奇艺的服务已经覆盖包括PC、MAC、手机、平板、电视、机顶盒等各种终端。)想必大家也知道网站与客户端软件各有优劣吧,比如:网站可以运行在任何设备的浏览器上,不需要用户安装,也不麻烦用户升级,能在各个终端保持统一的用户体验;而相比之下,原生的客户端软件运行得更快,并且能够充分利用本地资源为用户带来更加强劲、炫目的功能。(推荐阅读Jeff Atwood的一篇博文:App会取代网站吗?)我们的客户端软件是用C++写的,性能自然不必多说。而我们公司的互联网基因,也促使我们把网站的众多优点融合进了客户端软件。
  先说说研发流程吧。互联网行业最大的特点就是变化快。我们求新,必须快速迭代,快速试错。网站采用的是这种开发模式,我们的客户端软件开发也可以。我们采用了Scrum敏捷开发流程——两周一次迭代,每两周发布一个版本。我们称之为"小步快跑"——把大功能拆小,分阶段实现,追求微创新。比较一下传统的软件开发模式:先制定一份详尽冗长的PRD,然后是动辄1~3个月(甚至半年)的开发周期,再加上一个较长的稳定期来修复足够多的bug,等到发布产品的时候,市场环境早就不一样了……互联网环境容不得如此慢的节奏!
  上面说到了快速试错。那么,怎么试呢?又怎么知道我们是对还是错呢?这就要依赖数据啦!网站有它的先天优势,可以很方便地收集到这些数据:用户在网站上停留了多久,点了什么网页,在网页上点了什么按钮,用户使用的是什么浏览器,同时有多少人在线,访问的峰值出现在什么时间段,等等。我们在客户端里也加入了类似的投递代码。我们还有强大的数据统计和分析团队的支持,让我们对客户端软件性能以及用户行为了如指掌。我们很容易就能知道客户端软件的启动耗时、崩溃率、用户在我们客户端里看了哪些视频、播放是不是有卡顿等信息。在我们尝试做了一个新功能、但又不确定用户是否会喜欢的时候,我们也可以通过一个小渠道发布这个版本,然后在后台观察各种统计数据,以此来帮助我们决定是否应该继续开发这个功能,或者在后续迭代里需要在哪些方面做改进。
  我们每两周对外发布一个版本。我们也深知,发出去的版本就像泼出去的水,也是我们未来必须背负的包袱。时间一长,客户端版本碎片化,几千万用户手上的版本多达几十种。我们固然可以通过软件自带的升级机制把最新版本的客户端送到用户手上,但出于种种原因,新版本能够做到高于90%的覆盖已经不错了,而这个数字绝对达不到100%。然而,网站却能做到。网站添加了新功能之后,一旦部署,顷刻之间就能被全世界的所有用户使用上。问题是,我们怎么在客户端里获得像网页那样的灵活性呢?我们的做法是,对于性能要求不高并且可能会频繁调整的部分,用HTML/JavaScript来实现,并在客户端里用内嵌浏览器打开这些网页;而对于性能要求高的部分,坚决采用我们强大的C++皮肤库来把网页本地化。一个很好的例子就是爱奇艺影视大全(http://v.iqiyi.com),在与网站保持协同的基础上,我们让它在客户端里表现出了更为卓越的性能。
  在功能实现方面,我们时刻保持着一种意识:尽量不把业务逻辑在客户端里写死。否则的话,一旦业务逻辑有变,我们必须修改客户端的代码,然后再做全网升级,一来周期比较长,二来新版本也做不到100%的覆盖,结果就比较被动了。举一个VIP会员相关的例子吧。在客户端,我们有针对当前登录用户的类型来做不同会员套餐促销的需求,具体的业务逻辑是:如果当前是普通会员,则跳到白银套餐的购买页面(url1);如果当前是白银会员,则跳黄金套餐页面(url2);如果当前是黄金会员,则跳铂金套餐页面(url3)。一些经验欠缺的开发人员会把上述逻辑直接实现在客户端软件里,就像下图中左边所示的那样。遗憾的是,一旦VIP会员套餐的促销逻辑有变,比如,要改成对所有用户都推销铂金套餐,那就惨了!更灵活的实现方式应该像下图中右边那样,客户端只是调用一个相对固定的url(并带上必要的参数),而把具体的业务逻辑实现在服务器端。
网站目录投稿:香天