經過一年多的煎熬,我的職場處女作 Garmin nüMaps,以及最棒的團隊所打造出最棒的台灣圖資,終於在週二的記者會宣告之下正式對外上線了!

去年八月進公司開始,從 study 地圖座標投影及蒐集線上地圖相關技術開始,試著將公司資料庫內的數位化圖資繪成一張張圖檔,再慢慢刻出自己的 JavaScript API,一套簡單的網頁地圖瀏覽系統就此誕生,至此一共花了三個月。這一階段遇到的主要問題,就是 tile 檔案數目過多,以至於在部分 file system 會發生超過 i-node 上限的問題,而在部分 file system 則會有同一目錄內檔案數目過多造成存取速度銳減的情形,也因此花了一些功夫了解各 file system 的特性,之後在 file system 的選擇以及檔案的結構配置上也就比較有概念。
地圖呈現之歷史畫面
2008 年度報告時的模樣
秉持著「先求有再求好」的精神,有了基礎建設後,接下來就開始進行美化的工作。除了 JavaScript API 演算法及功能上的提升 (包含處理非常煩人的 cross-browser issue),也研讀了幾篇 labeling algorithm 相關的學術論文,使畫面的呈現盡可能地絢麗又不失舒適,並匯入更多種類的資料讓畫面內容盡可能豐富詳盡。至此,回報系統的雛形大致完成,又三個月過去了。
2009 年 4 月報告時的模樣
為了讓使用者能快速找到想尋找的點位,「搜尋」的功能刻不容緩。在稍微深入了解搜尋引擎的運作後才發現,中文搜尋首先面對的三大難題就是「斷詞」、「新詞」及「簡稱」等問題。「斷詞」部分舉個眾所皆知的例子來說,「下雨天留客天天留我不留」就有好幾種斷法,這將造成建立 index 上的模稜兩可。由於中文是活的語言,「新詞」的出現在所難免。常見的新詞大致可歸類為特殊領域新詞 (「非同步傳輸模式」)、時勢性新詞 (「一國兩制」)、衍生性新詞 (「數位化」)、合併性新詞 (「砍掉重練」)、火星新詞 (「殺很大殺不用錢」)、名字新詞 (「瑤瑤」) 等,除非有個字典不斷自動擴充各種新詞,不然一旦遇到了系統也無法解讀。「簡稱」的問題就更有趣了,中文的簡稱向來沒有一個制式化的標準,同樣是兩個詞的合併,有兩個頭合併的簡稱 (「節約能源」簡稱「節能」),有兩個尾合併的簡稱 (「香港總督」簡稱「港督」),有頭和尾的簡稱 (「外交部長」簡稱「外長」),也有頭頭尾的簡稱 (「安全理事會」簡稱「安理會」);你以為這樣就結束了嗎?同樣一個詞在台灣和中國大陸有著不同的簡稱 (「清華大學」在台灣叫「清大」而在中國大陸叫「清華」),還有那種順序顛倒的簡稱 (「第一核能發電廠」簡稱「核一廠」),還有簡稱再簡稱的 case (「冬季奧林匹克運動會」簡稱「冬季奧運會」再簡稱「冬季奧運」再簡稱「冬奧會」,更不用說用數字來簡稱的詞 (「通郵、通商、通航」簡稱「三通」)。也就是說,一旦使用者輸入這類「斷詞」政治不正確、系統沒見過的「新詞」或是毫無規則可言的「簡稱」字眼,搜尋結果的正確性就可想而知了。而現有的解法大致可分為兩大類:character-based 和 word-based。Character-based 的精神在於不管三七二十一,來幾個字切幾刀,亂槍打鳥只要子彈 (儲存空間) 夠多總是能打中的。而 word-based 則大致可以使用自動統計學習、手動建立字典、以及語意分析等方式來較為精確的切出當中的關鍵字,然而學習來源以及固有字彙的多寡仍然深深影響切割後的結果。因為相關論文表示前者的正確率並不亞於後者,再加上實作起來較為直覺簡單 (其實主因是本人智商不高),所以最後採用 character-based 的作法,加入一些客製化的變形,一個能夠同時搜尋地址、經緯度、POI 點位的地理資訊搜尋引擎就此誕生。突然發現好像打太多了...。總之,和 JavaScript API, labeling algorithm 有花俏的畫面和功能相較起來,同樣花了這麼多時間,結果呈現在使用者面前卻只有兩個平淡無奇的長方形:一個 text box 和一個 submit button,想想其實還蠻辛酸的。
一個搜尋欄位和一個按鈕的背後,隱藏著無數不為人之的奮鬥過程
為了滿足搜尋所需要的龐大 computation resource,同時解決未來上線時將會遭遇到的 bandwidth (以及 response time), storage, stability and scalability, security 以及 cost 等相互牽制的問題,為這套系統找個合適的居所也得花一番心思才行。根據前人的經驗,通通自己來要不就是砸大錢建置硬體設備及維護管理,要不就是等著被蜂湧而至的使用者打爆,也因此 outsourcing 似乎是較為可行的方式。經過 survey 發現多種方案,包含 shared hosting, cloud hosting, virtual private server (VPS), dedicated hosting, content delivery networks (CDN), Amazon EC2/S3, Google App Engine 等,就 C/P 值來說,Google 似乎是俗 (甚至免費) 又大碗的不二選擇,就它了!而為了 Python 支援度較高的 Google App Engine,也在惡補之下將 Python 這個 fucking damn fantastic 的語言學了起來,並應用在許多邪惡的事上 (糟糕!不小心說溜了嘴...),真是一舉數得啊!至此,系統悄悄在公司的防火牆外露臉。
歷經了小組測試、部門測試,以至於公司發動測試小組進行多方面測試,到後來動員全公司的測試,收到許多熱心的回饋和指教,在效能及功能上也做了大幅度的調整和提昇。終於,在 mobile01 第一篇新地圖討論串的帶動下,系統正式在所有使用者面前曝光。
目前 Garmin nuMaps 線上勘誤系統的模樣
系統上線一個禮拜來,除了 Google 例行性維護好死不死剛好就在發佈後的隔天,造成系統無法使用一個多小時外,其餘時間在 Google App Engine 及 Akamai 兩朵大雲的支撐下,運作上都還正常。
一個禮拜來,也得到許多來自四面八方的正反面迴響,箇中的酸甜苦辣,實在難以用言語表達,大概只有自己最清楚。無論如何,這算是自己職場上一個好的開始。期許自己在未來的路上,能夠繼續保持這一年來邊作、邊學、邊玩的心態,在成長的同時,除了盡可能保有正常的生活步調外,也能對社會有所貢獻。
P.S. 倘若各位看倌發現任何地圖內容上的問題,方便的話也煩請協助撥冗到 Garmin nuMaps 線上勘誤系統上進行回報喔 (需先經過簡單的程序建立 myGarmin 帳號並登入)!Garmin GIS Taiwan Map Team 感謝您!