19 May 2012

iOS development

我們的新產品 Cubie Messenger (iOS/Android) 上架三個月了,開發 Cubie 對我們來說實在是巨大的挑戰!上架前我們深陷開發的泥淖,我們是第一次開發手機 App,但是選到的題目難度太高讓我們進退兩難;而上架後的大成長讓我們為 scale 後台 Server 的疲於奔命,server 的警報沒有一天有停過.... 喔,我有說我們只有四個人開發維護 Cubie 嗎?Android 版加 iOS 版加 message server 加 data server.... 人力嚴重不足啊!

我們需要更多的頂尖 Hackers 加入!

好了,這半年來的開發有不少辛酸故事可說,不過今天先來聊一下我對 iOS 開發的感想。iOS 是我們團隊技術中最弱的一環,Cubie iPhone 版從去年 9 月起開發,那時沒人會寫 iOS 平台,只好挑一個人下海,而那個人就是我... 身為一個 Android/Java 愛好者卻要跳去寫 Objective C,實在是個痛苦的決定。不過身為一個 hacker 一年學個新語言是家常便飯的事,去年學 scala,今年就學 Objective c 吧,而且接觸新的開發平台可以提升不少功力。Cubie iPhone 版就在邊吐血邊苦幹下,在半年後正式誕生。我個人覺得是有點奇蹟了,畢竟完全不熟,而且題目還是即時通訊,不是簡單的 Web CRUD。開發 iOS 一段時間也有了一些感想,不過從我的 Java 眼來看 iOS 的開發,當然是批評苦水居多囉 :)

  • 學習 Objective C 的語法,[那個看來很可怕的中括號] 是你最不需要擔心的事,我寫了 [兩天] 就習慣了,再過一個月就可以在 Java/Objective C 之間 [瞬間] 來回切換而不會打結。如果有人說中括號是 Objective C 的缺點,你直接打他一巴掌吧!
  • Cocoa API 才是最毒的部份,Java 圈因為寫起來又臭又長已經被別的圈子的人唾棄到翻掉,Cocoa API 更上一層樓,API 的命名實在長到不可思議,我到現在還是記不起來要怎麼 split 一個字串。當然,這是 Objective C 開發圈的文化使然,只是我很驚訝在抬面上 Apple 是一家講求簡單易用的公司,它們的產品也是如此,但是為什麼主要的開發平台用起來這麼的繁瑣呢?而且 Cocoa 基本上只有 Apple 一家公司在用,它有足夠的時間和權力可以將 Cocoa API 改善,改到他們滿意為止,但是他們就是沒做。這問題我網上查到的答案大都說,明確完整說明的 API 程式碼可讀性較好... (如果你寫過 python 你就知道這種答案是個...屁)。iOS 開發跟 Perl 剛好是兩個極端,一個是寫起來超長,認為程式碼這樣才清楚好讀;另一個只管寫的簡短而完全不理可讀性。我個人認為兩者都是過猶不及,如果有選擇的話我不會選這兩種極端的平台開發。
  • API 太長太難打,但你還是得開發,所以你需要好的 IDE 來幫助 (跟 Java 的情況類似),我個人推薦 IntelliJ 開發的 AppCode,你可以少掉一大半無謂的鍵擊,支援真正的 code formatting,有像樣的 refactoring 工具。至於 Xcode,它的功能太陽春,而且三不五時就當,拿來拉 UI 和佈署就好。
  • iOS UI Animation 超強!Apple 就是這點行,其他平台都被打假的,而 Android 追一輩子也追不上!
  • Provisioning 的流程複雜難懂易錯,我猜這是 Apple 雇用到前 Microsoft 員工做的吧?
  • iOS 螢幕大小固定,所以 UI 格局都可以直接用 pixel 去算,某方面來說這是優點,美術做好的 UI 直接套就是成果。但沒有 layout engine 實在是很糟,程式碼裡一大堆 pixel 的加加減減在算位置,看也痛苦寫也痛苦。
  • 自行管理記憶體是雙面刃,初學者有踩不完的地雷,我踩了好久才熟悉他的規則。而且這條學習的路沒有捷徑,你只有自己踩過才會學得起來,有人帶有人教都沒用。即使我現在比較熟練了,但是對於 Objective C Block 的複雜規則還是非常感冒。在手機上自行管理記憶體是有優勢的,畢竟資源有限,所以這辛苦管理的代價付的到也甘願。但當未來手機的規格追上筆電時,自行管理那時就會變成一種懲罰了。Objective C 未來還需要更自動化的管理才能跟其他平台匹敵 (ARC 還不夠)。
  • iPhone 是一台 smart phone,但是它的限制讓它變得很笨。例如,沒有真的多工對一個即時通訊軟體很傷,我和同事一共花了快一個月的時間,才讓 Cubie 在 iPhone 上 "看起來很即時"。這不是單單套上 Apple Push Notification Service 就可以解決的事,有很多很多的例外狀況要處理。
  • 在開發過 Cubie 半年之後,我發現開發 App 都有很多奇奇怪怪的 corner case,這一點不論在 iOS 上或是 Android 上都一樣,遇到時你就需要找真的原因以及想辦法繞過。因為這個原因,我不認為 PhoneGap 這類 js wrapper 可以做出個好 App,因為被這些 wrapper 包過後你就沒辦法處理底層發生的 corner case 了。我建議不要因為不熟 Objective C / Cocoa ,或是怕學它們,而找 PhoneGap 這類的捷徑。速成的東西最後都會付出代價。
  • 大部份的問題和答案都在 stackoverflow,有問題就先直接查,不要浪費時間自己想,因為很多時候不是核心問題,只是單單不曉得有 API 可以這樣用而已。我知道有人批評這一代的開發者都只會靠 stackoverflow,不願意自己思考。但是現代手機的功能太多,API 堆的跟山一樣高,你得懂得有效率的解決這些已經知道的問題。把精力放在你 App 的核心功能上吧!
  • App 要 review 後才能上架,review 時間是一週。這點網路上已經討論很多了,不差我一個,我只有一個感想 -- 這限制讓我覺得我活在 80 年代。

最後,說一下 Cubie 這個 App 開發上遇到最奇怪的事 -- 當 iPhone 使用 WIFI 時,手機一連上 Cubie server,在某些時候會馬上斷線,而且是再連就再斷。手機端的 log 顯示 connection reset by peer,server 端也是顯示 connection reset by peer。為什麼只有 WIFI 會斷? 為何有時會有時不會 ? Android 版怎麼不會斷 ? 不論是 3G 還是 WIFI ? 這問題把我們的腦袋都燒壞了也想不出為什麼,用 Wireshark 看封包看了老半天什麼也看不出什麼鬼...

這問題後來解決了,如果你知道這問題的可能答案,你就是我們最需要的戰友。

ps. Cubie 的 server 是架在日本的 EC2。