陳天:如何快速掌握一門技術

jopen 10年前發布 | 16K 次閱讀 技術

陳天:如何快速掌握一門技術

        幾周前一個朋友也打算通過跑步來甩一甩脂肪,控制一下自己那已經嚴重扭曲了的身材 —— 他便求教我從衣服到鞋,從腕表到心率帶,都買了什么裝備,性能如何,他好照著原樣來一套。我告訴他我什么裝備都沒買,跑了半年多了,我還是隨便套上件純棉 的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。遺憾地是,很多初學者的問題是:想對一門技術快速入門,卻使用了系統學習的方法,還未入門,便倒在了艱苦修行的路上。

        歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早 8 點與您相會。

                    <span id="shareA4" class="fl">                            
                        </span> 

</div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!