如何打造高質(zhì)量的應(yīng)用?

作者:張紹文

今年年初翅溺,我去上海參加一個(gè)移動(dòng)技術(shù)會(huì)議,問(wèn)了很多開(kāi)發(fā)者最近在忙啥优幸。令我非常驚訝的是褪猛,大家講的最多的還是用戶體驗(yàn)和應(yīng)用質(zhì)量。特別是出海東南亞的同學(xué)碳却,面對(duì)一堆512MB內(nèi)存的設(shè)備笑旺、無(wú)處不在的弱網(wǎng)絡(luò)流下了無(wú)助的眼淚。

除了內(nèi)存優(yōu)化关噪、弱網(wǎng)絡(luò)優(yōu)化乌妙,想做一款高質(zhì)量的應(yīng)用還遠(yuǎn)遠(yuǎn)不止這些。一方面虐沥,我們面對(duì)的環(huán)境越來(lái)越復(fù)雜荠察。過(guò)去的iOS開(kāi)發(fā)者可能做夢(mèng)也想不到,現(xiàn)在也要開(kāi)始適配屏幕和雙卡雙待了盯荤,更不用說(shuō)Android那多如繁星的機(jī)型焕盟、廠家和系統(tǒng)宏粤。如果你的應(yīng)用也要出海绍哎,那么還要面對(duì)幾十個(gè)國(guó)家不同的語(yǔ)言鞋真、環(huán)境。

另一方面海诲,我們的代碼跟業(yè)務(wù)也越來(lái)越復(fù)雜了檩互。先不說(shuō)大量“年久失修”的歷史代碼,業(yè)務(wù)越來(lái)越復(fù)雜蚯斯,如何管理好幾十上百個(gè)模塊饵较?還要面對(duì)React Native、Flutter撰茎、TensorFlow等各種語(yǔ)言跟框架堆積在一起的情況打洼,再加上復(fù)雜的環(huán)境和龐大的系統(tǒng),想想做一款高質(zhì)量的應(yīng)用真的不容易炫惩。

從應(yīng)用交付的流程說(shuō)起

既然打造一款高質(zhì)量的應(yīng)用那么困難阿浓,我們可以先從哪里入手做些什么呢?我的方法是把應(yīng)用當(dāng)成一件商品筋蓖,想象一下商品在流水線生產(chǎn)的過(guò)程退敦,那么怎樣在每個(gè)步驟做好“質(zhì)檢”呢?這就要從應(yīng)用交付的流程說(shuō)起瓮下。

在我看來(lái),一個(gè)應(yīng)用至少會(huì)經(jīng)過(guò)開(kāi)發(fā)讽坏、編譯CI、測(cè)試迷捧、灰度和發(fā)布這幾個(gè)階段胀葱。每個(gè)階段需要關(guān)注什么問(wèn)題呢?

1、開(kāi)發(fā)階段手趣。在面試的時(shí)候,常常有人說(shuō)自己熟練掌握各種開(kāi)發(fā)工具朝群。但是中符,我們真的懂嗎?就拿我們比較熟悉的耗時(shí)分析工具Traceview來(lái)說(shuō)右莱,它背后的實(shí)現(xiàn)原理是什么档插?能不能做一個(gè)完全沒(méi)有性能損耗的Traceview?或者怎么樣將它移植到線上使用晨抡?

2则剃、編譯CI階段。如何防止代碼不斷地惡化调煎?怎樣進(jìn)一步優(yōu)化性能己肮?d8與ReDex有什么神奇的黑科技烈涮?如何利用好Coverity坚洽、Infer這些靜態(tài)分析工具西土?這部分可能需要一些編譯原理的知識(shí),你會(huì)發(fā)現(xiàn)移動(dòng)開(kāi)發(fā)也有很多值得深入研究的東西跳昼。

3肋乍、測(cè)試階段。我們常說(shuō)敏捷開(kāi)發(fā)堪伍,用戶是最好的測(cè)試觅闽。遇到問(wèn)題在線上反復(fù)試錯(cuò),對(duì)自己尸闸、對(duì)用戶都十分痛苦孕锄。我們希望可以做到測(cè)試“左移”,盡可能早地發(fā)現(xiàn)問(wèn)題茧痕。但是很多時(shí)候我們不是不想測(cè)試恼除,而是發(fā)現(xiàn)測(cè)不出什么問(wèn)題。那么怎樣提升實(shí)驗(yàn)室發(fā)現(xiàn)問(wèn)題的能力呢令野?如何盡可能地模擬用戶的操作路徑徽级?做好測(cè)試并不容易,自動(dòng)化測(cè)試結(jié)合AI或許可以幫助我們解決一些痛點(diǎn)现使。

4、灰度和發(fā)布階段碳锈。動(dòng)態(tài)部署流行起來(lái)之后,很多開(kāi)發(fā)變得松懈起來(lái)强重。有問(wèn)題發(fā)補(bǔ)丁贸人,一個(gè)不行就兩個(gè),兩個(gè)不行就十個(gè)倘要。怎樣去保證產(chǎn)品質(zhì)量十拣?很多線上問(wèn)題概率很低,基本很難復(fù)現(xiàn),比如對(duì)于一個(gè)印度的用戶弄跌,我們希望有一個(gè)遠(yuǎn)程的聽(tīng)診器,而不需要把用戶拉到我們的手術(shù)臺(tái)上埠胖。

對(duì)照應(yīng)用的交付流程淳玩,我來(lái)介紹一下專欄的學(xué)習(xí)方法。專欄“高質(zhì)量開(kāi)發(fā)”模塊主要對(duì)應(yīng)的是開(kāi)發(fā)階段谋竖,你可以帶著實(shí)踐過(guò)程的困惑去深入學(xué)習(xí)開(kāi)發(fā)需要的各種武器承匣。專欄“高效開(kāi)發(fā)”模塊主要對(duì)應(yīng)編譯CI、測(cè)試嘉抒、灰度和發(fā)布階段袍暴,你可以結(jié)合實(shí)際工作全面提升整個(gè)應(yīng)用交付的效率隶症。另外蚂会,我認(rèn)為一個(gè)好的架構(gòu)可以減少甚至避免團(tuán)隊(duì)出錯(cuò)狈定,也是打造一款高質(zhì)量應(yīng)用非常重要的一環(huán),因此我會(huì)在最后的“架構(gòu)演進(jìn)”模塊和你聊聊如何設(shè)計(jì)一個(gè)好的架構(gòu)措嵌,以及架構(gòu)該如何選型芦缰。

移動(dòng)APM質(zhì)量平臺(tái)

請(qǐng)你思考一下,在應(yīng)用交付的這幾個(gè)階段中浪规,我們對(duì)高質(zhì)量的目標(biāo)和實(shí)現(xiàn)方式是否一樣呢探孝?開(kāi)發(fā)階段有開(kāi)發(fā)人員,可能希望采集盡可能多的數(shù)據(jù)缸濒;測(cè)試階段有測(cè)試人員粱腻,可能更針對(duì)實(shí)驗(yàn)室環(huán)境或與競(jìng)品對(duì)比進(jìn)行測(cè)試;灰度和發(fā)布階段可能也有專門的運(yùn)維人員捞慌,策略會(huì)相對(duì)保守一些柬批。很明顯,不同階段我們對(duì)高質(zhì)量的目標(biāo)跟手段可能不太一樣锻霎。

一個(gè)公司有多套質(zhì)量系統(tǒng)揪漩,這在大公司是非常普遍的現(xiàn)象。我們希望有一個(gè)統(tǒng)一的平臺(tái)冰更,整合應(yīng)用的人員和開(kāi)發(fā)流程,這就是我們常說(shuō)APM質(zhì)量平臺(tái)舟铜。

APM的全稱是“Application Performance Management”奠衔,即應(yīng)用性能管理。據(jù)我了解归斤,國(guó)內(nèi)像阿里、騰訊她我、美團(tuán)點(diǎn)評(píng)迫横、餓了么、愛(ài)奇藝這些公司都在大力投入恨狈。Google今年也發(fā)力Android Vitals監(jiān)控呛讲,新增了耗電、權(quán)限管理模塊刃宵。那么APM質(zhì)量平臺(tái)究竟有著什么樣的魅力呢徘公?

1哮针、統(tǒng)一管理。A同學(xué)寫了一個(gè)耗時(shí)監(jiān)控工具等太,B同學(xué)寫了一個(gè)內(nèi)存監(jiān)控工具蛮放,它們?cè)诓煌膫}(cāng)庫(kù),上報(bào)格式可能不太一樣瞻想,各自都搭了一個(gè)簡(jiǎn)單的頁(yè)面。如果想評(píng)估一個(gè)應(yīng)用的質(zhì)量蘑险,總是要去幾個(gè)系統(tǒng)匯總數(shù)據(jù),想想都費(fèi)勁泼差。

2呵俏、統(tǒng)一三端。一個(gè)公司可能有多個(gè)應(yīng)用套啤,一個(gè)應(yīng)用也可能有H5随常、iOS、Android多個(gè)端绪氛。我們希望它們只是采集數(shù)據(jù)方式有所不同,上報(bào)争占、后臺(tái)分析序目、展示、報(bào)警都是共用的握童。隨著技術(shù)的發(fā)展叛赚,我們可能會(huì)增加React Native、Flutter這些新模塊的監(jiān)控肥卡,這個(gè)平臺(tái)應(yīng)該是統(tǒng)一演進(jìn)的事镣。當(dāng)然我們非常希望業(yè)界有一套開(kāi)源的方案,大家可以一起優(yōu)化氛琢。

那這個(gè)質(zhì)量平臺(tái)需要關(guān)注哪些問(wèn)題呢?這需要看我們用戶關(guān)心什么問(wèn)題册舞。有的問(wèn)題可能是致命的障般,像崩潰、卡死藐石、白屏定拟。另一大類問(wèn)題就是性能問(wèn)題,安裝包大小株依、啟動(dòng)延窜、耗時(shí)、內(nèi)存荠藤、耗電获高、流量都是這一個(gè)范疇。在這個(gè)專欄里念秧,我并不會(huì)教你如何從頭搭建一個(gè)APM平臺(tái),我會(huì)更期待你掌握背后所需要的知識(shí)庄吼,它們主要包括:

由于Android版本的碎片化和國(guó)內(nèi)Android生態(tài)的亂象严就,“Android開(kāi)發(fā)者很苦梢为,國(guó)內(nèi)的Android開(kāi)發(fā)者更苦”。11月16日祟印,第一屆安卓綠色聯(lián)盟開(kāi)發(fā)者大會(huì)在北京召開(kāi)粟害,會(huì)議上推出了應(yīng)用體驗(yàn)標(biāo)準(zhǔn)V2.0,里面也對(duì)應(yīng)用的兼容性套鹅、穩(wěn)定性汰具、性能、功能和安全做了詳細(xì)的定義留荔。

在極致性能的同時(shí),我們希望能更進(jìn)一步地打造“綠色應(yīng)用”杰妓。在這個(gè)過(guò)程中碘勉,一個(gè)全面而強(qiáng)大的APM質(zhì)量平臺(tái)會(huì)是我們堅(jiān)實(shí)的后盾。當(dāng)然對(duì)于大多數(shù)中小開(kāi)發(fā)者來(lái)說(shuō)句各,我們更建議選擇成熟的第三方服務(wù)晴叨。但深入了解它們背后的原理,無(wú)論是對(duì)我們?nèi)绾芜x擇合適的服務(wù)初厚,還是日常開(kāi)發(fā)工作都會(huì)有很大的幫助孙技。在學(xué)習(xí)完上面的這些內(nèi)容之后,你也會(huì)覺(jué)得其實(shí)“性能優(yōu)化”并不是那么“高不可攀”亚情,我們也可以慢慢地邁向“性能優(yōu)化專家”之路哈雏。

不過(guò)我們需要明確一點(diǎn)衫生,雖然移動(dòng)APM質(zhì)量平臺(tái)可以幫助我們快速發(fā)現(xiàn)和定位問(wèn)題罪针,但是監(jiān)控并不能保證實(shí)現(xiàn)高質(zhì)量,這里最關(guān)鍵的永遠(yuǎn)是人泪酱,而不是系統(tǒng)还最。為什么呢?我舉兩個(gè)小例子岂津。

你在工作中可能總能遇到這樣的場(chǎng)景悦即,我管它叫反饋問(wèn)題三連擊:“是我的問(wèn)題嗎?”“能復(fù)現(xiàn)嗎粱甫?”“你的測(cè)試靠譜嗎作瞄?”。雖然通過(guò)APM質(zhì)量平臺(tái)可以減少推卸責(zé)任宗挥,但有些人的做法通常還是發(fā)現(xiàn)空指針加一個(gè)判空,發(fā)現(xiàn)并發(fā)問(wèn)題加一個(gè)鎖瞒大。這里的空指針真正原因是什么搪桂?這里判空了后面的邏輯是否還會(huì)運(yùn)行正常?有沒(méi)有更加好的方法或架構(gòu)可以避免這個(gè)問(wèn)題酗电?我們真正應(yīng)該反問(wèn)的是這三個(gè)問(wèn)題内列,把“質(zhì)量觀”深入骨髓,真正去想要得到個(gè)人成長(zhǎng)荷荤,深挖背后的原因移稳。

第二個(gè)例子是,我發(fā)現(xiàn)許多人都在問(wèn)題無(wú)法忍受个粱,或者說(shuō)是老板無(wú)法忍受的時(shí)候才去開(kāi)啟各種優(yōu)化專項(xiàng),但事后又不了了之稻薇。我們很多時(shí)候都在用戰(zhàn)術(shù)的勤奮掩蓋戰(zhàn)略的懶惰胶征,性能優(yōu)化的關(guān)鍵在于如何解決存量問(wèn)題,同時(shí)快速發(fā)現(xiàn)增量問(wèn)題案狠。APM質(zhì)量平臺(tái)只可以協(xié)助我們钱雷,并不能解決組織內(nèi)部的心態(tài)問(wèn)題。

總結(jié)

看到這里可能你會(huì)有這樣的疑問(wèn)拉庵,我們?cè)谛」靖緵](méi)有機(jī)會(huì)學(xué)習(xí)到這些東西呀套蒂?確實(shí)如此,個(gè)人與公司一起成長(zhǎng)是最快速伸辟,也是非常難得的事情豺总,但并不一定人人都會(huì)有這樣的機(jī)會(huì)秩铆。從我自己的經(jīng)驗(yàn)來(lái)看魂务,在搜狗虱痕、微信會(huì)遇到各種各樣的疑難問(wèn)題葫哗,也可以有很多時(shí)間去研究振湾,讓我在解決過(guò)程中獲得成長(zhǎng)押搪。

幸運(yùn)的是現(xiàn)在大家都更加樂(lè)于去分享,在專欄和技術(shù)會(huì)議中大州,我們可以看到很多成熟的解決問(wèn)題的經(jīng)驗(yàn)和思路,在GitHub我們可以找到很多優(yōu)秀的源代碼疮茄。在這個(gè)環(huán)境下,我們需要耐得住寂寞力试,多摳一些細(xì)節(jié)排嫌,多深入研究,多停下來(lái)總結(jié)躯畴。

我來(lái)分享一個(gè)我的故事薇芝,2013年初我去面試微信,前面都不太理想嚷缭,最后還是通過(guò)了。后來(lái)有一次跟面試官閑聊說(shuō)起這個(gè)事情阅爽,他們認(rèn)為有一件事情打動(dòng)了他們荐开。2012年的時(shí)候,LeakCanary還沒(méi)開(kāi)源百侧,我在使用MAT做內(nèi)存泄漏分析的時(shí)候總覺(jué)得很不爽能扒。為什么不能做自動(dòng)化?為什么看不到Bitmap的圖片辛润?我當(dāng)時(shí)深入研究了內(nèi)存文件Hprof的格式见秤,做了幾個(gè)小創(chuàng)新:

實(shí)現(xiàn)內(nèi)存的自動(dòng)化測(cè)試真椿。在自動(dòng)化測(cè)試后回到首頁(yè)乎澄,這個(gè)時(shí)候獲取應(yīng)用的內(nèi)存快照。自動(dòng)分析內(nèi)存中Activity實(shí)例狞换,正常情況應(yīng)該只存在一個(gè)舟肉,其他都認(rèn)為是泄漏查库。為了支持正式包,還做了通過(guò)mapping文件反混淆Hprof文件的功能整慎。

查看圖片。自動(dòng)將內(nèi)存中重復(fù)的圖片裤园、比較大的圖片轉(zhuǎn)換成PNG格式輸出到文件剂府。

現(xiàn)在看起來(lái)這些功能并不是太難,但如果放到六年前淤袜,想到而且能做到的人相信并不多衰伯。講這個(gè)故事還是希望你能在工作和實(shí)踐中多停下來(lái)思考,多深入研究一些細(xì)節(jié)烦周,很多看似不經(jīng)意的思考和創(chuàng)新怎顾,可能在日后發(fā)揮更大的價(jià)值。

內(nèi)容選自:極客時(shí)間《Android開(kāi)發(fā)高手課》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贪壳,一起剝皮案震驚了整個(gè)濱河市蚜退,隨后出現(xiàn)的幾起案子彪笼,更是在濱河造成了極大的恐慌配猫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵肄,死亡現(xiàn)場(chǎng)離奇詭異腐巢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)玄括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門遭京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人船殉,你說(shuō)我怎么就攤上這事±妫” “怎么了孝扛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵苦始,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陌选,道長(zhǎng),這世上最難降的妖魔是什么您炉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任役电,我火速辦了婚禮,結(jié)果婚禮上冀膝,老公的妹妹穿的比我還像新娘。我一直安慰自己窝剖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布脊奋。 她就那樣靜靜地躺著疙描,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最楷。 梳的紋絲不亂的頭發(fā)上待错,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天烈评,我揣著相機(jī)與錄音,去河邊找鬼瓜客。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谱仪,可吹牛的內(nèi)容都是我干的否彩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼敬尺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼贴浙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起崎溃,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唤殴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體到腥,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乡范,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渠脉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶佳。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖为朋,靈堂內(nèi)的尸體忽然破棺而出厚脉,到底是詐尸還是另有隱情,我是刑警寧澤傻工,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站鸯匹,受9級(jí)特大地震影響泄伪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜臂容,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糟秘。 院中可真熱鬧球散,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斩芭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贬养,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工误算, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迷殿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓蜘犁,卻偏偏與公主長(zhǎng)得像止邮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子导披,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你撩匕,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,693評(píng)論 2 59
  • 導(dǎo)讀:最近在學(xué)習(xí)張紹文的“Android開(kāi)發(fā)高手課”止毕,該課程是一門為Android開(kāi)發(fā)者量身定制的進(jìn)階課程漠趁,圍繞打...
    迷途小頑童閱讀 340評(píng)論 0 0
  • 1. 每天送女兒上學(xué),過(guò)十字路口的時(shí)侯闯传,手總是下意識(shí)得向她伸出去。不管隔得有多遠(yuǎn),女兒也不由自主的把小手放在我掌心...
    素顏三步曲閱讀 476評(píng)論 13 19
  • 功能說(shuō)明:自動(dòng)檢測(cè)系統(tǒng)并更新源则披。 適用場(chǎng)景:一鍵式檢測(cè)系統(tǒng)并更新源洗出,用戶只需執(zhí)行該腳本一次即可自動(dòng)檢測(cè)系統(tǒng)并更新源...
    StevenQin閱讀 295評(píng)論 0 0