注:這裡的”後知後覺”者,指的是像我一樣的在大學之前沒有接觸過程式設計的人或者是在想要入職程式設計師而沒有任何基礎的人。
一.學任何知識的先決條件
       先不談具體的學習方法,就學任何方面知識的先決條件來發表一些我自己的看法。
       共三點,這3點的重要性不分先後。
       第一點就是主動性。當然主動性需要建立在興趣的基礎上。主動學習與被動學習,兩者的效果可以用天地之隔來形容。就好像主動去玩遊戲與學習自己不喜歡的科目一樣,兩者的happy程度與效果也無法相提並論。追女生都要主動去追,更何況學習呢?
       第二點就是自信。自信,從外在來說,決定了你走路的姿勢,說話的音量與魄力,眼神是否專注,等等。我瞭解別人的一個很重要的途徑就是眼神,我覺得眼神可以看出一個人做事的態度與性格。不需要說太多,我已經太多次從自信地做事中得到益處。我覺得,做任何事都需要一定的自信,即使是面對自己不擅長的東西,只要需要去做,就應該自信。自信與自負最大的差別就在於能力,能力強,那自然是自信地”藝高人膽大”。
       第三點就是自學能力。我記得劉未鵬在《暗時間》中提過:“一個人的知識積累,百分之九十都來源於自學”。做技術的人,是從書本中,從老師,同事,從各種資料,等等途徑自學;不做技術的人,是從人際交往中,人員管理等等方面自學。我覺得,自學就是在創造機會,而不僅僅是等待機會。由此可見自學能力的重要性。
二.”後知後覺”
       上大學之前,我對程式一無所知。那時對電腦的印象就是”魔獸世界”,”星際爭霸”,等等。大一上期學vb,體驗了程式設計,直到大一的寒假,才真正開始了我的程式之路。我看到網上很多人都是在高中之前就接觸了程式設計,或是Pascal,或是vb,等等。我把這些人稱做”先知先覺”者。我們這些”後知後覺”者,比”先知先覺”者晚了大概3年時間認識到程式設計。而我認為,這3年的差距,最重要的表現就是程式設計的思想。不要小看這3年,在大學之前,3年是段不短的時間。就我個人來說,我現在是大三,僅僅就兩年時間,就讓我從計算機或程式的角度把生活中的很多事物都再認識,再思考。比如,以前查字典的時候,只會按照字母和大概的頁數去找,當要找f開頭的時候,經常是在e和g的頁上耽誤時間。如果當時我學了程式,就可以很自然地想到折半查詢法,可以把時間穩定在對數級,再延伸一些,以前查字典的方法可以算是一種簡單的隨機演算法,雖然有時可能比折半查詢快很多,但是在穩定性上,折半查詢顯然好與隨機演算法。這也就是我認為的,”後知後覺”者在程式設計思想上與”先知先覺”者的差距。
三.從我的學習歷程中總結出”後知後覺”者的學習方法
       上面已經說到,我是一個在計算機專業上的典型的”後知後覺”者,但我覺得我很幸運,上大學的兩年以來走過的路恰好是我目前所認為的最好的路:大一上期體驗程式設計,大一下起進階學習程式設計,大二嘗試各種不同的領域,在大二的暑假基本確定了方向。下面我來仔細說說這幾個階段的學習方法。
       1.大一上學期。之前對程式一無所知,這時需要接觸一門比較簡單而且可以較快做出作品的語言,比如python等指令碼語言。在這段時間內,可以盡情地發揮自己的想象力,去操縱python,來感受程式設計。
       2.大一下學期。需要學習C語言。C的語法簡單(往深了學,C語言可不簡單),在少用指標,記憶體分配的情況下可以較少出錯。我推薦在這段時間內,儘量多地用陣列來代替指標,防止運用指標出錯,然後去實現常用的資料結構和演算法,然後做一些簡單的ACM題來練習基礎與思維。這段學習歷程對於我至關重要,讓我養成了很好的思維的習慣和一定的程式設計思想,簡單點說,就是將大問題拆分成小問題,然後用最簡單的辦法去解決小問題。這段時間內先不要去學物件導向。在期末的時候,可以寫一個基於連結串列的資訊管理系統,綜合運用一下所用知識。
       3.經歷了以上時期,程式碼量應該有了3萬左右(注:一定得獨立編碼,絕對不能照著書抄程式碼,那樣沒有絲毫作用)。大二,要去嘗試各種不同的領域,比如底層開發,linux下的C/C++程式設計,較上層的應用開發,比如android開發,j2ee等等。我在大二這一年,學過android開發,做過一個記單詞的小軟體;學過jsp,servlet,做過一個小的bbs;啃過C ++ primer plus;學了彙編,寫了一些小程式。最終,我決定了linux下C/C++,網路程式設計的主要方向。這是一個選擇的過程,每個人的興趣不同,選擇也就不一樣。
      4.選定方向後,先深入學習該方向,然後再適當廣泛的學習,採取”先精後泛”的策略。在時間上,也就是大三,這一年至關重要。在之前的基礎訓練的前提下,這一年可以讓技術有一個比較大的飛躍。
      5.貫穿在整個學習歷程中的總結與思考。”學而不思則惘,思而不學則殆”。”思”對應思考與總結,”學”對應看書與編碼實踐等等。”學”與”思”應該同時交替著進行,二者的地位同樣重要。但要注意克服一個心理上的障礙:我在看書學了一天後,總是不願意去總結,就像是對總結有恐懼一樣。我覺得這可能是一個普遍性的問題。這時,需要強迫自己去進行總結,去反省,在這個時候的總結與反省,往往能起到非常大的效果。
      6.注意身體健康,最好在每學習1小時就站起來休息5分鐘。我覺得即使在工作中,這個習慣也應該保持。擠5分鐘出來,會對自己的身體有很大的好處。經常面對著電腦,頸椎的壓力會很大,網上有很多頸椎保健操,差不多也就5分鐘。每學習一個小時,就站起來做5分鐘頸椎保健操。我高中時頸椎就因為玩遊戲而經常不書許,而這個習慣我已經堅持了差不多1年了,感覺有比較大的改善。
       當然,這些方法不只使用於學生。如果是想要入職程式設計師而沒有任何基礎,可以將體驗程式設計與選擇方向的時間儘量縮短,但是用C去實現資料結構和演算法以及做練習題的時間必不可少,因為這是基礎中的基礎。
       以上是我的個人斷點,如果您有不同的見解,歡迎提出來。
 
       如果您覺得我的文章對您有幫助,請贊一下,非常感謝!