來新公司三個(gè)月了,提前一個(gè)月轉(zhuǎn)正遵堵,總體上都進(jìn)入了正軌箱玷,我的工作因?yàn)槭窃诩軜?gòu)組工作,所以技術(shù)的沉淀也是工作的一部分陌宿。這幾個(gè)月的學(xué)習(xí)工作锡足,讓我對(duì)自己的行業(yè)有了更深的理解,對(duì) Android 壳坪,對(duì)團(tuán)隊(duì)舶得,和對(duì)技術(shù),都得到了一些以前從來沒有過的理解爽蝴。
業(yè)務(wù)還是架構(gòu)
作為一個(gè)移動(dòng)端開發(fā)工程師沐批,如果是單純的做 UI ,那么工作將會(huì)比較繁瑣和枯燥蝎亚,而且重復(fù)性工作也比較多九孩,對(duì)于技術(shù)的提升也比較有限,作為移動(dòng)端開發(fā)工程師的初期发框,確實(shí)是需要大量的業(yè)務(wù)代碼作為練手躺彬。作為個(gè)人發(fā)展來看,如果你是喜歡產(chǎn)品梅惯,對(duì)產(chǎn)品本身很感興趣宪拥,那么 UI 開發(fā)可能是你需要多多關(guān)注的。你可以多學(xué)習(xí)一些炫酷特效的制作铣减,那么自定義 View 這類的知識(shí)就特別重要她君。當(dāng)然一些設(shè)計(jì)元素也是你需要關(guān)注的,Andorid 和設(shè)計(jì)相關(guān)的一些技術(shù)方面就有不少葫哗,比如 Material Design 和 Lottie缔刹。
如果你對(duì)技術(shù)本身很感興趣,那么劣针,可能源碼是你的伙伴桨螺。曾經(jīng)我也是一直在寫這些業(yè)務(wù)和 UI,但來了我們公司酿秸,我作為一個(gè)架構(gòu)組開發(fā)成員灭翔,業(yè)務(wù)上的開發(fā)任務(wù)不是很多,對(duì)于我來說是一個(gè)新的挑戰(zhàn)「蜗洌可是我們是小公司哄褒,肯定不能像 BAT 那樣,你做架構(gòu)開發(fā)的煌张,只需要考慮自己的那部分架構(gòu)代碼就行了呐赡,至于業(yè)務(wù)程序員怎么用,我們不用關(guān)心骏融。簡而言之就是造輪子链嘀。在我們公司,因?yàn)殚_發(fā)人員不多档玻,而且這種架構(gòu)組業(yè)務(wù)組分布式開發(fā)的開發(fā)模式還不夠完善怀泊,大家都比較忙,都有自己需要做的活误趴,所以即便作為架構(gòu)組霹琼,開發(fā)好了一個(gè)「輪子」,Leader 也會(huì)要求你把輪子使用到業(yè)務(wù)中凉当,這就會(huì)產(chǎn)生一個(gè)問題:往往架構(gòu)開發(fā)人員不一定對(duì)某一塊業(yè)務(wù)代碼比較熟悉枣申,那么去使用自己造的輪子的時(shí)候,首先得先熟悉一下別人寫的業(yè)務(wù)代碼看杭。這是一個(gè)非常消耗時(shí)間和經(jīng)歷的過程忠藤,甚至在開發(fā)和理解對(duì)方代碼的過程中也需要讓對(duì)方來協(xié)助開發(fā)。
看懂業(yè)務(wù)代碼不一定會(huì)對(duì)你的技術(shù)提升有多少幫助楼雹,但肯定是對(duì)你日后的工作是有幫助的模孩,我自然是明白這種道理。但客觀的說烘豹,這種模式的開發(fā)效率并不高瓜贾,但在中小型互聯(lián)網(wǎng)公司中诺祸,又是很難統(tǒng)籌的一件事携悯,大家都有很多工作要做,業(yè)務(wù)開發(fā)人員也會(huì)有集中的開發(fā)任務(wù)筷笨,作為架構(gòu)組成員憔鬼,正好也可以通過這個(gè)機(jī)會(huì)熟悉一下項(xiàng)目的代碼。
在一次版本總結(jié)會(huì)中胃夏,我針對(duì)這個(gè)問題也和 Leader 交流過轴或。我認(rèn)為架構(gòu)組的服務(wù)對(duì)象就是業(yè)務(wù)組的程序員,我們?cè)斐鰜淼妮喿有枰尨蠹曳奖愕脑跇I(yè)務(wù)中使用仰禀,能夠更加清晰將業(yè)務(wù)邏輯和一些服務(wù)架構(gòu)劃分開來照雁,幫助團(tuán)隊(duì)更加高效和有層次性的開發(fā)。所以架構(gòu)組成員在做好輪子以后答恶,一定要花精力去詳細(xì)書寫一段 API 使用文檔饺蚊,并在業(yè)務(wù)程序員開發(fā)使用的時(shí)候給予一定指導(dǎo)萍诱。如果項(xiàng)目情況特殊,要求架構(gòu)組成員自己將輪子使用到業(yè)務(wù)中污呼,那么原生業(yè)務(wù)開發(fā)成員一定要對(duì)接好裕坊,將架構(gòu)組成員修改過的業(yè)務(wù)代碼重新 review 一遍,這本身也是對(duì)輪子熟悉的過程燕酷,也是架構(gòu)成員對(duì)業(yè)務(wù)熟悉的過程籍凝。
開發(fā)模式
這三個(gè)月,我最重要的一個(gè)開發(fā)任務(wù)就是將現(xiàn)有的項(xiàng)目進(jìn)行分層化和模塊化苗缩。
分層化就是將項(xiàng)目整體分層饵蒂,從底向上逐步和業(yè)務(wù)靠近。比如挤渐,我們項(xiàng)目從上往下現(xiàn)在被分為 4 個(gè)模塊:
- 設(shè)備服務(wù)層
- 基礎(chǔ)服務(wù)層
- 功能模塊層
- 業(yè)務(wù)邏輯層
4 個(gè)模塊從最底層到最上層苹享,是一個(gè)依次服務(wù)的關(guān)系。
比如浴麻,設(shè)備服務(wù)層里面是一些獲取設(shè)備基礎(chǔ)信息的一些工具類和方法得问,例如獲取 CPU 型號(hào),系統(tǒng)版本软免,屏幕寬高等宫纬。這一層的類和方法可以單獨(dú)抽離出來上傳到 Maven 庫中供以后所有的項(xiàng)目使用,具有很強(qiáng)的同質(zhì)化能力膏萧。下一層的基礎(chǔ)服務(wù)層也有這樣的特性漓骚。
基礎(chǔ)服務(wù)層是一些常規(guī)的公共工具類和方法,例如獲取時(shí)間榛泛、地點(diǎn)蝌蹂、網(wǎng)絡(luò)狀態(tài)一類的工具。
功能模塊層實(shí)際上已經(jīng)和業(yè)務(wù)有一定掛鉤能力了曹锨,但為了和業(yè)務(wù)解耦孤个,所以一些在項(xiàng)目中比較重要的或者使用比較頻繁的功能模塊就得單獨(dú)抽離。往往一個(gè)互聯(lián)網(wǎng)產(chǎn)品公司如果有多個(gè)移動(dòng)端 App 項(xiàng)目沛简,往往他們功能上都有一定的重合性齐鲤,那么這部分重合功能的封裝就可以作為一個(gè)獨(dú)有的功能模塊抽離出來,并同步進(jìn)行開發(fā)和版本管理椒楣。舉個(gè)例子给郊,我們公司是一個(gè)互聯(lián)網(wǎng)金融公司,公司會(huì)關(guān)注一些行情和指數(shù)捧灰,這些指數(shù)通過一個(gè)展示界面進(jìn)行實(shí)時(shí)更新數(shù)據(jù)淆九,這些報(bào)價(jià)數(shù)據(jù)需要和服務(wù)端維持一個(gè)TCP 長連接,那么這個(gè) Tcp 長連接對(duì)于我們公司來說就是一個(gè)非常重要的功能模塊,把它抽離出來單獨(dú)管理不僅可以幫助項(xiàng)目進(jìn)行解耦也可以讓功能模塊開發(fā)者更好的管理自己的模塊炭庙。
業(yè)務(wù)邏輯層就是最上層的業(yè)務(wù)代碼了跪另,它使用下層的那些分層和模塊來進(jìn)行業(yè)務(wù)開發(fā),如果分層化和模塊化做的好煤搜,業(yè)務(wù)邏輯層開發(fā)將會(huì)少走很多坑免绿。當(dāng)然不是說業(yè)務(wù)邏輯層就不需要一些架構(gòu)上的整理,這兩年 Android 的 MVP 和 MVVM 就是業(yè)務(wù)層架構(gòu)上面的優(yōu)化擦盾。實(shí)際上業(yè)務(wù)邏輯層是一個(gè)項(xiàng)目中花時(shí)間最多的地方嘲驾,如果想提高業(yè)務(wù)層的開發(fā)效率,除了一些團(tuán)隊(duì)統(tǒng)籌上的要求以外迹卢,代碼的規(guī)范性和良好的設(shè)計(jì)性也是非常重要的辽故。項(xiàng)目中有一些地方的數(shù)據(jù)結(jié)構(gòu)在多線程情況下非常容易出問題,然后我就試圖改變一下這些 Map 的數(shù)據(jù)結(jié)構(gòu)腐碱,但發(fā)現(xiàn)項(xiàng)目中的所有變量聲明和方法參數(shù)的調(diào)用都是用具體類誊垢,比如 HashMap,ArrayList症见。如果我改一個(gè)地方喂走,所有地方的參數(shù)都得改動(dòng),總而言之就是代碼沒有遵守良好的設(shè)計(jì)模式谋作,平時(shí)開發(fā)中一定要注意利用好里氏替換并注意寫的一些調(diào)用方法要遵循開閉原則芋肠。
在給項(xiàng)目做分層化和模塊化的過程中,團(tuán)隊(duì)要求使用 Maven 來管理這些 Library遵蚜,可以具備一定的代碼安全帖池,并且可以緩解項(xiàng)目中有大量 library 在目錄中的情況。之前通過 module 方式管理這些子模組有一個(gè)非常大的問題就是版本控制吭净,Git 上管理依賴子模組有一定的難度睡汹,如果開發(fā)組的小伙伴對(duì) Git 子模組理解不深,在協(xié)同開發(fā)的時(shí)候就會(huì)經(jīng)常出現(xiàn)版本控制上的問題寂殉。
不過有利就有弊囚巴,用 Maven 開發(fā)的話如果需要和業(yè)務(wù)代碼協(xié)同測試,那么你每次修改過之后都需要上傳一個(gè) snapshot 版本不撑,然后再通過改變項(xiàng)目中 gradle 文件的 compile 代碼來進(jìn)行測試文兢,我們知道晤斩,如果你修改了 gradle 文件焕檬,那么你就無法使用一系列增量編譯來提高編譯速度,然而在項(xiàng)目體量很大的時(shí)候澳泵,如果你每次改動(dòng)都要通過全量編譯來測試代碼实愚,那么開發(fā)效率只能用令人發(fā)指來形容,每天在編譯上花的時(shí)間就要超過 1 小時(shí),這是難以接受的效率犧牲腊敲。所以現(xiàn)在還在想辦法击喂,看看有沒有更好的優(yōu)化方案。
對(duì)自身技術(shù)沉淀的思考
最近碰辅,在技術(shù)圈懂昂,深度學(xué)習(xí),人工智能没宾,機(jī)器學(xué)習(xí)是目前最前沿和最火熱的技術(shù)凌彬,毫無疑問是未來十年計(jì)算機(jī)科學(xué)的風(fēng)向標(biāo),老實(shí)說循衰,移動(dòng)端已經(jīng)走向了下坡路铲敛,我身為一個(gè)移動(dòng)端開發(fā)工程師,如果說沒有被這些客觀因素影響到心態(tài)那是不可能的会钝,我也做了思考伐蒋,有了一些自己的想法。
最近阿里巴巴又辦成了不少大事迁酸,似乎馬云曾經(jīng)所期待的那種社會(huì)正在慢慢的實(shí)現(xiàn)先鱼。阿里巴巴先是在幾天內(nèi)分別和天津、福州簽訂了協(xié)議奸鬓,進(jìn)行無現(xiàn)金城市的推進(jìn)型型,然后又規(guī)劃了無人售賣咖啡廳和無人售賣超市∪看到阿里巴巴做的這些闹蒜,我深深的感受到了震撼和激動(dòng),這是一個(gè)真正走在時(shí)代前沿的企業(yè)抑淫,它所做的一切已經(jīng)脫離了一個(gè)資本企業(yè)傳統(tǒng)的運(yùn)營意圖绷落,而是往更高的立意和角度上靠攏,它在為人類發(fā)展始苇,社會(huì)進(jìn)步而努力砌烁。阿里已經(jīng)和亞馬遜、谷歌這類巨頭公司一樣催式,引領(lǐng)著人類社會(huì)的進(jìn)步函喉。
我心想這真棒啊,如果我寫的程序荣月,我研究的技術(shù)能夠?yàn)檫@個(gè)社會(huì)管呵,為人類的進(jìn)步帶來如此大的改變,甚至不要求有這種巨變哺窄,只要能稍微的貢獻(xiàn)一點(diǎn)力量捐下,然后通過身邊生活的變化账锹,感受到自己的貢獻(xiàn),這真是一種奇妙的感覺坷襟。這幾天我好像著了魔奸柬,越來越期待能夠有這樣的機(jī)會(huì)和能力了。
但回到現(xiàn)實(shí)婴程,做移動(dòng)端好像很難具備這樣的能力廓奕,現(xiàn)在做的事實(shí)際上是為公司服務(wù),是為老板服務(wù)档叔,或者是為客戶服務(wù)懂从,雖然也給這些人的生活帶來了一定的改變,但這樣的改變有限蹲蒲,立場也是沒有那么的高大上番甩。有那么一瞬間,我甚至有點(diǎn)失落届搁。但我后來經(jīng)過深思熟慮我才領(lǐng)悟到缘薛,沒有人能一蹴而就的,即便是那些已經(jīng)在做深度學(xué)習(xí)卡睦,人工智能那些人宴胧,他們也一定經(jīng)歷過慢長而枯燥的積淀過程。而我現(xiàn)在做的表锻,并不是像我上面想象的那樣狹窄恕齐。
我可以通過深入的學(xué)習(xí) Android 的各種技術(shù),從 UI 到架構(gòu)再到 framework 瞬逊,這本身就是一個(gè)龐大的知識(shí)體系显歧,實(shí)際上我現(xiàn)在連滄海一粟都沒看到,一個(gè)事情做精才能有所作為确镊,所謂的移動(dòng)端不火熱士骤,需求飽和,實(shí)際上只是針對(duì)初級(jí)工程師的蕾域,高級(jí) Android 工程師的需求量依然很大拷肌,他們?cè)诠镜牡匚灰卜浅8摺旨巷?偠灾拊担覒?yīng)該珍惜現(xiàn)在的工作,并且繼續(xù)不斷的在這個(gè)領(lǐng)域上努力采呐。
同時(shí)若锁,在技術(shù)界,不斷的追趕時(shí)代的潮流永遠(yuǎn)是對(duì)的懈万。我現(xiàn)在已經(jīng)在學(xué) Kotlin 了拴清,并且下周就會(huì)有 Kotlin 的開發(fā)任務(wù),這是我們團(tuán)隊(duì)第一次嘗試会通,Leader 也把這個(gè)光榮的任務(wù)交給了我口予,讓我先行一步。我現(xiàn)在還在研究 Java 并發(fā)編程和 JVM涕侈,爭取能夠把項(xiàng)目上所有并發(fā)問題進(jìn)行大包大攬式的處理沪停。JVM 的學(xué)習(xí)也會(huì)讓我對(duì)系統(tǒng)和虛擬機(jī)的理解更深一步,幫助我擴(kuò)展在寫代碼時(shí)候的思維廣度裳涛,寫出更高效的代碼木张。同時(shí)也為我以后研究 framework 打下堅(jiān)實(shí)的虛擬機(jī)技術(shù)基礎(chǔ)。
最讓我感覺開心的是端三,我已經(jīng)開始學(xué)習(xí)深度學(xué)習(xí)舷礼。我享受鉆研數(shù)學(xué)和算法的過程,我真實(shí)的感受到郊闯,我正在進(jìn)入一個(gè)技術(shù)學(xué)習(xí)上的良性循環(huán)妻献,學(xué)習(xí)使我快樂,因?yàn)楂@取了快樂团赁,所以我更希望學(xué)習(xí)育拨。
聽說程序員身上蘊(yùn)含著很強(qiáng)大的力量,他能通過手中的鍵盤改變世界欢摄。不知道從什么時(shí)候開始熬丧,改變世界,真的成為了我的夢想怀挠。