分享一篇之前看到的文章,也爲了之後找着方便。java
幾周前一個朋友也打算經過跑步來甩一甩脂肪,控制一下本身那已經嚴重扭曲了的身材 —— 他便求教我從衣服到鞋,從腕錶到心率帶,都買了什麼裝備,性能如何,他好照着原樣來一套。我告訴他我什麼裝備都沒買,跑了半年多了,我仍是隨便套上件純棉的T恤,穿條舒服的運動短褲,蹬着跑鞋,抓着手機,就這麼跑將起來。他連連說不信,一個連排汗速乾的衣服,臂包,運動腕錶都沒配的人,怎麼也能(配得上)跑步?python
這讓我想起了我在撰寫「程序人生」公衆號常常會遇到的一些讀者留言:android
「我想學rails,有沒有推薦的ruby的入門書籍?」c++
「我想學android,對java掌握到什麼程度才能開始呢?」web
「我c/c++還沒入門,能直接學python麼?」django
這些問題都是初學者經常縈繞心頭的疑慮。在咱們本身的現狀和想要達成的目標間,老是橫亙着一條名爲「先決條件」的大河,彷佛除了花費巨大的精力遊過這條大河外,別無他法。很不幸,大部分人還沒可以接近目標,便被湍急的水流沖走了。然而,仍是有少部分人彷佛坐上了阿拉丁的魔毯,毫無遲滯地直達彼岸,好像學什麼技術都不那麼費勁。這是怎麼回事?ruby
學一門新的語言,或者新的技術,與其說是一種能力,不如說是一種方法。試問什麼樣的人,或者說人在生命的什麼階段,學習效率最高?效果最好?答案顯而易見:嬰兒期。個人不到兩歲的女兒估計如今也就掌握了幾十個名詞,十多個動詞,三五個形容詞和介詞而已,但天天從她口中蹦出來的話不下幾百句。想一想咱們本身學了多少年英語,才能從口中完整地說出:"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。遺憾地是,不少初學者的問題是:想對一門技術快速入門,卻使用了系統學習的方法,還未入門,便倒在了艱苦修行的路上。
做者:陳天