Google一年工作感受(4)

其它几篇的链接:

Google一年工作感受(1) Google一年工作感受(2) Google一年工作感受(3)

上一篇我们吐槽了工作内容中的测试,这次我们来聊聊发布

工作内容

发布

不同组的发布流程不一样,不同产品的发布流程也不一样。比如服务器端的发布肯定比app端的发布周期短,因为我们拥有服务器的控制权,想什么时候做什么操作都是由我们说了算。而手机的话并不由我们掌控,用户可能处于关机状态,可能网络状态不连通,可能电池电量低,等等原因都可以导致手机端的更新速度不会有想象的快。同时相应的反馈也不会那么快地得到,比如这次更新有什么性能提升,失败率的变化,用户数据等等各种metrics。说了这些乱七八糟地,只是想说明,这部分内容不同组之间可能差别很大,这篇文章只是根据我我所在的组的观察体验所呈的一面之词。

特性开关

任何一个特性的发布不能随随便便就提交或者发布,毕竟现有系统非常复杂,任何一个微小的改变都有可能带来意想不到的后果。因此,所有改动必须要用一个特性开关来保护,默认是关闭的。类似这样子:

1
2
3
4
5
if (some_feature_is_enabled) {
// do something new
} else {
// do something old
}

这样子就算代码发布了,它也不会被马上执行。这个特性开关的步骤是不局限于安卓开发的,就算是服务器开发,也会用到。对于我们来说的不同之处在于,我们的apk发布后,并不是所有用户立刻都会更新的,因此我们需要等3-4周的时间才能开始改变开关的值进而进行测试。据说3-4周还是这几年来流程优化的结果,之前一个特性开发完毕到用户真正看到区别的周期可能长达半年以上。如果是这样的话,就算出了问题,当时开发这个特性的工程师说不定都已经忘了他做的是什么了。难以想象在国内小步迭代快速开发的环境下,如果每个特性的发布都要半年,产品经理不得疯了?

当然,特性开关不止是布尔类型的,还可以支持int,string等。因为有些特性,比如说修改某个缓存的ttl,开发者希望可以自定义任何值去做实验,从而决定最优。

实验

至于以上这个开关的值是定义在哪里的,然后如何更新它,这就需要依赖于我们的实验系统了。这个值当然不能只存在apk里,不然的话改它还得再发布一个apk。实验系统是一个云端的服务,这个开关既在apk里存了一个默认值(关闭),在云端也存有一份。云端的那一份,我们通过实验系统可以修改。手机端会从实验系统里爬取这个开关的值,如果没有的话就用apk里定义的默认值,如果有的话就覆盖。

当然,这个实验系统还负责做canary test(并不是所有用户取的开关值都是一样的)。我们在实验系统中可以定义一些阶段,每个阶段受众的数量是不一样的。这样子,可以通过这个实验系统逐步发布你所开发的新特性,避免引起巨大的影响。一旦发现某些指标不健康了,可以马上回退实验。只需要在实验系统中操作一下就可以,不需要额外发布新的apk,这一点还是非常棒的。

监控

在实验中,我们如何决定要不要进入下一阶段呢?我们的监控系统就入场了。关于监控的工具,谷歌真是做的太完善了,全方位的都有,我真是数不过来了。在这一年多的工作中,跟监控相关的内部网站就用过不止十几个,而且我相信一定还有更多我没有用过的。有针对整个系统的监控,也有针对实验的监控,稍微讲讲后者的原理。

对于每个实验,系统会自动分配一个实验id。对于实验中的不同阶段,实验id都是不一样的。当手机端尝试获取某个开关的值时,这个实验id也会同时被传到手机端。之后所有手机端产生的日志上传到日志服务器时都会带上这个实验id。由于同时可能有成百上千个实验在进行(毕竟安卓是个很大的组),用户上传日志时带上的实验id是一个很长的list。然后日志系统收到这些日志之后,就会根据不同的实验id分流,去不同的地方处理。当我们打开一个监控网站想要看看某个实验的效果时,输入相应的实验id,就会得到各种数据,比如请求次数,请求时间,内存使用情况,crash数量,电池使用时间,等等。这些metrics就可以作为指导我们决定需不需要进行实验下一步的指标。

用的比较多的监控工具是不同组共享的,有很多比较general的指标,你还可以根据自己组的业务特性定义自己的指标。定义之后,在这些监控工具的网站上就可以看到了。有些日志跟组的业务特性是相关性很高,因此常用的监控工具并不能很好的处理他们。所以有的时候我们还需要自己从头创建一个监控工具,搭建data pipeline:从指标定义数据采集数据分流, 数据存储数据分析数据展示都可以自己去完成。公司也提供了很多更底层的工具(相比而言,监控算是比较high level的工具吧)帮我们完成这一整个流程。比如用什么工具上传、 用什么工具分流、 用什么工具分析、 用什么工具展示。针对所有的步骤,公司内部都有相应的工具去做,非常方便。当然开源界也有很多类似的东西,理念都是一样的。

总结

这波“连载”终于写完了。其实还有很多可以说道说道的,有机会继续吧。到时候就不再以“Google一年工作感受”为题了,随便写点东西。