好像一直並沒有專門學習過某種語言,C也罷,C++也罷,VC也罷,都是在實踐中學習。但是Java看過《Thinking in Java》,在實際開發中,優秀的編程風格是很重要的,在我們看source code,有些是社區開原始碼時,有時真的很痛苦。在網易上有門公開課《編程方法學》,就去看看。
斯坦福大學給了一個Karel的類,以此為基礎進行編程教學。記錄一些筆記。
第1課:課程介紹 (2011.5)
比以前學校的老師講課風趣不少,要學習和被學習真的很不一樣。
程式很多人會寫,但是要成為大師就不一樣。就像作文大家都會寫,但是寫作成為大師就很難。
第2課:歡迎來到Karel的世界(2011.7.7)
編程要注重可讀性,程式不僅僅是寫給機器看的,也是寫給人看的,這是優秀程式員的首要條件。
程式應該具有的通用性,不是針對單一情況處理,在處理複雜情況中的方法的複用性。這取決於我們如何分解功能和結合功能,例如Java中,定義一個方法實現怎樣的功能。
第3課:Karel與Java(2011.7.8)
錯誤處理:要確保迴圈的退出,避免無限迴圈的情況,尤其效率我們第一次和計劃最後退出迴圈那一次body的運行,即對於迴圈需要確定第一步和最後一步迴圈是否已經完成我們所需的動作,例如是否在退出迴圈後仍需要再執行一次動作,或在進行迴圈之前先將動作執行一次,以免off by one bug。以及這個最後一步是否能有效確保在條件判斷中退出迴圈,是否各種情況都考慮到。
注釋(comment):要養成良好的編程習慣,在檔案和方法之前加入注釋,方便閱讀。給出方法的前置條件和後置條件,也就是前提和結果。以Karel舉個例子,Karel將Beeper從一點移到另外一點,並且返回。返回後需要將karel回複到原來狀態,例如原來面向哪個方向就是哪個方向。如果只是做完搬運的動作,如果沒能完全回複原狀,會影響後面的操作。如果狀態發生變化,那麼在注釋中的後置條件中需清晰表達。有例如S路行行走,有一個行一行的方法,是否需要說明後置條件為,已經轉向。
逐步求精(stepwise refinement):就是至上而下逐步分解的(top down design)。除了某些特定的情況,在設計中通常會採用這種方式。而由下至上則是很多程式員入門前易犯的錯誤。對於分解的動作,如何能迴歸最初狀態,準備執行下一個動作,是不錯的選擇。現在的CPU不在乎多些計算,而需要將程式寫得簡潔和清晰。例如karel這個小機器人,在某位置上,進行移動和操作,最後回到原來的位置上,或者面向某個方向(不一定是絕對方向,例如非牆方向,即可前進方向),這樣就是回複原來的狀態,使得任何人在你處理完之後,得到一個良好的狀態。
分解的一般性原則:
- 每個方法應該能解決一個問題,問題有多個層次;
- 一個方法大概在1-15行之間
- 好的方法名字,容易閱讀出功能,並應加上comment(加上前置和後置條件)
附:說說郭MM,事情出來正好是什麼扶貧日,收到郵件通知,每個層級員工應該捐多少錢都寫得很清楚,就是即便你愛心爆棚,也是有限額的,但是如果你不願,一般也是不行的,因為秘書是逐個室去收,基本落實到人頭。以前我們那個阿姨,還挨個人去收,然後再郵件最末通常假惺惺地說捐款自願,或者普通員工自願之類的。問題是,以前是捐了,照理,相應的部分是可以免稅的,但是只有收錢積極,從未見免稅。郭MM恰逢時候,事情的唯一結果就是我們這次真的是自願了,因為大家都決定不交了……當時在家裡養傷,以為有人替我交了,回去一聞,發現第一次不用交。
還有李娜的事情,獎勵60萬,稅12萬,將48萬捐出(補兩萬成50)。這裡有一個很大的問題,如果捐款是不扣稅的,也就是說如果李娜要捐的話,是可以全款60萬捐出,不需要扣稅的。