標籤:
這幾個月中做的工作包括網站開發、安卓App開發和蘋果App開發,前兩者用的語言都是我熟悉的java,故蘋果知識的學習,較安卓知識的學習,多出「語言基礎」一塊,其他方面差不多。
之前發過安卓那篇,如感興趣,戳我的名字看吧。
0.語言基礎
去年購入mac開始學ios編程時用的是swift,今年用的是objective-c(下簡稱oc)。
網上有將oc與java對比的博文,其實物件導向各種語言,能力大同小異,主要是寫法不同。oc最大的特殊,當為用中括弧調用方法,我感覺這很醜陋怪異,但想到目的是讓每個參數的意義在代碼中都直接呈現,除了用中括弧也沒別的好辦法。
屬性卻支援用點符號調用,看似直接向欄位寫、賦值,實際調用的是getter/setter方法,就像jsp裡寫el運算式時某某點某某,實際調用的是getter。
以前看c代碼,最奇怪的是h檔案和m檔案的關係,以及引用的方式,不像java那樣一個public class聲明,互相import即可,認為深奧玄妙,深不可識。其實只是固定寫法,h聲明一些公有方法,m實現這些方法,並可以同時聲明一些私人方法,有點像java的介面聲明和實作類別(xxImpl),但oc對應「介面」的概念是「協議」,用prototype聲明,確實,用「協議」更形象,它本來勒定的就是實現者的能力,像java聲明介面時常叫「xxAble」一樣。
其他基礎文法不贅,跟java的功能類似,只是換了個外觀,參考《objective-c編程》《objective-c進階編程》《Effective objective-c》三本書就很好。比較令人信服的,是《objective-c進階編程》的三大主題,即「自動引用計數」「Blocks」和「GCD」這三大文法糖,大概對應java的記憶體回收中的引用計數知識、java使用匿名內部類實現回呼函數、java尤其是android編寫跨線程的代碼這三個主題,在後兩個方面,古老的java寫法確實略顯笨拙,oc的文法糖很方便。不過我比較土,java8至今尚未研究過,不清楚其文法糖方便程度如何。(有空要研究下java8、scala、groovy這些據說方便的概念)
1.開發環境和參考資料
參考資料方面,由於學會FQ時間較短,大部分時間用的主力參考書是手邊幾本紙書,某兩本翻譯的外國書被我塞到床底下決定不看了,非常不滿意,《iOS開發指南》和《iOS9開發指南》這兩本人民郵電出版社的國產書我很喜歡。引進的翻譯書,有些作者「自我意識」過重,不肯按知識體系,分層次地安排章節,而是按著自己一廂情願的「意識流」安排,強迫讀者跟著他的想法走,而他安排的順序,又不把體繫結構、基礎知識、最核心常用技能放在重要位置,而是「反正我的書我說了算」,把些很邊緣的知識,在其基礎知識尚未交待的情況下就倉促提出,缺少基礎知識根本看不懂,即使費力看懂了也沒太大用。我總在想,也許確實國人骨子裡懂老子「後其身而身先」的教誨,更懂得把自己擺在一個次要的位置,以閱讀者的大腦為目標,把知識好好梳理安排,盡量舒服地送進讀者的大腦去,這樣「滿足了需求」,讀者喜歡,銷量自然好,「名」和「利」自然隨之而來。而不是存在感極強地勒令讀者跟著他走。不過話不能說絕,《iOS8應用開發入門經典》就相當不錯,以及我讀過的很多很多外國書籍都很好(早些時候寫的個人書單),上面僅限於對一些「定位於入門書卻對小白很不友好」的書的不滿。
話說多了,接著說書,上述四本書都是去年買的,《Swifter》《iOS開發進階》和《objective-c編程》也是。最後一本文法書,很有細細閱讀的必要,重要的點基本都講到了,但沒寫過代碼時看一些知識可能會難理解,邊寫代碼邊常讀它就不錯,《objective-c進階編程》和《Effective objective-c》是前天才買的,薄得讓人驚訝,但內容都不錯,前者講「三大文法糖」,不多說,後者只要讀過《Effective Java》或《Effective Javascript》自然會天生帶有好感(C++那本我沒讀過,估計也極好,這就是「品牌效應」),翻開看看,果然都是些最佳實務的建議,像《聖經》中的箴言,輕輕讀一則,就能有所獲,熟悉的味道。另外,前天還買了本《iOS Auto Layout開發秘籍》,之前在storyboard中布局時,對控制項的約束讓我傷透了腦筋,不知道該參考什麼資料,只好摸索著弄,有了這本書,可以強化一下。
上面說的是書,後來看了看官網文檔,感覺非常好,雖然我英文閱讀能力不是很強,但配合著有道詞典的取詞外掛程式閱讀起來閱讀效果還可以。官網的優點是權威,新,簡潔精準,安排合理,這是比所有書籍都好的方面,以至於很多人說有了官網文檔就不必買書了,不無道理。但官網文檔這樣多,用哪個「目錄」做全景概覽,以什麼「次序」做閱讀學習呢?「搜尋方塊」急用可以,能頭痛醫頭腳痛醫腳(但這方面似乎也不如google + stackoverflow),但作為「系統學習」的起點就太沒次序和脈絡了;網路上一篇講閱讀次序的文章,有點過時了,雖然萬變不離其宗,但對陌生於文檔的新手,當「萬變」發生之後,怎樣才能「不離其宗」?作者沒說。最後發現還是最老實的官網文檔入口頁http://developer.apple.com/develop/就不錯,tutorial做導航圖,api做字典,用前者尋找特定技術主題,用後者理解不同類庫功能,穿插學習一段時間,就能對重要知識有所掌握了。
除了書和文檔外,開源應用也是很好的學習對象,因為它是鮮活的,在模擬器裡直接能跑,還能改改代碼看效果,下下斷點看奧妙。我用的是開源中國的iOS用戶端的源碼。讀源碼,我習慣的方法是第一遍先概覽、通讀,不管三七二十一,讀將下去,不用太細,不用開模擬器,按最基本的線性順序,把整個項目的代碼過一遍(當然,有些包裡類的技術大同小異,只有業務的區別,則不必全讀,讀三分之一即可),然後第二遍,開模擬器(如果是web應用就是跑應用開瀏覽器),關注特定功能的來龍去脈,理解介面展示和響應時自始至終代碼的執行流程,對象和對象是怎麼組織的,類的父類是怎麼封裝的,重點看脈絡流程,至於具體的第三方或基礎類庫的使用,方法的調用,細微的演算法,如果感覺能學到東西,看看也可以,不看也沒關係。重要的是,觀察源碼中分包分模組的體繫結構、功能響應時的流程流轉,這是「樹榦」和主要「分支」,至於具體細微的樹枝和葉子,暫時忽略之可也。
開發工具xcode,我到現在對之也不算熟悉,好在寫代碼的部分,會基本的打字、複製、粘貼就行了,更高深的使用,當覺得「xcode估計有這個功能」時,去google搜一下就行了,xcode的使用,《iOS9開發指南》很簡單的介紹很實用,官網更有詳細的教程(還沒看),《iOS開發進階》則給出了一些實用的工具(還沒用),感覺再加上搜尋引擎,就沒有問題了。重要還是要熟練,「工欲善其事」嘛。
2.頁面知識
頁面知識兩大要點:一是在單個頁面中,組件的使用和約束的使用,二是多個頁面的協作。
單個頁面中,基本組件加到頁面中最簡單,拖拽即可,綁定到Controller的變數上、及綁定回應程式法也極簡單,同時開storyboard和Controller,拖拽即可。因為「Controller持有控制項」與「Controller提供響應函數」是有介面編程(且不管命之曰mvc還是mvvm吧)天經地義的規則,所以xcode直接用ide實現了,而不像android那樣還要用第三方的ioc架構,或者angular那樣手動的聲明。當然,如果比較喜歡滑鼠的移動和左右鍵的點擊,以及鍵盤按鍵組合的使用,喜歡「碼之」而不是「拽之」的同學,手動寫代碼聲明組件對象,並添加到Controller的屬性上,添加到Controller的view中,甚至手動添加約束,也是可以的。只是,這樣做,比起拽來拽去,工作量未免多太多了,所以什麼時候用碼的,什麼時候用拽的,就要視組裡結構及項目特徵而定,對於我個人,因為單打獨鬥,又是新手,所以兩種都試試,在實踐中學習之。
組件可以自訂,這是當然的,跟android一樣,提供一個回調方法,在其中用畫布繪製自己的自訂樣式,即可聲明一個組件類。不多說。
使用約束,大約對應android的RelativeLayout,相對布局,在網頁布局中對應的卻不是position:relative而是absolute,脫離文檔流。手動指定誰在誰左面,誰在誰上面,距離多少。但這種方法,始終是「奇兵」,「正兵」依然是先上後下、先左後右的線性布局,即html中的文檔流,android中的LinearLayout,iOS中怎麼實現?看開源中國的代碼,開了個眼界,用tableview實現LinearLayout的效果,指定第一行儲存格應該是啥,第二行應該是啥..不過感覺,這跟古老的html中用table布局有異曲同工的地方,html的table布局早就被揚棄了,不知道iOS中,tableview當LinearLayout的用法,是不是主流,還是有更好的方案,需要繼續研究。
多頁面協作,最常用無非是基本彈出、進退導航、標籤切換這三種,除了基本彈出太基本外,進退導航和標籤切換也被提供了原生的支援。android中標籤放到底部,還需要手動實現,iOS直接拖拽就行了;但iOS中Navigation導航還要在storyboard上布置下,android相對簡單些,究其原因,是android手機內建後退鍵,故「前進」「後退」是天經地義,而iOS只能在標題列顯示按鈕來點。相比網頁,網頁中的主要跳轉當然是前進後退,進棧出棧,而「選項卡」在網頁中多作為局部控制項點綴使用,與app的「標籤」對應的其實是網頁的「菜單」,但網頁點擊菜單,其實一般也是「前進」的,除了opoa的新潮頁面,和古老的iframe嵌套頁面外。但app的標籤切換基本就相當於iframe.src賦值。
3.資料知識
app的資料知識,無非兩點,一是本機存放區,二是rest互動。
本機存放區,分為直接寫檔案、寫索引值對、寫資料庫三種,都有基本實現,不多說。
rest互動,內建或第三方都有方便的庫,根據供求關係,基本需求必有方便供給,也不用多說。
4.實踐經驗
其實蘋果版app到現在也未上線,這方面經驗還待補充。
功能實現,基本上介面知識與資料知識結合即等於一切,在前面安卓那篇給過的公式。
第三方依賴,也是有事實標準的,不多說。
登入邏輯,跟安卓邏輯一樣,只是不同平台具體代碼的區別,不多說。
app嵌html,也沒實際用過。
5.個人感想
我不喜歡oc,我討厭大括弧調用的寫法,我不覺得把方法每個參數的含義都顯示出來有什麼必要性。
但不能只用swift,好比java開發雖然ssh是主流,直接用servlet的少見了,但servlet的基礎才是安全感和信心的保障和來源。
而且,據說swift也難免要用到oc的遺留類,躲總是躲不掉的。
或許oc變熟悉之後,再看c和c++的代碼都會更熟悉一點?
物件導向的語言,封裝繼承多態,萬變不離其宗,擁有介面的編程,狀態事件響應,是亙古不變的規矩。mvc和mvvm?區別有想象中那麼大嗎?
越做應用就越覺得荒蕪,感覺在同一地方兜兜轉轉,所謂語言切換,打通全棧,也不過是今天吃個蘋果,明天吃個梨子的變換,變來變去都是一樣。
就回頭,在畢業幾年後,回頭學電腦群組成原理,作業系統,資料結構和演算法,網路。之前的幾年,我學的是設計模式,重構,軟體工程,語言架構。
電腦的海洋,浩瀚無邊,程式設計語言和應用領域,以及具體產品,其實都是客體,內功強大了,用什麼招式,拿什麼語言,都能虎虎生風。君子不器。
而內功,也許是哲學,理解世界啟動並執行方式,才能在程式裡更好地類比之。(例如:物件導向)
也許是心理學,理解使用者生活的習慣,才能在設計上更好地協助之。
也許是邏輯能力和思辯方式,有了更好的溝通能力,才能跟同事、使用者、客戶產生高品質的交流,而交流,是產品之本。
也許是FQ能力,英文水平,搜尋引擎使用能力,閱讀能力,寫作能力。
這些都很重要,但我們總是忽略它。
「不用管別的,現在就開工寫代碼,有了問題『百度』一下!」
多少次就這樣,在戰術上的勤奮,日複一日的加班中,像拉磨一樣原地打轉,自以為做了很多工,實際上卻無進展。
很多時候該退出來,在戰略上想一想,這五年打算做什麼,下個五年呢?
我們要養成的,是布局自己人生的習慣。
「與其戀子以求生,不如棄子而取勢」,有價值的事情,未必就要做,所謂「價值觀」,所謂「取捨」,都包含了捨棄有價值的東西的部分。
而我們最寶貴的,是時間,做了這,就不能做那,在經濟學上,這叫「機會成本」。
如果我們希望,在有生之年,在世界上打出一塊屬於自己的天地,那我們現在該準備的是什嗎?這才是問題的關鍵。
不要拉磨拉得興起,汗流浹背天天加班,每月賺個兩三萬就心滿意足了。這真的是你青春的價值嗎?
此時此刻你身邊蠢人對你是羨慕嫉妒恨,還是小瞧,真的並不重要,你活著不是為了給他們看的。
這篇寫iOS,非常小白,基本沒有價值,如果有價值,就是這裡議論的幾句話。
希望對有緣看到這裡的編程的朋友有所啟發。
因為我們知道,我們中很多朋友,是會鑽到代碼渾然忘我的,這很好,能讓編碼能力猛增,但同時,可能會忘了後退一步看看天空。
別用戰術的勤奮掩蓋戰略的懶惰。
多想一想。
棄小取大。
布局人生。
蘋果版App開發心得