官术网_书友最值得收藏!

前言

我的Android開發(fā)之路

我從事Android開發(fā)工作已經(jīng)7年有余,這些年我不斷地思考,寫了數(shù)十篇文章和近百篇日記,在這個過程中我對Android開發(fā)的認(rèn)識逐漸深入。我想是時候做一個總結(jié)了。

入行至今的一些關(guān)鍵節(jié)點

2014—2015年:踏上Android開發(fā)之旅

我與Android的邂逅,源自一場意外。大學(xué)期間,我加入了西安電子科技大學(xué)金山俱樂部,當(dāng)時俱樂部里有很多技術(shù)小組:后端、前端、Android開發(fā)、Windows Phone開發(fā)等。由于我當(dāng)時使用的手機搭載了 Windows Phone系統(tǒng),所以我就選了Windows Phone開發(fā)小組。

2014年,iOS、Android、Windows Phone、塞班四強并立,Windows Phone的磁貼式設(shè)計我非常喜歡,加上使用該系統(tǒng)的設(shè)備操作流暢、分辨率高,一度讓我覺得它可能會“統(tǒng)治”手機操作系統(tǒng)市場。

沒想到的是,不到2個月,我的手機因為意外進水,無法使用了!當(dāng)時我非常難過,一方面因為手機壞了需要重買;另一方面因為無法繼續(xù)做Windows Phone開發(fā)讓我感到遺憾。對當(dāng)時的我來說,再換一臺Windows Phone手機過于昂貴,我只好換了一臺便宜的Android手機,也因此轉(zhuǎn)向?qū)W習(xí)Android開發(fā)。

幾年后,手機操作系統(tǒng)市場的發(fā)展超出了我的預(yù)料。Windows Phone由于缺乏良好的開發(fā)生態(tài),支持的App很少,因此用戶也少。用戶少導(dǎo)致開發(fā)者更少,形成惡性循環(huán)。如今Windows Phone 的全球市場份額已經(jīng)低于10%。

當(dāng)時我還做了一個目前看來非常重要的決定:我開始寫博客,記錄自己的所學(xué)所得。

在開發(fā)項目時,我經(jīng)常去網(wǎng)上搜索解決方案,后來搜索次數(shù)多了,覺得不能一直都是索取,我也要嘗試去分享。于是我在CSDN注冊了賬號,并于2014年10月發(fā)布了我的第一篇原創(chuàng)文章。

后來在工作、學(xué)習(xí)中學(xué)到新知識時,我都會盡可能地把它轉(zhuǎn)換成別人看得懂的內(nèi)容,寫到博客里。這個不起眼的開始,讓我逐漸有了解決問題后及時沉淀、分享的習(xí)慣,令我受益匪淺。

2015—2017年:明白項目迭代的全流程

在學(xué)習(xí)Android開發(fā)時,我先看了明日科技編寫的《Android從入門到精通》,然后看了校內(nèi)網(wǎng)的一些視頻,逐漸可以開發(fā)一些簡單的App。Android開發(fā)“所見即所得”的特點,讓我很快就可以得到反饋。后來我又去參加了一些地方性的Android開發(fā)比賽,獲得了名次,讓我逐漸增強了從事Android開發(fā)工作的信心。

2015年,我偶然參加了一家公司的招聘會,在面試時,面試官問了我一些簡單的與Java、Android和算法有關(guān)的問題。其中令我印象最深的就是問我會不會使用四大組件和ListView。

到公司實習(xí)后,我感觸很多:之前我都是自己拍腦袋寫一些簡單的功能代碼,沒有參照開發(fā)規(guī)范,也沒有進行工程結(jié)構(gòu)設(shè)計、系統(tǒng)設(shè)計,更沒有考慮性能是否有問題。真正參與商業(yè)項目開發(fā)后,我發(fā)現(xiàn)了自己的不足。

因此在完成工作的同時,我觀察并記錄了項目迭代的各個流程,對自己的知識結(jié)構(gòu)查漏補缺,創(chuàng)作了有關(guān)Java 源代碼分析、Android開發(fā)進階、設(shè)計模式的文章。我逐漸養(yǎng)成了定期復(fù)盤的習(xí)慣,每當(dāng)回顧過去時,我都會想想自己的成長歷程。

2017—2020年:提升復(fù)雜項目的架構(gòu)能力和做事意識

在開發(fā)第一個項目時,我基本掌握了從0到1開發(fā)一個Android App的流程,但對Android項目架構(gòu)的認(rèn)識還只停留在表面,沒有足夠多的實踐。

2017年,我開始接觸喜馬拉雅直播項目,喜馬拉雅在當(dāng)時已經(jīng)有多年的技術(shù)積累,加上直播業(yè)務(wù)比較復(fù)雜,開發(fā)團隊在架構(gòu)設(shè)計、編譯加速、快速迭代等方面都做了比較多的工作,讓我大開眼界。

為了能夠提升自己的技術(shù),在這期間我學(xué)習(xí)了很多框架的源代碼,通過分析這些框架的優(yōu)缺點、核心機制、架構(gòu)層級、設(shè)計模式,我對如何開發(fā)一個框架有了基本的認(rèn)識,也創(chuàng)作了一些文章,比如“Android 進階之路:深入理解常用框架實現(xiàn)原理”。

有了這些積累,再去實現(xiàn)復(fù)雜業(yè)務(wù)需求、基礎(chǔ)框架抽取、內(nèi)部SDK(Software Development Kit,軟件開發(fā)工具包)和性能優(yōu)化,就容易多了。

在實現(xiàn)一些需求或者遇到復(fù)雜的問題時,我會先想想之前看的第三方框架或者系統(tǒng)源代碼里有沒有類似的情況,它們是怎么處理的。

除了技術(shù)上的提升,在這幾年里,我的項目全局思考能力也提升很多。

由于我的溝通能力較強,領(lǐng)導(dǎo)讓我擔(dān)任一個10人小組的組長,負(fù)責(zé)跟進項目的需求提出、開發(fā)、測試、上線、運營等各個環(huán)節(jié),保證項目及時交付并快速迭代。

一開始我有一些不習(xí)慣,因為寫代碼時總是被打斷,比如被產(chǎn)品需求評審、測試 bug 反饋、運營反饋線上數(shù)據(jù)有問題等事情打斷,也經(jīng)常剛想清楚代碼怎么寫,正準(zhǔn)備動手,就被叫去開會,回來后只能重新尋找思路。

后來在和領(lǐng)導(dǎo)溝通、看一些書和文章后,我逐漸對寫代碼和做事情有了不同的認(rèn)識。代碼只是中間產(chǎn)物,最終我們還是要設(shè)計出對用戶有價值的產(chǎn)品,要做到這個,除了關(guān)注代碼,還需要關(guān)注其他很多方面。

2020年至今:深入理解底層技術(shù)

在進入字節(jié)跳動做基礎(chǔ)技術(shù)開發(fā)后,我的技術(shù)視野再一次得以拓寬。

字節(jié)跳動有多款億級用戶的產(chǎn)品,其中復(fù)雜的業(yè)務(wù)常常會產(chǎn)生各種令人意想不到的問題,這些問題需要技術(shù)人員深入理解底層技術(shù),對Android系統(tǒng)的整個架構(gòu)都比較熟悉,才能夠解決。

問題驅(qū)動是非常好的學(xué)習(xí)方式。每次幫助業(yè)務(wù)方解決一個新問題,我的知識庫都會豐富一些,這讓我非常興奮。之前我不知道學(xué)來干什么的Linux編程、Android虛擬機,后來終于在實際問題中弄清楚了它們的使用場景,繼續(xù)深入學(xué)習(xí)的效率也高了很多。

對軟件開發(fā)的認(rèn)識

前面講了個人的一些經(jīng)歷,接下來講我從這些經(jīng)歷中沉淀出的有價值的結(jié)論,主要包括對下面兩點的認(rèn)識。

職業(yè)發(fā)展的不同階段。

技術(shù)的價值。

職業(yè)發(fā)展的不同階段

我們在工作時,要對自己做的事有清晰的認(rèn)識,包括它大概屬于哪一個階段,怎樣可以做得更好。結(jié)合我這些年的工作內(nèi)容和業(yè)內(nèi)“大佬”所做的事情,我把軟件開發(fā)者的職業(yè)發(fā)展分為以下幾個階段。

第一個階段就是使用某個技術(shù)方向的一個點完成業(yè)務(wù)需求。比如Android開發(fā)者可以使用Android SDK自定義布局,完成產(chǎn)品要求的界面功能。這個階段的工作內(nèi)容比較簡單,開發(fā)者只要能仔細(xì)學(xué)習(xí)官方文檔或者看一些書就可勝任。

第二個階段開發(fā)者做的項目更加復(fù)雜,會涉及某個技術(shù)方向的多個點,這時開發(fā)者需要把這些點連起來,提供一個更加體系化的解決方案。

比如Android開發(fā)者在自定義布局時,發(fā)現(xiàn)頁面卡頓,要解決這個問題,開發(fā)者就要去了解這個自定義View的哪些代碼影響了這個頁面的刷新速度。這時開發(fā)者需要去研究渲染的基本原理,開發(fā)分析卡頓的工具,找到卡頓的原因,進行優(yōu)化。在這個過程中,開發(fā)者會對流暢性有整體的認(rèn)識,能夠?qū)ο嚓P(guān)問題有比較全面的分析思路、解決手段,從而可以開發(fā)相關(guān)的分析工具或優(yōu)化庫。如果能做到這一點,開發(fā)者基本上就是一名高級工程師了,不僅能做一個模塊,還能夠負(fù)責(zé)一個具體細(xì)分方向的工作。

第三個階段是掌握某個技術(shù)方向的通用知識,有多個線的實踐,能夠連線為面,同時給工作做中長期的技術(shù)規(guī)劃。

拿Android開發(fā)者來說,剛才提到通過解決卡頓問題,在流暢性方面開發(fā)者會有比較多的實踐;如果又發(fā)現(xiàn)內(nèi)存有問題,開發(fā)者會去了解內(nèi)存分配、回收原理,開發(fā)出內(nèi)存分析優(yōu)化工具,這樣就有了內(nèi)存的體系化的實踐;再積累一些針對啟動速度、包大小等的優(yōu)化經(jīng)驗。把這些線連起來,就得到了一個性能監(jiān)控平臺,這就是把多條線連成一個面。

再往前發(fā)展就不是只做技術(shù),而是要更多地思考業(yè)務(wù)。技術(shù)最終都是為業(yè)務(wù)服務(wù)的。職業(yè)發(fā)展的第四個階段,就是不局限于某個技術(shù)方向,能夠從產(chǎn)品的業(yè)務(wù)規(guī)劃、業(yè)務(wù)指標(biāo)出發(fā),為產(chǎn)品提供技術(shù)支持。

你首先要明白公司業(yè)務(wù)的核心指標(biāo)是什么,比如一個短視頻App,它的核心指標(biāo)除了常規(guī)的日活躍用戶數(shù)(以下簡稱日活)、用戶量,還包括視頻的播放率、用戶的停留時長、頁面滲透率等。了解這些指標(biāo)以后,你要思考做什么可以有助于公司提升這些指標(biāo),結(jié)合業(yè)務(wù)的核心指標(biāo)反思當(dāng)前的項目中哪里存在優(yōu)化空間。

總結(jié)我對職業(yè)發(fā)展的不同階段的認(rèn)識:第一個階段只做一些具體的點;第二個階段做多個點,需要能夠連點成線;第三個階段需要圍繞這些線提煉出通用的知識,再做到對業(yè)務(wù)/技術(shù)項目有整體的認(rèn)識;第四個階段能夠從業(yè)務(wù)規(guī)劃、業(yè)務(wù)指標(biāo)出發(fā),為產(chǎn)品提供技術(shù)支持。

技術(shù)的價值

說完職業(yè)發(fā)展的不同階段,接下來聊技術(shù)的價值。技術(shù)是為業(yè)務(wù)服務(wù)的。業(yè)務(wù)處于不同階段時,技術(shù)的價值也有所不同。

◆業(yè)務(wù)從0到1時

我剛畢業(yè)時所在的公司業(yè)務(wù)處于確定模式階段,業(yè)務(wù)上反復(fù)試錯,項目常常推倒重來,在這個階段我們做什么能讓公司業(yè)務(wù)變得更好呢?

第一,盡可能地抽取出相似點,減少重復(fù)成本。

如果產(chǎn)品經(jīng)理每次都對你提出相似的需求,你可以考慮如何把這些相似的需求抽象成一些可以復(fù)用的邏輯,做一個基本的框架,然后在下次開發(fā)的時候能夠直接復(fù)用框架,而不是每次都從頭開始開發(fā)。我平時工作中也常常問自己:“我現(xiàn)在做的事哪些是重復(fù)的,哪些是可以下沉的?”

第二,提供便捷的數(shù)據(jù)反饋機制。

在產(chǎn)品經(jīng)理提需求時,我們可以問問他這個需求出于什么考慮,有沒有數(shù)據(jù)支撐。比如說產(chǎn)品需求是將某個按鈕換一個位置,那我們要清楚原因,在換完之后會使頁面打開率提升嗎?這種數(shù)據(jù)驅(qū)動的理念對個人和公司業(yè)務(wù)都大有裨益。

在業(yè)務(wù)從0到1這個階段,技術(shù)對業(yè)務(wù)的價值是幫助業(yè)務(wù)快速確定模式。那在業(yè)務(wù)從1到100這個階段技術(shù)的價值是什么呢?

◆業(yè)務(wù)從 1 到 100 時

業(yè)務(wù)正在快速擴大規(guī)模時,需要把當(dāng)前跑通的業(yè)務(wù)模式復(fù)制到更多的地方,同時能夠服務(wù)更多的用戶。在這個階段中,技術(shù)能夠提供的價值主要有以下兩點。

第一,快速迭代。

雖然快速迭代是在業(yè)務(wù)的各個階段都需要做到的,但和業(yè)務(wù)從 0 到 1 相比,業(yè)務(wù)從 1 到 100 的階段會有更多的挑戰(zhàn),除了個人速度要快,更要關(guān)注團隊的速度。具體到Android項目,幾十甚至上百人共同開發(fā)的項目和三兩個人開發(fā)的項目相比,其復(fù)雜度可能會高幾百倍。

團隊人數(shù)增多后可能會出現(xiàn)以下幾個問題。

多人協(xié)作編寫的代碼有沖突。

發(fā)布速度慢。

問題的影響大,不好定位。

針對這些問題,這個階段我們可以做如下操作。

下沉基礎(chǔ)組件,定義組件規(guī)范,收斂核心流程。

拆分業(yè)務(wù)模塊,設(shè)計業(yè)務(wù)模板,單獨維護迭代。

探索適合業(yè)務(wù)的新方式。

第二,提升質(zhì)量。

和日活為幾萬的產(chǎn)品相比,日活上千萬甚至上億的產(chǎn)品,質(zhì)量問題更加顯著。在開發(fā)時,我們不僅要實現(xiàn)功能,還要能夠?qū)懞霉δ埽軌蛄私獾讓釉恚拍軕?yīng)對這樣大的業(yè)務(wù)量。為了避免經(jīng)常在重復(fù)的問題上浪費時間,我們需要學(xué)會從問題中找到共通點,提煉出可以用于多處的解決思路,輸出工具、解決方案甚至平臺。

這就需要我們有意識地在問題中磨煉本領(lǐng),主動站在更高的層面思考自己應(yīng)該具備的能力。在解決問題的時候,除了解決當(dāng)下的這個問題,更需要做的是把這個問題解構(gòu)、歸類,抽象出不同問題的相似點和差異,得出問題分析流程圖。

結(jié)束語

有人總結(jié)了人生的多重境界:看山是山,看水是水;看山不是山,看水不是水;看山還是山,看水還是水。

我想,我對軟件開發(fā)的認(rèn)識還沒有達到第三層,但,怕什么真理無窮,進一寸有一寸的歡喜!

主站蜘蛛池模板: 格尔木市| 满城县| 麟游县| 丰宁| 扎赉特旗| 墨江| 青川县| 尼木县| 民县| 洪雅县| 温州市| 高清| 洪江市| 吉林市| 南充市| 忻州市| 兴仁县| 滦南县| 余干县| 甘德县| 韶山市| 靖州| 微山县| 宝坻区| 伊宁市| 滨州市| 武冈市| 富顺县| 南华县| 富平县| 陇南市| 牟定县| 开封县| 安远县| 通州市| 南康市| 卓资县| 洪洞县| 三台县| 从江县| 织金县|