Writing a Program
Programming is understanding. - Kristen Nygaard
What would an experienced programmer do? When we are faced with a tricky technical question, there often is a standard answer. We know that people have been writing calculator programs for at least as long as there have been computers taking symbolic input from a keyboard. That is at least for 50 years. There has to be a standard answer! In such a situation, the experienced programmer consults colleagues and/or the literature. It would be silly to barge on, hoping to beat 50 years of experience in a morning. (p.186)
What would an experienced programmer do? When we are faced with a tricky technical question, there often is a standard answer. We know that people have been writing calculator programs for at least as long as there have been computers taking symbolic input from a keyboard. That is at least for 50 years. There has to be a standard answer! In such a situation, the experienced programmer consults colleagues and/or the literature. It would be silly to barge on, hoping to beat 50 years of experience in a morning. (p.186)
Actually, complicated grammars are not fit for humans to read, but computers are good at it.They follow such grammar rules quickly and correctly with the greatest ease. Following precise rules is exactly what computers are good at. (p.191)
最初,當然是因為遇到某個問題,想交給電腦解決,這時需要寫程式來讓電腦執行解決步驟,但在開始寫之前,最好先稍微想想問題、有什麼可能解決辦法,別急著編程
這個程式可以用來做什麼?我希望怎麼跟它互動?這兩個問題是從使用者角度來思考的,在開始編程之前最好先做過這樣的動作;這可能有點類似要證明某個若p則q的數學命題,可以嘗試從所求想起,就是想想什麼事情可以推到q,有時候這麼做後,解法的輪廓就鮮明多了
永遠從建立一個較簡單(能解決核心問題當然是更好)的正確可用版本開始,不要貪心想一次解決問題、或添加哪些功能,簡單正確的部分先做好,之後再慢慢擴充
關於作者舉例的計算機問題,也許我們現在希望使用者輸入一個數學式,例如1+2*3,下一行把結果7印出
> 1+2*3
= 7
四則運算遇到(),裡頭的式子要先做,*, /比+, -優先,如何讓電腦先做2*3,再回頭+1呢?計算上述數學式對人而言是個簡單的問題,但要「列出明確的規則」讓電腦遵循並計算,卻沒想像的那麼容易,需要對四則運算的數學式做點分析,顯而易見,數學式是由數字、四種運算符號、和括號構成,程式應該會需要記錄整串式子,因為要判斷誰的優先順序高、哪個先做後做,但是當電腦讀和運算的順序是從左到右時,1+2*3會變成(1+2)*3=9而不是7,所以如果讓電腦讀和運算的順序方向固定從左到右或從右到左,在很多情況下不會得到正確結果,怎麼辦呢?
作者就講了上面第二段的話,簡而言之,電腦已經發明那麼久,這個計算機程式肯定早已被人實作出來不曉得多少遍了,也許有一些關於解決計算順序的標準解法,先查這個解法是什麼,不要妄想短時間內可以想出個勝過50年經驗累積傳承下來的解法,目前現階段遭遇的許多問題多半已經有人解開了,我認為作者講的這個態度沒錯,因為有其他有趣、待解決、困難的問題值得做或需要做,時間有限,不過同時這確實喪失一個思考機會,四則運算是小學生就會的東西,如果連這樣難度的問題都不自己分析看看就直接找解法,以後遇到本質更麻煩、更難的問題怎麼辦?總是找找看有沒有現成的?作者直接講解法和所需的程式相關技術而不深入剖析這個問題,或者說明所用的解法概念是有什麼優點和理由,我可以理解,這本書主題畢竟是programming,不是什麼如何邏輯地分析問題、思考的技巧...等等,這解法概念稍微探討下去可能會佔掉不少篇幅或背離主題,可是我認為這非得釐清不可,因為就是根據它來寫計算機程式,章末的練習題之一是把計算機程式除錯,可是我抓不出邏輯錯誤,代表我除了可能對新技術還不熟外,可能背後的概念也不是很了然,更重要的是下一章節依然是用計算機程式當範例,不懂的話讀不下去orz
(未完待續...)
四則運算遇到(),裡頭的式子要先做,*, /比+, -優先,如何讓電腦先做2*3,再回頭+1呢?計算上述數學式對人而言是個簡單的問題,但要「列出明確的規則」讓電腦遵循並計算,卻沒想像的那麼容易,需要對四則運算的數學式做點分析,顯而易見,數學式是由數字、四種運算符號、和括號構成,程式應該會需要記錄整串式子,因為要判斷誰的優先順序高、哪個先做後做,但是當電腦讀和運算的順序是從左到右時,1+2*3會變成(1+2)*3=9而不是7,所以如果讓電腦讀和運算的順序方向固定從左到右或從右到左,在很多情況下不會得到正確結果,怎麼辦呢?
作者就講了上面第二段的話,簡而言之,電腦已經發明那麼久,這個計算機程式肯定早已被人實作出來不曉得多少遍了,也許有一些關於解決計算順序的標準解法,先查這個解法是什麼,不要妄想短時間內可以想出個勝過50年經驗累積傳承下來的解法,目前現階段遭遇的許多問題多半已經有人解開了,我認為作者講的這個態度沒錯,因為有其他有趣、待解決、困難的問題值得做或需要做,時間有限,不過同時這確實喪失一個思考機會,四則運算是小學生就會的東西,如果連這樣難度的問題都不自己分析看看就直接找解法,以後遇到本質更麻煩、更難的問題怎麼辦?總是找找看有沒有現成的?作者直接講解法和所需的程式相關技術而不深入剖析這個問題,或者說明所用的解法概念是有什麼優點和理由,我可以理解,這本書主題畢竟是programming,不是什麼如何邏輯地分析問題、思考的技巧...等等,這解法概念稍微探討下去可能會佔掉不少篇幅或背離主題,可是我認為這非得釐清不可,因為就是根據它來寫計算機程式,章末的練習題之一是把計算機程式除錯,可是我抓不出邏輯錯誤,代表我除了可能對新技術還不熟外,可能背後的概念也不是很了然,更重要的是下一章節依然是用計算機程式當範例,不懂的話讀不下去orz
(未完待續...)
留言
張貼留言