上篇180多贊,裡面還有我關注的Google的人,看來反響很好,給我不少動力啊。最近熱火朝天地把操作系統推到了風口浪尖,碼工又一次站在歷史舞臺上了。跟他們吵架意義不大,還是接著寫建設性的。大師兄靠不住,還得咱武衛右軍!

這篇我想談談網路資源的利用。先說結論:如果是20年前,我是強烈不支持靠自學CS來補充自身知識體系的。無他,那時候的網路資源,非常落後

學習上,這個時代最偉大的發明就是互聯網。瞬間拉近了所有人與知識之間的距離。如今的知識壁壘,非常薄弱,所有的壁壘更多地在於偏見、英語和信息收集能力上了。你可以搜到書籍和文章這些都是小事情,最方便的,是網上的各種教程、討論、在線學習平臺、在線評估平臺、甚至各種源代碼和已經打包好了的project。

讀書當然重要。但是如何利用網路資源,是自學者最重要的能力,沒有之一。我這裡試著羅列一下有用的資源類別。

前提

因為我英語水平過關,所以我用的絕大多數都是英文資料。英文不好的,可以找對應的中文網站或是資料,如果實在沒有,只能自己想辦法了。英語我已經強調了非常多次了,尤其是年輕人,盡量不要繞著它走,我知道我說了沒用,但是我必須說。

一個人的英文可以是啞巴英語,但只會讀和寫,已經在同樣的環境中非常佔優勢了,信息優勢。

綜合性、規劃性資料——論壇

這個主要是中文的。網上隨便一搜,就有不少論壇有人講自己改行的經歷。盡信書不如無書,這些文章或多或少不見得100%是事實,但是讀多了,自然有種直覺,人都學了什麼、起點如何、怎麼學的、多久改行成功的等。

這些論壇一般還有面經(面試經歷)和職場經歷等,還有準備、投簡歷等繁多步驟。改行者不要覺得「這離我很遠先不著急」,有時候隨便看看,可能慢慢就開始建立知識體系、知道哪些部分重要了。

北美推薦一畝三分地論壇。很多好帖子。國內不知道。

手把手教、從零開始的簡單網站

強烈推薦w3schools:

https://www.w3schools.com/?

www.w3schools.com

幾個原因:

  1. 最適合新手的學習網站——因為簡單;非常適合新手建立信心和第一感覺;
  2. 原理精鍊,不過幾句話而已——可能一個小時就能看十幾個章節;兩個小時就能粗略地學習一門語言(相對於老手來說);
  3. 話少英文少,哪怕剛出國甚至國內人看著也不費勁;
  4. 重視操作,每句話、每段話都跟著一段程序,是我個人最推薦的互動式學習方式;
  5. 知識不深也不新,但語言種類繁多而且概括面不錯;

這類網站,最適合新手了。其實好多人一開始,自己IDE都安裝不明白,可能折騰一晚上還沒開始寫程序——不要灰心喪氣,大家都是這麼過來的。但要講究方法,防止灰心喪氣,就得暫時省略這些細節,先步入相對容易的部分——看例子跑程序。

新手連寫都不會,但人給你寫好了例子,你直接跑,再不會再不理解可就說不過去了;而且,自己可以理解後馬上更改程序,在線提交運行,實在是太方便了。

什麼javascript、PHP等語言,先學兩門墊底,儘管自己寫還是不會,但好歹有個心理準備了。這網站也不見得只針對新手,有時候老手忘了一些細節,也會回來看例子。

網路視頻

有人愛讀書,有人愛看視頻。youtube上面有大量的學習資料,國內youku等想必也是很多,新手可以看看簡單的、評價頗好的起步介紹,瞭解些基本知識和基本概念。網路視頻的難度跨度就很高了,從最簡單的入門,到刷題解題,到高深的系統設計,都有對應的課程,其實免費的視頻已經有極其大量的優質資源了。

網路視頻的問題在於:

  1. 略為雜亂,質量良莠不齊;新手在信息經驗不足的時候很難判斷;
  2. 英文視頻對聽力要求較高;
  3. 相對效率不高;

這個3是比較致命的。要知道,文字的信息輸入量要高於視頻,所以盡量還是習慣閱讀文字來學習,長遠來看效率較高、效果較好。公司文檔也佔資料的99%,只有非常重要、非常常見的問題才會做成視頻。

但是好處也顯然:

  1. 可以使用搜索,比如你在Youtube搜索「Load Balancer」(系統設計的基本概念),一大堆經典視頻,圖文並茂,直到你完全理解;
  2. 可以解決一些難題,比如安裝軟體或是建立新project這些,按照紙面教程新手連按鈕都找不到,但是視頻一看,一目瞭然;

個人建議是:較困難和抽象的話題,如Recursive(迭代),系統設計的各個概念等,可以多藉助視頻;其他較為簡單的知識推薦還是文字解決。

在線刷題平臺

這個以LeetCode為首。什麼LintCode,Hackerrank等都行,國內應該也有很多類似網站吧,其中LeetCode有中文版。這些網站的特點是,其在線測試做得非常好。

新手可能不瞭解其實現,我簡單介紹一下基本原理:

  1. 新手提交程序到伺服器,伺服器編譯、運行你的代碼;
  2. 伺服器有很多測試用例(Test Cases),來測試你的代碼;LeetCode一般有幾十個;
  3. 伺服器返回結果,比如你通過了哪些測試,失敗了哪些測試;高端一些的功能還告訴你性能(Performance)如何;

在線刷題平臺是最值得花時間的網上資源了。它的意義在於鍛煉演算法和編程習慣。它的優勢,是不言而喻而且壓倒性的:

  1. 不需要本地IDE的安裝,任何一個設備只要有瀏覽器,隨時開始;
  2. 不限制語言,C++、Java、Python,總有一款適合你;
  3. 這些題目,比如LeetCode的1000題,是歷年實戰面試的精華,是最接近實際面試的知識;
  4. 精心設計的Test Cases讓人養成良好的編程習慣,培養對細節的重視和理解——新手大大咧咧,光check null、check empty array這些基本習慣就很費勁,沒平臺的磨鍊教育不行;
  5. 大量的系統化的話題分類,比如Sliding Window類,Graph類,DP類等,以及對各個容器的覆蓋,哪怕資質再平庸的人,在同類別題目的磨練下,也逐漸趨於深刻和精髓;

沒什麼可說的了,從第一題,Two Sum開始吧。其實,Two Sum真的那麼簡單麼?這裡不細說,以後有機會講。

在線案例代碼平臺

光憑前面這些是不夠的。新手需要在本地安裝IDE,比如Visual Studio(VS)或是Eclipse,以C#或是Java,來做一些最基本的project練習。

這種學習方式的好處在於,單機上可以深刻地理解操作系統,以及具體語言內容。就VS而言,可以每一行地看當前的變數狀態、運行狀態,可以稱之為最細節的學習,有些時候似懂非懂,跟著程序走一遍,一下子就豁然開朗了。

更重要的是,這種學習方法學會了跟本地文件系統、網路系統、UI組件、本地資料庫等各個方面的交互,讓人可以更現實也更全面地理解——什麼是程序。

這種體驗,是前面的online資源所提供不了的。所以,下載免費的Visual Studio吧!我記得有學生版是免費的。

但是,一個問題隨之而來——新手什麼都不會。

假設,我現在給你留個作業,寫一個基於WPF的MVVM模型的UI,最簡單的就行。有人一下子就蒙了,WPF不懂,MVVM又是什麼?你去查了下WPF是做桌面UI的啊,學了兩個小時,略懂了WPF,會添加按鈕了,進度很不錯;不過MVVM看了半天,又是圖片又是講解的,看不懂啊!說的是什麼啊!我根本不會啊!

是,MVVM或是MVC,是非常經典的UI設計模式。但這裡雞蛋蛋雞問題又來了——新手不會UI經驗不足,怎麼理解這個?

天下程序一大抄的思想一定要接受,比如這個:

MVVMLight Hello World in 10 Minutes?

www.codeproject.com
圖標

CodeProject以及類似網站,思路是,每篇文章,講的是一個簡短的project。哦,好吧,也許在你看來不那麼簡短,但是最大的特點是,它的源代碼是可以下載的,解壓縮後用VS直接打開project,可以編譯運行。

所以,從頭寫一個不會,很正常;但是拿一個例子project,抄一抄、改一改,運行運行,這總會吧?這就是這些案例代碼的意義!

下載下來後,按著對方的思路,不斷的運行、研究、嘗試,這裡需要很多的時間花費,但是一旦理解,就真理解了,因為,這是真正的程序,真正編譯成exe、dll,真正在本地運行。那種成就感,也是非常鼓舞人的。

假設,你實現了UI,並且基於MVC或是MVVM,我讓你加上本地資料庫,比如SQLite或是SQL Server呢?如何連接?如何創建Table如何增刪改?

我再讓你用LINQ作為Data Access Layer呢?實現後再改為Entity Framework呢?

其實,每一步,都可以用這個網站慢慢解決,只要有例子,什麼都好辦。這,也是公司工作節奏的特點,很少有公司讓人從頭寫一個東西,哪怕是如此,大概也有類似的例子和參考資料,更多的是擴展、遷移、維護當前已有的系統。

面經、簡歷網站、公司網站

面經不必說了,講面試的故事和技巧的,看了只有好處;

簡歷網站值得簡單一說。我前文談過簡歷,這裡再強調一下——新手的學習,一定要內心中存著一個概念——我在建立(Build)簡歷。看看sample(例子),別人是怎麼寫簡歷的,UI Developer的簡歷是怎樣的,人會的什麼,怎麼形容自己的project的;後端的簡歷是怎樣的,機器學習方向的簡歷是怎樣的之類。

在校生的簡歷如何,職場老司機的簡歷又是怎樣的。讀多了,自然會有感覺,簡歷上的每個字都值得斟酌,都要推敲,都要經得起反覆考驗。

簡歷還能對技術有概念。新手一看到鋪天蓋地的語言、框架,人自己先慌了——這得學到什麼時候啊!慢慢地,簡歷看多了,自己又學了一些,就瞭解整個工業體繫了。這個過程很痛苦,也漫長,但是不做,是不行的。

公司網站,這個前文好像分析過。找個你的dream company,比如Amazon,看看他們的工作要求是怎樣的?需要哪些技術和方面?有人說這些都是官話,對,官話也得看,新手從零開始,要學習的東西太多了,包括識破官話後面的真正要求。

無他,唯手熟爾。見多了,自然有感覺。——這也是我個人認為,學計算機的人,哪怕文科資質——善於讀而不善於算,也是一種另類的優勢。

純搜索引擎

網上的優質資料太多了,列是列不過來的。新手當對某一個領域有一定理解後,可以開始純以搜索引擎為載體學習,簡單的幾個詞排列組合,就可能拿出來最好的結果。這種是大部分工業界程序員的基本能力。

這個的前提,是新手已經不是新手,判斷力是最重要的。比如搜一個技術,老手可以迅速判斷這是(1)新手教程 (2)解決某個技術問題 (3)評價和使用感想 (4)例子 (5)官方API。有人說這還不簡單,不是老手都是在十秒鐘之內判斷一頁的內容的,不可能通讀;

某些老工程師切屏的速度,跟LOL職業比賽也差不了太遠了。

純搜索引擎會指向很多有意思的網站,試著舉幾個例子——

Stackoverflow。Stackoverflow是類似程序員的知乎,但更簡單,都是一些小細節問題,工作的程序員非常喜歡,因為可能半分鐘就解決了自己面臨的問題。比如python裏如何check null啊,如何split string啊,這些看似簡單但又有時候會忘的細節,往往在這個網站有。

可別小看了這個網站。據我所知,Facebook、微軟都使用它的公司內部版,可見其作用之大。這是因為,程序員有很多精力,是純耗費在技術細節上的,如何迅速找到這些細節,是效率的關鍵,也是解決問題的能力。

各專題網站

不列了。有些是專門講系統設計的,有些是專門講程序效率的,有些講單一語言。自己慢慢體會吧。

Github

開源網站,值得學習。但新手好歹有些經驗再試。我用得不是很多。倒是Github也有人放總結性資料,好得很,可以學習之。

結語

如何利用網路資源,是自學的重中之重。上課全A不算牛,課下效率高刷題猛細節全會纔是真牛。程序員想走得遠,不斷利用網路資源矯正自己的學習方法,把自己的知識庫搭建在網路體繫上,是最簡單實用的策略。

但是,英語依然重要。百度靠不住,加上很多資料中文沒有對應。Google的搜索能力和對程序問題的精準定位,其實是一種隱含的保障。英語,是優質信息的鑰匙。


推薦閱讀:
相關文章