2010年1月11日 星期一

如何學好「寫程式」?

這篇是我閒暇時間google看到的一篇文章
我覺得寫得蠻好的,對於有寫過程式的看了這篇文章或許會有點感覺跟方向吧~~
以下這篇文章來自→這裡

------------------------------------------------------------------
其實在這之前,一直有人問我這類問題,我的回答總是一樣:「要從基本功做起。」只不過大部份人都會皺皺眉頭,想說 「為什麼沒有速成一點的方法?」

先撇開軟體開發一定要有其它領域的 domain know-how 之類的東西,我就針對到底有沒有辦法把 CODE 寫好這件事來討論。如果真的存在速成的方法,那滿街就都是高手強者了。技術及工具的進步,是簡化你操作工具及開發過程的細節,但是其中累積的知識及理論,只會越來越多


現在要寫程式所必須俱備的技術門檻越來越低,但是要能專精所必要的知識及經驗則是越來越高。我常在想,我是一路學習摸索上來的,大學四年唸了電機學到了硬 體的底子,大三大四本來想修資工當輔系,後來直接去考資工所... 這三四年下來也有點資訊的底子,這些知識讓我到現在都還不用辛苦的去 「追」 技術,我只要看看 overview,大概就能掌握這些技術能解決什麼問題,不能解決什麼問題等等。真正需要用的時後,文件翻一翻就能找到我要的段落,就能夠上手了。
不過現在的年輕人就沒那麼好運了,要從 CPU 是怎麼設計,怎麼執行指令,到瀏覽器為什麼點下網址就能看到網頁,這一連串的細節,大概現在的大學畢業生都回答不出來吧? 現在隨便買本書翻一翻,就能寫出一個漂亮的網站,誰還願意去唸那些基本功? 也因為這樣現在的人都少了那份 「內功」,只剩漂亮的招式,出招很勵害,不過打沒兩下就後繼無力,或是對手出了沒看過的招,就不知怎麼接下去了。
如果你真的有心把底子練好,我是有幾個建議的方向,雖然看起來沒什麼用,但是看熟了你一定會發現,你寫什麼程式都逃不了這幾個基礎知識。

  1. 最基本的: 計算機概論 & 資料結構這些有助於你用正確的邏輯寫程式。要成為一個合格的 programmer 一定要有這樣的能力。
  2. 進階一點的系統層面,作業系統 & 系統程式
    這些有助於你瞭解系統層面如何運作,如果你開發的系統需要些基礎建設,像是元件等等,這些知識很有用。成為 software engineer 就應該要有這些基礎。
  3. 再來就專精一點了,我推薦 OOP 理論 / Design Patterns、或是軟體工程的方法論 ( XP, TDD ... 等 )
    這個層次的知識能幫助你設計正確的架構,或是用正確的方式開發軟體,是成為 ARCHITECTOR 的必要技能。
每一項都代表一個階段。上禮拜跟同事討論的,其實只有討論到 (1) 的部份。如果工程師都 「 寫程式,但是用的邏輯看起來都 怪怪的」,那就是要加強 (1) 的部份了。我簡單的舉個例子,資料結構在學什麼? 跟實際寫程式能有什麼關聯?
想到資料結構,不外忽一堆排序 (SORT) 的演算法,或是各種 TREE / LIST 等怎麼 「放」 資料,及怎麼 「找」 資料的問題,如 LINKED LIST,HASH TABLE,BINARY TREE,HEAP,STACK 等等。再來就是什麼問題可以用什麼資料結構來處理? 像是走迷宮要靠 STACK,各種資料結構的特性為何? 它們的時間複雜度 (Time Complexity) 為何? 什麼時後該用那一種?
這些是很基礎的問題,不過你如果不是科班的,只是翻翻書就會寫程式的,那這些問題應該都回答不出來吧? 針對這部份,我強烈建議要學的人一定要先搞懂這些 「邏輯」。我不稱為理論,是因為他們還太淺,只是個作法而以。搞懂這些邏輯,你至少要有能力把程式寫出來。
因此第一課很簡單,挑幾種 SORT 的方式,比如 Bubble Sort, Quick Sort 等等,不用多,兩三個就好,步驟搞清楚了,還能用你熟悉的程式寫出來 ( 如: C# / JavaScript,當然你不能作弊用現成的 SORT 函式庫 ),你就過關了。
再來就是搞懂各種資料結構,我舉幾個 .NET 內建的,卻又常讓人搞混的幾個 Collection。List / LinkedList 用的方式都一樣,那麼兩者到底有什麼不一樣? 只塞一百筆,找出一筆要 10 ms 的話,塞一萬筆找出一筆要花多少時間? 是 100 倍嗎? 還是 10 倍? 還是都一樣?? 是 Microsoft 工程師太無聊,故意寫來讓你傷惱筋的嗎?
如果這部份你也搞懂了,接下來就是應用了。就拿導航系統來說就好,地圖要用什麼方式存才好? 使用者選定起點及終點,你該怎麼幫它找出最佳的路逕? 不管畫面等等問題,你有辦法寫出程式找到答案嗎? 這就是典型的資料結構的應用。你沒學好資料結構的話,看再多 C# / ASP.NET 的書,一點用都沒有啦,碰到這類問題,管你用 VB / C++ / C# 還是 Java, 只能坐在螢幕前發呆而以。
總結一下,你符合我講的 (1) 基本要求嗎? 很簡單,這些問題或程式你都寫的出來就符合了:
  • 丟一付洗過的撲客排給你 (不要多,黑桃1 ~ 13就好),你知道怎麼用 Bubble Sort / Quick Sort 的步驟把它排好嗎? 丟一個陣列,裡面隨便打幾個數字,你能寫程式把它由小到大排好印出來嗎?
  • 假設記憶體夠大的話,你有辦法把一百萬筆通訊錄資料讀到記憶體內 (用什麼物件都隨你),然後還能用很快的速度找到你要的資料嗎? 不同的搜尋方式,你知道該用什麼樣的方式找才有效率嗎?
  • 以台灣高速公路為題 (中山高、北二高、國道二號),你有辦法寫程式,讓使用者指定起點跟終點的交流道,然後替它找出建議的路線嗎? (把延路經過的交流到跟收費站列出來就好)
看起來就像是作業,沒錯。不過它是很實際的基本功夫,如果寫不出來,那就真的該好好唸個書了。其實這些問題,都跟熱門的技術 (如 DB / WEB / RIA 等等) 無關,就很單純的看你的邏輯能力而以。這個主題我會繼續寫下去,大概一兩個禮拜一篇吧。我的目的是希望大家底子打好再來學這些熱門技術,這樣你才有辦法更 進一階,否則就只能隨著技術規格推陳出新,不斷的在追新技術而以。

------------------------------------------------------------------

12 則留言:

  1. ㄜ...親愛的Neil先生你好
    (請容許我暫時如此稱呼你)

    這篇文章的內容真的令我受益良多
    雖然裡面所寫的我大部分都看不懂
    但是 至少提供了我這個不是專科的學生
    一個很好的學習方向
    真的非常感謝你~

    By 心中感激滿溢的羊

    PS.希望你不會介意陌生人的發言(=口=)

    回覆刪除
  2. 哈哈,當然不會介意陌生人發言囉~

    回覆刪除
  3. 那請問我讀高中 上大學要學這些東西 大學是讀哪裡比較好呢??

    回覆刪除
  4. xclool我的奇摩即時msm我沒有2010年7月30日 下午10:27:00

    我只是一個微不足道的發言著而已
    看了你的文章
    知道了大約的概念
    只是你所謂的C++這個軟體
    或Java我曾經有
    打開卻是一大堆看不懂得"碼"
    這寫軟體的作用在於??
    方便你寫程式??
    還是??
    可以請你告訴我ㄇ

    回覆刪除
  5. 有個觀念或許要先澄清
    C++、Java這些不是叫做軟體
    而是「電腦語言」
    就好像人跟人溝通有中文、英文、日文等等
    而人跟電腦溝通有C語言、C++、Java...等等
    這些只是語言而已
    並不是軟體
    像在寫程式時所用的軟體(例如:Dev C、Visual C++這些軟體)
    這些寫程式的軟體只是幫助人們如何把電腦語言(或叫做程式碼,C++、Java那些)轉換成電腦能「直接」看得懂的語言(又叫做機器碼,副檔名是.exe的程式,也就是常聽到的0101的二進位數字)
    所以說,C++、Java...那些只是語言
    並不是軟體

    回覆刪除
  6. 可是我上次用的是VC++ 2008 Redistributable
    跟Java(TM) SE Development Kit
    或Dev-C++
    所以你說的是C++是程式語言
    而不是軟體
    我誤會了
    以為C++是軟體
    原來只是軟體名稱上有C++這個字
    就像是全速CPU
    也有CPU這個字
    但是卻不是我ㄇ電腦的那個CPU
    -----------------------
    所以VC++這類的軟體
    是為了讓寫程式的人
    更容易寫??

    回覆刪除
  7. 可以這麼說
    因為如果要「直接」寫出電腦能直接看得懂的程式
    除非你非常熟悉01的各種組合在電腦裡代表什麼意義以及程式結構
    否則幾乎都是靠VC++這類的軟體來幫助人寫程式

    回覆刪除
  8. 那如果要利用VC++寫一個exe的程式
    建議要先寫哪種???
    用VC++可以將程式檔開啟ㄇ??
    裡面的程式碼跟網站的CSS是相同的道理ㄇ
    請給我一些入門的文章
    我問題很多......
    所以謝謝你願意回答

    回覆刪除
  9. 我聽不太懂你的意思,「先寫哪種?」
    要用VC++寫一個exe有分什麼所謂的哪種?請問哪種的意思是什麼?

    exe檔已經是0101的機器碼,你要開啟他也只能看到一堆你看不懂的亂碼而已,已經不是什麼C++還是Java的程式碼了,除非用一些特殊工具去轉換成組合語言。我覺得依你目前情況,沒那個必要去開啟exe檔,那個已經是比較深入的層次了,這樣會扯到太多東西

    CSS我是不太熟,所以道理是否相同...我只能說邏輯上算相同吧?

    回覆刪除
  10. 一直問你的那個2010年7月31日 下午10:55:00

    VC++2008
    VC#2008
    VB2008
    V Wed Developer
    你會選擇哪個??

    回覆刪除
  11. 這個問題就要看你了囉...

    VC++2008:主要寫C或C++
    VC#2008:寫C#
    VB2008:寫VB
    V Wed Developer:寫網頁程式

    就好比你要學中文、英文還日文的意思是差不多的

    回覆刪除
  12. 今年大二化工
    因為系上沒教C++
    所以想來自學一番
    資料結構or資料庫那些是完全沒修的...
    但因為對Coding還蠻有熱忱的
    想說大學資工的東東除了計概以外,都沒聽過
    那對coding會有很嚴重影響嗎?
    自己翻書有可能銜接上大學讀四年的資工系嗎?

    回覆刪除