如何學習新的程式語言?

2020-07-16 10:05:18
一名軟體工程師的最大挑戰就是使自己的技術棧跟得上技術的發展,而在這個技術飛速發展的時代,保證自己不被淘汰的唯一方法就是不斷學習。

那麼,程式設計師需要掌握多門程式語言嗎?很多初學者都被這個問題所困擾。

Google研究總監 Peter Norvig曾就這個問題給出自己的觀點,一名優秀的程式設計師至少應該掌握 6門程式語言,其中包括:
  • 支援類抽象的程式語言如 Java 或 C++;
  • 支援函數抽象的程式語言如 Lisp 或 ML;
  • 支援語意抽象的程式語言如 Lisp;
  • 支援宣告規範的程式語言如 Prolog 或 C++ 模板;
  • 支援協程的程式語言如 Icon 或 Scheme;
  • 支援並行的程式語言如 Sisal。

一名畫家若擅長使用多種型別的畫筆,就可以創作出多種型別的藝術畫作;一名程式設計師若掌握多種型別的程式語言,在解決問題時就可以有多種選擇。

重點學習什麼

《計算機程式的構造和解釋》的作者曾經表達這樣的觀點:在學習一門新的程式語言時,應該關注這門語言的基本表達形式(Primitive Elements)、組合的方法(Means of Combination)及抽象的方法(Means of Abstraction)這三個特性。

如果展開以上三個特性的話,就幾乎包含了學習一門程式語言所需要關注的所有重要知識。
  • 基礎知識:基本語法、關鍵字、變數與常數、資料型別、運算子、流程控制、例外處理、檔案處理、程式設計思想(物件導向、程序導向、函數語言程式設計)、多執行緒支援等。
  • 應用知識:網路請求、資料處理、內建函數、對紀錄檔和偵錯的支援、對單元測試的支援、序列化與反序列化等。
  • 高階知識:開源類庫、開源框架、底層原理等。

學習程式語言的正確方法

學習程式設計需要長期堅持,不要迷信三五天就能讓人學會的教學,你可能三五天掌握了一些語法,卻難以完成複雜一點的程式設計,也沒有和同行交流的經驗。

1) 選擇適合自己的程式語言

如果想學習一門新的程式語言,又不知道學習哪一門的話,可以參考 TIOBE 程式語言排行榜,其榜單每個月都會更新,可以反映某程式語言的熱門程度。

在學習程式語言之前,需要先簡單了解其主要特性及可以解決的問題,即選擇適合自己的程式語言,帶著目的去學習。

下表所示為一張關於程式語言分類的表格,讀者在選擇程式語言進行學習時,可以參考這張表,選擇最適合自己的程式語言。

分 類 程式語言
動態型別語言 Python、Ruby、Erlang、JS、Swift、PHP、Perl
靜態型別語言 C、C++、Java、Object-C
強型別語言 Java、C#、Python、Object-C、Ruby
弱型別語言 JS、PHP, C、C++
編譯型語言 C、C++、Pascal、Object-C、Swift
直譯語言 Python、JS、Erlang、PHP、Perl、Ruby、Java
靜態語言 C、C++、Java
動態語言 C#、Python、Object-C, PHP, Erlang、JS

比如,你擅長Java,希望學習另一門程式語言來提升自己的競爭力,就可以先選擇和 Java 相似的程式語言,例如和 Java 同為強型別的、解釋型的程式語言,再根據 TIOBE 程式語言排行榜就知道 Python 值得學習。

當然,選擇程式語言的標準不盡相同,比如想從事手機 App 開發,就需要學習和行動端開發有關的程式語言,比如 Object-C、Java 和 Swift;如果對區塊鏈技術感興趣,想要從事區塊鏈開發,那麼 Go、Python、Solidity、C++ 等會是不錯的選擇。

2) 選擇好的學習方式

在學習新的程式語言時,筆者認為讀書、看視訊和參加培訓都是不錯的學習方式。當然,不同的學習方式適合不同的人。

很多人通過閱讀書籍進行學習,因為他們覺得書籍上的內容相對完善且成體系,並認為通過視訊和課程學習會比較慢。關於程式設計的書,大概有入門類、工具類、實戰類、進階類、原理類等,可以根據自己的知識程度進行選擇,切勿盲目選擇。

還有些人認為在閱讀書籍的過程中會遇到很多沒見過的名詞、定義等,容易阻礙學習的進度。他們願意選擇偏重實踐的內容,傾向於課程、視訊等方式,因為可以進行現場敲程式碼、排查問題等。

各種學習方式並無好壞之分,適合自己才最重要。如果能夠將多種方式相結合,通過書籍完善自己的知識體系,並提升理論知識,再通過視訊及課程增加自己的實戰經驗,就再好不過了。

另外,在學習新語言時,翻閱官方文件和原始碼也是必不可少的,當然,這比較適合在學習的中後期進行。切勿遺漏這個步驟,這是了解並掌握一門語言的至關重要的步驟。

3) 勤加練習

很多開發者容易陷入誤區,只注重理論知識的學習,不注重實戰,在回答別人問題的時候頭頭是道,一旦動手實踐卻不知所措。所以,學習一門程式語言,是絕對離不開動手實踐的。

我們要把從書本中學習到的理論知識和實際應用結合起來,由淺入深地學習,最終達到熟能生巧的目的。孔子說“學而不思則罔,思而不學則殆”,在學習程式語言的過程中,學和思固然重要,勤加練習卻也是必不可少的。

在學習程式語言的過程中進行練習,可以增加自己對理論知識的理解,增強自己的記憶。

我們都知道,Java 中的 int 是有範圍的,書本上說如果超過範圍就會溢位,那麼這個範圍到底是多少,溢位之後的表現是什麼呢?只有真正地敲一遍程式碼,真正地練習一下才會有深刻的體會,才能在日後的工作中避免發生類似的錯誤。

另外,在練習的過程中難免會遇到各種各樣的問題。比如,Java 初學者在安裝 JDK 和設定環境變數時可能會遇到很多問題,其想辦法解決問題的過程非常可貴,因為在日後的工作中能夠自主解決各類問題,是一名優秀程式設計師的必備技能。

在很多時候,初級程式設計師和高階程式設計師之間最突出的區別其實就是解決問題的能力。通過實踐,我們也可以鍛鍊自己在這方面的能力。所以,在實踐的過程中遇到任何問題都不要退縮和逃避,要勇敢地面對並解決問題。

4) 帶著問題學習

學習要由目標驅動,在目標驅動起作用後,我們還可以採用問題驅動方式進行學習,即在學習過程中多問問題。

問問題可以採用六何法。六何法,又叫作 6W 或 5W1H 分析法,即 What、Who、When、Where、Why 及 How,需要我們在學習的過程中多思考、多問問題。

舉個簡單的例子,在學習設計模式中的單例模式時,可以用六何法多提幾個問題,例如:
  • 什麼是單例模式?
  • 什麼時候使用單例模式?
  • 怎麼實現單例模式?
  • 哪種單例實現方式最好?
  • 在單例模式中如何保證執行緒安全?

在學習的過程中,如果沒被問題驅動,你學到的就可能只是一個技術概念和用法。有了六合法的問題驅動,你學到的就會從一個點橫向擴充套件成一條線,如果將線上的每個點都逐漸深入,就會擴充套件成一個面。

比如,我們用六合法來學習單例時,就可能以單例模式為中心點擴充套件到執行緒安全、鎖、序列化、列舉、類載入機制等知識。

5) 教是最好的學

通過寫部落格來學習也是非常棒的一種學習方式,這對於新技術的學習十分有效,還可以通過技術分享、線下會議及線上教學等方式將自己學到的知識分享給他人,這就是教學學習法。

教學學習法有如下好處:
  • 迫使自己更深入地了解更多的知識。
  • 在教學的過程中會加入自己的理解。
  • 可以回頭翻看教學的內容。
  • 可以加深記憶。
  • 可以和別人深入探討。