1. 程式人生 > >專訪 iOS 技術專家孫源:開發者的成長始於“死磕”

專訪 iOS 技術專家孫源:開發者的成長始於“死磕”

小編語

本文為 DevLink 專訪系列,本期採訪嘉賓是 iDev 蘋果開發者大會《連結器:Linker 與 Loader 的前世今生》的講師——孫源。在即將到來的 iDev 大會上,他將和大家聊聊 Linker 和 Loader 70 年來的發展歷程,加深對 iOS 開發中靜態連結、動態連結、程式載入等技術的理解,再結合實踐,看看我們能利用連結器做什麼有意思的事情。

由 DevLink 主辦的 iDev 蘋果開發者大會 將於本週六、日在北京國際會議中心舉行,本次大會特約講師——孫源的演講題目為:《連結器:Linker 與 Loader 的前世今生》。

連結器是計算機程式中的重要角色,從編譯器都沒出現的時候就已經誕生,它的每一次演進都意味著程式開發模式的一次升級。本次 Topic 將帶領大家把玩連結器,聊聊 Linker 和 Loader 70 年來的發展歷程,加深對 iOS 開發中靜態連結、動態連結、程式載入等技術的理解,再結合實踐,看看我們能利用連結器做什麼有意思的事情來。

下面的二維碼檢視議題列表。

以下為採訪內容,提問者:DevLink,受訪者:孫源。

1、孫源老師您好,能否簡單的介紹一下你自己?

我叫孫源,在網上的 ID 叫 sunnyxx,微博 @我就叫Sunny怎麼了,會時常在微博上發一些 iOS 開發相關的東西,還有個部落格 http://blog.sunnyxx.com 大多是比較偏原理性或探究性的文章,因為覺得去寫網上隨便就能搜尋出來的東西不好玩兒,所以每篇文章都有很多自己的探索過程和理解。

做業務開發的時候發現有很多 UI 上的重複性工作,於是和 team 裡同學一起搞了些通用的東西,用著還不錯於是就開個源吧,就成立了一個名叫 forkingdog 的開源小組,在 http://github.com/forkingdog 上能找到。

時不時也會參加一下技術大會和一些線下的技術分享,比如這次的 iDev 大會。現在在桔廠工作,做一些技術深挖的事情,妄圖搞個大新聞。

2、與具體的程式設計和實現不同,您這次分享的議題在大家看來更加偏重底層,關於連結器,似乎很多同學只有在學習編譯原理時才會遇到,日常工作中則很少考慮這一層面的執行機制。您是出於怎樣的考慮來分享這個議題的呢?

個人理解,技術想要進階的話一定不能只停留在“應該怎樣做”,而是對“為什麼這樣做”抱有很強的好奇心,當把所有的為什麼都搞明白的時候,才能從更高的視角來看待程式、看待程式碼以及看待某個 bug。當探索到一定階段後,會發現有一些問題是死活不能搞明白的,這是因為它們的答案在更底下的一層。

比如為什麼 build 的時候會報 undefined symbol for architecture i386,有時候又會提示 duplicate symbol,為什麼有些問題可以通過在 Other Linker Flags 裡面加一個 -ObjC 搞定,除錯時出現的 stub for objc_msgSend 代表什麼,為什麼安全大大們可以在非越獄機器上 Hook,讓微信擁有自動搶紅包功能?這些是日常開發息息相關的事情,若對連結過程有一定了解,相信這些問題都能迎刃而解。

3、一提到 iOS 程式設計技巧,很多人的意識裡面就是一些介面及效果的實現,而對於底層技術就似乎很少有人進行深入研究了,您覺得造成這種局面的主要原因是什麼;對剛剛開始 iOS 程式設計探索的新人,您覺得應該關注和持續學習哪些方面的知識,才能讓自己成長為一個技術“大牛”?

網上也有很多朋友問我這個問題,苦於“技術不夠進不了大公司”、“小公司每天做業務沒時間提升自己”、“有時間的時候不知道如何入手,求推薦本書”等,我可以講一下我自己的經歷。

當初剛畢業的時候,也自詡 iOS 技術掌握的還可以,去百度面了個試,被虐之後發現也就懂個皮毛,但沒關係慢慢來唄,就去了一個小的遊戲公司工作。當時和 iOS leader 對很多技術上的問題都有爭執,年輕氣盛,爭論不過那就拿事實說話,回去就做很多功課、寫各種 Demo、看各種文章來證明我是對的。後來發現證明自己的正確,並不如探索過程本身有意思,有一個疑問之後就去滿世界找答案,找到答案之後就又對這個答案背後的原理產生了疑問,直到最後,發現我的問題在網上搜不到什麼文章來解答,那好吧,我來寫,於是搞了個部落格記錄那些網上並不好搜到的答案,還把探索過程寫出來,好讓其他人不用像我一樣苦苦探索。比如當時很好奇,為什麼 main 是程式的入口,在它之前到底發生了什麼呢,這對於當時我的初級水平來說,搞清楚可是費了老勁了,一直追到 dyld 原始碼裡面,終於搞清楚了前因後果,這種好奇-探索的過程一直持續到了現在。

所以所謂進階的過程不就是死磕麼,刨的越深嗑的越狠肯定進步越快,我們身處的技術環境就像一大片戰爭迷霧,如果不去好奇黑暗裡藏的究竟是什麼,那地圖就永遠只能開那麼一小點兒了。

4、作為一個“大廠”的開發者,您覺得在大型公司工作,與在創業公司工作,有哪些不一樣的地方?

更大的名氣、更知名的專案、更加規範的流程和職責劃分、更加明確的晉升方向。更多的人,找到氣味相投的好技友概率更大,也會吸引更多厲害的人;同時也會帶來更多的溝通成本,當一個專案人數到了一定規模的時候,溝通成本變得不亞於編碼開發成本。大專案要拖著歷史的包袱,對技術的選用會更加謹慎一些,比如 Swift 不是你想用,想用就能用,少了一些技術的靈性。我選擇在大公司還因為創業公司很難有機會去讓人專門的,全職的做技術深挖或技術儲備的工作,也就是說,大公司更能給深度的技術以成長的溫室和發揮的舞臺。

5、對身處蘋果生態鏈的一線開發者有什麼要說的麼?

現在的 iOS 開發日子可比幾年前難多了,以前對語言熟練點、搭 UI 比較快的那就挺好找工作,現在一面面試是不是都得拿個 runtime、runloop 懟懟面試者,可見這個行業已經進入飽和的狀態,再加上各種前端技術的衝擊,有種 iOS 程式設計師分分鐘要失業的感覺,需要掌握的技術棧多到學不過來,眼花繚亂。

我給大家的建議是以靜制動,簡單來說就是別整那些用不著的,把重點放在眼前能用上的技術,比如工作是做業務 UI,那就下功夫把 UI 做的又快又好,比如工作中的專案不能切 Swift,那就把 ObjC 搞的再清楚點,在技術發展百花齊放的時候,比的是誰學的精,而不是誰學的早或誰學的多,在沒有定論之前切勿跟風,比如說前端技術能統一全棧,那起碼它得先把前端自己統一了之後再來 iOS 和 Android 湊熱鬧吧?要練就的是紮實的基礎和厲害的學習能力,所謂釘子理論,把眼前的扎深,以後不論技術怎麼演變,花個一兩週入下門應該就能上手了。