[TOC]
iOS開發(fā)現(xiàn)狀
目前我們在看到一個JD的時候,iOS開發(fā)一般會特指iOS互聯(lián)網(wǎng)App開發(fā),主要關(guān)注與用戶體驗和互聯(lián)網(wǎng)交互。
這樣看起來,主要有兩條線,其一是互聯(lián)網(wǎng),其二是用戶體驗,所有的技能基本上都是從這兩個點出發(fā)的。
我們來假定一個場景:
老板:我們需要開發(fā)活動,元旦前要上線
iOS:后臺API是什么
后臺:API定義好了,還沒有數(shù)據(jù),需要爬一些數(shù)據(jù)
iOS:產(chǎn)品稿定義好了嗎
PM:產(chǎn)品稿已經(jīng)好了
iOS:設(shè)計和交互都有了嗎
交互:沒問題,已經(jīng)確定好了
設(shè)計:已經(jīng)設(shè)計完了,還差切圖就好了
iOS開始評估這個需求,然后對這個需求提出了幾個問題
這個交互動畫比較難搞,如果這么設(shè)計的話,元旦前做不好
這個頁面是純展示的頁面,能不能讓前端做
這個需求哪些地方需要埋點做數(shù)據(jù)分析,要盡快整理出來
這個頁面彈窗不太符合蘋果的設(shè)計規(guī)范
API什么時候有數(shù)據(jù)可以調(diào)試
QA可以開始準(zhǔn)備用例了
這是一個典型的開發(fā)場景,對于大部分的iOS開發(fā)來講是一個不斷重復(fù)的過程,這里我們可以清楚的看到合作的不同角色以及iOS開發(fā)在其中的定位。
iOS開發(fā) - 入門
iOS的入門是非常容易的,有一臺mac基本上就可以了,買幾本教程或者看看視頻,很快就能入門。
為了衡量自己的水平,那么開始做自己的第一個App吧
這個時期對app開發(fā)的認(rèn)知基本上就是頁面,一個個的頁面,不管你有多少需求,我自然可以開發(fā)出對應(yīng)的頁面,可以叫做頁面開發(fā)工程師??梢哉f沒有搞不定的需求,只有不合理的需求。
語言
語言是必備的工具,主要是Objective-C,這個階段掌握OC的基本語法和應(yīng)用,以及基礎(chǔ)的OOP
系統(tǒng)
使用系統(tǒng)提供的各種framework
push
定位
相冊
。。。
交互相關(guān)
頁面基本上是交互的基本組成了,不同頁面之間的跳轉(zhuǎn)構(gòu)成了app的使用路徑。這個里面主要包含的技能有:
-
uikit
基本控件
tableview
布局
導(dǎo)航
-
簡單動畫
- uiview animation
互聯(lián)網(wǎng)相關(guān)
大部分公司的API都是通過http來調(diào)用的,所以這個階段只需要會調(diào)用http的相關(guān)庫就可以了
- http
數(shù)據(jù)
因為http下載到數(shù)據(jù)基本上都會是json格式的
- json到模型
工程
這個階段基本不關(guān)注工程,只要會用git的基礎(chǔ)操作即可
掌握了這些技能基本上就可以開發(fā)簡單的應(yīng)用了,需要一些高級的功能,都可以通過第三方庫來實現(xiàn),所以這個階段會說自己熟練使用和掌握各種第三方庫,無非是用pod把第三方庫引入進(jìn)來使用罷了。
寫代碼速度也非常快,自動布局,模型轉(zhuǎn)換,網(wǎng)絡(luò)下載都得心應(yīng)手,偶爾也會引入一些MVVM等架構(gòu)的概念。
iOS開發(fā) - 晉升之路(Dive Into)
知其然而知其所以然
開發(fā)入門之后慢慢會覺得有一種全面掌控的感覺,在慢慢遇到挫折之后會靜下來思考人生。
之后會開始對之前用的東西產(chǎn)生懷疑,然后自己考慮實現(xiàn)一些第三方庫或探索第三方庫的源碼,從優(yōu)秀的代碼中學(xué)習(xí);
場景設(shè)計:PM拿著手機來找程序
PM:你看脈脈這里有一個動畫,我們要做一個一樣的
iOS:這個效果不錯啊,好酷
。。。兩分鐘
PM:我們做這個效果要多久
iOS:我先研究一下~~
這個時候會掃描自己的技能列表,發(fā)現(xiàn)居然不能完成這個動畫,怎么辦?
程序員的好朋友google,stackoverflow,github能夠給出大部分的答案
PM:我們的程序為啥比別人慢
PM:我們的安裝包為啥比別人的大那么多
PM:有用戶反映我們的app用起來發(fā)熱
PM:有用戶反映我們的app偷跑流量
PM:老板說要改一個文案,線上的可以改嗎
PM:我們的app要根據(jù)手機殼更換主題顏色
PM:~~~
面對PM各種別出心裁的需求,入門級選手很快就慌了,還是多請教請教老司機,畢竟老司機開過的車比較多
在比較好的公司里面,技術(shù)傳承是非常重要的,每個新人有一個mentor是非常重要的。
基本上在這些公司呆上兩三年多,就能可以解決以上大部分多問題了。
語言
除了Objective-C之外還可能掌握Swift,Swift不是必須的。
OC Runtime,最著名的奇技淫巧如swizzle這些
OOP設(shè)計模式和設(shè)計原則SOLID
FRP,主要是RAC的應(yīng)用
MVVM / MVP 等頁面架構(gòu)
Cocoa
對iOS系統(tǒng)程序的運行原理有更深的理解,能夠解決一些比較詭異的bug
runloop
autorelease pool
內(nèi)存管理
鎖
多線程和異步開發(fā)
交互相關(guān)
除了布局之外,還對手勢,事件響應(yīng)過程,動畫有更深入的了解
-
UIKit
layer
collectionview
頁面的繪制和更新過程
頁面的渲染優(yōu)化
自定義手勢
-
動畫
頁面transition動畫
CA動畫
displayLink動畫
其他
互聯(lián)網(wǎng)相關(guān)
對于更多的網(wǎng)絡(luò)傳輸,緩存,加速等有一定的了解
-
區(qū)分url和uri
- 對url encode有深刻的了解
-
http/https
- Http2/http3(QUIC)
-
長鏈接
自研
websocket
等等
DNS優(yōu)化
數(shù)據(jù)
除了json可能還會有各種二進(jìn)制數(shù)據(jù)如protobuf等,但是更主要的還是下面這些的應(yīng)用和處理
緩存
數(shù)據(jù)庫
數(shù)據(jù)一致性
調(diào)試
-
lldb
- 各種斷點技巧
instrument
工程
進(jìn)階路上肯定會對工程有一定對研究和使用,主要來講就是
CI的使用和配置
-
工程的管理
pod
carthage
submoudle
編譯過程和加速
單元測試和代碼覆蓋
Appstore
經(jīng)過上面的大部分問題的洗禮,基本上就可以帶人帶小團隊了,這個過程因人而異,可能是二三年,也可能是四五年,對于各種技術(shù)的選型和分析基本上都是沒問題的
iOS開發(fā) - 更高發(fā)展 (break out)
上面一個階段之后一般也會有一段時間的迷茫期,很容易受網(wǎng)上的一些文章的影響,比如說iOS開發(fā)沒有前途,移動開發(fā)要被取代等等,會對自身的價值和未來的發(fā)展產(chǎn)生一些疑問,這個時候就要跳出來,打破iOS開發(fā)字面的約束,才能有更高的發(fā)展。
一般情況下會在靠近的領(lǐng)域,比如大前端,比如全棧進(jìn)行一些適量的探索。
iOS和前端
Hybrid模式是一個非常常見的模式,iOS和Android對webview進(jìn)行擴充使網(wǎng)頁可以通過js調(diào)用系統(tǒng)的能力,從而給前端開發(fā)帶來更多的可能,實現(xiàn)一種快速開發(fā),跨端的開發(fā)模式。這種情況下需要開發(fā)人員對webview有較深入的了解,對js有較好的理解。深入的話可以去了解node以及相對應(yīng)的開發(fā)框架,嘗試自己搭建簡單的前端頁面和服務(wù)。
iOS和服務(wù)器
iOS和服務(wù)器之間主要就是數(shù)據(jù)交互了,彼此之間相互了解可以解決一些問題,比如減少請求次數(shù)和流量,嘗試使用非http的服務(wù)
跨平臺的攪局者
Hybrid方案有天然的優(yōu)勢和劣勢,主要劣勢還是webview本身的渲染和交互會比較慢,讓交互效果打折扣,所以就有了各種框架來提供,原生應(yīng)用的運行效率,H5的開發(fā)效率,實現(xiàn)雙贏,最出名的就是RN了,其次是Weex以及最近火爆的Flutter。
除了框架外,還有語言的侵入,原生iOS應(yīng)用一般都是OC或Swift來開發(fā),不過也有一些其他語言希望加入進(jìn)來,早期有微軟的c#,現(xiàn)在有Jetbrain的kotlin,以及一直期望進(jìn)入的各種js衍生品,一些大牌的公司還會使用C++來開發(fā)一些核心邏輯。
開發(fā)思維的轉(zhuǎn)變
從設(shè)計模式上來看有很多優(yōu)秀的范例,我們可以去使用套用這些模式來解決我們代碼中的結(jié)構(gòu)問題,另外也要從設(shè)計模式中跳出來。
OOP思想是目前的主流思想,不過近些年的開發(fā)語言或多或少都會提到一些函數(shù)式開發(fā)語言的特性,不懂鞋函數(shù)式編程語言都不好出去聊天了,了解一些FP是很有必要的,還有GP,RP等等也都是非常常用的一些技能。
工程上的變化
面對工程的體量越來越大,更多的公司提出了自己的解決方案,不再是單純的pod能夠解決的,一個完整的工程編譯一次一個小時,修改一個代碼也要編譯十分鐘,這些都是很容易碰到的問題
更多
除了能夠總結(jié)的知識,還有很多領(lǐng)域的知識,比如圖像,視頻,即時通訊,仿真,模式識別等等數(shù)也數(shù)不完的
還有
和PM相愛相殺,慢慢的也明白更多產(chǎn)品的思維,能夠從更多的角度去思考問題
能夠從團隊的角度去思考,關(guān)注團隊的成長和公司的成長,培養(yǎng)更多的人才
是去做架構(gòu)還是去做管理都是見仁見智,各有發(fā)展
談?wù)勊惴ê兔嬖?/h2>
算法是不是重要,很多人都說,公司面試造核彈,入職擰螺絲,主要就是說這個了吧,很多公司都會面試算法,尤其是外企,國內(nèi)公司反而是面試項目和經(jīng)驗更多一些,外企有的會有甚至有三四輪算法面試。
對于大部分工程師來講,確實用不到更高深的算法,因為前頭我們說了,大部分都是頁面工程師,所以用不到,但是當(dāng)你要做深入了,需要考慮這個問題了。
面試的時候面試算法主要是用來評價一個人的能力和潛力,順帶考察一些溝通能力,軟素質(zhì)等等,而針對簡歷和項目以及iOS知識的面試主要是來判斷經(jīng)驗,國內(nèi)公司希望到崗后馬上進(jìn)入需求開發(fā)階段,所以對經(jīng)驗更看重一些,比如要求技術(shù)棧是一樣的才能面試。外企很多更注重能力,就算你沒做過iOS開發(fā),但是通過算法和計算機的基礎(chǔ)知識判斷你是一個能力沒問題的候選人也有很大幾率入選。同樣來講如果候選人較多的話,肯定會綜合考慮經(jīng)驗和能力。
刷題是非常常見和有效的,尤其是很多公司的算法題是有固定套路的,只要刷一些leetcode或者網(wǎng)上搜一些面試題就能準(zhǔn)備和通過,針對這種情況,需要面試官在題目上多一些變化,并在面試的時候把這些變化拿出來討論,不要只單獨的看結(jié)果,多討論過程比看最后的代碼要好。
刷iOS知識點也很常見,這個有時候不好甄別,所以建議面試的時候拿一些具體的場景來讓候選人進(jìn)行設(shè)計和實現(xiàn),了解其思路,是否可以有效識別其中蘊含的一些障礙和陷阱。