2006年12月22日 星期五

開發速度和執行效率的取捨

最近發現在學弟版上回的問題,比我自己版上po的東西有營養多了 XD ,有些回文改改就適合放在Blog上分享。這篇是討論技術層面的軟工,人事管理的軟工請見”軟體開發與管理的思維:人月神話”

我看到的 書/文件 都強調不要早期做最佳化自早苦吃,把時間花在刀口上,最好是能動,快速開發出prototype,再漸漸改好它。更何況最佳化可以從很多層面執行,舉凡演算法、coding技巧、libaray、compiler、OS、hardware等,不見得要拘泥在一處。

在和人合作寫project,或自己寫project的經驗裡,快速開發士氣較好,士氣會嚴重影響到產品的存亡。

至於最佳化的議題,可以用profiler抓bottleneck,確實調整最該調整的code,在我的經驗裡,用profiler常抓出想破頭也不會注意的bottleneck。

舉例來說,我用Java寫了統計文章裡所有單字出現的次數,我辛苦tune hash table半天,把linked-list改成binary tree也沒快到一秒,用profiler一測,發現1/3的時間耗在class String的split(),改用StringTokenizer一步步取單字,而不是一口氣轉成String array後,就省下1/4的時間了。另一次的經驗是用profiler發現object包太多層後,有些object被重new一次,增加一倍的初始化overhead,memory用量凶時會因garbage collector運作而嚴重delay,去掉多餘的 new 後,程式快了一倍以上。

這裡不是說演算法分析沒用,那是基本能力,實務上除了complexity分析外,更要配合profiler雙管齊下。

另外可以透過refactoring的技巧,將快速寫好的破爛code趨於完美,讓它更易擴充,更易最佳化。

做個總結,就是:

快速開發prototype -> 反覆refactoring + 再開發 -> project尾聲使用profiler做最佳化

參考書藉:

  • eXtreme Programming (XP):我忘了看過的那本書名,相關的書應該有不少。
  • Refactoring:這本講概念並以Java實作的code說明,現在各家IDE漸漸支援Refactoring,做起來簡單又不用擔心改出bug。

沒有留言:

張貼留言