Thursday, June 23, 2011

該如何學好"寫程式"?作者 : jasper(Jasper)

作者 : jasper(Jasper)


該如何學好 "寫程式"?

這是安德魯的部落格上的一個系列的文章,這個系列總共有五篇,第一篇的原文在此 http://columns.chicken-house.net/post/GoodProgrammer1.aspx

該如何學好〝寫程式〞?文中提了三點:

1.最基本的: 計算機概論 & 資料結構
這些有助於你用正確的邏輯寫程式。要成為一個合格的 programmer 一定要有這樣的能力。

2.進階一點的系統層面,作業系統 & 系統程式
這些有助於你瞭解系統層面如何運作,如果你開發的系統需要些基礎建設,像是元件等等,這些知識很有用。成為 software engineer 就應該要有這些基礎。

3.再來就專精一點了,我推薦 OOP 理論 / Design Patterns、或是軟體工程的方法論 ( XP, TDD ... 等 )。
這個層次的知識能幫助你設計正確的架構,或是用正確的方式開發軟體,是成為 ARCHITECT 的必要技能。

文中談到了資料結構,然後在第二篇、第三篇分別講解了如何運用正確的資料結構及演算法。在第三篇提到PASCAL 之父 (Niklaus Wirth) 講的這句名言: "程式 = 資料結構+演算法"。

我自己在修資料結構這門課時,那是大二的必修課程,剛好經過了大一的計概的 Fortran 及 Pascal 的磨練,有了一點點的程式撰寫經驗,所以會對資料結構這門課程更覺得有意思、有深度。引用文中的一段話:

想到資料結構,不外忽一堆排序 (SORT) 的演算法,或是各種 TREE / LIST 等怎麼 "放" 資料,及怎麼 "找" 資料的問題,如 LINKED LIST,HASH TABLE,BINARY TREE,HEAP,STACK 等等。再來就是什麼問題可以用什麼資料結構來處理?像是走迷宮要靠 STACK,各種資料結構的特性為何?它們的時間複雜度 (Time Complexity) 為何?什麼時後該用那一種?

我自己在設計一個英文字典查詢功能上栽過一次,那時用 Binary Tree 來記載每個單字,結果耗掉的記憶體空間太多,導致程式根本無法執行,那是一個 640 KB 上限的環境。

執行的環境有時候會對程式設計的方法有所限制,我另一次的經驗是在一台手提電腦上,一個等待的迴圈增加了耗電量,那又是一個沒有 NoteBook 玩意的時代。遊戲寫慣了,偵測不到鍵盤有動作,當然會自動做一些動作,哪裡會知道硬體設計會期望沒有輸入動作就該休息,以便省電。呵!當然那個〝手提電腦〞最後一定是不了了之。

很多人都不知道資料結構這門課真正的用途何在?只覺得重要。現在程式語言已內建 Sort, LinkList, Tree 等功能,也沒必要自行開發。但如果您不懂,未必能挑對內建的物件,就像這系列第二篇提到的用錯了 List。

資料結構、演算法、資料庫表格的設計等等,多一點的思考會讓您的程式寫起來更簡潔、更有脈絡,當然啦,門外漢會很難理解其中的奧妙、玄機。

程式入門、上手是很容易的事,畫面上拉拉控件、安排事件處理,易如反掌。然而該如何進階呢?不外基礎紮根,多多加強這方面的認知才是根本。

=========
作者 : fcwang(fortran)

如果要在這幾項基本工找出最重要的根基, 我會毫無遲疑地選擇資料結構, 因為它是讓我理解作業系統,資料庫, ...等許多電腦軟體必修課程的基礎.

個人修習資料結構可以說是自修完成的, 它讓我非常著迷, 也有相當的心得.
個人認為如果對資料結構未能修成正果, 你可能無法理解作業系統的運作. 作業系統中記憶體的管理(包含Garbage Collecvtion), Process Management, ... 等都是Link List的運用
程式設計師常呼叫副程式或Procedure, 有多少人真正理解它是 Stack 的運用. 如果你真正理解它是 Stack 的運用, 你就不會對Call by value或 Call by Reference有迷惑.
資料庫更毫無疑問地是以資料結構為主的系統.

資料結構是非常難的一門課程, 因為有許多數學觀念, 學生經常會分成 知之為知之,不知為不知的兩極化的群組. 如果資料結構能學得好, 學 Design Pattern就不會有太大問題,因為也是有許多抽象的概念
如果有興趣從事軟體設計的工作, 學好資料結構是會有相當的助益. 學習是一回事, 但是如何應用則是另ㄧ項挑戰. 這是我個人對年輕學生的建議.

========
作者 : seabook_liu(西布克)

個人經驗是...Data Structure和Compiler還有Architecture真的是基本功。
即便是工作十年,這些東西還是很重要。畢竟根基沒有打好,學再多花樣都是枉然!

不過現在的老闆倒是很喜歡很多花樣的人...

要學好最快的途徑就是,大量的翻人家寫得典範code吧... ACM 上面很多可以參考。

http://www.programmer-club.com.tw/ShowSameTitleN/exp/14428.html

No comments: