最近有一些開發(fā)朋友問我砖织,應(yīng)該怎樣提升自己的能力垢村?
回想起來做了這么久 iOS 開發(fā),我也有過那種“讓我做一個(gè)功能實(shí)現(xiàn)個(gè)需求我會做馋艺,但接下來怎樣提高我不知道”的時(shí)期栅干。
這里嘗試列一下 iOS 開發(fā)的相關(guān)技術(shù),再說說在學(xué)習(xí)進(jìn)階上我的一些想法捐祠。
一碱鳞、iOS 技術(shù)棧
這里按我的理解給 iOS 相關(guān)技術(shù)分個(gè)類,以工程實(shí)現(xiàn)的角度踱蛀,分成了基礎(chǔ)窿给、需求、效率率拒、質(zhì)量四個(gè)類別崩泡。
基礎(chǔ),指程序開發(fā)和 iOS 開發(fā)的基礎(chǔ)知識和技能俏橘,需求就是產(chǎn)品的需求,有了基礎(chǔ)技能圈浇,實(shí)現(xiàn)了產(chǎn)品需求后寥掐,剩下的事情就都是為了提高項(xiàng)目質(zhì)量和提升開發(fā)效率。
大致的思維導(dǎo)圖:
1.基礎(chǔ)
基礎(chǔ)包括語言磷蜀、框架召耘、內(nèi)存、網(wǎng)絡(luò)褐隆、存儲污它、渲染、線程庶弃。
語言衫贬,目前 iOS 開發(fā)就是 OC 和 Swift,國內(nèi)仍以 OC 為主歇攻,對于 OC 除了語法外固惯,最好了解它的對象模型,動(dòng)態(tài)機(jī)制等特性缴守。Swift 方面若要在團(tuán)隊(duì)里使用葬毫,目前還是風(fēng)險(xiǎn)大收益小的镇辉,但個(gè)人最好保持對它的關(guān)注。
框架贴捡,就是 Foundation / UIKit 以及蘋果系統(tǒng)封裝好的各種框架忽肛,F(xiàn)oundation 和 UIKit 每個(gè)做 iOS 開發(fā)的人都熟知這套,iOS 功能越來越多烂斋,蘋果提供的框架也越來越多屹逛,像 StoreKit / MessageUI / AVFoundation 等可以在使用到再去了解。
接著源祈,是客戶端里最常見流程里的四個(gè)關(guān)鍵部分:從網(wǎng)絡(luò)拉取數(shù)據(jù)煎源,存儲到本地文件系統(tǒng),再從本地取出來放進(jìn)內(nèi)存香缺,最后渲染出來手销。而這里所有的處理都在操作系統(tǒng)的進(jìn)程和線程中執(zhí)行。
網(wǎng)絡(luò)方面图张,若要深入的話內(nèi)容很多锋拖,客戶端一般只需要關(guān)心 http / https / dns 這幾個(gè)協(xié)議,了解 https 的原理祸轮,處理運(yùn)營商劫持 dns 劫持等情況兽埃,另外需要處理好各種異常情況做好重試機(jī)制,iOS 作為移動(dòng)端網(wǎng)絡(luò)不穩(wěn)定适袜,要看情況優(yōu)化弱網(wǎng)絡(luò)下的連接柄错,做好離線機(jī)制,以及注意避免耗費(fèi)太多流量苦酱。還有客戶端跟后臺的通信協(xié)議售貌,數(shù)據(jù)結(jié)構(gòu)一般用 json 或 protobuf,由于客戶端本地會保存一部分內(nèi)容疫萤,很多 APP 都會需要做數(shù)據(jù)的增量更新颂跨。
存儲方面,主要是 sqlite扯饶,sqlite 作為存儲引擎是大多數(shù) APP 的核心恒削,也是性能優(yōu)化的關(guān)鍵點(diǎn),最基本的需要知道主鍵索引事務(wù)等數(shù)據(jù)庫基本概念尾序,再深入需要了解具體的存儲機(jī)制/索引的實(shí)現(xiàn)/sqlite的七層結(jié)構(gòu)等钓丰,才能在遇到問題時(shí)找到最佳的解決方案∶勘遥客戶端上 nosql 用得較少斑粱,除了 sqlite 一般就剩單文件存儲,XML存文件或?qū)ο笮蛄谢啥M(jìn)制存儲脯爪,也是常用的存儲方式则北,近期有 realm 這種新型數(shù)據(jù)庫矿微,也值得了解一下。
內(nèi)存方面尚揣,需要了解 OC 的引用計(jì)數(shù)涌矢、 ARC 機(jī)制、自動(dòng)釋放池等相關(guān)點(diǎn)快骗,最好其他語言的垃圾回收機(jī)制也有所了解娜庇,另外需要注意避免內(nèi)存泄露,管理好客戶端的緩存方篮,避免緩存太多導(dǎo)致OOM名秀,或緩存命中率太低性能低下。
渲染方面主要是文字和圖像藕溅,基礎(chǔ)上文字方面 UIKit 已封裝得很好匕得,CoreText也提供了更自由的排版渲染方式,圖像渲染只需要注意解壓時(shí)機(jī)巾表,再深入需要了解 iOS 具體的渲染機(jī)制汁掠,像圖層混合,渲染時(shí)機(jī)集币,離屏渲染等考阱,才好做更多的優(yōu)化。
線程和進(jìn)程方面鞠苟,iOS 開發(fā)只在做 Extension 時(shí)才需要考慮到進(jìn)程乞榨,一般只需處理好線程,需要了解主線程子線程当娱,多線程并發(fā)鎖競爭吃既,死鎖,GCD趾访,Runloop 等知識點(diǎn)态秧。
2. 需求
需求方面姑且概括為普通需求董虱、特殊需求和運(yùn)營需求扼鞋。
普通需求就是上面提到的網(wǎng)絡(luò)拉數(shù)據(jù)->存儲->讀取->展示,大多數(shù) APP 主要都是在實(shí)現(xiàn)這類需求愤诱,熟悉上述的基礎(chǔ)知識后就能輕易實(shí)現(xiàn)云头。
特殊需求是指一些特定 APP 的需求,像瀏覽器內(nèi)核淫半,文字排版引擎溃槐,音視頻和圖像處理引擎,圖標(biāo)繪制引擎等科吭,要求較高昏滴,都需要在相關(guān)領(lǐng)域里較深入的鉆研才能做好猴鲫。
運(yùn)營需求是 APP 上線后持續(xù)運(yùn)營過程中的需求,包括功能動(dòng)態(tài)化谣殊,可以隨時(shí)增刪改線上的功能拂共,一般這塊由內(nèi)嵌 web 承擔(dān)。配置系統(tǒng)也算動(dòng)態(tài)化的一種姻几,可以通過各種開關(guān)控制展現(xiàn)的功能宜狐。
統(tǒng)計(jì)系統(tǒng)記錄 APP 各項(xiàng)運(yùn)營數(shù)據(jù),包括用戶增長情況蛇捌,留存率抚恒,功能使用情況等。事件流可以清楚看到用戶在 APP 里的使用流程络拌。有些 APP 還會開發(fā)推薦系統(tǒng)俭驮,根據(jù)收集來的數(shù)據(jù)給不同用戶推送不同內(nèi)容,提高用戶轉(zhuǎn)化率等盒音。
3. 質(zhì)量
越大的 APP 會花越多的精力在保證和提高 APP 質(zhì)量上表鳍,包括性能優(yōu)化,搭建監(jiān)控體系祥诽,提升代碼質(zhì)量譬圣,保證安全,以及通過測試保證質(zhì)量雄坪。
性能優(yōu)化范圍很大厘熟,在網(wǎng)絡(luò)/存儲/內(nèi)存/渲染/算法各方面都有優(yōu)化的可能,一般性能上的優(yōu)化可以分成三步走维哈,一是檢測各方面的數(shù)據(jù)绳姨,量化運(yùn)行性能,二是從中找到性能瓶頸阔挠,三是找辦法優(yōu)化飘庄,用第一步的數(shù)據(jù)驗(yàn)證優(yōu)化效果。
監(jiān)控體系在面向大眾用戶的產(chǎn)品里無論是前端后端一直都是非常重要的购撼,你需要時(shí)刻知道用戶在使用你的產(chǎn)品過程中有沒有發(fā)生什么問題跪削,讓你的 APP 處于可知可控狀態(tài)。
客戶端最常見的監(jiān)控點(diǎn)是 crash迂求,這個(gè)無需多說碾盐,另外一般對于 APP 里的錯(cuò)誤碼,包括本地錯(cuò)誤揩局、網(wǎng)絡(luò)錯(cuò)誤等都需要監(jiān)控起來毫玖,這樣在出現(xiàn)異常時(shí)才能即時(shí)得知進(jìn)行處理。
其他通用的監(jiān)控包括卡頓監(jiān)控、數(shù)據(jù)庫監(jiān)控付枫、流量消耗監(jiān)控烹玉、內(nèi)存消耗監(jiān)控、各種耗時(shí)監(jiān)控等等阐滩,還有各類業(yè)務(wù)相關(guān)的監(jiān)控春霍,越大的 APP 監(jiān)控的項(xiàng)目就越多越細(xì)致,目的都是及時(shí)發(fā)現(xiàn)問題叶眉,以及衡量 APP 的質(zhì)量址儒。
除了監(jiān)控問題外,這里還需要做好出錯(cuò)時(shí)的補(bǔ)救措施衅疙,可以通過預(yù)埋功能開關(guān)配置或接入熱修復(fù)的庫去做莲趣。
安全方面,客戶端上安全的分量相對于服務(wù)端是少很多饱溢,尤其是在 iOS 系統(tǒng)沙盒機(jī)制的保護(hù)下喧伞,本身已經(jīng)比較安全,最需要注意的是網(wǎng)絡(luò)傳輸?shù)陌踩ɡ桑苊饩W(wǎng)絡(luò)傳輸內(nèi)容被篡改潘鲫,或泄露了用戶名密碼等敏感信息。對于代碼里有機(jī)密信息的可以考慮混淆代碼對 APP 進(jìn)行加固肋杖,減少被破解的概率溉仑。
代碼質(zhì)量主要存在于團(tuán)隊(duì)協(xié)作上,一般團(tuán)隊(duì)都會定義代碼規(guī)范状植,讓大家的代碼風(fēng)格趨于一致浊竟,有些會開發(fā)代碼規(guī)范檢測工具,確保提交的代碼遵循代碼規(guī)范津畸。另外很多團(tuán)隊(duì)都會實(shí)行 code review 機(jī)制振定,互相查看代碼,減少臟亂差代碼出現(xiàn)的概率肉拓,具體 review 機(jī)制各有不同后频。
測試是一個(gè)專業(yè),國內(nèi)終端產(chǎn)品因?yàn)榈炫荆R姷氖呛诤袦y試卑惜,雖然不能保證無問題,但成本低效率高丧肴,部分穩(wěn)定的核心功能會做單元測試残揉,也有一些團(tuán)隊(duì)所有業(yè)務(wù)功能都做自動(dòng)化測試的胧后。
4. 效率
客戶端的架構(gòu)可以說都是為了提高開發(fā)協(xié)作效率芋浮,因?yàn)楣δ芸梢杂煤芏喾N方法實(shí)現(xiàn),可以不需要什么架構(gòu),無論是大型還是小型 APP 都可以按一套來實(shí)現(xiàn)纸巷,只不過差的架構(gòu)在中大型 APP 上代碼會很混亂镇草,導(dǎo)致在開發(fā)/協(xié)作/debug上效率會越來越低,好的架構(gòu)則會提升這里的效率瘤旨。大多數(shù)架構(gòu)都是分層抽象和解耦梯啤,把功能獨(dú)立的組件抽離出來,業(yè)務(wù)模塊化存哲,分層職責(zé)清晰因宇,互相不耦合。
只要分層抽象和解耦做得足夠好祟偷,無論多大的 APP 都是很多小模塊的拼接察滑,就可以降低復(fù)雜度,提高開發(fā)效率修肠。但有時(shí)解耦會帶來通信的麻煩贺辰,抽象也有粒度大小的問題,這些都需要根據(jù)具體情況權(quán)衡嵌施。
業(yè)界有各種各樣的架構(gòu)模式可供參考饲化,像 MVC / MVVM / MVP / VIPER 等。除了解耦和抽象吗伤,還有一些改變編方式的架構(gòu)吃靠,像響應(yīng)式編程,單向數(shù)據(jù)流等足淆。
持續(xù)集成的意思是不斷把每個(gè)人做的東西(代碼/資源等)集成到一起輸出成品撩笆,進(jìn)行自動(dòng)化構(gòu)建,其中涉及代碼管理(git / svn)缸浦,編譯流程夕冲,證書和簽名機(jī)制,自動(dòng)化測試裂逐,打包發(fā)布等歹鱼。其中還會有一些自定義的自動(dòng)化流程,例如自動(dòng)生成代碼卜高,根據(jù) debug / release 包類型自動(dòng)更改配置等弥姻,重復(fù)做的事都應(yīng)該自動(dòng)化,以提高開發(fā)效率掺涛。
業(yè)界為了提升開發(fā)效率庭敦,跨平臺開發(fā)一直是大家孜孜不倦追求的目標(biāo)。終端上跨平臺愿望是只開發(fā)一次薪缆,就能完美運(yùn)行在 Android 和 iOS 上秧廉,業(yè)界有很多嘗試,這篇文章總結(jié)得比較全,總的來說目前最好的跨平臺方案就是 web (H5)疼电,代價(jià)是性能略低嚼锄。
二、進(jìn)階
列完 iOS 開發(fā)的相關(guān)知識點(diǎn)蔽豺,接下來說說怎樣學(xué)習(xí)提高区丑。
如果自學(xué)能力強(qiáng)的話,不需要多說修陡,上述每個(gè)點(diǎn)網(wǎng)上都有大量資料沧侥,像內(nèi)存網(wǎng)絡(luò)存儲這些計(jì)算機(jī)基礎(chǔ)知識也有經(jīng)典的書籍,一個(gè)個(gè)啃下去就行了魄鸦,只要理解得足夠深入正什,就已經(jīng)可以成為領(lǐng)域里的專家,并很容易觸類旁通号杏。
但這種學(xué)習(xí)方法會比較枯燥婴氮,也難以實(shí)踐,個(gè)人還是比較推薦在實(shí)踐中學(xué)習(xí)盾致,具體來說就是在平時(shí)開發(fā)過程中不斷地發(fā)現(xiàn)問題 -> 解決問題主经。
1. 發(fā)現(xiàn)問題
首先你最好處在一個(gè)有很多工程上的問題急需解決的環(huán)境里,這樣發(fā)現(xiàn)問題就很容易庭惜,最好的是處于這幾類項(xiàng)目里:
處于高速發(fā)展期的項(xiàng)目罩驻。增長會帶來很多問題,一切又未成熟护赊,解決這些問題是非常自然又有價(jià)值的惠遏。
龐大的項(xiàng)目,超級APP會帶來很多中小型APP沒有遇到過的問題骏啰,又因?yàn)轶w量大节吮,就算只有千分之一的人遇到也會影響幾十萬人,很有解決的價(jià)值判耕,會有很多細(xì)致的問題透绩。
像上面提到的有“特殊需求”一類的項(xiàng)目,需要在一個(gè)領(lǐng)域里深入研究壁熄,也會自然碰到很多問題帚豪。
如果恰巧沒有在這三種類型的項(xiàng)目里,也沒關(guān)系草丧,只要是健康發(fā)展的項(xiàng)目狸臣,總會存在問題和優(yōu)化空間,只是要培養(yǎng)發(fā)現(xiàn)問題的意識昌执,很多時(shí)候問題就在那里烛亦,但沒人發(fā)現(xiàn)它诈泼,沒人覺得它可以/應(yīng)該解決。
按上述列的點(diǎn)此洲,在相關(guān)點(diǎn)上多問自己,能不能提高效率和質(zhì)量委粉。例如呜师,能不能提高前后臺聯(lián)調(diào)效率,重復(fù)寫的代碼能不能自動(dòng)生成贾节,啟動(dòng)耗時(shí)能不能短一點(diǎn)汁汗,線上問題發(fā)現(xiàn)和排查的效率能不能提高等等。各種問題會涵蓋上述提到的所有知識點(diǎn)栗涂。
如果不幸你的項(xiàng)目沒有健康發(fā)展知牌,實(shí)在沒碰到什么問題或者問題不值得解決,或者你還沒畢業(yè)斤程,那這里還有一個(gè)萬能問題可供參考:那些知名的開源項(xiàng)目具體是怎樣實(shí)現(xiàn)的角寸?
剖析開源項(xiàng)目源碼,可以學(xué)到很多東西忿墅,各種各樣的開源項(xiàng)目也覆蓋了很多知識面扁藕,只要深入去研究它們,學(xué)習(xí)它的架構(gòu)和編碼疚脐,不懂的地方再去補(bǔ)齊知識亿柑,也是個(gè)很好的學(xué)習(xí)方式,如果學(xué)習(xí)后能輸出文章效果會更好棍弄,相當(dāng)于動(dòng)手實(shí)踐了望薄。
2. 解決問題
不同的解決問題的方式差別很大,有一些常見的套路可供參考:
1. 業(yè)界是怎樣解決這個(gè)問題的呼畸?他們的方案有什么不足痕支?我怎樣可以做得更好?
業(yè)界有各種各樣的開源庫和技術(shù)分享蛮原,只要問題不是太偏門采转,大多會有人已經(jīng)提出解決方案,多對比和研究這些已有的方案瞬痘,看它們是否能滿足需求故慈,找出它們的優(yōu)點(diǎn)和不足,看看能不能做得比它們更好或更適合解決碰到的問題框全。
2.解決方案能否通用化察绷,封裝成開源庫供其他項(xiàng)目使用?
開源項(xiàng)目都是這樣來的津辩,如果遇到一個(gè)別人沒解決好的問題拆撼,別錯(cuò)過封裝成開源庫造福社會容劳。
3.有沒有辦法防止以后出現(xiàn)類似的問題?
有些問題可能會反復(fù)出現(xiàn)闸度,能不能防止竭贩,或者能不能在出現(xiàn)問題的時(shí)候能及時(shí)發(fā)現(xiàn)和修復(fù),這可能涉及到開發(fā)流程莺禁、自動(dòng)化和監(jiān)控體系等方面的完善留量。
4.總結(jié)沉淀
能不能總結(jié)出解決這類問題的方法論(套路)?最好能輸出文章或分享哟冬,寫的過程是很好的學(xué)習(xí)過程楼熄,因?yàn)橐言灸:南敕ǘ记逦乇磉_(dá)出來,迫使自己去整理思路浩峡。想學(xué)IOS的也可以來找我
三可岂、總結(jié)
這里按我的理解列了 iOS 相關(guān)技術(shù)點(diǎn),以及在實(shí)踐中提升能力的一點(diǎn)小建議翰灾,可能無法各方面都覆蓋到缕粹,只是作為一個(gè)參考。另外這里只局限在 iOS 開發(fā)上纸淮,實(shí)際上作為程序員不應(yīng)該限制自己學(xué)習(xí)的范圍致开,有時(shí)間多去了解后端/前端/運(yùn)維也會很有利于自身開發(fā)能力的提高。