周日拿同事的卡去听了上午场和下午的互联网产品研发改进之路。其中上午前两场:领域驱动设计(Domain Driven Design)和Ceylon语言,和我们关系不大。着重说说“Twitter性能优化原则”和“互联网产品研发”的感受。由于是回去后根据记忆写就,想到哪写到哪,某些细节可能跟现场有出入。 来自Twitter的总工程师和架构师、Ruby牛人Evan Weaver分享了Twitter在性能优化方面的经验。Twitter从最初一个小规模的应用快速流行,用户规模呈指数级增长,网站吞吐量也相应地不断增加,然而其硬件规模的增长幅度要缓慢得多。Evan指出,Twitter系统吞吐能力的提升不是通过添加更多的硬件来达成,而是靠性能优化来实现。有以下几条性能优化原则: 1.Just do less. 做得越少越好。 当然这不是教人偷懒,而是非常明智的tradeoff原则。这不仅适用于性能优化,也适用于产品演进。在面临众多候选的产品特性时,拒绝大而全的诱惑,将精力聚焦于那些关键的功能特性上,做到少而精。Twitter自始至终坚持140字的短消息,没有扩展到1000字、10000字用于写长篇博客,用户关系是简单的follow和被follow的关系,没有扩展成SNS那种复杂的关系。Twitter的成功也说明了这条原则的正确性。 2.Focus on memory. 关注内存的使用。 由于Twitter所有计算的开销都不大,而包括对象分配、Cache等都要占据内存,因此内存成了关键资源,Twitter的很多努力都花在内存的使用上。Twitter的技术方案是基于Ruby on Rails,关于Ruby的GC,Evan讲了很多,Twitter内部自己实现了一个Ruby的垃圾收集器(Garbage Collector),名叫kiji好像。其垃圾收集算法跟Java的类似,不过似乎比Java的简单,堆内存分为Longlife Heap和Eden Heap,Longlife Heap相当于Java的Old Generation或Permanent Generation,Eden Heap相当于Java的Young Generation中的Eden Space。 3.Let code make informed decision. 让代码去做假定。 关于这一点,我的理解是让代码在访问数据之前对各种可能的情况先做假设,而不是等到所有数据收集齐备再做决定,这样能够更快得做出响应,进而提高吞吐量。 4.Explicitly access bulk data. 以明确地、批量方式访问数据。 除了这几条原则,Evan讲了Ruby垃圾收集器和Twitter的数据存储层。GC刚才已经提了,数据存储用的是MySql,分为4块:Twitt按照id分区;索引按照user分区;Cache采用memcached;还有timeline pool(这个没搞明白)。这4个部分是通过Rails框架来进行衔接的,看来Ruby on Rails还是满强大地。 ——————————————————————– 来自淘宝的芷薰讲述了互联网产品发展过程中的问题和应对策略。芷薰是过程改进专家,关于过程改进,我们尚没有这种职位,似乎淘宝(阿里)有一个很大的部门在做这项工作。感觉这些内容都是我们似曾相识,和我们的工作息息相关的。 关于如何保持团队的持续创新问题,淘宝的办法是让团队感受到使命感和危机感。淘宝产品相关的数据,如PV、活跃用户数、交易金额、社会价值等,让每个员工每天都能够很容易地见到,而且淘宝在一开始就在全公司推行一种以业务(business)为中心的思考问题的方式。 在产品研发进化方面,芷薰分享了淘宝的10条策略,分别应用于3个不同阶段,由于信息量比较大,我记不太清了,有些理解得不是很透彻,根据印象简单记一下: 产品初期 (在某个产品线的一开始,是没有产品、研发、运营等职能区分的,所有成员都在一个开发团队中工作) 策略一:采用Scrum快速迭代。 策略二:包容原则——缺陷容忍和一票否决。不要求零BUG,某个版本哪怕还有很多BUG没解决,由所有团队成员共同评审,只要评审通过就可以上线;只要有一个人对某个BUG提出反对意见,就取消上线。 (随着产品演化和团队规模扩大,会从开发团队中抽调人员组成产品团队和运营团队,团队保持10人规模,如果超过10人则继续拆分) 策略三:资源协调。随着产品需求不断增加,要开发这些功能,会造成对各种资源的争用。因此每月会召开资源PK会,各个项目经理PM对要实现的功能需求及资源占用进行PK,确定优先级。 产品发展期 策略四:自动构建、持续集成。虽然自动构建越早越好,但是根据经验,在产品初期,很多东西面临快速变化,一开始就推行自动构建,则团队成员修改压力非常大,效果不理想。所以到了一个相对稳定的阶段再推行自动构建、持续集成。 策略五:培养项目经理PM。在产品快速发展阶段,团队规模膨胀,一个产品经理要和N个开发团队打交道,沟通成本非常高。因此培养一批项目经理来分担沟通协调职责。 [...]
最新评论