習得一種編程語言後如何高效地學習其他語言?


王垠不是寫了嗎,如何掌握所有編程語言。

他那個又沒說錯,你們為啥不去看。


你只能快速學會概念相近的語言,顯然學會C++模板以前的所有知識對你學Haskell並沒有任何幫助。但是函數名終歸是要重新背誦的。


謝邀。

你可以參考我很久之前的一篇文章:如何學習編程語言。

當然了這個是針對任何一門語言的學習過程。如果你已經掌握一門或者幾門編程語言了,那麼當然也有一些其他的途徑。

這裡假設,你所掌握的編程語言中至少有一門是對其特性非常了解而且有過至少一些簡單的應用程序設計經驗的。

那麼就可以從以下三個點來對照學習:

  1. 語言特性上,與你所熟悉的編程語言大體有多少差別。這裡並不是只指的語法上的區別:任何人都能夠通過練習掌握。而是,在編程範式層面上是否有明顯的不同。如果有,就像Java和Haskell,那麼你所關注的點則應該放在新語言的新範式上。
  2. 慣用法。大部分編程語言都能夠通過簡單的命令式組合來編程,但是每個編程語言因其獨特性和社區偏好不同,都可能有所慣用的技巧。這套技巧並不是為了拿來炫耀的,而是,在整個社區能夠作為通用語言拿來交流,也是 @張漢東 老師提到的,可以拿來體會「設計哲學」的點。
  3. 應用領域。雖然每個編程語言都盡量聲稱自己是General Purpose的,但是畢竟因其能力限制和專長,有著一定應用領域的劃分。所以,如果想要通過實踐來學習的話,不妨從其所長的應用領域入手:一方面可以從中體會這個編程語言及其特性的特色所在,另一方面,社區也有足夠的資源來作為參考。

我並不贊成所謂的「如果不用,學了就忘,所以別學」的理論,無論如何這個過程都至少對你是有幫助的。

另外:

  • 不要一開始就去讀Spec
  • 不要死摳語法細節
  • 不要脫離實踐空談
  • 不要覺得所有的編程語言都是一樣的
  • 官網的Guide是個開始的好地方
  • 創始人或者一些主要貢獻者寫的書更值得看

謝邀。

從我的經歷來看,「學了一門編程語言」跟「如何高效地學習其他語言」並沒什麼很大關係。現在要學習另一門編程語言,我覺得首先要思考兩個問題:

1. 學新的編程語言的目的是什麼?你學來幹嘛用?

2. 有沒有明確而強烈的意願?

如果倆問題都答不上來,還是別學了,不然你學了也是白學。道理很簡單,不實踐就會忘記。

學其他語言的語法是一件簡單的事情,一般兩三個月拿下是沒問題。但難在實踐加深的過程,這急不來。

學習新語言儘可能找一本口碑比較不錯的書/資料,跟著例子做,劃線標重點,筆記做總結。但終究沒太多捷徑可循,還是得靠大量實踐。


編程語言也是好多分類方式。比如說你可以按照面向對象的,還是函數式的。你也可以按照靜態類型還是動態類型來分類, 還有強類型還是弱類型分類等。同類的語言會比較相近,所謂觸類旁通嘛,比如你c++學習好了,學java或者c#就會快,反之亦然,因為他們都是面向對象的靜態類型語言。又比如你Java和haskell學好了,學Scala 就會非常快,因為scala是靜態強類型的函數式編程語言,又兼顧了面向對象,而java是靜態強類型面向對象,haskell是靜態類型函數式語言,正好覆蓋scala。但如果你之前學的是PHP(php雖然有class,但還不能叫面向對象吧,只能說是支持對象編程),又沒有絲毫面向對象,或者函數式編程的底子,直接就來學scala就很難了。


如果只是學語法,學會一門語言之後其他語言的語法也會很容易,特別當你學的語言都是C系的時候。

但是學編程語言往往需要的了解語言的特點、底層實現、生態環境甚至是歷史,這個就需要慢慢下功夫了。比如平時寫軟體的時候換著語言用一用,今天A軟體用C++寫,明天B軟體用Python,後天C軟體用Java,大後天用JavaScript,大大後天用C#什麼的,語言這種東西時間就不用了也會慢慢生疏的。用一種預言實現一個軟體,都會對它的特點、生態環境有很多新的了解和認識的。

還有就是平時做演算法題,用多種語言分別寫一遍,因為相同的演算法在不同的語言里也是會有差別的,不同語言里容器的性能也有差別,多用不同的語言實現,結合不同語言的特點來高效實現出演算法,既可以學演算法,也可以很深刻的了解語言特點。


既然已經習得一門編程語言,那就代表你已經收穫了以下知識:

  1. 編程已經入門
  2. 該門編程語言的思想
  3. 該門編程語言應用領域的知識

這個自己心中有數。

上面是回答這個問題的前提。

然後,擺正學習態度。

  • 所謂高效地學習,不是教你3天學會一門語言,而是指不走彎路地掌握一門語言的精髓。
  • 還是那句話,放下一步登天的想法。

其次,是否能高效地學習其他語言,主要決定於下面兩個前提條件:

  1. 新語言是否和已掌握語言屬於同一種思想。比如都是OOP或函數式。
  2. 新語言的應用領域是否與已掌握語言重合。比如都是Web。

最後,具體可以按以下策略進行學習:從哲學到科學,從整體到細節。

  1. 先從該門語言的設計哲學出發。

為什麼要先了解設計哲學? 因為一門編程語言的出現,是為了解決某個主要問題,你需要找到這門語言要解決的主要問題,以及它的解決方案,做到心中有數。一門好的編程語言, 其語法必然是其設計哲學的體現,你也可以把設計哲學,理解為語言本身的思想架構。設計哲學是根和主幹,語法只是細支末節,如果不通過這一步掌握一個整體的Big Picture,直接學習語法,就很容易在細節中迷失自我。了解設計哲學的過程實際上是你在心裡建立這麼新語言心智模型的過程。

如果上面的前提條件都滿足,高效就是自然而然的。因為有共通的心智模型。

既然都是相同思想相同範式的語言,那麼它新在哪裡?

這就需要考察該門語言的設計哲學,從設計哲學出發,把握它的誕生要解決什麼樣的問題。比如你學過了Java,現在想學Ruby,那麼先了解它為什麼會存在,Matz是怎麼想的?好在Matz自己寫了一本書《松本行弘的程序世界》,把他腦子裡的想法都告訴了你。掌握了其設計思想,再去看語法,才有腳踏實地的感覺。

如果上面前提條件都不滿足,那意味著,需要重新建立對新語言的心智模型,那麼你就需要花更多的精力來達成此目標了。

比如,你以前學的Ruby,現在要學Rust。一個是OOP,一個是混合範式,一個是活躍於Web領域,一個是系統級編程語言。了解Rust設計哲學的過程,會是一個挑戰,可以挖掘更底層的知識。如果你擅長C或C++這個過程也許會好受一點。

2. 在完成第一步之後,把語法通學一遍,將設計哲學和語法元素掛好鉤,做到心中有數。

第一步的學習過程中也會了解語法,但是著重考察設計哲學,語法層面可能比較零碎。這一步是側重語法,需要系統地完整的學習一遍語言的語法。

掛鉤的意思就是,了解具體的語法是為了實現設計哲學的哪一點。 拿Ruby來說,模塊允許Mix,這體現了組合優於繼承,利用單繼承消除Java那樣多繼承的複雜性,這也體現了Ruby三大設計哲學之一:簡潔。

再比如Rust,雖然語法概念眾多,但是從其內存管理出發,去看Rust如何用所有權來保證內存安全,你就會發現Rust是一門一致性非常高的簡潔的語言,傳說中很高的學習曲線自然就會從心頭消除。

3. 剩下的就是開始實踐了。

如果應用領域是一樣的,那麼很多領域知識都是共通的,直接上手做幾個項目即可。如果應用領域不同,那就只能多費點功夫了,這個沒有什麼捷徑或方法論。但是可以分階段:

1)消除陌生感。這個階段的練習實踐完全是為了消除陌生感,主要是應用於上面兩個學習步驟。比如可以去CodeWars刷刷題。

2)做完整的庫或小項目。練手項目。

3)做生產項目(商業或開源)。對新語言的心智模型建立完畢,如果可以就可以做生產項目了。

以上,拋磚引玉。


學得一門或者多門語言後,再學新的語言。

  1. 先研究發音,看口型圖,口型大小排序。
  2. 掌握核心動詞,及其變形。動詞可能是最靈活的。
  3. 看看名詞有沒有陰陽性。有的話,如何區分,是不是詞尾就能看出來。
  4. 充分利用同語系的相似性。比如學日語的時候可以利用漢字的音讀,學韓語的時候看看對應的漢字是什麼。學法語的時候,許多詞其實是英語的高級詞。
  5. 我知道你說的是編程語言,我編不下去了。

謝邀

前期就是在學語法,只要語法類似,完全可以路過的,就這麼快。跟原來的語言比一下就知道了,把不同的地方記住就可以了


隨便瞎說……

我們先把語言定位在 一般的 PHP/JAVA/GO/C++/JS這類 面向對象編程類型的語言……

那麼語言就是三大結構

順序、判斷、循環

然後 一般還需要

聲明變數、聲明常量、聲明函數、聲明類、聲明類型、引入庫(文件)、

初始化對象實例、調用對象的屬性 ……等等

(當然,還有指針啊、銷毀對象釋放內存啊 什麼的……)

學習一下新語言的 以上兩部分的語法

……

就可以開始最基本的編程了……

意外不意外?! 驚喜不驚喜?! 刺激不刺激?!


學完C/C++

再去學其他語言,嗯,都很高效


學習一門語言最好有目的性,不然看完就會忘記。

有一門語言的經驗再學另一門,瀏覽一下新語言的語法,就完全可以邊學邊開發。

如果不知道寫什麼好,可以用新學的語言重新實現以前語言寫過的工具,

遇到不懂就看文檔,

實踐是最高效的學習,

這樣也可以了解兩門語言的在某一方面的優劣性,

加深對語言的認識。


如果你在一座城市做過地鐵,那麼換了一座城市應該也會比較順利的乘坐。編程語言的模式都比較相同,初級的話主要就是表達式形式、數據類型、程序控制結構、自定義函數等等,學會了一門,照貓畫虎就能很快上手另一門~


學一個語言然後學其他類似的語言就比較輕鬆,比如你學了c語言之後,再學php4版本的語法就很熟悉,學會了c++之後就會很輕鬆的掌握java和c#,而會了java和c#,你很輕鬆的就看到php5的語法是模仿java的

  1. 直接看變數定義,常量定義,函數定義,類定義的語法
  2. 看for和while循環的語法
  3. 看語言內置了幾個數據結構,比如java有數組和容器,php只有數組,python有元組,字典等

以為這三個是所有語言不一樣的地方,剩下的地方几乎所有高級語言實現都是一樣的

這樣你已經算是入門了,至於新人為啥到這裡寫不出代碼,那是因為他不曉得很多問題的具體解決方法而已,比如資料庫連接,字元串的處理函數,還有各種擴展庫,這些都是所有語言公用的,甚至像redis這樣的,幾乎所有語言的介面函數都是一樣的,所以當你學會了三四個語言之後,你稍微看看語法部分,你就可以直接寫東西出來了,因為遇到問題你google一下,看看那個庫是怎麼使用就行了

剩下的就是你不斷的經常去用,經常用熟能生巧而已


乾貨夠多了,我就分享一下心得

我也是萌新。

觀點:編程語言是工具,是用來解決實際問題的,不是用來看的,更不是用來給人添堵的。

如果學習一個編程語言之後,還想要學習別的編程語言的話,一般都會是因為前一種編程語言並不能完全滿足需要吧...

所以學之前應該先了解一下新的編程語言的特性。(甚至稍微了解一下所謂特性是怎麼實現的)

既然已經掌握了第一種編程語言,對於數據結構什麼的也應該有了了解,這些通用的東西短時間內應該不需要再下功夫了。

那麼與其各種猶豫還不如直接嘗試用新語言開個坑逼著自己填完...自己動手不是能更深入的了解這個語言的特性么?

通常用新語言開的第一個坑都是很慘不忍睹的,當你積累了足夠的知識之後不如再把第一個作品重寫一遍。那麼一般來說都能獲得不小的提升。

(最起碼代碼寫多了BUG就不怎麼出了)

以上。


看數據類型,看控制結構,看支持什麼範式,寫點小東西,學會了


建議去上coursera的programming languages這門課(會教函數式的靜態類型&動態類型,以及面向對象這幾個特性),掌握各類語言的特性,而不是掌握語言。


uml算么?


不要死扣語法,掌握最佳實踐才是最重要的。

比方說c艹的話,先看看 a tour of c++(不到兩百頁,c艹11標準),再去看其他書


if for swtich

class function

編程就這樣東西了,書要越看越薄,要找相似點.


第一,focus on concepts,not syntax

第二,你可以把之前寫過的東西用新語言寫一寫,不要逐行翻譯,要盡量用到新語言的語言特性,沒什麼可寫的那就把常用的演算法和數據結構實現一遍


推薦閱讀:

一個簡單C語言編程問題?
iOS程序員的第二門語言選什麼?
目前有哪些計算機編程語言能(或者不能)自舉?
R語言和D3可視化可以結合起來嗎?
綠箭俠的編程水平屬於什麼級別?

TAG:編程語言 | 編程 | 計算機科學 | 計算機專業 | 計算機語言 |