July 31 21:20~22:53
上週的「Design Patterns這樣學就會了–入門實作班」下課後有學員問:「要怎麼讀懂別人的程式?例如開源軟體或Android原始嗎?」這個問題不容易回答,畢竟撰寫程式的風格那麼多,系統有大有小,要讀懂別人寫的程式的確不是容易的事。
這個問題讓Teddy想起若干年前還在讀博士班的時候,有一陣子想要研究「是否有什麼方法可以自動找出軟體系統中套用了哪些design pattern?」當時花了點時間找了一些論文,發現原來軟體工程有一個領域叫做Program Understanding專門在討論如何了解程式碼的問題。剛剛翻了一下之前找的資料,有一篇發表於EuroPLoP(歐陸的Pattern Language of Programs研討會)的論文叫作「A Pattern Language for Reverse Engineering」,用模式語言(pattern language)介紹逆向工程,提供給鄉民們參考。
該文章將逆向工程的pattern依據流程階段不同分成四大類:
- First Contact:第一次接觸階段,包含四個模式,
- Read All the Code in One Hour(一個小時內讀完全部程式碼)
- Skim the Documentation(瀏覽文件)
- Interview During Demo(在示範中訪問),找懂系統的人來demo,然後在過程中問他問題。
- Confer with Colleagues(與同事商議)
- Initial Understanding:初始理解階段,包含三個模式,
- Speculate about Domain Objects(推測領域物件):依據自己的經驗建立一個class model用以代表所要解決的問題領域。透過閱讀程式碼來修正這個模型一直到你覺得模型穩定為止。
- Analyze the Persistent Data(分析持久性資料):檢查資料庫中的實體(entities)並判斷他們是否代表有價值的物件。 可以透過資料庫的實體建立class model藉此理解系統。
- Inspect the Largest Entities(檢查最大的實體):在幾百萬行的程式碼中很難看出重要的功能位於何處。可以先透過度量工具掃描原始碼,從繼承階層、模組、類別、函數這些對象中找出較大或異常者。從原始碼中判斷這些找出來的實體是否有實作特別重要的功能。
- Detailed Model Capture:詳細模型擷取階段,包含三個模式,
- Derive the "true" Public Interface
- Step Through the Execution
- Reconstruct the Iterations
- Prepare Reengineering:準備逆向工程階段,包含三個模式,
- Write the Tests(寫測試)
- Refactor to Understand(透過重構了解系統)
- Build a Prototype(建立一個雛型)
***
這篇論文在網路上有兩個版本,分別詳細介紹前兩個階段的pattern。論文可從此下載:
雖然沒有包含全部四個分類的pattern,但這兩篇論文還是有其參考價值。首先論文從流程的角度告訴讀者,理解一個系統需要按部就班的準備工作,並把這些工作整理成pattern的格式來表達。其次,因為論文採用pattern的格式撰寫,對於研究pattern的人可以學到以下額外知識:
- 文中特別分析每一個流程階段所面對的作用力(force)是什麼,對於想進一步學習如何分析force的人可作為參考。
- 文中的pattern包含了Teddy經常提到的Context、Problem、Forces、Solution,可以嘗試找1~2個pattern來詳讀,比對一下與GoF的design pattern寫法的差異,思考一下少了problem與forces的GoF格式的design pattern為什麼經常被只被視為一種解決方案?這個結果會造成什麼不良的影響?
***
友藏內心獨白:自己寫的程式都看不懂了,更何況是別人寫的。
建「力」一個雛型
回覆刪除已修正,謝謝。
刪除