以互聯(lián)網(wǎng)思維做好客戶端軟件
加入愛奇藝的時間不長,但我感受到的震撼卻不小。在外企打拼了十幾個春秋,今年終于有機會進入一家國內(nèi)***的互聯(lián)網(wǎng)企業(yè),真真切切地有一番不太一樣的體驗。不過,我今天并不想說在外企工作與國內(nèi)企業(yè)的差別。目前,我負責“愛奇藝PPS影音”PC客戶端軟件的研發(fā)。也許有人會有疑問:怎么還在做PC軟件?大家不都一窩蜂似的轉(zhuǎn)去做移動開發(fā)了嗎?然而,大家要明白的是,雖然PC行業(yè)已經(jīng)風光不再,但PC飽有的體量仍然是巨大的,并且PC自有其不可替代的價值;PC軟件還要繼續(xù)做,今天我想說一說的是,怎樣以互聯(lián)網(wǎng)思維來做好客戶端軟件。
說起互聯(lián)網(wǎng),大家自然便會想起網(wǎng)站。(順便提一下,愛奇藝就是以網(wǎng)站起家的;現(xiàn)如今,愛奇藝的服務(wù)已經(jīng)覆蓋包括PC、MAC、手機、平板、電視、機頂盒等各種終端。)想必大家也知道網(wǎng)站與客戶端軟件各有優(yōu)劣吧,比如:網(wǎng)站可以運行在任何設(shè)備的瀏覽器上,不需要用戶安裝,也不麻煩用戶升級,能在各個終端保持統(tǒng)一的用戶體驗;而相比之下,原生的客戶端軟件運行得更快,并且能夠充分利用本地資源為用戶帶來更加強勁、炫目的功能。(推薦閱讀Jeff Atwood的一篇博文:App會取代網(wǎng)站嗎?)我們的客戶端軟件是用C++寫的,性能自然不必多說。而我們公司的互聯(lián)網(wǎng)基因,也促使我們把網(wǎng)站的眾多優(yōu)點融合進了客戶端軟件。
先說說研發(fā)流程吧。互聯(lián)網(wǎng)行業(yè)***的特點就是變化快。我們求新,必須快速迭代,快速試錯。網(wǎng)站采用的是這種開發(fā)模式,我們的客戶端軟件開發(fā)也可以。我們采用了Scrum敏捷開發(fā)流程——兩周一次迭代,每兩周發(fā)布一個版本。我們稱之為“小步快跑”——把大功能拆小,分階段實現(xiàn),追求微創(chuàng)新。比較一下傳統(tǒng)的軟件開發(fā)模式:先制定一份詳盡冗長的PRD,然后是動輒1~3個月(甚至半年)的開發(fā)周期,再加上一個較長的穩(wěn)定期來修復(fù)足夠多的bug,等到發(fā)布產(chǎn)品的時候,市場環(huán)境早就不一樣了……互聯(lián)網(wǎng)環(huán)境容不得如此慢的節(jié)奏!
上面說到了快速試錯。那么,怎么試呢?又怎么知道我們是對還是錯呢?這就要依賴數(shù)據(jù)啦!網(wǎng)站有它的先天優(yōu)勢,可以很方便地收集到這些數(shù)據(jù):用戶在網(wǎng)站上停留了多久,點了什么網(wǎng)頁,在網(wǎng)頁上點了什么按鈕,用戶使用的是什么瀏覽器,同時有多少人在線,訪問的峰值出現(xiàn)在什么時間段,等等。我們在客戶端里也加入了類似的投遞代碼。我們還有強大的數(shù)據(jù)統(tǒng)計和分析團隊的支持,讓我們對客戶端軟件性能以及用戶行為了如指掌。我們很容易就能知道客戶端軟件的啟動耗時、崩潰率、用戶在我們客戶端里看了哪些視頻、播放是不是有卡頓等信息。在我們嘗試做了一個新功能、但又不確定用戶是否會喜歡的時候,我們也可以通過一個小渠道發(fā)布這個版本,然后在后臺觀察各種統(tǒng)計數(shù)據(jù),以此來幫助我們決定是否應(yīng)該繼續(xù)開發(fā)這個功能,或者在后續(xù)迭代里需要在哪些方面做改進。
我們每兩周對外發(fā)布一個版本。我們也深知,發(fā)出去的版本就像潑出去的水,也是我們未來必須背負的包袱。時間一長,客戶端版本碎片化,幾千萬用戶手上的版本多達幾十種。我們固然可以通過軟件自帶的升級機制把***版本的客戶端送到用戶手上,但出于種種原因,新版本能夠做到高于90%的覆蓋已經(jīng)不錯了,而這個數(shù)字絕對達不到100%。然而,網(wǎng)站卻能做到。網(wǎng)站添加了新功能之后,一旦部署,頃刻之間就能被全世界的所有用戶使用上。問題是,我們怎么在客戶端里獲得像網(wǎng)頁那樣的靈活性呢?我們的做法是,對于性能要求不高并且可能會頻繁調(diào)整的部分,用HTML/JavaScript來實現(xiàn),并在客戶端里用內(nèi)嵌瀏覽器打開這些網(wǎng)頁;而對于性能要求高的部分,堅決采用我們強大的C++皮膚庫來把網(wǎng)頁本地化。一個很好的例子就是愛奇藝影視大全(http://v.iqiyi.com),在與網(wǎng)站保持協(xié)同的基礎(chǔ)上,我們讓它在客戶端里表現(xiàn)出了更為卓越的性能。
在功能實現(xiàn)方面,我們時刻保持著一種意識:盡量不把業(yè)務(wù)邏輯在客戶端里寫死。否則的話,一旦業(yè)務(wù)邏輯有變,我們必須修改客戶端的代碼,然后再做全網(wǎng)升級,一來周期比較長,二來新版本也做不到100%的覆蓋,結(jié)果就比較被動了。舉一個VIP會員相關(guān)的例子吧。在客戶端,我們有針對當前登錄用戶的類型來做不同會員套餐促銷的需求,具體的業(yè)務(wù)邏輯是:如果當前是普通會員,則跳到白銀套餐的購買頁面(url1);如果當前是白銀會員,則跳黃金套餐頁面(url2);如果當前是黃金會員,則跳鉑金套餐頁面(url3)。一些經(jīng)驗欠缺的開發(fā)人員會把上述邏輯直接實現(xiàn)在客戶端軟件里,就像下圖中左邊所示的那樣。遺憾的是,一旦VIP會員套餐的促銷邏輯有變,比如,要改成對所有用戶都推銷鉑金套餐,那就慘了!更靈活的實現(xiàn)方式應(yīng)該像下圖中右邊那樣,客戶端只是調(diào)用一個相對固定的url(并帶上必要的參數(shù)),而把具體的業(yè)務(wù)邏輯實現(xiàn)在服務(wù)器端。
當然,上面只是一個很小的例子。為了在客戶端里獲得足夠的靈活性(不通過發(fā)布新版本就能滿足業(yè)務(wù)需求),我們還給很多功能加上了云端配置。只要我們發(fā)現(xiàn)某些功能的用戶體驗不理想,隨時都可以調(diào)整控制參數(shù),甚至將其徹底關(guān)閉。我們始終牢記,我們在做的不是一個單純、孤立的客戶端軟件——我們提供的是一種互聯(lián)網(wǎng)服務(wù)。也因為如此,我們的客戶端軟件同時很好地支持了編輯運營(及時發(fā)布時事或?qū)n}、熱門推薦、快速上線或下線節(jié)目等),以及靈活的廣告策略控制。
PC軟件真的沒落了嗎?其實不然!也許我們只是需要順應(yīng)潮流,改變一下自己的思維方式。我們相信,只要有用戶存在,每個終端都是重要的。因此,即使沒有聚光燈、鮮花或掌聲,我們?nèi)匀辉趫猿植恍傅嘏ψ龊卯a(chǎn)品,全心全意為我們的用戶服務(wù)!