當秋葉原的女僕轉過頭來跟我說了一句話,我和我的小夥伴們都驚呆了

這是去年八月的事。之所以到了現在才敲鍵盤記下來,主要原因是,這個故事基本上算是人生當中的一段黑歷史,可是這個故事,又充滿啟發,每當你回想起來,就會在心頭泛起一陣陣漣漪。

去年八月參加了公司的員工旅遊,是五天的東京自由行。由於我自己沒有規劃行程,所以就跟著公司安排的室友—另外一位在這個業界也算是有相當名氣的工程師,平常不少人也將這類型的工程師喚做「大神」—一起行動。

這位大神級的同事一年可能會去個十幾趟東京聽演唱會,前兩天先走了他的既定行程,先去獺祭把什麼 Beyond 啦、二割三的吟釀還是大吟釀喝了一輪,又搭了 JR 去趟輕井澤,來趟一天的小鎮單車之旅,吃了燒肉,還在輕井澤的 Outlet 買了一盒星際大戰系列裡頭的 AT-AT 樂高回來。至於吃個什麼一蘭拉麵,也是免不了。而就算在電車上往返的時間,大神也沒有閒著,既然是在東京穿梭,那就順便在 Ingress 裡頭把看到的東京地標也都打了一輪。

第三天,沒什麼其他的規劃,由於剛好是週末,就在網路上聯絡了一位因為軟體開發社群認識,現在在東京工作的朋友,看看東京還有什麼好去處。中午先約在池袋,午餐據說是只有當地人才會知道的道地拉麵,走出來看到對面的百貨公司裡居然有個不錯的畫展,也就進去逛了一圈—像我們這麼有文藝氣息的一群工程師,怎麼有辦法抵抗《攻殼機動隊》原畫展這樣的文藝活動呢?

當我們從士郎正宗的原始漫畫設定,一路看到攻殼機動隊 Arise 的美術之後,又想不到行程了。

「走!去秋葉原。」大神提議。

「來東京這麼多次,還沒有去過女僕咖啡店,我們今天就去—解開成就!」

Continue reading

在 Swift 裡頭呼叫 CFArray

在寫 Swift 的時候遇到 CFArray 都得要花點時間想一下。雖然當你在使用 Swift 語言的時候,你會盡可能希望只呼叫到 Swift 與 Objective-C API,而不用碰到 Core Foundation 的 C API,可是呢,當你在做某些事情的時候,就還是得遇到這些東西。

在 Swift 裡頭處理 CFArray 之所以不好搞,第一個原因是,當某個 API 希望你傳入 CFArray 的時候,建立 CFArray 的方式跟你在 C/Objective-C code 裡頭差異很大,但似乎也沒有看到多少文件在說明這點。

另外當你從 C/Objective-C code 傳遞了一個 CFArray 到 Swift 裡頭的時候,裡頭可能會有兩種類型的東西:一種是可以 bridge 成 Objective-C 或是 Swift 的物件—通常是 Foundation 或是 Core Foundation 的物件;另外也可能是其他種類的 C 指標,可能是某種另外定義的 C Structure,而在這兩種不同的狀態下,要用不同的方式操作 CFArray。

Continue reading

東森新聞雲捷運車廂廣告賞析

2015-02-23 21.12.42

在東森新聞雲的捷運車廂廣告畫面中,由左至右,我們可以看到以下元素:

  1. 文案:「新聞類網站票選第一名」。
  2. 兩支手機的圖片,看起來像分別是 iPhone 與 Android 手機,一支手機的畫面是有東森新聞雲 Logo 的 Splash 畫面,另外一支手機上,看起來則像是某個 App 的操作畫面。
  3. 看起來像是一對男女正要深情相吻的剪影,在這對男女的身後,則出現像是台北市河濱公園、或是新北市政府廣場上什麼新北歡樂聖誕城之類的活動會出現的大型愛心裝置藝術。
  4. 文案:「車廂裡,每 10 個人,有 8 個正在看…」
  5. 出現「東森新聞雲」字樣的搜尋引擎搜尋框介面。
  6. 兩個 QR Code,下方分別有 iOS 與 Android 字樣。
  7. 文案:「不管巧遇、外遇、豔遇,第一次相遇都在____」

如果這則車廂廣告的意圖是推薦東森新聞雲服務的話,就上面的七項元素來說,光是 1、2、5、6 這四個元素,就可以構成一個完整的故事,雖然這個故事也有點怪:東森新聞雲是票選第一名的新聞類網站,不過,雖然是個第一名的新聞網站,但我們不要去用這個網站,你應該去使用 iOS 與 Android 平台上的專屬 App,只要掃描 QRCode 就可以下載,或是用搜尋引擎找「東森新聞雲」關鍵字。

至於手機 App 的評價如何,從上述的線索中無從得知,不過,既然網站票選第一名會寫出來,如果 App 評價也是第一名,照理說也會寫出來才對,既然沒有寫出來,我們不妨猜測 App 並沒有第一名的評價。

不過,這些都不是畫面中最重要的元素,我們從一整塊粉紅色的背景,看起來就是要凸顯那對熱吻中的男女,加上正中央字體最大的文字是這段「車廂裡,每 10 個人,有 8 個正在看…」推論,這則廣告的重點應該不在於東森新聞雲這項服務,而是有一段更重要的敘事等待廣告的受眾發掘。

「每 10 個人,有 8 個正在看…」顯然是個懸疑式的標題,企圖激發讀到這段文字的人心中的懸念,你不禁猜想,這八個人到底在看什麼呢?另外兩個人在做什麼呢?你看到旁邊激情擁吻的身影,你就豁然開朗了,啊!這就是八個人之外的另外兩個人嘛!他們忙到自顧不暇,眼中只有彼此,當然沒有餘力可以看其他的東西囉。

回到「每 10 個人,有 8 個正在看…」—另外八個人到底在看什麼呢?如果是在看東森新聞雲,對照另外兩個人好一番人生勝利組的舉動,感覺起來,用 App 看新聞似乎是種非常魯蛇的行為;所謂廣告的目的就是希望看到的人購買,廣告想觸發的購買動機,往往就是營造階級可以向上提昇的想像,應該不會強調「別人在享受愛情,你只能看新聞」這種事。

所以我們該從別的方向來想—這幾個元素其實跟東森新聞雲根本無關。這八個人其實在看另外兩個人的精采演出,兩個人在相姦另外八個人在視姦;如此一來,我們也可以輕鬆回答「不管巧遇、外遇、豔遇,第一次相遇都在____」這個填空題,自然就是在捷運車廂嘛。嗯,真是好一幅溫柔繾綣的捷運風情畫。

ATAT

ATAT

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

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

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

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

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

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

有人問我 Design Pattern

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

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

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

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

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

Continue reading