[如何學習寫程式] #1 - 我的學習歷程

寫這系列的文章,總是要有些先導的範例,許多先進,高手,大師都有自己的一套學習方式,但因為我沒有錢可以去採訪那些成功人士 (請他們分享的話,都是很有價值的經驗啊),所以就由小弟我先分享當初我怎麼開始學習的,可能廢話以及講古的地方會很多啦,但這些經驗都會組成這個文章系列的一部份,所以多少也有一點點的參考價值啦。

寫這系列的文章,總是要有些先導的範例,許多先進,高手,大師都有自己的一套學習方式,但因為我沒有錢可以去採訪那些成功人士 (請他們分享的話,都是很有價值的經驗啊),所以就由小弟我先分享當初我怎麼開始學習的,可能廢話以及講古的地方會很多啦,但這些經驗都會組成這個文章系列的一部份,所以多少也有一點點的參考價值啦 。

1. 啟蒙與初入門階段

一開始其實我並沒有想過要用寫程式當專業的,只是單純的對電腦有興趣而已,1994 年 (當時我才高二) 由老爸手中得到第一台電腦時,我還只是個超級新手 (才一星期就可以因為中毒搬回電腦店修理),在什麼都不會的情況下,只能先由作業系統 (當時是 MS-DOS 6.22) 以及初級的電腦知識開始學起,我自己這第一台電腦也是我第一台用硬碟開機的電腦 (在學校的電腦只能用大片磁片開機),最早買的兩本書是柯志賢先生的 [自己動手裝電腦] (學習硬體的知識) 以及 [活用 DOS 6.2], 當時在看[活用 DOS 6.2] 時其實蠻吃力的,雖然作者寫的文字風格很有趣,但很多東西都看不懂,所以又去買了一本 [快快樂樂學 DOS],從指令以及批次檔開始學習,但我寫批次檔最多的時候是因為看了 [活用記憶體 – 基礎篇],當時為了測試將 DOS 的記憶體由 580K 調到 624K (含倚天中文 ET3),寫了大概一個星期的批次指令。

不過我真正接觸寫程式的工作,是在 1996 年初,在書店的案頭上找到一本 [Windows 工程師手冊] (汪仲甫著),對書中所描寫的安裝程式 (setup program) 很有興趣,這本書所講的是 Microsoft 當時在很多軟體都有使用的 Setup Toolkit,作者使用 Visual C++ 4.0 的工具實際展示了抓取 DLL 內資源的方法,而作者也在書上大略說明了要從事 Windows 應用程式開發應該要有的能力,包含 C/C++, Visual Basic, FoxPro 這些開發環境,也是由這本書,我學到了 Windows 內的組態儲存區 – Registry (登錄資料庫) 的功能以及如何使用它的作法。大家也知道,一個窮小子要玩 Visual C++ 4.0 是很難的事 ,大補帖在這時候就變成了我的好朋友,舉凡 Windows 以及 Office 以及 Visual Basic 4.0, Visual C++ 4.0 等都是來自大補帖,如果當時沒有大補帖可用的話,根本沒辦法自學這些東西,而且去訓練中心 (當時稱為 ATEC) 上課要花幾萬塊,窮人只能用窮人的作法:看書學。不過我第一個學習的語言並不是 C++,而是 Visual Basic,因為當時太自不量力,不小心買了一本侯捷大師的 [深入淺出 MFC],想用它來入門 MFC 程式開發,但真的太難了 XD,所以退而求其次,由 Visual Basic 開始。

而剛好那時 Internet 也才剛起步,微軟才剛出 IIS 1.0 (with Windows NT 3.51),上網只能用數據機,而且每分鐘還要算錢的時代,每天只能上網一兩個小時而已,瀏覽器則是 Netscape Navigator 2.0,我當時剛好有一個可以獲得 MSDN Enterprise 光碟集的機會 (剛好有人要賣),就向老爸要了 5500 元去買下來 (5500 元可以買到二三十套正版軟體),裡面剛好有 Windows NT 4.0 Server 的中文版,它內建的 IIS 3.0 就有 ASP 1.0,使用的是 VBScript,語法和 VB 差不多,所以筆者就利用它來學習 Internet 的應用程式開發,同時一起學習 Windows NT 的系統管理,當時也買了 Windows NT 的系列大作 [Mastering Windows NT 4.0] 的中文版本 (兩本書),但後來我放在程式開發練習的時間比系統管理要來的多,系統管理部份都當作廁所文學了 。而我在學習 ASP 開發所買的第一本書是周世雄先生的 [NT 動態網站速成班],這本書的 ASP 以及 Web 應用程式的概念寫的很清楚,而為了資料庫的應用,我又去買了同一位作者的 [NT 網站資料庫速成班],這兩本書是我的 ASP 開發技術的知識來源,而我第一支 Web 應用程式 - 線上購物網所需要的技術,就是由這兩本書所教的內容所撰寫出來的。

後來我在 1997 年被騙去當志願役,出現了快一年的學習空窗期,但之前所訓練的 ASP 開發概念和程式設計概念,在日後我學習 Visual Basic 6.0 的開發時作為重要的基石,尤其是在寫程式的練習中的思考模式,也奠定了我日後要求自己 "寫程式前先思考" 的基礎。

學習方式:

在這個階段,因為對這個產業仍然不夠熟,身邊又沒有可以詢問或請教的人,所以只能透過大量閱讀來找到方向,此時的重點是廣納知識,不要刻意排斥任何資訊,這會讓你可能會遺漏可能會成為你未來賺錢工具的知識。而在資訊產業,動手寫程式和做 Lab 是不可或缺的,初學者想快速學習的話,大量實作是唯一的道路,只會看不會動手的人,是學不到任何東西的。

 2. 自學階段

雖然當初被騙進國軍當志願役士官,不過也許有一壞必有一好吧,剛好被分發的單位是離島的一個單位,在完成了該做的學習評量 (這段時間很痛苦…) 後,總算可以接觸在單位內的電腦設備,而且也因為單位內的電腦不夠,我還搬了幾台進去,當時我的部門可是除了行政以外電腦最多的部門,直到退伍時,我也只搬了一台電腦回家,而且硬碟都格式化後才帶走 (這台 Quantum 850MB 硬碟目前還活著呢)。在還債的這段期間內,除了平常該做的業務以及站哨值更外,總算是多了一點時間可以看書和練習,包括利用部門的電腦架了一個小型的 10Base2 同軸電纜的區域網路,並且用 Windows NT Server 架設了一台 File Server 和 NT Domain,在這個電腦不到五台的網路中,所有電腦都不需要使用磁片到處跑來跑去就能拿到指定的檔案,這在當時單位是比較先進的作法,只是這個網路在兩個月後因為上級要視導而拆除了…,但這個經歷,讓我對 Windows NT 網域的架設有了實戰的經驗,也更了解了 Windows NT 網域和 Windows 98 的系統管理作法。後來在我要退伍的前一年,Windows 2000 也出來了,我那時也在辦公室內架了一個 10BaseT 的網路,伺服器是用 Windows 2000 Server,用戶端則是 Windows 98。

Windows 98 是我進入 MCP 的第一個作業系統,1998 年的時候,由雜誌上得知微軟的專業認證計畫,當時主流是 MCSE on Windows NT 4.0 以及 MCSD (考 Microsoft Windows Architecture I & II 的時候),雖然當時我已經有開發過 Visual Basic 程式的經驗,但其實那時我的程式開發能力並不夠強,所以我當下決定先衝 MCSE 類,也就是網管和系統管理類,為了準備考試,我利用放假的時候到處去掃高雄的大書店,找到網路相關的書籍,並以到 Bookpool.com 訂購一些 Microsoft Self-paced training kit 的書回來看,並且在 1998 年底時參加第一次的 MCP 考試:70-058 Network Essentials,但可能是學習不夠,沒考過 Orz,後來又考了 70-098 Implementing and Supporting Microsoft Windows 98,也是沒過 XD,我是考到 1999 年 7 月,考了第三次的 70-098 才過,70-058 也是考了三次才過,這些成績單我都留著呢 ,接著 8 月又挑戰了 70-067 Implementing and Support Microsoft Windows NT Server 4.0 過關 (剛好過 passing score XD),但在考 70-068 Implementing and Support Microsoft Windows NT Server 4.0 in the Enterprise 時,考了兩次都沒有過,當時其實沒有足夠的實驗環境,也沒有可以模擬的環境可以練習,所以我決定改變跑道,加強自己的 Visual Basic 開發技術 (原因是寫程式不用那麼多的電腦就可以學 XD)。

我的 Visual Basic 開發技術訓練最重要的參考資源是王國榮的 Visual Basic 6.0 教本,三本我都有買,寫的真的很詳細,當然 ASP 的教本我也有買,但除了基本的功力以外,當時華彩出版社出了好幾本 Microsoft Press 所出的 Programming Series 的翻譯書,這些書可說是 Visual Basic 開發人員一定要讀的經典,像是 Programming Visual Basic 6.0, Visual Basic 6.0 Workshops, Programming Components with Visual Basic 6.0, Programming Distributed Application with Visual Basic 6.0 與 Advanced Visual Basic 6.0 等書,不但十分精采,作者也在書中傳達了許多重要的程式設計概念,但在這個時期真正影響我未來程式開發概念的,是 Mary Kirtland 所寫的 [Designing Component-Based Application],這本書使用了 Island Hopper 範例應用程式完整的說明了整個使用微軟平台以及 Visual Basic 和 Visual C++ 開發應用程式的過程,以及在過程中使用物件導向開發的方法,這些知識對我日後的 Component-Based 應用程式開發與 OOP 的基礎概念的建立十分重要,它也是少數會在書中完整介紹整個應用程式開發流程的書籍,這本書被我翻了五年多,才正式歸檔,現在這本書仍然在我的書架上。

我在單位內曾經使用 Visual Basic 開發兩個系統,一個是朝令管理系統,可以自動產生次一日的朝令,並且自動排定站哨的班表;另一個是學科測驗系統,以統一測驗新進人員在專業技能上的學科能力 (術科能力還是要實地操作),其中學科測驗系統是參照當時的 Prometric 測驗系統所開發的,具有下列功能:

  • 測驗鎖定,全螢幕背景。
  • 測驗成績管理與報名系統。
  • 測驗成績列印功能。
  • 題庫管理系統。

雖然有這些功能,但其實都很陽春啦,不過已足夠處理部門內的新進人員的專業學科測驗了。

有了這些系統經驗,在我參加 MCSD 系列的考試時發揮了很大的作用,VB 6.0 的考試除了 Desktop 的考了兩次以外,Distributed Application 和 Visual C++ Desktop 的選考科目都考一次就過關了,但真正的難關才開始。

由於我並不算是資訊本科系,系統分析與設計 (System Analysis and Design) 我根本沒有接觸過,當時連什麼叫 DFD, ERD, Data Modeling, Normalization 這些術語都不懂,導致在第一次考 Analyzing Requirements and Defining Solution Architecture 這一科時有如瞎子摸象般,結果也很慘,才 300 多分 Orz… 為了要充實系統分析的知識,除了前面那本 Designing Component-Based Application 以外,還額外買了很多書,其中有幾本有趣的,像是 Software RequirementsDesinging Relational Database Systems 等書,那時還不知道軟體工程這件事,也不知道像 Fundamentals of Database Systems 這類聖經書可以看,只能由不同的書籍來得到我需要的知識,光是為了準備這科,我大概就買了近十本書吧,但還是狂考了八次才正式過關。雖然花了很多錢 (8x55 美金),但學習到的系統分析知識,正是作為我現在整體系統架構與分析的能力的基石。

在結束了被騙的當兵生活後,沒有多少的時間就馬上投入業界,當個小小工程師了,我第一間 (也是唯一正職上班過的一間) 是在高雄市一間小型的網路公司,負責 ASP 程式的維護與新功能開發工作,在之前的自學經驗非常充份,所以在很短的時間內就上手了,在這段期間內還用了 Visual Basic 去讀 FoxPro 的資料,以及使用 Visual Basic 開發網路的應用程式,因為受到 Designing Component-Based Application 概念的影響,我在思考應用程式架構時都是以三層式為主,將資料,介面和邏輯都切分出來,這可以讓系統達成分工,同時在維護上也會比較容易。不過在這個階段還是有些挑戰,像是開始使用 JavaScript,以及接觸 ASP 的樣板化 (template) 開發方式。

而也大約是在這個時候,微軟的 .NET Framework 1.0 (以及沒過多久後的 .NET Framework 1.1) 發表,以及新的 VB.NET 和 C# 程式語言,當時一開始使用 .NET Framework 時的參考書籍是當時學貫出的 .NET 系列書籍,以及 Professional C# 這本超級大部頭的書 (1000多頁),也許剛好是因緣際會吧,當時我就有使用 XMLHTTP 來開發現在火紅的 AJAX 應用程式架構,只不過當時業界還沒有 AJAX 這個概念出來。而前端程式語言使用的就是 JavaScript,我當時想在 JavaScript 和 VB 間切換的話太累了,而且 VB 升級到 VB.NET 的複雜度也不低,不如趁這個時候轉換為 C#,所以由此開始,我撰寫 .NET 應用程式的主力就變成了 C# 而不是 VB.NET,但我還是會保持 “看懂”VB.NET 程式的狀態,畢竟兩個程式語言都系出同門,若只能看懂一種的話,如果另一個程式語言有好應用的話就不太好了。

在轉換成 ASP.NET 後,第一個開發的專案是技術支援管理系統 (Technical Support Management System),這個系統是管理技術支援以及知識庫的系統,可用來管理 Support Ticket,追蹤處理進度以及結案歸檔等功能,使用 SQL Server + ASP.NET + C# 開發。第二個專案就是目前仍在運作的 Web POS 系統,到目前為止,使用 ASP.NET 開發的應用程式已經有幾十個專案了。

自學階段還沒結束呢,在資訊行業中,只有在退休時才會正式完結。

學習方式:

自學 (Self-paced learning) 是最省錢的方法,優點是經濟且可以自己安排進度,但缺點就是不一定可以模擬出完整的測試環境,而且沒有人可以帶你學習,特別不適合被動型的初學者使用,但被動型的初學者也不利於在資訊產業發展,因為永遠都要人家推在會動,如果你是這種人,可能要檢討一下。我自己是因為要幫家裡省錢,而且當時正在當兵,無法到 ATEC 上課,所以只能靠自己手邊的幾台電腦以及勤作練習來訓練自己應有的能力。參與認證考試則是要驗證自己的學習成果,認證的價值是在學習過程而不是結果,只要學習課程真的得到很多東西的話,那認證可以幫你取得更多更好的機會,但若只是用背題庫的方式去考得,那它也就只是一張壁紙而已。

3. 交流階段

自從 Internet 普及後,許多資料都可以自網路取得,早期在練習使用 .NET 開發時,就很常使用 MSDN Library 來輔助資訊的查詢,當時可用的搜尋引擎不像現在 Google 這麼強大,這時論壇以及 Newsgroup 的討論區就很重要了,我第一個參與的論壇是程式設計俱樂部,在 2003 年時,因為經常需要找一些 .NET 問題的解法,就把目光轉移到了當時仍然是 Newsgroup 的微軟論壇,原先只是想要發問一些與 C# 和 ASP.NET 的問題,但後來不知為什麼,總是會手癢的回覆一些問題,也許是在程式設計俱樂部養成的習慣吧,看到可以回應的就回應。後來微軟辦了好幾場與微軟對談的線上聊天室,只要是線上聊天室的時間,我都會直接去參一腳,一開始時都沒辦法回應太多問題,後來回應的愈來愈多,這些在討論區累積的經驗,都反應在我參加 MCAD 的考試上,Windows 和 Web 應用程式的考試幾乎都是一次過關,後來有一天在信箱中突然看到由微軟社群寄來的報名表,邀請我參加當時的社群之星 (Community Star) 選拔,我當下就直接決定參加,後來也順利選上,當年更選到 MVP 的獎項。

論壇是一個很棒的技術交流園地,也是一個很好的學習場地,這裡會匯集了許多人的開發經驗以及各式各樣的疑難雜症,如果想要成為某個技術領域的高手,勢必要通過這個部份的考驗才行,在論壇上測驗自己的能力會比一般的考試要來的有效,因為在論壇上的問題有難有易,能夠順利解決各種問題的人,才具有真正高手應該要有的能力,這點是筆試無法測試出來的。

因為經常在微軟 Newsgroup 活動,所以在 MSDN Forum 第一代論壇出來時,很榮幸擔任第一代板主的職務,並且得到連續三年的 MSDN 論壇第一貢獻者的殊榮,尤其是當台灣成為全球第二大熱絡的論壇時,那種成就感是無法用言語形容的。直到現在,雖然已經放手給新生代的高手接手,但我還是不定時會回去看問題以及解問題,因為這已經是一種習慣了。

學習方式:

論壇是可以在短時間內發現自己缺乏的知識的地方,透過不斷的和問題交戰,讓自己可以再得到學習缺乏知識的機會,以及面對問題思考解決方案的能力,這是在產業內非常重要的核心能力,企業聘請你是為了協助他們解決問題 (需求也是問題),所以解決問題的能力非常重要,而論壇是可以讓自己快速的學習這個核心能力的地方。

4. 分享階段

在論壇活動久了,寫文章會變成一種習慣,不論是簡短的回答,或是長篇大論的文章,只要資訊充分的話,都可以很輕鬆的寫出來,這些能量開始由論壇轉換到書上,我的第一本書 [ASP.NET 問題解決實戰] 就是這時候的產物,我在點部落 (也就是這裡啦) 的部落格是在 2008/10 (到今天兩歲了) 成立的,且不定時在這裡發表文章,寫的範圍不限,只要突然有靈感或是工作上碰到比較稀奇的問題時才會貼上來,或是一些 concept sharing 的文章 (例如邁向架構師的暖身運動系列) 等。

學習方式:

分享是一種習慣,也是一種學習的方法,因為在分享的時候,可以發現自己還有哪些不足,哪些需要充實的,還可以訓練自己文章的筆感和知識的組織能力,這在撰寫像技術文件或是規格書等都很重要。

以上就是我自己的學習歷程和方法,接下來的系列文章將會聚焦於觀念和方向上。