2008/9/27 上午 04:00:00

該如何學好 "寫程式" ??

[精選文章] | 543 | 技術隨筆

會寫這篇是因為上禮拜,有個資深的同事問我個問題,如何把底下的 programmer 素質拉上來? 跟他講這問題害我那天拖到晚上十點才回家吃晚飯 @_@,不過我想這也是現在台灣軟體業普遍碰到的人才問題,就順手寫了這篇。這篇是打算要貼在公司的 BLOG 裡給同事看的,這裡先貼一下,到時整理好再搬過去...。

 

 

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

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

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

現在要寫程式所必須俱備的技術門檻越來越低,但是要能專精所必要的知識及經驗則是越來越高。我常在想,我是一路學習摸索上來的,大學四年唸了電機學到了硬體的底子,大三大四本來想修資工當輔系,後來直接去考資工所... 這三四年下來也有點資訊的底子,這些知識讓我到現在都還不用辛苦的去 "追" 技術,我只要看看 overview,大概就能掌握這些技術能解決什麼問題,不能解決什麼問題等等。真正需要用的時後,文件翻一翻就能找到我要的段落,就能夠上手了。

不過現在的年輕人就沒那麼好運了,要從 CPU 是怎麼設計,怎麼執行指令,到瀏覽器為什麼點下網址就能看到網頁,這一連串的細節,大概現在的大學畢業生都回答不出來吧? 現在隨便買本書翻一翻,就能寫出一個漂亮的網站,誰還願意去唸那些基本功? 也因為這樣現在的人都少了那份 "內功",只剩漂亮的招式,出招很勵害,不過打沒兩下就後繼無力,或是對手出了沒看過的招,就不知怎麼接下去了。

如果你真的有心把底子練好,我是有幾個建議的方向,雖然看起來沒什麼用,但是看熟了你一定會發現,你寫什麼程式都逃不了這幾個基礎知識。

  1. 最基本的: 計算機概論 & 資料結構
    這些有助於你用正確的邏輯寫程式。要成為一個合格的 programmer 一定要有這樣的能力。
  2. 進階一點的系統層面,作業系統 & 系統程式
    這些有助於你瞭解系統層面如何運作,如果你開發的系統需要些基礎建設,像是元件等等,這些知識很有用。成為 software engineer 就應該要有這些基礎。
  3. 再來就專精一點了,我推薦 OOP 理論 / Design Patterns、或是軟體工程的方法論 ( XP, TDD ... 等 )
    這個層次的知識能幫助你設計正確的架構,或是用正確的方式開發軟體,是成為 ARCHITECT 的必要技能。

每一項都代表一個階段。上禮拜跟同事討論的,其實只有討論到 (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 等等) 無關,就很單純的看你的邏輯能力而以。這個主題我會繼續寫下去,大概一兩個禮拜一篇吧。我的目的是希望大家底子打好再來學這些熱門技術,這樣你才有辦法更進一階,否則就只能隨著技術規格推陳出新,不斷的在追新技術而以。上面那三個問題,有興趣的話歡迎找我聊聊。在這留話或是 mail 給我都可以。



評論

2008/10/31 上午 11:44:31 #

Adam

可以請問你 你說第一步需要看計算機概論  主要是要看哪方面的東西呢?
還有資料結構 請問有沒有推薦的書籍?  希望你有空可以回答,謝謝


Adam Taiwan | 回覆

2009/8/12 下午 10:18:20 #

rico

大大這篇寫的很讚
如你所說  現在比比皆是不注重內功的軟體工程師(外表漂亮,可惜內部一團糟)
但只有內力高強的高手  才能兵來將擋  水來土淹
為了成為高手並更上一層  這篇我就收藏起來了
提醒自己^^

rico Taiwan | 回覆

2009/9/14 上午 10:06:56 #

Jerry

請問一下,
文中提到,
(要從 CPU 是怎麼設計,怎麼執行指令,
到瀏覽器為什麼點下網址就能看到網頁,這一連串的細節,大概現在的大學畢業生都回答不出來吧?...)

這些細節要怎麼了解呢?
學校不教,而且老師也不一定答的出來,
自己要去研究的話也是加強文中3點基礎知識嗎?這些都是基礎知識的延伸嗎?

Jerry Taiwan | 回覆

2009/9/14 下午 10:13:39 #

chicken

Jerry,

說穿了不值錢,CPU 怎麼設計 & 執行,當時是修系上的 "數位系統" & "微算機原理" 學的... 其實後來看看雜誌都會介紹新的 CPU 有什麼特點,都可以得到印證... 有時看看雜誌也能學到點東西...

至於點下網址 -> 看到網頁,這是開始工作後看看 HTTP 的原理學到的...

這些都不難,隨手也都找的到資源,有心留意一下就有了。我寫的純粹是我個人經驗的分享而已,我是這樣學的,文中的三點也是我認為必學的基礎知識,也不一定對,不過你可以參考看看 :D

chicken Taiwan | 回覆

2009/11/23 上午 09:38:55 #

antonio

你寫的這篇真的很好 可以請問你一下 對於初學著(基礎0)的你建議我可以去讀哪些書呢?
我可以重哪裡開始著手呢?

antonio Taiwan | 回覆

2010/4/21 下午 07:50:08 #

yuanlin

謝謝您這一系列的好文章,讓我獲益良多。
並告知您,我在這篇文章有連結引用
http://web.yalinfo.com/2010/04/blog-post_20.html

yuanlin Taiwan | 回覆

2010/4/28 下午 11:02:08 #

chicken

謝謝你喜歡我的文章, 歡迎引用 :D

chicken Taiwan | 回覆

2010/5/20 下午 11:04:11 #

zuyan

我自覺...基本功都有打好..
例如..計概,作業系統概論,資料結構...
可是之前死在.....OO, 因為我以前程式是使用BASIC ..是自學的之後沒人教,
也不解很多書中OO的意思..任督二脈沒打通
還好之前再去上課..打通了任脈..督脈還是沒通
現在死在....沒有動力學..寫寫小程式可以...大就免了
MIS 要學的東西太多......雖然觀念都通...可是細節太多
光一個MAIL Server ...就要會5種...更何況還要學別的..,平時還要與病毒對抗..
當然...寫好程式...是我最大的遺憾..
這時有一個好老師再打通我的督脈...那就圓滿了

zuyan Taiwan | 回覆

2010/7/29 下午 06:18:06 #

Maos

大大可以教我有關寫程式的嗎
我願意重最基本學起 可以的話+我即時
gaexp225120(請著明ˋˋ)

Maos Taiwan | 回覆

2010/8/9 上午 09:15:46 #

kat

您好,拜讀了您的文章,覺得受用許多。但若身為一名網站企劃人員(不懂程式),卻想更深入的瞭解關於資料結構與程式邏輯的話。您是否有建議參閱的書籍,或是可以從何練習起呢 ? 謝謝

kat Taiwan | 回覆

2010/8/10 上午 01:43:07 #

chicken

其實別把資料結構想的太複雜啦,這個是資訊科系大二的課程而已,不會很難。
買本課本來看就好了。只不過課本都寫的比較死板,要看的下去需要一點意志力...

書我都是十幾年前唸書時看的,現在大概都絕版了吧 @@  書店找本你看的下去的就好了 :D
重要的是要多練習,跟想辦法把書裡講的內容套到你的程式裡,多練幾次就掌握的到要領了

chicken Taiwan | 回覆

2010/8/18 下午 03:31:06 #

班傑明

您好,我是今年資工系考資工所的學生
但程式能力真的不強 想在這一個月內加強自己
考研究所的動機
就是大學時代沒辦法確認自己對程式有沒有興趣  (畢竟坐在電腦前寫程式的時間不多 彈興趣與否言之過早)  
離開學剩不到一個月 實在很怕跟不上同學  成為LAB的老鼠屎...
想問問你當是跨考時候的心路歷程   我真的很需要信心...

班傑明 Taiwan | 回覆

2010/8/18 下午 04:59:10 #

班傑明

想聽聽大大跨考所遇到的瓶頸
我是資工系 九月準備讀資工所
但是大學時期很混 程式能力沒有下苦功
考研究所的動機只是想試試看 畢竟有沒有興趣 是要花時間才會知道的
而我四年卻沒給自己這樣的機會嘗試...
所以想問問大大 你是在"感到興趣"的動機學習程式  還是因為"不排斥" 而學習程式呢??

班傑明 Taiwan | 回覆

2010/8/31 下午 07:49:01 #

chicken

兩則我就一起回了 :D

興趣是我改唸資工主要的原因,我是喜歡用程式碼把我的想法寫出來那種成就感,所以我願意花很多時間去研究那些看不到漂漂亮亮畫面的東西,像是 OOP, threading... 等等。

不過,唸資工所,寫程式的能力只是個 "很重要" 的工具而已,雖然重要但不是全部。專攻的領域知試才是重點啦,只不過有好的 coding skill 能讓你唸資工所吃香很多... 做什麼數據,做什麼實驗,或是做模擬,多少都得寫到一點 code...

chicken Taiwan | 回覆

2012/1/5 下午 04:35:51 #

吳忠翰

我是無意間看的,
我真的深深的感受你的專業和熱誠^^
我本身是攻資工,看到你的文章我不經五體投地。
希望我能跟你談談關於程式相關的資訊和知識,
小弟我今年大一,是最近才在碰觸程式相關的東西。
希望你不嫌棄傳授我相關的知識,看完你的文章我的信心大振!!!

吳忠翰 | 回覆

2012/5/5 下午 04:41:22 #

小哥

各位大大     我想學程式         但都學不好     如果有人可以交我的話      請加我即時i2998078

小哥 | 回覆

2012/5/5 下午 04:42:46 #

小哥

我希望有人能交我程式    我連基本工都不知道    看書好像也沒用     可以交我的大哥們    家我即時i2998078     各位幫幫忙吧      

小哥 | 回覆

2012/8/30 上午 08:55:25 #

吉格艾諾

格主您好,


看到您這篇文章
在下真是心有戚戚焉
我本身也是「基本功主義」者
對於那些只想速成的人
我只會請他們自求多福
無論是 Resouece 或解決問題的想法
我都很樂於和他們分享
但我更相信
沒底子的他們
早晚會自爆

這種狀況
其實就像近幾年來
補教業者大力鼓吹證照課程一樣
不可否認
他們賺翻了
但另一方面也打爛了這些證照的價值
更造就了許多只會考試的「證照工程師」
這些人上了戰場
待得住的沒幾個

吉格艾諾 | 回覆

2012/11/3 下午 06:16:03 #

資管系學生

我現在是一片迷茫
學業要求我們  一定要將新技術學到手

但是....這和我的初衷不一樣,
我原先從電子工科轉入資訊
就是想當個駭客,
但現在卻淪落到和大家在那搶新技術的情況....

就在此時看到您的文章 讓我震憾
希望您看到此文能與我聊聊 我想多多了解更多東西

資管系學生 | 回覆

2013/2/5 下午 12:34:15 #

skyline

我好早以前就很想設計程式,但都不知道從下手  謝謝大大的分享

skyline | 回覆

2013/3/17 下午 09:47:18 #

Dalalama

簡直類似望洋興嘆感
因為我是幾乎從0開始 而且是現在 2013/3/17 開始

但是我也想體驗
"用程式碼把我的想法寫出來的那種成就感"
一定很有趣~

所以也就硬著頭皮玩看看

但是我 既沒內功 也沒招式

像那些 泡泡 sort 等你提供的基礎知識 都是上網學就可以了嗎

萬丈高樓平地起阿........

Dalalama | 回覆

2013/6/7 下午 07:57:08 #

阿傑

寫得很棒 我現在大二資管系,已經快升三年級了
但是程式語言很弱,只會基本的,大一學計概覺得還好,但是現在有點忘了計概的重點是什麼
因為一年級的VB老師只會給我們看投影片,我對VB整個不熟....但是不至於被當

我是真的想要學好程式語言,不管是哪種語言都會想要學好
老師出的題目參考課本,編譯卻頻頻出錯
上網找相關語法,發現網上的人跟老師教的不太一樣
我們老師是教大語法,細節的部分都留著給我們自己想或翻課本...

希望能讓自己的程式更加成熟,看完你的文章,我一定要更加努力
絕對不能敗在程式手下 !!!

如果大大願意教我的話 可以加我即時通或fb
以上兩個都是 w7946138@yahoo.com.tw
謝謝

阿傑 | 回覆

新增評論


(將顯示您的Gravatar圖示)

biuquote
Loading





Widget HotPost not found.

'.', hexadecimal value 0x00, is an invalid character. Line 336, position 245.X


精選文章

RUN! PC 文章及範例下載
2010/07. 結合檔案及資料庫的交易處理
2010/05. TxF讓檔案系統也能達到交易控制
2010/04. 生產者 vs 消費者 - 執行緒的供需問題
2008/11. 生產線模式的多執行緒應用
2008/09. 用ThreadPool發揮CPU運算能力
2008/06. SEMAPHORE在ASP.NET的應用
2008/04. 以ASP.NET開發同步WEB應用程式

如何學好 "寫程式" 系列
#1. 該如何學好 "寫程式" ??
#2. 為什麼 programmer 該學資料結構 ??
#3. 進階應用 - 資料結構 + 問題分析
#4. 你的程式夠 "可靠" 嗎?

#5. 善用 TRACE / ASSERT

安德魯是誰?

Andrew Wu | Create Your Badge

我喜歡鑽研物件導向、軟體工程及作業系統等相關技術。我會在這裡發表我的研究心得,也當作我自己的學習筆記。


Recent comments

Comment RSS