Email me: jollen # jollen.org

more: Jollen 的 Embedded Linux 教育訓練

« August 2011 | (回到Blog入口) | October 2011 »

September 2011 歸檔

September 5, 2011

Android 軟體品質管理: 台灣硬體廠如何提升軟體能力

文/Jollen Chen (原文刊載於零組件雜誌 2011 年 9 月號)

建立 Android 專用的 Code Review 流程是關鍵

照顧程式碼品質就像照顧身體,要常常檢查,隨時注意異狀。Android 的開發工作如果要確保可用(Usable)與穩定(Stability),就要做好 Code Review 的工作。根據過去與許多廠商的合作經驗發現,許多關鍵的軟體開發觀念經常被忽略。主要的原因為,大部份的技術開發思惟,都比較偏向硬體與驅動程式方面,或是功能性的實作。

軟體的開發本身就是一項大工程,由 Android 所創造出來的手機作業系統,可能有近 90% 的比例是透過軟體工程的技術與觀念所開發,其它 10% 才是考量硬體層面,或是驅動程式層面。換個角度來看,以台灣硬體廠商的技術水準,如果把軟體工程的技術養成,一定能具備產品開發的實力。以下提供個人的一點建議:台灣硬體廠該如何提升軟體開發能力。

第一、先做再說、確實可行。單獨以 Android 的框架與軟硬整合的角度來看,先設計後實作(Design & Implementation)的方法論可能不適用於台灣的產業環境,因此導入傳統的軟體工程方法論,或許也沒有絕對的必要性;原因是,Android 已經把這些基礎建設都做到一定程度了。在理論與實際間取捨的話,「先實作、後檢視」可能是一種方式。

目前在業界所見的程式碼實作,大多偏重硬體與功能面,在理論面著墨不深,不過這卻是個很好的契機。過去自已的經驗發現,先實作,得到初步可用的程式碼實作後,再考量理論面,進行程式碼調整,其實是可行、有效率的做法。因此,自已也希望能將這個觀念與方法論,提供給客戶參考,甚或協助導入「先實作、後檢視」的作業流程。

什麼是 Code Review

第二、實施 Code Review 就對了。軟體的開發工作,都會有 Code Review 的流程。這裡所提的「檢視」即 Code Review。Code Review 是一個很久的觀念了,它在軟體管理(Software Management)的領域裡被詳細討論。

Code Review 是一個系統化的檢查過程,目的是確定程式碼的品質;檢查的過程,是為了找出錯誤、並且修正錯誤,這些錯誤在初階的開發階段(Initial Development Phase)可能不會被發現。這裡的「錯誤」也包含「觀念上的錯誤」、「理論的誤用」等等,因此,能動作(Workable)的程式碼,不見得是正確的程式碼。

Code Review 是教育訓練的一環

第三、搭配教育訓練。Code Review 還有另外一個很重要的目的,卻不常被提及,就是「提升開發人員的技能」。Code Review 等於 Improve Software Quality + Improve Developer's Skills。軟體的品質,影響軟體的穩定性;人員的素質,影響軟體的品質。在初階開發階段,可以不必發現理論上的問題,而是下一階段,由資深開發人員協助 Code Review,再進行程式碼調整,以提升軟體品質。這就是「先實作、後檢視」的精神。

最後、其實是一個例子。以 Android Framework 與 Linux 驅動程式為例,主要影響系統穩定性的關鍵在於「Android 框架與 Linux 驅動程式的資料傳遞方式」,即「儲存資料」並「傳遞記憶體」的方式。「記憶體的使用」是影響 Android 與 Linux 整合穩定性的主要因素。Android 底層可能需要以 Memory Heap 來儲存並傳遞大量資料,而非以 C 語言指標(Pointer)的方式進行。

從事硬體發展的研發人員,可以在初階開發階段以 malloc 搭配 C 語言指標,來傳遞硬體資料給 Android 作業系統。但是,必須有 Code Review 人員,協助將初階的實作,修改為 Memory Heap 方式,並以物件觀念傳遞。 重構後的程式碼,可以協助該硬體開發人員,提升他(她)的軟體技能。這種「先開發、後檢視」的作法,就是 Code Review 的精神,也是台灣硬體業提升 Android 程式碼穩定性,以及提升開發人員技能的一個方法。

September 27, 2011

[教育訓練紀錄] Android 的 JNI 開發,排名第一名的誤用是?

Java 與 native code 的溝通介面稱為 JNI,這是 Android 底層開發的基本技術。不過,有許多 C 語言遺留下來的壤習慣,讓很多系統程式的開發者,一不小心就把 JNI 的程式碼寫錯。本週將會在一場論壇上說明幾個「誤用 C 語言」的例子,希望對 Android 底層開發的初學者有幫助。

近期在協助一家企業進行 Android 內訓,也遇到工程師問起「Java 如何與 C 傳遞資料」的問題,以傳遞陣列來說,其程式碼的寫法,跟傳統的 C 語言寫法有點不同。

從過去的教育訓練經驗裡也能歸納發現,排行榜第一名的誤用莫過於「陣列傳遞」,當 Java 透過 JNI 傳遞 Array 給 native code 時,native code 必須使用 JNI 的 GetIntArrayRegion() method 來讀取,而不是使用 C Pointer 的做法。

例如:

int intArrayAdd(int *num)
{
   int i, sum = 0;
   
   for (i = 0; i < 10; i++) {
      sum += num[i];
   }
}

換成 JNI 的話,應該改寫成:

intArraryAdd(JNIEnv *env, jobject obj, jintArray arr)
 {
     jint buf[10];
     jint i, sum = 0;
 
     (*env)->GetIntArrayRegion(env, arr, 0, 10, buf);
 
     for (i = 0; i < 10; i++) {
         sum += buf[i];
     }
     return sum;
 }

這裡的概念是,將陣列 copy 到 native code 裡後再使用。相關的完整說明,可參考「The Java Native Interface. Programmer's Guide and Specification」第 3.3 節。

關於 September 2011

此頁面包含了在September 2011發表於Jollen's Blog的所有日記,它們從老到新列出。

前一個存檔 August 2011

後一個存檔 October 2011

更多信息可在 主索引 頁和 歸檔 頁看到。

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org