in 專欄

該如何學好 “寫程式” ??

會寫這篇是因為上禮拜,有個資深的同事問我個問題,如何把底下的 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 給我都可以。

Related Posts

Comments

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

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

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

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

  4. Jerry,

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

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

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

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

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

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

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

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

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

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

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

  12. 兩則我就一起回了 😀

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

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

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

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

  15. 格主您好,

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

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

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

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

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

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

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

    所以也就硬著頭皮玩看看

    但是我 既沒內功 也沒招式

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

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

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

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

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

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

  19. 我是個年近三十,才發現自己興趣是電腦,愛的是程式。由於根本沒有底子,有如蝦子一樣不知該從何打好基礎。直到看到你的文章後我才驚醒,原來那才是現階段我需要的知識。否則花在多錢去補習,花再多錢亂買書來讀,終究是不堪一擊。
    真的太謝謝你了。