### 功能型手機Java VM(J2ME)移植
在智慧型手機問世之前,J2ME是手機上面可下載的遊戲或應用程式所使用的主流技術。當時的功能型手機沒有統一的硬體平台,各家手機製造商各別採用了不同架構的晶片,因此Java的跨平台特性讓軟體開發商可以有一個統一的執行環境,讓開發出來的遊戲與應用程式可以在眾多廠牌的手機上面執行。而要讓這些不同架構的手機執行Java程式,就需要將Java VM(虛擬機器)能夠移植進這些手機平台的程式碼中。
在曜碩科技服務的期間,我參與過多個型號的手機的Java VM的移植工作;每一個移植的案子都包含以下的工作:
#### 中介層撰寫(Porting)
Java VM本身是一個函式庫,程式碼是授權自Java的開發商Sun Microsystems,保證了與J2ME相關規格的相容性;公司再根據Java VM運作需要的系統功能,制定了一個與手機平台介接用的API;而Java VM的移植工作就是將VM的函式庫整合進到整支手機的程式專案中,並按照手機平台所提供的軟體功能,撰寫程式碼來對應VM介接API所需要的功能。
例如當使用者按下手機的按鍵,手機平台要把這個事件通知到Java程式,就需要按照該手機平台的設計,撰寫程式接受到按鍵的事件,再呼叫Java VM的介接API把訊息傳進去,讓裡面執行的Java遊戲收到使用者的操作。反之,當Java遊戲要發出音效時,Java遊戲呼叫的是定義在J2ME規格的多媒體相關的標準API,Java VM再呼叫中介層定義的與音效相關的API;移植的工作就是要撰寫程式,在中介層的音效API被呼叫時按照該手機平台的規格,呼叫相對應的音效函式,就實現了Java遊戲在這個手機平台發出音效的功能。
手機平台的程式碼多為C語言撰寫,因此Java VM的移植工作主要也是使用C語言開發。使用到Java語言的時候反倒是在測試移植的正確性時,會撰寫J2ME的應用程式來檢查Java的功能是否如預期。
#### 應用程式管理器
當年的手機平台本身並未提供使用者自行安裝程式的功能,所有手機選單上的功能都是固定不變的。因此還需要開發一個Java應用程式的管理器,整合進手機的主選單裡,以提供使用者需要的下載、安裝、執行或刪除程式等管理功能。
#### 相容性測試(TCK)
完成移植之後,還有一個重要的工作就是「相容性測試」,要完整執行原廠提供的整套測試用例,以確保J2ME定義的各種功能都符合規格上定義的行為。只有通過相容性測試,才能夠被原廠授權,可以宣稱與J2ME規格相容。支援測試模式需要連續自動安裝、執行測試,並收集測試結果回報給測試主機,因此在提供給使用者的介面之外,還需要為這個手機平台撰寫測試模式需要的機能,讓測試人員可以自動化的執行測試程序。
### 藍光光碟播放功能與BD-J開發
藍光光碟片除了影片內容,也有互動性的功能選單讓使用者操作,甚至可以在光碟片中放上Java程式讓使用者操作,提供功能更豐富的互動介面,這代表藍光播放機上面都會搭載Java VM,以執行互動程式。基於手機上的Java VM產品的成功經驗,公司嘗試跨入藍光播放機的Java VM市場;我參與了這個產品的初期研究,參與了以下的開發工作:
#### BD-J VM 中介層API制定
在藍光光碟規格中,規定了播放機要支援的Java API(稱之為BD-J),以提供一致的功能讓光碟片的開發商可以確保互動程式可以在任何相容的播放機上正確執行。因此如同手機上的Java VM產品,我們需要為藍光版本的Java VM設計一組中介層,方便將來移植Java VM產品到不同的硬體平台上。
#### 播放器參考實作(Reference implementation)
為了驗證BD-J的功能,必須要有一個執行的環境讓Java VM可以實際執行,實際控制影片的播放、快進、跳到下一章節等動作,因此我們開發了一個Linux版本的藍光播放軟體作為「參考實作」;可執行BD-J的互動程式,顯示其選單畫面,並且執行基本的影片播放。
這個參考實作是在Linux上以C++開發,使用DirectFB作為畫面顯示的基礎平台,並利用GStreamer實作影片播放功能。
### 公司內部管理系統建置
除了公司核心的Java VM相關產品,我也參與了公司內部系統的導入與開發,以增進工作效率。
#### 企業知識管理平台(Confluence)
為了將開發過程中累積的知識文件化,提供一個容易查詢也方便編輯的知識共享平台,我參與了企業知識平台的導入。選用的是Confluence這個套裝的系統,架設在公司內部的網路。這套系統支援了類似wikipedia的語法,方便員工快速撰寫格式清晰易讀的文件,文件之間也可以很簡單的建立連結,方便互相引用。
#### Issue tracking 系統(JIRA)
隨著公司規模成長,需要有效管理發現的bug,追蹤開發進度,我負責為公司挑選合適的issue tracking系統。最後挑選JIRA的原因主要是其自訂流程、狀態、以及設定通過條件等等客製化空間很大,可以配合團隊的工作習慣定義最適當的處理流程。
由於JIRA的客製化彈性,我也協助公司的管理部門透過自訂流程的方式,以JIRA系統來管理諸如合約簽訂這類在不同階段需要不同主管核准、放行等等需要控管的流程。
當時公司正在導入ISO 9001認證,藉由將事務的流程規則定義在JIRA系統,只要在JIRA系統上面操作就一定會符合規定的流程,每個控制點都由具有權限的人授權,自然就滿足ISO的要求,無需增加人工稽核的負擔。
#### 工時紀錄系統
每個專案開發所花的工時,都被視為公司產品的成本,在會計上必須要正確的紀錄,因此公司自己開發了一個系統專門讓工程師填寫每天在哪個專案上面花費的時間。我參與了這個系統的開發,使用Grails框架搭建網站,後台搭配MySQL資料庫。以這個框架建構的網站符合MVC的架構,並且內建了ORM來以物件導向的方式對資料庫的操作。在學習使用這個框架,以現代化的觀念搭建網站的過程中,我學到很多寶貴的經驗。
### 自動化硬體測試工具
除了軟體的產品,公司也試圖跨展到IOT相關的硬體領域。當時選定藍芽模組作為家電自動化的控制核心,在試產的過程中衍生出開發測試機具的需求。我參與了測試機具的控制軟體的開發,利用Arduino開發程式來偵測測試治具的開合。當測試人員把藍芽模組放上治具,並搬動把手固定住模組,測試的接腳便會接上;此時Arduino程式偵測到治具關上,便透過serial port通知電腦上的測試軟體開始執行測試。藉由自動偵測開合,測試人員可以不需操作電腦畫面,只需手動放上模組就可以逐個進行測試,減少操作的不便並減少人工錯誤。
隨後公司推出了一些電玩搖桿的產品,我也參與了搖桿的測試工具開發,利用電腦程式呈現搖桿與按鍵讀取到的數據,讓工人檢查搖桿推到左右上下邊界時是否能讀取到正確的數字,按下搖桿按鈕時是否收到信號等等。