題圖:from bessiesbluedress.tumblr.com
避免看到最後說我誆你,這篇其實應該是《我是如何學習一門程序語言的》。
對我而言,不同的語言,學習的方法似乎也不太一樣。
最早的時候都是在學校裡學的,比如 Fortran、C、C++、Java、OCaml 等。通過正式的課程去學習一門語言,方式會比較固定和統一,都是上課、做作業、以及編程作業。這種方式通常可以比較系統地了解語言各方面的特性,而實際實踐還是要看各人的機遇和選擇。所以有一些語言,上完課之後,卻是很少再用了。
離開學校後,很多工作中再接觸到的語言就屬於自學了。總的說來有三點感觸。
一是不要為了學習一門語言而學習。至少你知道自己在不遠的將來有很大可能性會用再去學。因為學了一門語言而不去實踐,除了對語言特性能有些了解,其實不會有什麼用。因為很多東西肯定會忘掉。這有的時候和一門說話的語言一樣。大學的時候覺得好玩學了日語和德語,然而從來沒有真正的應用場景,所以都忘的差不多了。都不好意思跟別人說我學過。不過以後需要用的時候可能學起來還是比從頭開始快些吧。
二是不同語言別人口中的學習的難度和你自己學起來覺得的難度會很不一樣。原因就在於你已經熟悉掌握的語言其實是你的底子。比如一個已經熟悉 OO 編程的人,再學另一門 OO 語言就會相對輕鬆;一個已經熟悉函數式編程的人,再學習另一門函數式語言也會比從沒接觸過的人容易的多。
但這僅限於相對輕鬆。每門語言都還是有很多區別於同類語言的特性。還有很多語言,是綜合了多個類型語言的特性,再做了不同的權衡。即使是看似語法很相近的語言,可能實際使用起來卻又有很大的區別。一個眾而周知的例子就是 C++ 和 Java。二者都是典型的 OO 語言,然而使用起來很多思維方式卻是有著極大的差異。因此,學習一門語言很忌諱膚淺的覺得 「這個和我知道的 X 語言差不多」,然後想當然的在使用中套用一些 X 語言的思維。
三是因為工作時候學習語言通常都是邊用邊學。一方面,這比在學校時候能夠學的更快,因為你有使用的場景,可以不斷練習。而且周圍很多高手可以討論,還有別人的代碼可以參考,更容易積累實戰經驗。而另一方面,直接上手沒有系統學習很容易想當然,很容易以偏概全。這又必須在工作以外自己主動學習理論知識來彌補。
說幾個我工作中學習語言的例子。
首先說 Scala。需要用 Scala 的時候,是一個別組的項目有特別緊的 Deadline,我因為一向比較 「手快」 且對業務邏輯比較熟,所以被借調過去幫忙。那時候我並沒有學過 Scala,但是因為時間關係,必須立馬上手。好在面向對象語言和函數式設計語言我都有比較好的底子。所以在已有代碼庫的基礎上寫一些新的函數,而不需要我去寫架構代碼,總的來說還是比較輕鬆的。
但是用 Scala 寫 Spark 相關的代碼,邏輯正確是不夠的,一定要對代碼執行的性能有所考慮。比如需要知道一些常見函數大概的時間代價,例如 group by 和 order by 其實都是比較昂貴的,應該避免一些不必要的頻繁使用。而有些操作又是相當低代價,可以隨意使用。另一個就是 Lambda 嵌套使用過程中語言的一些局限性等。好在組裡當時有幾個 Scala 比較熟的,所以一些不規範或者低效的使用方式,在 Code Review 中也會被指出。所以,幾個月後,雖然用 Scala 也寫了不少代碼,過程中也了解了很多這樣的易出錯的地方,但是感覺如果不是因為是在一個協作的過程中有人幫忙,這種裸上寫代碼的方式還是可能引起一些性能上自己沒有意識到的問題。
再說說 Ruby 以及 Rails。Ruby 是語言,Rails 是框架,但是實際工作中極大多數時候 Ruby 都是在 Rails 下使用的。因此放到一起說。Ruby 語言語法簡單、使用靈活,看似好學,其實又是最難學的語言之一。因為總和其配對的 Rails 中的 Magic 太多。很多在別的語言上挺有造詣的朋友,對這門語言/框架自學和速成都遇到一些困難。Ruby / Rails 其實是我最精通的語言/框架之一,卻也是我學習的時間最長的語言/框架之一。一來在 Square 的時候 Rails 就是主要(語言)架構,且公司有很多 Rails 的專家大牛,所以給了我一個極好的學習氛圍。且 Airbnb 也是重度使用 Rails。二來因為常用,所以自己也願意額外下功夫,整個 RailsCast 幾百段教學錄像,當時借用每天上下班坐車的時間都看完了。一些 Rails 的論壇也常常關注。所以對於 Rails,雖然坑很多,但是自己還是有信心能避開大部分常見的問題。之前的一篇《聊聊 Ruby on Rails》也寫過一些心得體會。
最後說說幾種前端語言、框架、和庫的學習,例如 JavaScript,Ember,React 等。我在學校的時候其實從來沒有碰過前端。後來因為工作需要才去學的這幾種。前端語言和後端語言差異還是蠻大的,尤其是語法上。如果一點底子都沒有,加上 Html,CSS 等,其實有時候讀懂代碼都費勁。所以直接上手寫幾乎是沒有可能了。
當時一開始是找的 W3School 上的一些教程類文檔,完整地過了一篇,不算很長,看起來倒也挺快。看完讀代碼問題就不算太大。然後白天看看公司的代碼庫,寫一些簡單的代碼練手。一有空,就拿語言的官方文檔邊看邊抄。什麼意思呢?就是從頭細讀,遇到能立馬理解體會的,根據熟悉程度,或快或慢,一帶而過。遇到有點不知其所以然,或者雖然理解了,但是覺得自己沒有深刻體會的的,就做筆記摘錄下來。這樣有一些在實踐的過程中慢慢又會遇到,通過實際場景就會更深刻地理解。不時再溫習一遍自己的筆記,覺得已經熟悉掌握的就劃掉。學和練交替,等到筆記上半懂不懂的內容全部被 Mark 了,基本也算學的差不離了。
大致就是如此吧。
最後說一下,語言畢竟只是工具。精通一門語言最多算是優勢,從長久的職業生涯來說,只能算技能之一。簡歷上多列幾門語言也不見得就在找工作的時候一定有優勢。有一定的語言功底,每種典型的語言類型都能熟悉或精通一門。然後在需要的時候再去學,學習的過程中能做到不想當然,不套用定式。
其實沒有絕對好或者絕對不好的語言,因為每種語言都是為了一些特定場景設計的。脫離了這些場景,就總有用起來比較尷尬的情況。多了解語言的特性,在使用過程中能做到揚長避短,大部分時候就足夠了。當然,如果是項目裡負責語言架構的技術人員,那又另說了。
因為是極客邦老大霍泰穩的親妹妹,年底了,不給我發紅包,卻被感情綁架發免費廣告。也不知道有幾個妹妹能這麼好使喚的。不過話說回來,極客邦的活動和產品確實是高品位、高品質的。所以推薦起來,也算是良心推薦了。技術人的未來沒準就在這裡。
長按二維碼關注InfoQ,中國最專業,最用心的IT技術資訊公眾號。行業內的技術大牛基本都在訂閱。
如果你不是技術出身,並不從事技術領域的工作,可以轉給你身邊的程式設計師,技術宅男,表示你很理解他們。等他們統治世界的時候,你會堅定的站在他們身邊。
長按二維碼關注stuq,更偏向於實戰,技術培訓,技術交流的社區公眾號。從菜鳥到大牛,很可能就從關注這個公眾號開始。