Jollen's email: jollen # jollen.org

more: Jollen's Consulting | Jollen's Wiki | Jollen's Android Framework in a Nutshell

May 16, 2012

什麼最重要、Browser 最重要

HTML5 來了。什麼最重要,Browser 最重要。因為所有 HTML5 App 都在 Browser 環境裡執行,所以,HTML5 App 的 Runtime 就是瀏覽器。

正因為這個原因,各家軟體大廠無不加碼研發人才,努力打造一個能完全相容 HTML5 的瀏覽器,連今年10月份要登場的 Windows 8 Mobile Phone 也在 HTML5 做了很大的改進。

可以這樣想,第一代的 App 使用 OS 做為 Runtime。第二代的 App 使用 Java Virtual Machine 做為 Runtime,例如:Android。第三代的 App 將使用 Browser 做為 Runtime。所以,Runtime 就是個關鍵技術。No Runtime No Running。以前沒有掌握好 OS 沒關係,過去沒掌握好 VM 沒關係,現在還是沒掌握好 Browser 技術,就很有關係了。

所以,各大瀏覽器與 HTML5 的相容性,成為相當重要的指標。因運而生的網站 html5test.com 可以幫助我們了解瀏覽器的 HTML5 相容性。根據最新的 html5test 測試報告,桌面瀏覽器 (Desktop) 平均分數仍然領先行動 (Mobile) 瀏覽器,可見 HTML5 在桌面環境的部份,會優先成熟。

而目前在桌面瀏覽器的部份,來自北京的 Maxthon 瀏覽器以 437 分取得第一,領先第二名的 Chrome 18。Chrome 原本是被寄於厚望的 HTML5 先鋒者,沒想到被大黑馬 Maxthon 超越。由此可見,大陸的軟實力不容小覻;並且,在 HTML5 方面,大陸目前也扮演了非常重要的角色。


my-score.jpg
我目前使用的瀏覽器

score-desktop.jpg
桌面瀏覽器:Maxthon 成為領頭羊,Chrome 緊追在後

score-mobile.jpg
行動瀏覽器:沒有意外地,Opera 拿到第一

April 15, 2012

[Jollen's AFC] 1.3 C & Object-oriented

最經常使用的物件導向觀念就是繼承(Inherit),使用C語言如何實作繼承?最實用的例子就是 Android HAL。以下圖為例,這是一個標準的 HAL Stub 設計。這個例子試圖在原有的 Android 作業系統裡加入一個「LED Stub」,透過 LED Stub 來控制底層的 LED 硬體。

圖1.3是一個標準的繼承設計,也就是說,在設計 HAL Stub 時,需要重用 hw_module_t 設計。從架構設計的角度來看,我們進行設計重用的工作,以擴充出 LED Stub;錯誤做法是,直接修改原有的 hw_module_t 設計,以達到原本的要求。上述觀念,就為設計重用(Design reuse),這是軟體工程領域相當重要的知識。

figure-1-3.png
圖1.3 HAL Stub設計重用

在開發 Android 系統時,會不斷地 reuse 原有的設計,以擴充出想要的功能。

以標準 C 語言實作圖1.3的方式如下:

1. 以資料結構(Data structure)來描述類別(Class)
2. 以資料結構的第一個欄位(First field),來表示繼承

所以圖1.3的意思是 led_module_t 繼承 hw_module_t,用 C 語言來實作,結果如下:

struct led_module_t {
   struct hw_module_t parent;
};

C語言沒有明顯的物件導向語法,因此以C語言實作物件導向的繼承,又是另一個Implicit of object-oriented的例子。

April 12, 2012

Jollen's AFC 電子書開工了,順便提暢 Single 的概念

先前在「Jollen 的 Android Framework Complete (框架大全) 課程發表、外加感想」提到了想把 Jollen's AFC 寫成一本書的構想,現在開始付諸行動了。學生時代寫書,其實也不是為了寫書而寫,大多是平常做技術的零碎紀錄,再匯集而成。在看到自已的成果出版成實體書時,內心可是無比的感動與激動,要特別感謝旗標出版社當時給了我這麼好的機會。

這次,也打算開始整理手邊的資料,慢慢匯整成一本書,並且一邊整理,一邊上線。這就是數位內容的好處,不用一次全寫完再出版。新書的書名也未定,所以暫且叫做「Jollen's AFC」吧。不過,這次不打算出版實體書,原因有三:

1. 這是冷門書。內容不在迎合業界需求,而是希望寫出真正自已想像中的作品。

2. Light-weight content,頁數鎖定在 200 頁上下。簡單說,出版社考量實體書售價(根據頁數),以及管銷成本等,應該也不願意出版。

3. 不能 Print on demand,也就是不能「隨選列印」。有時讀者可能只想看,並且列印部份內容而已。

近二年,原文書掀起一股輕量級風,越是有深度、越是複雜的技術,內容就更輕量級。這種書的優點是,讀起來全不費工夫,而且一氣呵成,暢快無比。缺點是,底子不深,就很難啃,自已也踼過幾次鐵板。寫出這種書的作者,必定底子深厚,而且把知識融會貫通得很好。我決定多磨練一下功力,挑戰這種輕量級的寫作。

輕量級寫作的重點,在於頁數少,或是字數少。不過,最不重要的就是它的頁數或字數,而是內容的價值。輕量級的書,就是「底子不深不好啃」的概念,看起來小小一本,質量卻很大,讀起有重量。中文電腦書流行的磚頭書概念,也是經常有不錯的作品,但是請避免看起來很大,讀起來卻很輕的現象。例如,連續20頁都是程式碼(Source code listing)。

其實網路上有許多優質的短篇內容,但並不利於做實體出版,就算要出版,出版商也會請作者想辦法補到一定頁數。於是,為了補頁數、趕截稿,作者只好草草做工,所以最後的章節,也就草草了事。非常可惜。

為了不讓短篇內容,被出版商裝上義肢,所以 Amazon 就提出了一個解決方案。線上自助出版平臺。

Amazon 把這類有價值,字數介於一萬至三萬字間的短篇(小品),稱為 Single,並且搭配 Kindle Fire 推出了一個獨立的 Single 線上自助出版產品線。

所以,「Jollen's AFC」將考慮數位內容與數位出版。曾幾何時,實體出版居然變成作者的 Last choice。

April 11, 2012

JavaScript 王者再臨

JavaScript 是「王者再臨」的最佳代言人,由於 jQuery 被大量應用在網頁設計上的原因,讓 JavaScript 再度被重視了起來;再加上 HTML5 的推波助瀾,JavaScript 儼然成為今年最受矚目的程式語言。

現在,JavaScript 的主要用途,已經由過去的動態網頁(Dynamic Webpages),轉為開發 HTML5 App 角色;也就是 HTML5 的應用。我們不僅僅使用 JavaScript 製作有動態效果的網頁,還藉助它來開發大量的 UI interactive、使用者體驗的設計,以及,最重要的雲端服務的整合。

還有一個很重要的應用,就是「JavaScript in Browser」,也就是利用 JavaScript 來增強瀏覽器的功能,最為大家所熟悉的例子,就是 Google Chrome。Google Chrome 為了增強對 JavaScript 的支援與效能,開發了新的 JavaScript 引擎;在日記「HTML5在手持裝置將開始爆發式成長」就提到了,「JavaScript引擎的成熟度是關鍵」。

所以,測試 JavaScript 的使用案例(Use Cases)在各大瀏覽器的效能,更為一項重要的工程工作。目前被軟體工程師廣為使用的 jsPerf 就是為此而生。更進一步地,由於 JavaScript 現在搭配 HTML5 來開發「軟體」,而不只是用來製作動態網頁,所以研究 JavaScript 的軟體設計模式,當然也就變成一門顯學;目前被廣為推薦的就是「Essential JavaScript Design Patterns」一書。

JavaScript 過去曾經在動態網頁製作上紅極一時,後來又迅速沈寂,2003到2007年這段時間,應該是 JavaScript 最谷底的時候。而後在 2007 到 2009 年,因為 Web 2.0 風格網頁,以及 jQuery 的盛行,再度得到開發者的重視。2010 到 2011 年因為 Mobile Native App 的大量流行,使得眾多開發者不再以 JavaScript 做為首選,再度走入低潮。

時間到了 2012 年,在 HTML5 時代正式啟動的今天,JavaScript 成為軟體工程師的必修語言,也是程式設計初學者的最佳選擇。從去年大約 1.5% 的使用率,飆升到這個月的 3.3% 左右的使用率。雖然它不是最受歡迎的程式語言,但是在「Browser & Webpages」的領域,頗有王者再臨的感覺。

April 8, 2012

[Jollen's AFC] 1.2 C & Object-oriented

Linux 核心是 implicit of object-oriented 的典型實例。例如,在開發驅動程式的過程中,雖然不需要特別了解驅動程式的物件導向架構,但其架構則是依循嚴謹的物件導向觀念。Linux 核心與驅動程式,都是以 C 語言實作。

另外一個例子,就是筆者在 Android Framework & HAL 課程中所提到的 HAL Stub 觀念。HAL Stub 可採用 C 語言實作,編譯後以 *.so 形式佈署,但它不是程式庫(Library),而是一個物件(Object)。


圖1.2 HAL Stub 架構

HAL 的模組稱為 Stub,Stub 是一種物件。Stub 在軟體工程領域代表「樁」的角色,也就是整體架構中的一小段基礎程式碼,這段程式碼有著以下二個特色:

1. 符合架構的程式碼(打地基)
2. 一段程式碼範本,最終的實作 (final implementation) 是代理人 (proxy) 的角色

但是,Android 將上述的物件導向封裝得非常好,不需要懂這些架構面的觀念,也能依循「步驟」實作出基本的 HAL Stub。

在軟體裡加上自已的實作,最重要的第一門課就是練習寫「樁」,也是打地基的程式碼。所以,我們要知道 Android 的整體架構,並依循其架構,設計並實作自已的 HAL Stub。由此可知,從事 Android 軟體整合開發,重要的背景知識是物件導向、軟體工程與 HAL 架構,而不是硬體的知識。另外,還有很重要的背景知識,就是如何以 C 語言實作物件導向設計。

步驟性的知識可以解決部份的工程(實作)問題,但因為缺乏系統性的觀念,將會影響解決整體性問題的能力。這就是「隱性物件導向」的概念,大部份我們接觸過的軟體,都是嚴謹的物件導向設計,只是因為它被封裝得很好,所以常常會忽略它,或是認為它不存在。

有一種誤解,可以說明這個現象。有些工程師,會誤以為使用 C 語法實作的軟體,並不是物件導向的架構,實則不然。Linux 核心便是一個很好的例子。Axel-Tobias Schreiner 在 1993 年發表了著作「Object-oriented programming with ANSI-C」,解釋了如何使用標準 C 語言 (ANSI C) 撰寫物件導向程式碼;國外有些大學,甚致將這個科目列為必修課。

因此,C 語言是隱性的物件導向程式碼,因為它不像 C++ 或 Java,有著明顯的物件導向語法特徵。這點對於研究工作其實是個麻煩,因為 C 語言沒有鮮明的物件導向語法,所以經常需要花費時間,來探索隱藏其中的物件導向設計。

[Top] Copyright (C) 2006,2010,2011 www.jollen.org.
All rights reserved. All contents are licensed under Creative Commons License.