A/B测试:实现方法【转】

我们先来看一个图:

A/B testing 部署概念图

上图展示了 A/B 测试的实现原理。从左到右,四条较粗的竖线代表了 A/B 测试中的四个关键角色:客户端(Client)、服务器(Server)、数据层(Data)、数据仓库(Data Warehouse)。从上到下代表了三种访问形式:无 A/B 测试的普通访问流程(Non AB test)、基于后端的 A/B 测试访问流程(Back-end AB test)、基于前端的 A/B 测试访问流程(Front-end AB test)。

一般情况下,用户在一次浏览中,会从客户端(Client)发起一个请求,这个请求被传到了服务器(Server),服务器的后台程序根据计 算,得出要给用户返回什么内容(Data),同时向数据仓库(Data Warehouse)添加一条打点信息,记录本次访问的相关信息。这个过程也就是图上横向的流程。数据仓库收集到足够的数据之后,就可以开始进行分析 (Analytics)了,这也即是图中右上角的部分。

A/B 测试需要将多个不同的版本展现给不同的用户,即需要一个“分流”的环节。从上图中我们可以看到,分流可以在客户端做,也可以在服务器端做。传统的 A/B 测试一般是在服务端分流的,即基于后端的 A/B 测试(Back-end AB test),当用户的请求到达服务器时,服务器根据一定的规则,给不同的用户返回不同的版本,同时记录数据的工作也在服务端完成。

基于后端的 A/B 测试技术实现上稍微简单一些,不过缺点是需要技术部工程资源介入,另外收集到的数据通常是比较宏观的PV(Page View)信息,虽然可以进行比较复杂的宏观行为分析,但要想知道用户在某个版本的页面上的具体行为往往就无能为力了。

基于前端的 A/B 测试则可以解决上面的问题。它的特点是,利用前端 JavaScript 方法,在客户端进行分流,同时,可以用 JavaScript 记录下用户的鼠标行为(甚至键盘行为,如果需要的话),直接发送到对应的打点服务器记录。这样的好处是不需要技术部(如果你们和我们一样,前端工程师与后 端工程师分属不同部门的话)参与,并且可以比较精确地记录下用户在页面上的每一个行为,甚至包括后端方法难以记录到的无效点击!

下面,我将重点介绍一下我们在基于前端的 A/B 测试上的一些实践。

一、分流

首先遇到的问题是如何分流的问题。对于大部分需求来说,我们希望各个版本的访问人数平均分配。解决办法有很多种,比较简单的一种即是前面提到过 的,根据某一个 Cookie ID 来划分用户,前提是你的网站上每一位访客在第一次访问时就要有一个不重复的 Cookie ID,比如“123.180.140.*.1267882109577.3”。然后,可以根据这个 Cookie ID 的最后一位(在本例中是“3”)来划分人群,比如单数的显示 A 版本,偶数的显示 B 版本。

因为 Cookie ID 一般设定后不会轻易改变,基于 Cookie ID 的好处是我们能很好地对访客保持一致性,某个用户如果第一次看到的是 A 版本,那他刷新后看到的还是 A 版本,不会一会儿看到 A 版本一会儿看到 B 版本。但不足之处就是如果用户浏览器不支持 Cookie 的话,分流就不能正常进行了。不过,现代浏览器默认情况下都是支持 Cookie 的,如果真有用户的浏览器不支持 Cookie ,那也应该是极少数特殊情况,对结果的影响非常微小,对于这些特殊情况,我们一般可以安全地忽略掉。

还有一点需要注意的是,A/B 测试的页面必须有较高的 UV (Unique Visitor,独立访客数),因为分流带有一定的随机性,如果页面 UV 太小,分到每一个版本的人数就更少,结果很有可能被一些偶然因素影响。而 UV 较大时,根据大数定理,我们得到的结果会接近于真实数据。就像想知道一个地方的成年人的平均身高,当然是取的样本越大结论越可信。

二、展示

决定向当前访问者显示哪个版本后,怎么用前端的方法加载对应的版本呢?这需要分情况处理。

一般情况下,如果两个版本只有一个较小的区域不一样,我们可以同时将两个区域的 HTML 都加载到当前页面中,先用 CSS 把它们隐藏起来(也可以默认显示一个版本),等 JS 判断出该显示哪个版本后,再控制对应版本的 CSS 显示。

有时候,测试区域比较大,代码比较多,或者需要后台较多的计算资源,如果一开始就把两个版本的 HTML 全加载到当前页面中,就会需要比较大的开销(比如带宽、后台计算量)。这种情况下,我们可以先把测试区留空,之后再用 Ajax 的方式延迟加载。

还有的时候,测试区域非常大,几乎占了整个页面,或者完全就是不同的页面,这时,用 Ajax 方式加载也不适合了,可以将不同的版本做成不同的页面,然后再用 JS 跳转。不过这样的方式并不是很好,因为前端 JS 跳转需要一定的时间,这个过程很有可能被用户感受到,并且留下不好的体验。对这个问题,似乎没有很好的解决办法,至少在前端层面很难完美解决,所以并不是 非常推荐这种跳转方式,如果真的需要跳转,最好是在服务器端由后端代码来操作。

三、数据采集

正确展示对应的版本后,就要开始采集需要的数据了。有一个可选的数据,是当前版本有多少 PV (Page Views,访问量),如果需要记录这个数据的话,在正确版本加载完成之时就要发送一个打点信息。不过很多需求中,具体版本的 PV 的精确数值可能不是很重要,而且要收集这个信息需要多一次打点操作,所以一般情况下这个数据是可选的。

必须的数据是测试区域内用户的点击信息。当用户在测试区域点击了鼠标左键(无论这个点击是点击在链接、文字、图片还是空白处),我们就需要发送一条对应的打点信息到打点服务器。一般来说,这个打点信息至少需要包含以下数据:

当前 A/B 测试以及版本标识
点击事件的位置
点击时间戳(客户端时间)
当前点中的URL(如果点在非超链接区域,此项为空)
用户标识(比如 Cookie ID)
用户浏览器信息

为了尽可能精确地还原用户的点击位置,我们的页面对前端有比较高的要求,要求页面在不同的浏览器下有基本一致的表现,至少在IE6、7、8以及 Fiefox 下,页面横向的元素要精确一致,纵向上很难做到完全一致,但也要尽可能保持统一。另外,这样的测试也不太适合自适应宽度的页面,比较适合定宽的页面,为了避免不同分辨率下页面左右空白不同导致鼠标点击位置的不同,点击位置取的应该是相对于测试区域左上角的位置。除此之外,最好再记录一下测试区域相对于页面内容左上角的位置,在后面还原点击分布图以及绘制热区图时会用到这个数据。

这一阶段的流程大致如下图所示:

A/B 测试打点生命周期

数据打点该如何发送以及如何存储呢?这要取决于你的打点服务器如何存储信息。

四、数据存储

我们使用了一台专用的服务器收集打点信息,为了能支持尽可多尽可能密集的打点请求,这台服务器的 apache 服务网站目录下只有两个静态文件,分别是 abtest.html 和 abtest.gif ,两者都是非常小的空白文件(空白图片)。访客端进行打点时,只需要以 GET 的方式带上相关的参数请求两个文件中的任意一个即可。比如:

http://abtest.xxx.com/abtest.gif?abid=1-a&clickBlockX=244&clickBlockY=372&clickBlockW=392&clickBlockH=76&clickTime=1263264082137&clickRX=233&clickRY=47&clickURL=&clickBeaconID=123.180.140.*.1267882109577.3&browserType=FireFox

这个请求可以通过 Ajax 的方式发送,也可以通过 JS 在页面上创建 new Image() 对象的方式完成。

对打点服务器来说,这只是一条普通的 HTTP 请求,它会在日志里留下一条普通的日志记录,形如:

123.180.140.* – - [13/Jan/2010:15:21:15 +0800] “GET /abtest.gif?a=123&b=456&c=789 HTTP/1.1″ 304 – “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.6 (KHTML, like Gecko) Chrome/4.0.266.0 Safari/532.6″

可以看到了,除了 JS 发送给我们的信息外,Apache 还帮我们记录了一些信息,比如访客 IP 、服务器时间、用户浏览器信息。

对于数据记录和存储来说,到这一步就足够了。Apache 静态文件 + 日志的方式足够高效,基本不用担心性能的问题。剩下的,就是另外一个问题,如何从 Apache 日志中读取打点信息并加以分析,这已经和前端无关了,并且是一个比较复杂的问题,将在后续日志中介绍。

 

平台的本质与盛大的若干思考

Facebook为什么会对Google造成冲击?Facebook的理念是建立一个以facebook为中心的平台,希望用户长久的留在以Facebook为中心的局域网,而google的成功是依托于整个互联网的海量信息,如用户寻找信息不依赖于海量中小站点,也等同于google是无用的。

淘宝屏蔽百度 就像Facebook屏蔽google一样,让用户最终购物入口变成淘宝网,而非百度的搜索框;消费类网站的用户粘性不大,购物以后,即刻离开,海量的淘宝用户如新浪的用户一样,说走就走。淘宝为了沉淀用户关系,建立了淘江湖,打通了朋友之间的Feed,建立卖家之间的relation,也为以后的精准营销做了准备.新浪也是如此,借助新浪微博,沉淀用户关系。使得用户对网站的粘性越来越强。新浪微博是和twitter不一样的一个产品形态,在本土化的基础上把转播和评论分开,添加了很多sns的特性,粘性比twitter要强的多。

盛大的产业结构,和淘宝、新浪有明显的区别;盛大的用户总量非常多,然而分配在每个应用的用户量并不多。盛大优秀的产品,用户粘性都比较大。盛大主要依靠现有产品中的用户来创造价值,如用户从现有产品出来,去其他应用,这对盛大其实是有害的,如果完全牺牲盛大现有产品的收益,回收落地至一个平台(糖果类)这和做平台的理念是不合的。

做平台的真实意图,并不是卖(导)用户给其他应用,举例QQ这个平台为例说明:QQ本身需要优质的内容;腾讯之所以给第3方应用导流量。是因为自己消化不了;用户的需求逐渐刚性,腾讯需要这些新内容和新场景来满足用户;腾讯本来并没有消费流量,这些给应用带去的流量是新生流量,并未触及腾讯的既得利益,相当于无本经营;当然腾讯也不可能给具有平台潜质的应用导流量,比如gmail,twitter,新浪微博等应用,这些应用本身具有挑战QQ平台的潜质,或是说给这样应用导流量,相当于导用户,对QQ是有害的。

盛大依赖于多个产品(游戏,文学)来挣钱,每个产品本身对用户都有很强的粘性,也就无法利用淘宝的思路和新浪的思路(建立一个SNS社区来沉淀用户)来运作平台。另外一个原因是盛大的产品线用户群体(年龄、社交需求)与新浪和淘宝的用户有很大的不同,盛大的用户群体的年龄偏小、集中在对娱乐产品感兴趣的年轻人,对虚拟关系的刚性需求比真实关系的刚性需求更大,因此在产品形态上面不能以Facebook为模型。

QQ、Facebook、手机等 这几个平台都是掌握了用户的关系网络,使用户离开不了。这里QQ和Facebook的虚拟关系刚性需求满足的比较好,特别适合中国人扎堆、闲聊、kill time及不善于表达的天性。虚拟关系的刚性需求可理解成 在这些平台和现实社会中一样可以认识新朋友,建立新的关系,使得关系像滚雪球一样更多的在这些平台落地。其中QQ和手机并不支持逆向搜索功能,如不能直接在QQ和手机里面搜索我高中一个名叫“张三”的同学的号码或是QQ。QQ的发展是依托于匿名交友先建立虚拟关系,然后慢慢沉淀真实关系。Facebook是完全依托真实关系,后续建立虚拟关系,最终QQ/Facebook都是真实的社交的一个缩影,即可满足真实关系交流、又可满足认识新朋友的需求。

——————————————————————————————–

 

hard模式+_+

觉得有意思,就转了.

当年投胎选了hard模式,结果生在中国,还好没选very hard,不然生在朝鲜了…

↓ 神一样的回复们 ↓

选择professional模式,更杯具。生在了阿富汗和伊拉克

Hell模式:埃塞俄比亚,苏丹,刚果,扎伊尔

easy模式大概是在北欧那片吧~normol应该是美日欧

hell模式真情提示:请先完成very hard再尝试

选择hard模式下次投胎有机会获得heaven模式。

从玩家数量来看,还是玩hard的多啊~

也不一定啊,人家选了Hard模式,加外挂,加加速,神装比那些选择easy模式的裸装备不知道好玩儿多少倍呢

我卡在买房那关了,兄弟们有秘籍没啊~~~

ls你输入作弊码my father is ligang了没?

事实证明,选了hard模式玩着玩着可以切换到normal模式

这游戏表面上是免费的,实际上忒烧钱了
多投点RMB就可以买好装备还可以改模式
如:投资移民去米国什么的,可降低游戏难度

敢情我这辈子是加错技能树了?…这个版本练我这个专业真是特么一杯具

淡定的选择——随机,出生赠送两百金

选HELL模式直接被“计划生育”了

弱弱的问一句,你们玩的是什么游戏?(淫才)

哥打怪升级二十载,至今买不起坐骑啊!!!!!!!!!!!!!!

其实要是有忍耐力还可以等大资料片,一种是换新运营商,一种是旧运营商自己整改了。

少数富二代都有飞行坐骑了啊!!!!!!!!

hard模式,人民币玩家一样玩的很爽!我们这些普通玩家就是陪他们玩的。

求hard模式掉落物品表!

求带过副本!听说zf大楼里面boss怪的掉宝特别好!

我加错点了,学的生产技能在这个服赚不到G啊!!!!!!

23级自由职业求入工会(镰刀锤子党优先)
另外有消息称2012年将关服维护,请各位提前做好下线准备

技能和天赋也是仁者见人,但是“加入少先队”“加入共青团”“加入党”三项被动技能,优先升满,不解释。

至于加属性点,要根据情况而定,但是基本上不用加精神,狂加生命就行,自然抗性中的毒抗性要注意,一定要至少加到75。

请问这是什么游戏?(又一个淫才)

据说2012年更换服务器,说不定可以模式重选呐

有谁组队刷怪的!!! ZF大楼进去直接被秒啊!!!

有谁组团下城管副本的???
满级神装进组

刚鸡巴练到20来级就要停服了

GM什么时候上线,我想投诉,bug太多了

听说投诉的人会被强制返回出生点,有的还被关黑监狱了

我是小号,求包养,有时装就跟,有坐骑和花园,顶级装备着优先

真搞笑,这么多人都信服务器扫档的事情。2012病毒就是一个概念操作,让你们这些平头小白玩家有个念想。其实你们过个三年还得苦逼地做日常,让那些爹是管理员的都笑坏了。人家刷钱,一头坐骑300w没人管,压人压完再捅没人抓。不行人家转到美服欧服,人家有钱,你呢?你怎么广播里刷了一句“太王八蛋了”就给转入躲猫猫、喝凉水模式了?哈哈哈。

 

国内的开放平台就是一个玩笑

晚上煮了点面条,手艺越来越差,难以下咽,于是就在微博写写骂骂的,还不过瘾,就瞎写一番.此文有辱斯文,品德高尚者走开.

国内的开放平台就是一个玩笑

openplatform

国外的几个平台 Facebook\apple\android\google都获得很大的成功,于是乎国内的互联网大鳄也开始布局,我们先来看看几点基本的不同吧。

国内建站,大部分都是基于discuz + phpwind+dedecms这几个流派
难怪几家巨头开始布局都是这么个玩法,腾讯收购discuz,盛大收购phpcms,阿里收购phpwind,dedecms没有去研究,估计也花落谁家了.
你说一个国家的互联网以垃圾站林立,毫无创新概念,连国家都提倡在淘宝开网店就TMD当创业了,这这能有啥前途.
收购垃圾站和开放平台可能鸟关系没有,我觉得有很大的关系.
国内都这么个玩法有1点是可以肯定的,开源事业在国内真的很悲剧.
开源者为啥悲剧呢,开发者不愿意分享呗,看到好的开源软件改改用用呗,然后包装一下卖钱呗,不愿意拿出来的呗,喜欢忽悠人呗.
整个国民都如此的浮躁,你能指望程序员,这个中国最累的职业,那些互联网大公司都是劳动密集型的,程序员能有闲功夫出来写程序玩,这不是意淫吗?

何为劳动密集型,就是比如某某公司看见 另外一家小企业有个好点子,立马动员抄袭,程序员天天加班.这TMD能去搞开源,自己累的半死不说,
稍微聪明点的程序员,比如像老周(360)的,关心用户体验,也去整个IE插件出来,开始挣钱了.

这个国度 没有版权,都是拿来主义,注定不会有开源事业,有点开源的事业也是畸形的,比如discuz。
这个国度 没有创新 没有高科技企业,全是劳动密集型企业,注定不会有闲的蛋疼的程序员,都TMD的加班,要么在加班的路上…..
稍微有点想法的程序员也跑到美帝国主义去了,为啥,因为这个国度就没有一个靠谱的互联网开放平台企业.
某公司千亿市值,主营抄袭,拿来主义.某伟大的搜索引擎公司,以敲诈式营销的方式获取广告利润,某客户端公司以恐吓的方式要求用户XXOO,
比较好看的一点就是,中国这些互联网企业,和中国人一样,就压根没有协同合作的精神.

国内这些企业我还真不相信,不相信一个喜欢内斗的民族企业会干点分享的事情

国内的开放平台又会具有中国式特色,进一步将中国互联网推向骗取用户点击,更加垃圾站为主的大环境中。
它会是一种什么情况呢?
国内的开放平台最终会变成企业与企业的渠道合作,或是大企业和小站长的渠道合作.占据互联网的浏览器终端窗口.
在这种情况下,反倒是那些真正做产品的公司,估计会有所成长…
平台与平台之争在国内,又是人海战术与人海战术的比拼,水军……..
高科技、技术神马都是浮云.
唯一的机会就是政府出面把这些平台企业墙掉,你丫的又可以出来整个中国特色出来了,哈哈。

 

分享会-高性能nosql数据库redis

分享会没有讲好,没有很多使用经验,没有办法分享故事,不过redis是个好东西.希望大家多尝试一下….

 
 
About This Website

Lamp development & SEO & Plan of Website & Project Managment

Learn more »
Follow Us (SNS)
Help & Support

more about Bruce.xu»

Get in touch

QQ: +252339382
Email: shjuto @ gmail.com

Online contact form »