香蕉在线观看I亚洲第一中文网I日韩免费成人avI亚洲国产999I色综合久久久久久久I特级西西444www高清大视频I一区二区网I亚洲免费在线I亚洲午夜久久久久久久久久久I日韩在线观看小视频I中文字幕日韩avI亚洲综合黄色

基于前端的 A/B 測(cè)試上的實(shí)踐問(wèn)題

2012/3/26 14:43:11   閱讀:2639    發(fā)布者:2639

基于前端的 A/B 測(cè)試則可以解決上面的問(wèn)題。它的特點(diǎn)是,利用前端 JavaScript 方法,在客戶端進(jìn)行分流,同時(shí),可以用 JavaScript 記錄下用戶的鼠標(biāo)行為(甚至鍵盤行為,如果需要的話),直接發(fā)送到對(duì)應(yīng)的打點(diǎn)服務(wù)器記錄。這樣的好處是不需要技術(shù)部(如果你們和我們一樣,前端工程師與后端工程師分屬不同部門的話)參與,并且可以比較精確地記錄下用戶在頁(yè)面上的每一個(gè)行為,甚至包括后端方法難以記錄到的無(wú)效點(diǎn)擊!

下面,我將重點(diǎn)介紹一下我們?cè)诨谇岸说?A/B 測(cè)試上的一些實(shí)踐。

一、分流

首先遇到的問(wèn)題是如何分流的問(wèn)題。對(duì)于大部分需求來(lái)說(shuō),我們希望各個(gè)版本的訪問(wèn)人數(shù)平均分配。解決辦法有很多種,比較簡(jiǎn)單的一種即是前面提到過(guò)的,根據(jù)某一個(gè) Cookie ID 來(lái)劃分用戶,前提是你的網(wǎng)站上每一位訪客在第一次訪問(wèn)時(shí)就要有一個(gè)不重復(fù)的 Cookie ID,比如“123.180.140.*.1267882109577.3”。然后,可以根據(jù)這個(gè) Cookie ID 的最后一位(在本例中是“3”)來(lái)劃分人群,比如單數(shù)的顯示 A 版本,偶數(shù)的顯示 B 版本。

因?yàn)?Cookie ID 一般設(shè)定后不會(huì)輕易改變,基于 Cookie ID 的好處是我們能很好地對(duì)訪客保持一致性,某個(gè)用戶如果第一次看到的是 A 版本,那他刷新后看到的還是 A 版本,不會(huì)一會(huì)兒看到 A 版本一會(huì)兒看到 B 版本。但不足之處就是如果用戶瀏覽器不支持 Cookie 的話,分流就不能正常進(jìn)行了。不過(guò),現(xiàn)代瀏覽器默認(rèn)情況下都是支持 Cookie 的,如果真有用戶的瀏覽器不支持 Cookie ,那也應(yīng)該是極少數(shù)特殊情況,對(duì)結(jié)果的影響非常微小,對(duì)于這些特殊情況,我們一般可以安全地忽略掉。

還有一點(diǎn)需要注意的是,A/B 測(cè)試的頁(yè)面必須有較高的 UV (Unique Visitor,獨(dú)立訪客數(shù)),因?yàn)榉至鲙в幸欢ǖ碾S機(jī)性,如果頁(yè)面 UV 太小,分到每一個(gè)版本的人數(shù)就更少,結(jié)果很有可能被一些偶然因素影響。而 UV 較大時(shí),根據(jù)大數(shù)定理,我們得到的結(jié)果會(huì)接近于真實(shí)數(shù)據(jù)。就像想知道一個(gè)地方的成年人的平均身高,當(dāng)然是取的樣本越大結(jié)論越可信。

二、展示

決定向當(dāng)前訪問(wèn)者顯示哪個(gè)版本后,怎么用前端的方法加載對(duì)應(yīng)的版本呢?這需要分情況處理。

一般情況下,如果兩個(gè)版本只有一個(gè)較小的區(qū)域不一樣,我們可以同時(shí)將兩個(gè)區(qū)域的 HTML 都加載到當(dāng)前頁(yè)面中,先用 CSS 把它們隱藏起來(lái)(也可以默認(rèn)顯示一個(gè)版本),等 JS 判斷出該顯示哪個(gè)版本后,再控制對(duì)應(yīng)版本的 CSS 顯示。

有時(shí)候,測(cè)試區(qū)域比較大,代碼比較多,或者需要后臺(tái)較多的計(jì)算資源,如果一開始就把兩個(gè)版本的 HTML 全加載到當(dāng)前頁(yè)面中,就會(huì)需要比較大的開銷(比如帶寬、后臺(tái)計(jì)算量)。這種情況下,我們可以先把測(cè)試區(qū)留空,之后再用 Ajax 的方式延遲加載。

還有的時(shí)候,測(cè)試區(qū)域非常大,幾乎占了整個(gè)頁(yè)面,或者完全就是不同的頁(yè)面,這時(shí),用 Ajax 方式加載也不適合了,可以將不同的版本做成不同的頁(yè)面,然后再用 JS 跳轉(zhuǎn)。不過(guò)這樣的方式并不是很好,因?yàn)榍岸?JS 跳轉(zhuǎn)需要一定的時(shí)間,這個(gè)過(guò)程很有可能被用戶感受到,并且留下不好的體驗(yàn)。對(duì)這個(gè)問(wèn)題,似乎沒有很好的解決辦法,至少在前端層面很難完美解決,所以并不是非常推薦這種跳轉(zhuǎn)方式,如果真的需要跳轉(zhuǎn),最好是在服務(wù)器端由后端代碼來(lái)操作。

三、數(shù)據(jù)采集

正確展示對(duì)應(yīng)的版本后,就要開始采集需要的數(shù)據(jù)了。有一個(gè)可選的數(shù)據(jù),是當(dāng)前版本有多少 PV (Page Views,訪問(wèn)量),如果需要記錄這個(gè)數(shù)據(jù)的話,在正確版本加載完成之時(shí)就要發(fā)送一個(gè)打點(diǎn)信息。不過(guò)很多需求中,具體版本的 PV 的精確數(shù)值可能不是很重要,而且要收集這個(gè)信息需要多一次打點(diǎn)操作,所以一般情況下這個(gè)數(shù)據(jù)是可選的。

必須的數(shù)據(jù)是測(cè)試區(qū)域內(nèi)用戶的點(diǎn)擊信息。當(dāng)用戶在測(cè)試區(qū)域點(diǎn)擊了鼠標(biāo)左鍵(無(wú)論這個(gè)點(diǎn)擊是點(diǎn)擊在鏈接、文字、圖片還是空白處),我們就需要發(fā)送一條對(duì)應(yīng)的打點(diǎn)信息到打點(diǎn)服務(wù)器。一般來(lái)說(shuō),這個(gè)打點(diǎn)信息至少需要包含以下數(shù)據(jù):

當(dāng)前 A/B 測(cè)試以及版本標(biāo)識(shí)

點(diǎn)擊事件的位置

點(diǎn)擊時(shí)間戳(客戶端時(shí)間)

當(dāng)前點(diǎn)中的URL(如果點(diǎn)在非超鏈接區(qū)域,此項(xiàng)為空)

用戶標(biāo)識(shí)(比如 Cookie ID)

用戶瀏覽器信息

為了盡可能精確地還原用戶的點(diǎn)擊位置,我們的頁(yè)面對(duì)前端有比較高的要求,要求頁(yè)面在不同的瀏覽器下有基本一致的表現(xiàn),至少在IE6、7、8以及 Fiefox 下,頁(yè)面橫向的元素要精確一致,縱向上很難做到完全一致,但也要盡可能保持統(tǒng)一。另外,這樣的測(cè)試也不太適合自適應(yīng)寬度的頁(yè)面,比較適合定寬的頁(yè)面,為了避免不同分辨率下頁(yè)面左右空白不同導(dǎo)致鼠標(biāo)點(diǎn)擊位置的不同,點(diǎn)擊位置取的應(yīng)該是相對(duì)于測(cè)試區(qū)域左上角的位置。除此之外,最好再記錄一下測(cè)試區(qū)域相對(duì)于頁(yè)面內(nèi)容左上角的位置,在后面還原點(diǎn)擊分布圖以及繪制熱區(qū)圖時(shí)會(huì)用到這個(gè)數(shù)據(jù)。

四、數(shù)據(jù)存儲(chǔ)

我們使用了一臺(tái)專用的服務(wù)器收集打點(diǎn)信息,為了能支持盡可多盡可能密集的打點(diǎn)請(qǐng)求,這臺(tái)服務(wù)器的 apache 服務(wù)網(wǎng)站目錄下只有兩個(gè)靜態(tài)文件,分別是 abtest.html 和 abtest.gif ,兩者都是非常小的空白文件(空白圖片)。訪客端進(jìn)行打點(diǎn)時(shí),只需要以 GET 的方式帶上相關(guān)的參數(shù)請(qǐng)求兩個(gè)文件中的任意一個(gè)即可。比如:http://yanet22.blog.163.com/
這個(gè)請(qǐng)求可以通過(guò) Ajax 的方式發(fā)送,也可以通過(guò) JS 在頁(yè)面上創(chuàng)建 new Image() 對(duì)象的方式完成。

對(duì)打點(diǎn)服務(wù)器來(lái)說(shuō),這只是一條普通的 HTTP 請(qǐng)求,它會(huì)在日志里留下一條普通的日志記錄,形如:

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 發(fā)送給我們的信息外,Apache 還幫我們記錄了一些信息,比如訪客 IP 、服務(wù)器時(shí)間、用戶瀏覽器信息。

對(duì)于數(shù)據(jù)記錄和存儲(chǔ)來(lái)說(shuō),到這一步就足夠了。Apache 靜態(tài)文件 + 日志的方式足夠高效,基本不用擔(dān)心性能的問(wèn)題。剩下的,就是另外一個(gè)問(wèn)題,如何從 Apache 日志中讀取打點(diǎn)信息并加以分析,這已經(jīng)和前端無(wú)關(guān)了,并且是一個(gè)比較復(fù)雜的問(wèn)題,將在后續(xù)日志中介紹。

主站蜘蛛池模板: 中文字幕息子101在线 | 99精品久久精品一区二区 | 日本在线黄色 | 国产区精品福利在线社区 | 日本www网站色情乱码 | 久久视频这里有精品33 | 日韩丰满少妇无吗视频激情内射 | 综合久久激情 | 中文字幕色图 | 国产熟睡乱子伦视频观看软件 | 在线观看超碰 | 亚洲无限观看 | 九九精品免费视频 | 变态 另类 国产 亚洲 | 99精品视频在线在线观看视频 | 性生活一区 | 秋霞av无码观看一区二区三区 | 99超碰在线观看 | 国产又色又爽无遮挡免费动态图 | 欧美专区综合 | 另类小说激情 | 久久精品一区二区三区中文字幕 | 精品国产乱码久久久软件使用方法 | 久久艹影院 | 国产精品乱码人妻一区二区三区 | 99久久国产自偷自偷免费一区 | 无码av中文出轨人妻 | 无码精品人妻一区二区三区av | 日韩精品www | 国产毛1卡2卡3卡4卡免费观看 | 国产乱妇乱子视频在播放 | 亚洲第一网站免费视频 | 狠狠色丁香五月综合缴情婷婷五月 | 欧美精品一区三区 | 精品久久国产综合婷婷五月 | 一区二区传媒有限公司 | 免费无码成人av片在线 | 99精产国品一二三产品香蕉 | 欧美成人精品一区二区综合 | 黑人巨大av在线播放无码 | 一级女淫片a8888 | 青青草成人免费在线视频 | www男人天堂| 国产视频在线观看一区二区 | 岛国av免费观看 | 黑人巨大videos亚洲娇小 | 国产成人精品福利一区二区 | 尤妮丝大尺度av在线播放 | 国产性xxxx18免费观看视频 | 久久精品国产99久久无毒不卡 | 精品人妻少妇一区二区三区在线 | 日韩熟女精品一区二区三区 | 在线观看日韩中文字幕 | av手机免费在线观看 | 日本三级日产三级国产三级 | 久久被窝亚洲精品爽爽爽 | 国产高清精品福利私拍国产写真 | 亚洲精品无码午夜福利理论片 | 最新99热 | 亚洲欧美日韩综合在线丁香 | 日韩第一页在线观看 | 男女性潮高清免费网站 | 精品国产三级a在线观看 | 成年激情网 | 欧美人与牲禽动a交精品 | av成人免费在线观看 | 日韩精品在线视频观看 | 在线播放黄色av | 亚洲精品久久国产高清情趣图文 | 国产丝袜久久 | 中国一级一级全黄 | 国产精品亚洲日韩au在线 | 久爱无码免费视频在线 | 国产真实交换多p免视频 | 日韩欧美视频一区二区 | 国产精品爽到爆呻吟高潮不挺 | 国产精品_国产精品_k频道w | 四虎最新在线永久免费 | 丁香一区二区 | 亚洲第一香蕉网 | 中文字幕专区高清在线观看 | 久热国产在线 | 国产无精乱码一区二区三区 | 亚洲va中文字幕无码久久不卡 | 亚洲精品黑牛一区二区三区 | av小四郎在线观看 | 成年女人免费毛片视频永久vip | 无码中文资源在线播放 | 成人国产区 | 狼群社区www中文视频 | 宅男噜噜噜66在线观看 | 久久亚洲精精品中文字幕早川悠里 | 色综合中文字幕 | 色 综合 欧美 亚洲 国产 | 天天操天天爽天天干 | 天天夜碰日日摸日日澡性色av | 黄色网久久 | 国内精品久久久久久影院8f | 欧美老熟妇506070乱子 |