人類腦力的發展進程

一般人的腦力大概只能夠使用 10%,但當你的腦力發展到 25% 左右的時候,你可以從細胞中召喚回許多你已經忘記的感受與回憶。

你想起了還在襁褓中的種種,想起了還在搖籃中的風景,母親溫柔呵護的觸感,你突然意識到父母是多麼的愛你,你也多愛父母,你突然想聽到母親的聲音,即使你現在正在動手術,想把身體裡面的一些藥物拿出來,你還在被一股在台北勢力龐大的,嗯,韓國黑社會追殺,但是你就是想要打一通越洋電話。沒錯,你這時候需要一支三星手機。

動完手術,你的腦力繼續飛速開發,進展到了 30%。原本只會說英文的你,在台北街頭上,突然什麼中文都聽得懂了。放眼望去,你看到在鬧區裡每個人手上都有支手機,每個人都在講手機,你可以聽懂每個人怎麼講手機,而且每個人手上都是三星手機。

你知道你要報復,也要搞懂腦力繼續發展到 100% 會如何,更要防止一種可怕的藥物在全世界各地擴散。腦力發展到 40% 了,你知道了到底是誰會夾帶這些藥物的名單,這些人又要把藥物帶往何方,你需要一邊想辦法通過桃園機場的海關前往歐洲,又要聯繫法國警察,你需要立刻變身,讓你的一頭金髮變成黑髮,也要同時施展超能力控制電器,讓地球彼端的法國人相信你的能力。要完成這麼艱鉅的任務,你的手上需要一台三星手機。

雖然你讓德法義各國海關把藥物攔截了下來,集中到了巴黎的歐洲警察總部,但是韓國黑社會現在卻大舉襲來,你雖然用腦力發展而來的超能力抵禦了一次次的進攻,在巴黎上演飛車追逐,但你發現,你的時間不多了。

隨著腦力不斷進展,你慢慢地貫通了古往今來,窺探了創世的奧祕,你掌握了人,掌握了物質,更洞悉了宇宙中最深奧的智慧,但你也發現你逐漸失去了人類的靈感,你也預知當腦力完全開發之後,你會從世界上消失。但腦力開發是個不可逆的過程,你回不去了,你也打算加速進行,你更想要讓這樣的智慧流傳下來。

最後你成功了,在腦力開發到 100% 的時候,你的肉身崩解,留下了一片像是 USB 隨身碟或是電視棒之類的裝置;如果有哪個廠商會製造出這一款的裝置,我會很希望知道會是哪個品牌。你的肉身不在了,但是你的精神充塞整個世界,你變成了一團又一團具有超意識的電子,你船了一則手機簡訊昭告世人,說,你無處不在。是了,收到簡訊的,又是一支三星手機。

人類腦力發展的每一段進程,都需要三星手機。

喔,對了。美國加州有個法官,駁回了蘋果所提出—因為三星侵犯蘋果專利,所以要求禁售三星產品—這項要求。這是位女法官,韓裔美國人,她叫做 Lucy。

軍中樂園

時間怎麼推移是這部電影的重要線索。

金門這個地方說起來也是四季分明,春天會有綿延好幾周的濃霧、夏天有梅雨後的濕熱,冬天也有刮骨般的海風,而《軍中樂園》的敘事從阮經天飾演的小兵下部隊開始,到退伍結束,時間應該長達將近三年,但是片中每一個畫面都是夏天—什麼時候都是陽光照耀、什麼時候路上都有人穿短袖。

舉個更具體的例子吧:萬茜所飾演的妮妮這個角色,是因為蔣介石為了慶祝中華民國建國六十年,因此獲得特赦而能夠離開 831 回到台灣本島,會慶祝建國週年,要不就是十月國慶日、要不就是一月元旦,但是當阮經天要和萬茜慶祝有機會離開的時候呢,吹過窗簾的是夏季的晚風,外頭是一片蛙叫蟬鳴,炎熱的天氣讓兩人不禁天雷勾動地火…。不管怎麼看,這都不會是十月或是一月的金門啊;你知道嗎?本島與外島部隊發的夾克不一樣,外島部隊的夾克是有毛領的。

這部電影設定的背景是金門,但是裡頭出現的並不是金門的溫度,而是另外一種心理的溫度。《軍中樂園》題材上雖然設定成是個國共內戰背景的服役故事,可是從時間的安排上,更像是把服役當做暑假來拍,文類(genre)上更接近一些青少年成長 YA 電影。

Continue reading

Swift 會不會取代 Objective-C?

說到 Swift 會不會完全取代 Objective-C,目前看起來是,在 iOS 8 推出之後,應該不少應用程式會使用 Swift 開發,但是 Framework 這一層還是要用 Objective-C 來寫。

我們還是要回來看 Objective-C 與 Swift 的 run time 是怎麼實作的。無論是在 Objective-C 或 Swift 中,一個 class 有哪些 method,都是儲存在 virtual method table (以下簡稱 vtable)中,但是實作方式不一樣。

Objective-C 的 vtable 是個像是 dictionary 的實作,table 中每一筆資料都是 C 字串當 key(又稱 selector),對應到相對的 C Function pointer,所以每次呼叫某個 Objective-C 物件的某個 method,就是透過一個叫做 objc_msgSend 的 function,在表格中根據字串當 key,尋找對應該執行的 function—如果找不到,還會去問這個 Class 是否有實作 forwardInvocation: 這個 method,還是沒有的話,就會丟出找不到 method 的 exception,這部份可以參考蘋果自己的官方文件

至於 Swift 的 vtable 則是一個 array,對某個物件呼叫某個 method 時,相當於要求執行這個 function array 當中的第幾個 function(參見 Mike Ash 的文章)。

如此就會造成以下影響:在 Swift 中,尋找要呼叫的 method 的速度,理論上就會比 Objective-C 來得快,因此同樣功能的程式,用 Swfit 寫,整體上應該會比用 Objective-C 來得快。但同時,Swift 的 vtable 中每個 function 的順序就不能改變,在編譯的時候,vatble 裡頭是什麼順序,在執行的時候就得要是什麼順序,如果是執行的時候載入了不同的 runtime,順序不對,那就會呼叫到錯誤的 function。

蘋果是怎麼確保 compile 時用到的 runtime 與執行時的 runtime 是同一份呢?就是,在編譯應用程式的時候,Xcode 會自動把一份 Swift runtime 複製到應用程式的 bundle 中;所以,你的裝置中有多少個 Swift 應用程式,就會有多少份 Swift runtime。Swift 的 runtime 本身不大,這麼做還沒什麼問題,但是你寫一個 iOS 應用程式還會用到 Foundation、UIKit…一大堆的 Framework,如果要把每個 Framework 都複製一份,聽起來就很不對,照裡說不會換成 Swift 才對,Objective-C 當初用字串當 key,某方面來看,也就是為了處理像 DLL Hell 這樣的問題。

外部開發者比較沒有機會寫到比較底層的 Framework,如果只是寫一個 iOS 應用程式的話,按照蘋果的宣稱,全都用 Swift 寫看來不是什麼問題。

而在 iOS 8 之後,蘋果也終於開放在應用程式 bundle 中,放置自己寫的、或別人包好的 Framework(Mac OS X 從一開始就開放了)。如果是自己寫的 Framework,而且這個 Framework 與主要應用程式的 Target 是在同一個 Xcode project 中,跟著主應用程式 Target 一起編譯,那應該還不會有什麼問題,但如果用的是別人已經編譯好的 Framrwork,那就相當危險—你不能夠保證別人的這個 Framework,與你現在的開發環境用的是同一個版本的 Swift runtime。

iOS 8 同時也開放了一些系統 extension,這些 extension 感覺起來原理就是 Mac OS X 上的 plug-in bundle,透過 dynamic loading 讀入外部的 library。感覺起來 extension 用 Swift 寫似乎也頂危險的—一個應用程式載入一堆 plug-in,每個 plug-in 可能相依於不同的 Swift runtime,看起來就會出亂子。不過目前還沒看到蘋果自己在這方面有什麼文件。

ATAT

ATAT

買了一台 ATAT 的樂高積木,放在辦公室裡。

ATAT 實在是整個《星際大戰》系列,甚至是我所看過的所有科幻作品中,最引人入勝的機械設定之一。整個機體的設定真是何等的荒謬,而就是 ATAT 的荒謬,使得 ATAT 如此讓人著迷。

在脆弱、修長的四肢上,是巨大笨重的軀體,裡頭裝載了複製人雜魚大軍。明明就是毫不堅實、搖搖欲墜的基礎,偏偏又要弄得異常高大,只要破壞其中一隻腳,立刻再起不能、失去作戰能力。ATAT 的四肢脆弱就罷了,作為運兵用途的機械,關節居然被設計成完全無法轉向,開始走動之後,就只能夠直線前進;搭配遲鈍的移動速度,把 ATAT 送上戰場之後,就是單調、不知變通地一路緩慢亂衝一陣,最後重重地、狠狠地摔落地面。這樣的機械設計出來,根本就是讓官兵趕著送死。

只能夠直線前進,我們還需要駕駛做什麼呢?頭部的駕駛艙到底有什麼作用呢?頸部的關節倒是可動的,我們可以讓當頭的東擺西擺,但不管頭怎麼擺、頭打算晃到哪個方向,腳就是無法改變方向,腳就是這麼脆弱,完全不會改變緩慢向前直線前進最後摔倒送命這種命運。

頭到底還可以做些什麼呢?你看到了那幾門砲管,於是恍然大悟—是了,是嘴砲。ATAT 左邊有一門嘴砲,右邊有一門嘴砲,下巴還有兩門嘴砲,這玩意有好多嘴砲。

這樣的東西擺在辦公室裡,實在太合適了。

Swift

來講講從今年 WWDC 之後,到目前為止練習 Swift 語言的心得。

想想其實蘋果推出一門新語言其實並不奇怪。雖然對許多人來說,是最近幾年才開始學 Objective-C,但是 Objective-C 算一算已經有三十多年的歷史,而三十年過去,自然不少人會看到這門語言的缺陷。

Continue reading

有人問我 Design Pattern

我說,Design Pattern 對軟體工程師而言,就像是在格鬥電玩裡頭所謂的「連續技」(Combo)那樣的東西。

你學會了開發工具的操作與程式語言,像是學會了如何使用搖桿上每個按鈕的功能,你開始接觸函式庫,像是選擇了要使用的角色,你學會某個函式如何使用,就像是學會了某個招式。

接下來,你發現將某些招式組合起來,可以發揮更大的威力,像是,如果你玩格鬥天王系列,就知道如果讓草薙京把對手踢到空中的時候,就可以施展大蛇薙,這,我們稱之為連續技;如果你平常就熟練這些連續技,又清楚出招的時機,經常可以有效傷害對方,取得不錯的成績。

Design Pattern 就是這些年來許多軟體工程師所整理出來,在某些情況下,你可以如何用某些方式組合函式與物件之間的關係,並且給了這些關係特定的名字,讓在你日復一日的開發工作中,在遇到某些類似的時機可以用上,而且提供了一套現成的詞彙,方便你說明你做了什麼,或是打算怎麼做某個東西。

有人問我會不會注重、應不應該注重 Design Pattern,這個問題實在有點奇妙…我還沒有看過多少人玩格鬥電玩不練連續技,但也沒有看到有人每次在對戰中,都非要把某套連續技施展出來不可。

Continue reading