讀書與上課

或許是網際網路太發達且資訊已經多到爆炸,也許有人覺得要對一門電腦技術精通只要上網查查資料、看看別人的部落格就有機會達成這樣的目標。我不否認應該有少數這樣具有特別天份的人,這類的人多半對於知識的組織與吸收是有獨到之處,不過這也意味著大部份的人走這條路通常都會進到死胡同,很快地將會遭遇許多技術瓶頸的挑戰。

       或許是網際網路太發達且資訊已經多到爆炸,也許有人覺得要對一門電腦技術精通只要上網查查資料、看看別人的部落格就有機會達成這樣的目標。我不否認應該有少數這樣具有特別天份的人,這類的人多半對於知識的組織與吸收是有獨到之處,不過這也意味著大部份的人走這條路通常都會進到死胡同,很快地將會遭遇許多技術瓶頸的挑戰。

 

       現在我一則不寫書、二來不教課,大家買不買書或上不上課基本上和我的荷包一點關係都沒有,主要是有感於某些初學者對於正確的學習認知不足導致走了很多冤枉路,更有甚者是一直以為這樣個學習方法是真的有用的,殊不知你可能花了十倍的力氣才學到別人一倍力氣所學的東西。

 

       可能有些持反對意見的人會講說網際網路上有這麼多的文章、問答,難道不能取代書籍或課程嗎?我是認為有點困難,因為在網路上的知識往往是零碎的,就拿我們自己在寫部落格文章來說,每次我們可能是想到什麼特定的題目就寫一下,因此這些資料雖然有用,但通常都在解決特定的事情,而非一個有組織過的完整知識,因此並沒有一個循序漸進的教學過程,有些人甚至程式碼抄了就拿來用,也未曾仔細想過該程式碼的內容而囫圇吞棗,這對學習反而是有害的。

 

       不論是讀書或上課,這些事情帶給我們最大的好處是這些知識都已經被這些老師們有結構性的重新組織過 (我知道有些書或課程很爛,但畢竟爛的通常屬於少數的那一邊,所以在這邊我就假設你選對了書或老師),當一個知識被重新組織過後對於學習者來說會比較省力,也就使得我們不會花了一堆時間兜圈子。舉個例子來說好了,如果你要寫一個TCP通訊的程式,首要是你必須對TCP/IP這種通訊協定有基礎的瞭解再下去寫程式;或許你完全不瞭解TCP/IP然後看了我在部落格上的文章依樣畫葫蘆,然後就以為自己會寫TCP/IP的通訊程式了,這會產生一個問題,我不可能在部落格上寫太複雜的範例程式,因為那篇文章要說明的不過就是TcpClient和TcpListener這兩個類別的最基礎用法,於是當你的通訊程式需求稍微複雜點的時候就鬼打牆了( 真的,很多人根本搞不清楚Server和Client的TCP Port之間存在著什麼樣的對應關係,就只有抄抄網路上的Code,然後就誤以為自己會寫Socket程式了 )。看書又是另外一回事,通常關於Socket程式的書開宗明義都會先對OSI 7 Layers有淺顯的介紹,然後對於更應該深入瞭解關於網路通訊的基礎知識也會有所著墨( 例如TCP, UDP, FTP, HTTP 的通訊模型 ),當你有具備了這些基本的網路知識之後,撰寫這一類的程式碼時遇到那種百思不解問題的機率一定會降低,因為你會懂得用正確而非錯誤的知識來判斷問題。舉個例子是有人曾經有一個問題是拼命地想要將TcpClient Connect 上另一個TcpClient,如果有足夠的基本網路技能知識第一時間就會知道這是不可能的,就不會浪費時間在這種根本就是錯的事情身上。

 

       我讀不讀書呢?基本上我既買書也讀書,雖然我也鼓勵大家也要多閱讀MSDN文件庫,但畢竟看字典和念一本中文寫作技巧的書籍還是有點不同的,學習新的技術最快的方法就是利用別人先幫你組織好的知識來入門,像小朱當時搞雲端幾乎沒有多少文件可以看,每天必須很辛苦地反覆測試才能知道想法與結果有沒有差距,但我看了他後來出的那本書,起碼很輕鬆地知道如果要寫Azure該從哪著手、學習的順序應該是如何、以及我應該先補充哪些相關的基本知識與技能,省下自己大把的時間 (這證明我真是個懶鬼)。所以鼓勵大家多念對的書、上到好老師的課程,事半功倍,何樂不為?