l

2016年8月1日 星期一

如何讀懂別人的程式?

July 31 21:20~22:53

螢幕截圖 2016-07-31 22.49.34

 

上週的「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為什麼經常被只被視為一種解決方案?這個結果會造成什麼不良的影響?

***

友藏內心獨白:自己寫的程式都看不懂了,更何況是別人寫的。

2 則留言: