如何快速掌握一門技術

zhihu發表於2014-10-08

  幾周前一個朋友也打算通過跑步來甩一甩脂肪,控制一下自己那已經嚴重扭曲了的身材 —— 他便求教我從衣服到鞋,從腕錶到心率帶,都買了什麼裝備,效能如何,他好照著原樣來一套。我告訴他我什麼裝備都沒買,跑了半年多了,我還是隨便套上件純棉的T恤,穿條舒服的運動短褲,蹬著跑鞋,抓著手機,就這麼跑將起來。他連連說不信,一個連排汗速乾的衣服,臂包,運動腕錶都沒配的人,怎麼也能(配得上)跑步?

 

  這讓我想起了我在撰寫「程式人生」公眾號經常會遇到的一些讀者留言:

「我想學rails,有沒有推薦的ruby的入門書籍?」

「我想學android,對java掌握到什麼程度才能開始呢?」

「我c/c++還沒入門,能直接學python麼?」

  這些問題都是初學者常常縈繞心頭的疑慮。在我們自己的現狀和想要達成的目標間,總是橫亙著一條名為「先決條件」的大河,似乎除了花費巨大的精力遊過這條大河外,別無他法。很不幸,大部分人還沒能夠接近目標,便被湍急的水流沖走了。然而,還是有少部分人似乎坐上了阿拉丁的魔毯,毫無遲滯地直達彼岸,好像學什麼技術都不那麼費勁。這是怎麼回事?

  學一門新的語言,或者新的技術,與其說是一種能力,不如說是一種方法。試問什麼樣的人,或者說人在生命的什麼階段,學習效率最高?效果最好?答案顯而易見:嬰兒期。我的不到兩歲的女兒估計現在也就掌握了幾十個名詞,十多個動詞,三五個形容詞和介詞而已,但每天從她口中蹦出來的話不下幾百句。想想我們自己學了多少年英語,才能從口中完整地說出:"hello everybody, so glad to see you",初中?高中?抑或大學?想想我們單詞量三千的時候能做什麼程度的溝通,交流?

  如果你仔細觀察,你會發現,嬰兒的學習方法極盡實用之能。模仿,試錯,練習,不管一切所謂「權威」的語法,詞法,一切以用為主。還是以我女兒為例,她的表達是以短語和句子為主:

「爸爸抱抱小寶」- 求安慰

「小寶要喝奶奶」- 餓了

「要是小寶不聽話呢」- 學會了反問之後你跟她說話她時不時就將你一軍

「媽媽媽媽快回家,讓我親親你吧」- 跟唱歌機學的,賣萌

「goodbye so long farewell my friend」- 跟音樂課學的,賣萌

  說出的大部分的句子,她並不知道每個詞的具體含義,但她知道這個句子的模糊的意思,而且從大人的反應中,她能知道她理解的意思是否正確,就這樣,一次又一次模仿,試錯,獲得反饋,不斷地累積自己直接能用的「知識」。

  這是實用主義者的學習方法:繞過障礙,直奔主題,專注那些你馬上需要學的。幾年前,我在開始學某樣東西前,會上網蒐羅幾乎所有能找到的從入門到進階再到專家的書籍,在看了一大堆各式各樣的評論後,心滿意足地篩選出所謂的「精品」購買回家,然後把他們壘在書桌前,彷彿這是學習之前必要的儀式。但這樣的做法僅僅是成就了豆瓣和亞馬遜,堆積的圖書往往在我豪氣萬丈地看到第一本的第X章(X<=5)後便被束之高閣。後來我發現,我被所謂的「學習要先系統地打下紮實的基本功」坑了 —— 我不斷地陷入「基礎知識」的泥沼,越陷越深,越學越苦,只能苦苦掙扎。這掙扎的結果,80%的情況變成了放棄。

  其實我大可不必去擔心這些「基礎知識」,把它們先放在一邊,用到多少,便學多少。比如說,我要學rails,那就直接從rails開始,遇到有關ruby的語法障礙,回過頭來看看ruby文件中相關的內容,掃清障礙立刻回到rails本身,而不是先從ruby啃起。要知道,rails裡用到的ruby特性,可能佔ruby總體語言和類庫特性的20%都不到!從ruby學起,便是走了岔路。

  軟體開發是個手藝活,它的學習不是各種可能很少用到的知識一股腦的堆積,我們沒法在一切理論知識準備就緒以後再開始學習。scala的作者批評java的低效時曾經說過,java把寫程式變成了做儀式,因此毫無樂趣可言。那麼,當我們在桌前堆滿了從入門到專家的各種書籍,是不是也把學習變成了一場盛大莊重的儀式?重要的不是堆砌了多少知識,而是學以致用。

  僅僅專注並直奔主題還遠遠不夠。學習過程中你需要大量練習和獲得反饋。 嬰兒並沒有在累計了3000個詞彙之後才開口說話,而是當身體和大腦準備好後的第一天就張口說話了,並且,儘管說得錯誤百出,他們依然越挫越勇,屢敗屢戰。同樣的道理,當你學習python而不使用ipython在REPL環境下嘗試各種使用技巧,當你學習django而沒有從搭建一個可執行的web專案開始,那學習效率肯定不高,效果也必然馬馬虎虎。在健身房裡,就算觀摩教練的動作一百遍而不是自己親自嘗試,並接受對方的糾正建議,你還是無法掌握正確的動作要領。我見過有人把書中的例子一個個敲到編輯器中,全部執行正確,然後就心滿意足地認為自己「掌握」這門技術了。殊不知,這種「練習」並非有價值的練習。我們需要試錯,就像嬰兒學步那樣,模仿,邁步,摔倒,爬起來,再邁步。犯錯是學習的一部分,當你看完教程掌握了裡面所述的內容後,可以自己構思某個應用或者某個使用場景,然後從頭寫起。你會發現很多問題,也會加深對教程的理解。自己無法回答的問題,可以尋求社群的幫助,大部分和開發有關的問題都能在stackoverflow上得到解決。這樣不斷地練習和獲取反饋,你的開發功底會很快提升。很多非系統的知識和能力(甚至洞見)就是這樣通過不斷練習和試錯在下意識間學到的 —— 它們來得如此悄無聲息,以至於除你之外,別人都將其視為你的一種天賦。

  那麼,什麼時候需要系統地學習呢?當你有了實戰所需的技術和經驗,需要巨集觀上對自己所學的內容做一個昇華時,或者當你的實戰能力遭遇到了瓶頸的時候。有句話說得好:你不需要成為一個優秀的ruby工程師才能用好rails,但如果你想成為一個優秀的rails工程師,則你必須很好地掌握ruby。遺憾地是,很多初學者的問題是:想對一門技術快速入門,卻使用了系統學習的方法,還未入門,便倒在了艱苦修行的路上。

相關文章