5
本文作者: SAKURA | 2014-12-15 10:08 |
我是一名普通的iOS程序員,入職360以后一直在手機(jī)衛(wèi)士部門(mén)從事開(kāi)發(fā)工作,最近我們上線了AppStore版防騷擾電話(huà)的功能,引起了網(wǎng)友的議論,也勾起了自己對(duì)這三年來(lái)iPhone軟件開(kāi)發(fā)工作的一些感想,既然這篇文章題目叫不歸路,請(qǐng)?jiān)试S我倒一倒自己的苦水。
老婆當(dāng)初覺(jué)得我是一名iOS開(kāi)發(fā)很高大上,那逼格啊,莫名比Android開(kāi)發(fā)高幾個(gè)level,但咱偏偏是做iOS開(kāi)發(fā)中最奇葩的安全那一塊的開(kāi)發(fā),心中的苦逼只有戰(zhàn)友和同行知道。
隨著360衛(wèi)士新版推出騷擾號(hào)碼識(shí)別功能,廣大iPhone用戶(hù)又重拾了往日對(duì)騷擾電話(huà)攔截的心愿,雖然現(xiàn)在的實(shí)現(xiàn)方案只是“向通訊錄中添加騷擾號(hào)碼庫(kù),能識(shí)別來(lái)電騷擾號(hào)碼、不能攔截來(lái)電”這樣一種無(wú)奈的方案,但是,對(duì)受限制較多的iOS系統(tǒng)的而言,安全類(lèi)app的一點(diǎn)點(diǎn)功能提升,就意味著花費(fèi)在這個(gè)功能上大量的失敗嘗試。
試錯(cuò)不是互聯(lián)網(wǎng)公司的專(zhuān)利,但是互聯(lián)網(wǎng)公司不試錯(cuò),就不能生存。當(dāng)初剛進(jìn)入360其實(shí)我也不懂上面這句話(huà)的意思,第一次聽(tīng)team里的產(chǎn)品老大這么講,我心里還想:試個(gè)毛啊,驗(yàn)證一下而已,非得整這么洋氣的詞?后來(lái)的經(jīng)歷告訴我,試錯(cuò)真不像看上去驗(yàn)證一段代碼那么輕松…
2012年初,我剛進(jìn)入團(tuán)隊(duì)3個(gè)月,運(yùn)營(yíng)的同學(xué)反映每個(gè)月都能收到數(shù)千的用戶(hù)強(qiáng)烈要求增加來(lái)電歸屬地顯示、騷擾電話(huà)和垃圾短信攔截,然后技術(shù)leader就把我們拉到經(jīng)常討論到通宵,例舉數(shù)十種技術(shù)方案,也翻墻研究過(guò)很多國(guó)外iOS大神的分析,結(jié)論仍然是除了企業(yè)版用私有接口可以實(shí)現(xiàn)別無(wú)他法,那就先做企業(yè)版吧,經(jīng)過(guò)一個(gè)多月的封閉開(kāi)發(fā),手機(jī)衛(wèi)士企業(yè)版正式推出了上面兩個(gè)功能,識(shí)別方法輕松有效:攔截來(lái)電/短信,把主叫號(hào)碼傳到云端與騷擾號(hào)碼庫(kù)進(jìn)行比對(duì),最后把結(jié)果返回App端,App端予以展現(xiàn)。
圖:2012年初用戶(hù)反饋情況
iPhone用戶(hù)可以攔截騷擾電話(huà)和短信了,這解決了一小部分企業(yè)用戶(hù)的需求,也算圓了一個(gè)工程師小小的夢(mèng)想。這段時(shí)間是我印象里少有的能夠讓人興奮起來(lái)的時(shí)光,因?yàn)樽鳛橐幻绦騿T,可以使用自己認(rèn)為最好的代碼完美的實(shí)現(xiàn)想要的功能,沒(méi)有什么比這個(gè)更有成就感了。事實(shí)也證明,企業(yè)用戶(hù)對(duì)這個(gè)功能的喜愛(ài)完全符合我們預(yù)期,這給了我們很大的鼓舞,但我很清楚,走到這一步,不是碼農(nóng)指間的神作,而是如履薄冰的探險(xiǎn)。
按照蘋(píng)果的企業(yè)版證書(shū)開(kāi)發(fā)許可協(xié)議,利用這樣的接口開(kāi)發(fā)的應(yīng)用是不允許提供給普通用戶(hù)使用的,但是當(dāng)時(shí)面對(duì)普通用戶(hù)洶涌的而來(lái)的需求,我們確實(shí)沒(méi)有更完美的解決方案(其實(shí)直到現(xiàn)在也是),我們?cè)谄髽I(yè)用戶(hù)的反饋和建議中驗(yàn)證著每一個(gè)細(xì)節(jié),并穿插測(cè)試向普通用戶(hù)開(kāi)放這個(gè)功能的可行性。結(jié)果,一不留神,還真就踩到地雷上了…
2013年1月25日,衛(wèi)士被正式下架AppStore,并且連累到公司的所有iOS端產(chǎn)品。
說(shuō)真的,那天早上被產(chǎn)品總監(jiān)的電話(huà)叫醒,整個(gè)人都懵了,不是做夢(mèng)吧?
我的iOS程序猿生涯TM剛開(kāi)始1年就進(jìn)入了完全不可預(yù)期的狀態(tài)。
接下來(lái)的時(shí)間里,我轉(zhuǎn)戰(zhàn)越獄版、WindowsPhone版,甚至差一點(diǎn)去做服務(wù)端工程師,總之就是隨波逐流,但是在心底里始終有種欠債的感覺(jué),而且下架初期用戶(hù)的不理解、競(jìng)爭(zhēng)對(duì)手的抹黑與我們什么也做不了只能每天憧憬重新上架卻一次次失望的情緒像噩夢(mèng)一樣揮之不去,最重要的是,作為直接參與這一“越軌”功能的實(shí)現(xiàn)并面對(duì)下架結(jié)果的我,和我們PM一樣僅剩下的一點(diǎn)盼頭,也就是祈禱自己的產(chǎn)品不會(huì)被用戶(hù)遺忘,那一段時(shí)間真實(shí)的感覺(jué)到了產(chǎn)品就像自己的孩子一樣。
這一等就是一年,我難得可以不用通宵,難得9點(diǎn)以前回家,難得有了更多時(shí)間陪陪老婆,在這如夢(mèng)如幻、魂不守舍的一年,我還真的成了一個(gè)孩子的爸。
當(dāng)屌絲成大叔,當(dāng)大叔已成爹。2014年初,蘋(píng)果對(duì)360的開(kāi)發(fā)者賬號(hào)解封,主產(chǎn)品手機(jī)衛(wèi)士的市場(chǎng)份額流失慘重,說(shuō)真的,聽(tīng)到重新組織團(tuán)隊(duì)恢復(fù)AppStore版開(kāi)發(fā)的消息時(shí),我第一反應(yīng)不是高興,而是困惑,我們能做什么?
一邊是iPhone用戶(hù)呼聲不斷的攔截騷擾的需求,一邊是蘋(píng)果對(duì)我們更加嚴(yán)格的審核(據(jù)說(shuō)專(zhuān)門(mén)安排了兩組審核人員)和無(wú)法跨越的紅線。當(dāng)然,困惑歸困惑,產(chǎn)品該上還是要上的,不過(guò)是閹割了諸多功能之后的版本,包括攔截騷擾來(lái)電、來(lái)電歸屬地顯示、清理加速,呵呵,都砍掉了。
我們能做的除了適配iOS7扁平化,就是優(yōu)化代碼、美化界面和增加其它無(wú)關(guān)痛癢的功能,結(jié)果上線后用戶(hù)罵聲一片,我們既覺(jué)得委屈又覺(jué)得無(wú)奈,好想在更新日志說(shuō)這個(gè)版本是美工開(kāi)發(fā)的。
這種狀況一直持續(xù)到今年7、8月份,蘋(píng)果iOS8透露出一些新的接口,包括通知中心、輸入法等擴(kuò)展功能,作為一款安全軟件,通知中心接口的作用最大,于是我們?cè)诮?jīng)歷了兩次被拒的小插曲后趕在蘋(píng)果正式推送iOS8下載的第二天,國(guó)內(nèi)首家推出了完美適配iOS8和Arm64架構(gòu)并支持通知中心插件的版本更新,但是這仍然沒(méi)有解決用戶(hù)反饋?zhàn)疃嘈枨笞顝?qiáng)烈的騷擾電話(huà)攔截問(wèn)題,直到一個(gè)偶然的機(jī)會(huì)…說(shuō)起來(lái),這個(gè)機(jī)會(huì)也跟公司的一條原則有關(guān)系,也是老周的3個(gè)凡是的一條——“凡是用戶(hù)提的問(wèn)題,一定要追根述源,找到問(wèn)題的原因,從用戶(hù)的角度想解決的方案。”無(wú)論用戶(hù)向我們建議、抱怨、還是怒目相向,團(tuán)隊(duì)里所有人都必須積極傾聽(tīng),理解用戶(hù)背后的需求,從而改善產(chǎn)品。
正因?yàn)榇耍覀冊(cè)谝淮蝺?nèi)部吐槽會(huì)議上,幸運(yùn)的借一個(gè)360論壇用戶(hù)對(duì)來(lái)電歸屬地顯示的建議聯(lián)想到了一個(gè)辦法:利用iPhone系統(tǒng)一個(gè)聯(lián)系人可以附帶若干電話(huà)號(hào)碼的機(jī)制,我們可以在用戶(hù)手機(jī)中新建一個(gè)聯(lián)系人,名稱(chēng)為空,然后在下面帶上我們從云端拉取的1、2000個(gè)騷擾號(hào)碼,并給這些號(hào)碼的標(biāo)簽都命名為“騷擾號(hào)碼”,這樣在用戶(hù)接到這些號(hào)碼的來(lái)電時(shí),因?yàn)闆](méi)有姓名,iPhone系統(tǒng)就會(huì)顯示其標(biāo)簽名稱(chēng)“騷擾號(hào)碼”,就等于是提醒了用戶(hù)!然后就開(kāi)始研究吧,貌似簡(jiǎn)單的功能,細(xì)節(jié)一大堆,尤其是要測(cè)試的工作很多:
1、把騷擾類(lèi)型分別放在名字上、放在標(biāo)簽上、放在其它字段,寫(xiě)入通訊錄,看通訊錄中的顯示、來(lái)電時(shí)的顯示、外撥時(shí)的顯示;
2、每個(gè)聯(lián)系人添加不同的號(hào)碼數(shù)量,對(duì)比測(cè)試:通訊錄啟動(dòng)響應(yīng)速度、正常來(lái)電響應(yīng)速度、騷擾號(hào)碼來(lái)電響應(yīng)速度、正常外撥響應(yīng)速度、外撥騷擾號(hào)碼顯示速度、雙擊home顯示速度、最近聯(lián)系人打開(kāi)和關(guān)閉時(shí)響應(yīng)速度;
3、號(hào)碼和標(biāo)簽的對(duì)應(yīng)關(guān)系、編碼方式,對(duì)比測(cè)試上面的各種響應(yīng)速度;
4、在不同的iPhone機(jī)型、iOS版本上測(cè)試,確定每款機(jī)型的最優(yōu)配置;
5、上面這些都搞定后,似乎不錯(cuò)了,打開(kāi)手機(jī)上的常用軟件,怎么推薦了這么多陌生手機(jī)號(hào)碼?尤其是一款可以推薦朋友的朋友的社交產(chǎn)品,對(duì)比一下:A產(chǎn)品只推薦朋友也就是你通訊錄中的人給你,那你發(fā)現(xiàn)推薦了一堆亂七八糟的人之后首先會(huì)想到把騷擾號(hào)碼庫(kù)刪除掉,這樣直接就可以解決問(wèn)題,B產(chǎn)品是推薦朋友的朋友,你發(fā)現(xiàn)問(wèn)題后刪除騷擾號(hào)碼庫(kù)根本沒(méi)用!因?yàn)槟阃ㄓ嶄浐糜阎兄灰幸粋€(gè)人他的通訊錄中有騷擾號(hào)碼庫(kù),那騷擾號(hào)碼就依然會(huì)成為你“朋友的朋友”,如果這個(gè)騷擾號(hào)碼庫(kù)是上萬(wàn)個(gè)號(hào)碼,結(jié)果簡(jiǎn)直不敢想!于是我們尋找解決辦法:在手機(jī)號(hào)碼中嘗試增加各種無(wú)效的字符、國(guó)家碼的排列組合,在保證號(hào)碼能夠在來(lái)電時(shí)被蘋(píng)果系統(tǒng)識(shí)別出來(lái)的前提下測(cè)試能不能避開(kāi)社交軟件的好友推薦,不能避免的,將我們的騷擾號(hào)碼聯(lián)系人特征發(fā)給產(chǎn)品的開(kāi)發(fā)者或公司,請(qǐng)對(duì)方做規(guī)避處理,只有這樣,才能避免給用戶(hù)造成困惑;
6、對(duì)通訊錄備份軟件及相關(guān)的開(kāi)發(fā)者也要重新走一遍第5條的流程;
7、刪除這個(gè)特殊聯(lián)系人后,通訊錄中會(huì)多出很多標(biāo)簽,永遠(yuǎn)保存在用戶(hù)手機(jī)中,iOS通訊錄不能批量清理掉這些標(biāo)簽,讓用戶(hù)一個(gè)個(gè)手工刪除又太繁瑣,能不能通過(guò)代碼批量刪除?能不能通過(guò)iTunes同步通訊錄刪除?能不能通過(guò)iCloud同步通訊錄刪除?能不能通過(guò)恢復(fù)手機(jī)設(shè)置刪除?能不能通過(guò)恢復(fù)手機(jī)所有內(nèi)容和設(shè)置刪除?能不能通過(guò)iTunes備份和恢復(fù)刪除?每一個(gè)方法都要試!
8、還有識(shí)別率問(wèn)題,騷擾號(hào)碼庫(kù)的大小(通訊錄中這個(gè)特殊聯(lián)系人的號(hào)碼數(shù)量),和騷擾識(shí)別率之間的權(quán)衡,如何才能在通訊錄不受影響的情況下,盡可能提高識(shí)別率?這里真得感謝衛(wèi)士Android版的廣大用戶(hù)這幾年來(lái)標(biāo)記產(chǎn)生的龐大的騷擾號(hào)碼庫(kù)(比某狗的多出兩個(gè)數(shù)量級(jí)好嗎?。?,量級(jí)夠大,才能做到按照用戶(hù)號(hào)碼歸屬地分別下發(fā)Top1000的數(shù)據(jù)就能保證不錯(cuò)的識(shí)別率,后來(lái)看到有人說(shuō)這是2014年最佳大數(shù)據(jù)實(shí)踐案例,其實(shí)和我們team一點(diǎn)關(guān)系沒(méi)有,都是人家安卓用戶(hù)的貢獻(xiàn);
9、最后還有個(gè)終極問(wèn)題,這次除了騷擾識(shí)別的主要實(shí)現(xiàn)機(jī)制必須嚴(yán)格遵守蘋(píng)果的開(kāi)發(fā)者協(xié)議外,任何解決卡慢、社交產(chǎn)品兼容等副作用的方法都必須要確保不逾越這條紅線?。ㄟ@一點(diǎn),與廣大iOS開(kāi)發(fā)者共勉)
分析工作做完,經(jīng)過(guò)近兩周如履薄冰又絞盡腦汁的緊張加班,新版產(chǎn)品終于在11月23日再次以試錯(cuò)的心態(tài)提交蘋(píng)果審核,結(jié)果,兩天后我們看到另一個(gè)大體思路相同的競(jìng)品正式上線了!而且因?yàn)樽鞣ū容^粗暴導(dǎo)致用戶(hù)手機(jī)卡的一逼、罵聲一片,我和團(tuán)隊(duì)里的產(chǎn)品普遍都開(kāi)始擔(dān)心,難道這次又要翻船?要不要低調(diào)點(diǎn)放量?甚至取消上架?繼續(xù)上吧,一來(lái)不理解的用戶(hù)會(huì)說(shuō)你抄襲,二來(lái)用戶(hù)對(duì)于這種實(shí)現(xiàn)方法不知道能不能接受,不上吧,我們處心積慮考慮的那么多因素、做的那么多測(cè)試眼睜睜無(wú)用武之地。最后,產(chǎn)品總監(jiān)還是一句話(huà)拍板:刀山火海都過(guò)來(lái)了,不試個(gè)結(jié)果死不瞑目!
結(jié)果是:這一次,我們可能試對(duì)了!至少到目前為止,用戶(hù)對(duì)我們這次騷擾識(shí)別功能的反饋是正面的,雖然有一些說(shuō)我們抄襲的聲音,但也很快被淹沒(méi)在大家的好評(píng)中。作為一名程序員,我想這就夠了。
當(dāng)然,我們也沒(méi)閑著,接下里隨著服務(wù)端數(shù)據(jù)算法的改進(jìn),和我們對(duì)蘋(píng)果iOS系統(tǒng)的了解深入,我們將嘗試解決騷擾號(hào)碼庫(kù)打開(kāi)速度和識(shí)別率之間的矛盾,譬如先把號(hào)碼庫(kù)從1000個(gè)提高到2500個(gè),提高騷擾號(hào)碼識(shí)別率的同時(shí)提高用戶(hù)打開(kāi)這個(gè)特殊聯(lián)系人的速度,通過(guò)試錯(cuò)一步步把這個(gè)功能達(dá)到我們認(rèn)可、用戶(hù)也認(rèn)可的理想狀態(tài)!
之前聽(tīng)過(guò)一個(gè)說(shuō)法:程序員天生就是理想主義者,代碼要寫(xiě)的很整潔、執(zhí)行效率要很高、容錯(cuò)要很好、適應(yīng)性要很強(qiáng),想想和自己的編程習(xí)慣還真是蠻符合的,但是自己這幾年在360的開(kāi)發(fā)經(jīng)歷卻讓我完全體會(huì)不到這種理想主義帶來(lái)的任何好處,反而是處處碰壁,直到現(xiàn)在才終于明白:人世間沒(méi)有一次滿(mǎn)足所有用戶(hù)需求的程序,只有一步步試錯(cuò)、越來(lái)越貼近用戶(hù)需求的程序!
過(guò)去3年,頭發(fā)白了一茬,在為解決iPhone騷擾電話(huà)的問(wèn)題從未止步,我,一個(gè)小小碼農(nóng),已習(xí)慣了紅線內(nèi)戴著腳鐐舞蹈。
用老婆的話(huà)來(lái)說(shuō),這3年,我還是有收獲的,收獲了一個(gè)娃。
自從當(dāng)?shù)院?,心態(tài)也好了很多,每一天都苦逼并努力著,抬頭看看帝都霧霾散去的晴空,期待著iOS未來(lái)的開(kāi)放。
本文作者:360手機(jī)衛(wèi)士程序員 閆占龍
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。