2015年5月10日 星期日

The Pragmatic Programmer : from journeyman to master 書摘


我們,採集的只是石頭,卻必須時時刻刻展望未來的大教堂。
                                                                                                                —採石工人的信條

  1. 第一章:注重時效的哲學
    • 負責你的代碼,不要找蹩腳的藉口
    • 不要容忍破窗戶:有問題就及時修改,別累積技術債
    • 做團隊裡「做變化的催化劑」:提供大家改變的契機,讓大家追隨你而改變
    • 永遠記住大目標,要見樹並見林
    • 使質量成為需求問題:讓你的用戶參與權衡
    • 定期為你的知識資產做投資
    • 批判地分析你讀到的和聽到的
    • 你說什麼和你怎麼說同樣重要:交流、知道你要說什麼、瞭解聽眾、選擇文件的風格和美觀
  2. 第二章:注重實效的途徑
    • 不要重複你自己:和重用(Reuse)差別在,重複(Repeat)在於你做了同樣的事情,你應該只做一次卻做了很多次,造成時間和成本浪費;而重用則是再次利用優秀的程式碼來達到效率上的精進。
    • 讓重用變得容易(Make It Easy to Reuse)
    • 消除無關事物之間的影響:提升系統各組件的正交性(即降低耦合性)
      • 有正交性的好處:提高生產率、降低風險、項目團隊、設計
      • 編碼:讓代碼解藕、避免使用全域變數、避免相似的函數
    • 可撤銷性:不要存在最終決策,你的產品隨時隨地都有可能砍掉重練
    • 使用曳光彈來幫助你找到目標:和原型製作的差異在於曳光彈代碼是完整的,之後會構成最終系統的骨架的一部分
      • 用戶能及早看到能工作的東西
      • 開發者建構了一個他們能在其中工作的結構
      • 有了集成的平台
    • 為了學習而製作原型:原型所具備的元素有
      • 正確性
      • 完整性
      • 健壯性
      • 風格
    • 靠近問題領域編寫程式(Program Close to the Problem domain):選擇特定語言或是編寫特別定義過的程式來解決問題
    • 估算以免發生意外
      • 理解提問內容
      • 建立系統的模型
      • 把模型分解為組件
      • 給參數指定值
      • 估算項目進度
  3. 第三章:基本工具
    • 用純文本保存知識(Keep Knowledge in Plain Text)
    • 利用命列Shell的威力(Use the Power of Command Shells)
    • 用好一款編輯器:好的編輯器應該具有以下特性
      • 可配置:可高度客製化
      • 可擴展性
      • 可編程性
    • 總是使用原始碼控制工具
    • 要修正問題,而不是發出指責
    • 不要恐慌
      • 將你的數據視覺化
      • 跟蹤
      • 使用橡皮鴨:向別人解釋你的程式碼,讓別人像鴨子一樣一直點頭,直到問題出現
      • 消除過程
    • Select沒有問題
    • 不要假定,要證明
    • 學習一種文本操縱語言
    • 撰寫能撰寫程式碼的工具
  4. 第四章:注意時效的偏執
    • 你不可能寫出完美的軟體
    • 使用DBC按照合約設計:
      • 前條件
      • 後條件
      • 類別不變項
(未完.....)

2015年5月2日 星期六

數學思考(Think Mathematically) 筆記&閱讀心得

大二下過了這麼久,終於有時間好好讀一本書了。

這次借來的看的「數學思考」是由建中第49屆314班全體同學合譯後出版。其實會讀到這本書真的是因為大學的專業課程所需,像是統計、作業研究、電腦網路等,大部份都需要縝密的分析和邏輯能力,逐一抽絲剝繭後才能找到解決方案。既然想說自己不是讀書的料,那就只好強化數學能力,畢竟數學是所有學科的基礎嘛。

⟪筆記部分⟫

這本書主要提供了一套可依循的步驟來看待數學問題。作者引入了「要點思考」(Rubric Writing)這方法,主要步驟有:

  1. Stuck
  2. Aha!
  3. Check
  4. Reflect
第一個Stuck是指遇到困難,作者提到「遇到困難是件榮譽的事」,因為你可以從中發現到思維上的障礙和不足點,好比說我是不是「沒有搜集足夠的已知條件」、「我不確定我的所求」或是「所使用的工具不對」等等。另外在這階段時要多多使用「特殊化」和「一般化」的技巧,特殊化是指找出某個符合題目的例子,包含要找到特例,來輔以自己的想法;而一般化是問說「為什麼這樣做才是正確的」,就是確認自己的方法是否正確,之後能不能套用到類似性質的問題上。

第二個Aha!是指在解題時想到好點子就記錄下來,不管是靈光一閃或是經過縝密推論而得到結論,讓你很開心、愉悅,覺得離解答又更進一步的想法,都把它記錄下來,在往後的計算也可能再次用到。

第三個Check顧名思義就是檢查任何的計算或推理,你也可以用幾個例子檢查你所發現的法則(特殊化),最後再看看你的解法是否能解決原命題。

最後一個的Reflect是指想一下發生了什麼事。可以寫下重要的想法或是記憶中引人注目的時刻,然後確實地仔細思考在這一題中學到了什麼。

經過以上步驟就完成了要點寫作,再加上作者所提供的「進入」、「攻擊」、「回顧」,這張圖在解決數學問題上就顯得十分有用。

p.129 數學思考整體步驟

⟪心得⟫

這本書閱讀起來十分輕鬆,一個晚上就讀完了。看完後我第一個想法是:「假如我高中時代有看過這本書就好了。」從小時所接受的數學教育一直以來都是大量算題目、介紹很多工具和方法、熟練不同的解題技巧,到最後只要題目再有新的變化還是招架不住。我記得我高中有個老師每堂課就要我們背題目,尤其是矩陣那個章節更是要求。所以從教育來看,有兩個點很值得檢討:

1. 思考、辯駁、討論的訓練


台灣的數學教育一直很填鴨,課堂上我們總是希望老師教得愈多愈好,教更多解題技巧,學生做愈多題目愈好,可是卻常常缺乏討論的機會。近日才看到關於猶太人的教育相關文章,他們對於孩子放學後會問說:「你今天有沒有問了好問題?」而不是像台灣的家長問說:「今天考得如何?」「有學到什麼?」。愛因斯坦曾說想像力比知識重要,我把它解讀為「提出好問題比獲得知識更重要」因為提出問題時你要對該領域有一定了解,而且也代表你願意學習。

在我們的中小學教育中其實還蠻有這種練習的,讓學生發言、問問題,都是很好的機會。可是到了國高中,面臨升學考試壓力,這種討論的模式大量減少,問問題也傾向於很簡單的回答,非常可惜。

此外台灣人也很奇怪,就是會有菁英主義。菁英不是不好,可是大家總會希望說有個唸書高手出現,他總是自己唸書,然後硬是比別人高分,造就班上大家都自己念自己的,你要跟我討論課業門都沒有。可是假如你今天沒有外在幫助,缺乏討論和問問題,又怎能期待大家都變好呢?

2. 分析問題、深入思考的能力

從高中進入到大學後,教授開始用原文書上課。一方面是讓我們練英文整我們,另一方面是讓我們完整接觸洋人的想法和思考方式。可是台灣學生在這塊十分欠缺(對我就是其中一位),他們對於一個問題都可以有很完整的思考脈絡,就跟在數學思考裡面闡述的雷同,從已知慢慢推到未知,並且不注重於標準答案,而是自己的答案能不能說服他人。

在台灣考試考久了我們都希望出現那種十秒鐘就能解的題目,我們要求標準、快速的答案,所以才會有人覺得台灣都被標準答案綁死,導致我們長大後無法洞悉問題、提出有效且長遠的解決方案。

與其做大量訓練,不如給我們下一代有用的魚竿,教孩子如何思考,尤其是在數學這塊。