qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Facebook 的移動(dòng)端 A/B 測試框架

           兩年前,我們重寫了我們移動(dòng)端(iOS,Android)的應(yīng)用,使用了原生的開發(fā)棧(native development stacks)代替我們以前定制開發(fā)的 Web 棧(custom web-stack)。這給了我們在關(guān)于項(xiàng)目在那里/怎樣下載、緩存、釋放等等方面一個(gè)更好的控制。它分別深入地和操作系統(tǒng)整合在一起,提供在底層調(diào)整修改所有系統(tǒng)的一整套工具。
            測試是我們開發(fā)的一個(gè)重要部分,但在轉(zhuǎn)換到原生的之后,我們沒有了 A/B 測試的能力。并不是每個(gè)測試都可以用到生產(chǎn)中,但即使是失敗的測試也能幫助我們理解如何才能更好地改進(jìn)。失去的這部分能力變成了一個(gè)我們要應(yīng)對的挑戰(zhàn)。
            A/B 測試
            要把我們的應(yīng)用移植到 iOS 和 Android 上,需要來自不同團(tuán)隊(duì)的人來進(jìn)行協(xié)作,每四周就要產(chǎn)生一個(gè)新的修復(fù)一些 bug 和帶有一些新特性的二進(jìn)制軟件包。在我們發(fā)布一些更新之后,對于我們很重要的事情是要去明白:
            ● 新特性的使用情況
            ● bug 修復(fù)后的運(yùn)行情況和穩(wěn)定性
            ● 用戶界面改進(jìn)之后用戶是怎么使用這個(gè)應(yīng)用及在哪里花的時(shí)間多
            為了去了解這些事情,我們需要一個(gè)移動(dòng)端進(jìn)行 A/B 測試的基礎(chǔ)組件,這個(gè)組件能讓我們的用戶分別使用不同版本的應(yīng)用(版本 A 和版本 B),這些版本在除某些特別需要測試的部分外,其他各層面都是一樣的。所以我們創(chuàng)造了 Airlock,一個(gè)可以讓我們比較不同版本應(yīng)用的度量數(shù)據(jù)(metric data)和進(jìn)行各種各樣測試的測試框架,這幫助我們決定采用那個(gè)版本或者后續(xù)如何迭代。
            從一點(diǎn)一滴中建成
            我們盡可能從最簡單的試驗(yàn)開始:使用已有的 Web-Stack A/B 分箱(binning system)系統(tǒng)。我們構(gòu)造了一個(gè)測試:把聊天按鈕換成文字"Chat"的試驗(yàn)。當(dāng)應(yīng)用啟動(dòng)的的時(shí)候,它會發(fā)送一個(gè)到我們服務(wù)器上的網(wǎng)絡(luò)請求,詢問這個(gè)試驗(yàn)的參數(shù)。當(dāng)有回應(yīng)返回后,我們就會更新按鈕。一些員工會有按鈕,另一些員工會有文字"Chat"。我們期望這僅僅會影響信息發(fā)送的數(shù)量(看起來不會太多),其他的東西不會受影響。
            曝光日志
            當(dāng)這個(gè)版本的應(yīng)用公開發(fā)布了,我們等待數(shù)據(jù)能穩(wěn)定下來,然后發(fā)現(xiàn)看到文字"Chat" 的版本會更熱衷于使用這個(gè)應(yīng)用。是不是我們發(fā)現(xiàn)了什么秘密,或者誘惑般的魔法?沮喪地說,并不是。我們遇到了很多 bug,其中一個(gè)很大的問題是,某個(gè)組件并不能正確地緩沖數(shù)值。由于這是個(gè)大的系統(tǒng),基礎(chǔ)設(shè)施(the infrastructure)必須要是 "防彈的",不然收集到的數(shù)據(jù)就沒用了。
            從服務(wù)器開始的數(shù)據(jù)管道決定某個(gè)人的版本是屬于那種變體的。然后,數(shù)據(jù)就會被打包,接著發(fā)送到設(shè)備上,設(shè)備分析返回的信息然后保存。接著,這個(gè)值會被用于重新配置 UI,然后最終在屏幕上顯示。問題是我們在依靠服務(wù)器對我們數(shù)據(jù)分析的分類。一個(gè)簡單的 bug 就導(dǎo)致了一大群用戶在使用有別于我們期望的的變種版本。服務(wù)器還在堅(jiān)持:"我告訴了設(shè)備去顯示字符串!" 但在某處地方這個(gè)語句變得有點(diǎn)令人模糊(一個(gè)在客戶端存貯邏輯上的 bug)。
            一個(gè)試驗(yàn)的部署圖:
            上面圖表展示了一個(gè)試驗(yàn)的部署。淺綠色的條柱是試驗(yàn)用戶的數(shù)量,黑綠色的條柱是實(shí)際被影響的用戶數(shù)。我們可以看到,服務(wù)器和設(shè)備的數(shù)據(jù)區(qū)別還是很大的: 在第一天,大多數(shù)用戶收到這個(gè)配置,但大多數(shù)用戶沒有留意到我們試驗(yàn)。
            當(dāng)問題不僅僅是設(shè)備收到返回的數(shù)據(jù),而需要加上我們的數(shù)據(jù)分析需要知道什么時(shí)候收到信息,然后把它正確地顯示在 UI 上時(shí),問題變得更大了。即使信息能正確地到達(dá),在 UI 不正確時(shí)也有一個(gè)延遲。我們通過
            添加雙向握手(wo-way handshake)解決了這個(gè)問題。設(shè)備請求用于試驗(yàn)的數(shù)據(jù),服務(wù)器記錄它發(fā)出的回應(yīng)。因此,即使某用戶沒有看到我們想讓他看到的,我們?nèi)匀豢梢赃M(jìn)行正確性分析(但也必須意識到選擇性偏差(selection bias)的問題,還有分發(fā)時(shí)由于某些原因變得不平均)。
            可伸縮性
            在進(jìn)行了幾個(gè)月這樣的"課程"之后,我們必須將支持兩個(gè)試驗(yàn)的系統(tǒng)升級支持整個(gè)應(yīng)用的系統(tǒng)。這個(gè)促使 Airlock 發(fā)生變革的試驗(yàn)是以前我們原想著進(jìn)化和簡化我們應(yīng)用內(nèi)的導(dǎo)航模塊而開發(fā)的。在經(jīng)歷這幾個(gè)月之后,我們把這個(gè)應(yīng)用改變了很多,你可以去下載 Facebook for iPhone 來體驗(yàn)一下,這里面很多是測試的功勞。
            隨后,Airlock 被用于支持更多的試驗(yàn),其請求的參數(shù),數(shù)據(jù)的記錄、客戶端計(jì)算等等都快速地變多。Airlock 充分地被用于測試原生的應(yīng)用,使得我們的應(yīng)用運(yùn)行得前所未有的輕快,伴隨著測試的自由,再測試,和評估測試結(jié)果,我們期望能建造更好的測試和創(chuàng)造更好的用戶體驗(yàn)。

          posted on 2014-02-25 10:32 順其自然EVO 閱讀(219) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

          <2014年2月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          2324252627281
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黑水县| 曲阜市| 新建县| 石楼县| 夏津县| 客服| 青岛市| 彭山县| 化隆| 大化| 陆河县| 新蔡县| 三门峡市| 莱芜市| 泰兴市| 大洼县| 青海省| 南宁市| 扶余县| 富民县| 鄱阳县| 同德县| 霍林郭勒市| 文水县| 宜阳县| 剑阁县| 原平市| 临颍县| 和政县| 大庆市| 丹巴县| 乐业县| 门源| 咸阳市| 肃北| 琼结县| 永昌县| 广宁县| 内乡县| 北宁市| 通海县|