如何學習一門編程語言

前言

不少人喜歡爭論什麼什麼編程語言好,我認爲這個話題若是不限定應用範圍,就毫無心義。前端

每種編程語言必然有其優勢和缺點,這也決定了它有適合的應用場景和不適合的應用場景。現代軟件行業,想一門編程語言包打天下是不現實的。這中現狀也形成了一種現象,一個程序員每每要掌握多種編程語言。react

學習任何一門編程語言,都會面臨的第一個問題都是:如何學習 XX 語言?jquery

我不想說什麼多看、多學、多寫、多練之類的廢話。世上事有難易乎?無他,惟手熟爾。誰不知道熟能生巧的道理?webpack

我以爲有必要談談的是:如何由淺入深的學習一門編程語言?學習全部編程語言有沒有一個相對統一的學習方法?程序員

曾幾什麼時候,當我仍是一名小菜鳥時,老是歎服那些大神掌握多門編程語言。後來,在多年編程工做和學習中,我陸陸續續也接觸過很多編程語言:C、C++、Java、C#、Javascript、shell 等等。每次學習一門新的編程語言,掌握程度或深或淺,可是學習的曲線卻大抵類似。web

下面,我按照我的的學習經驗總結一下,學習編程語言的基本步驟。shell

學習編程語言的步驟

learn-programming-language.png

基本語法

首先固然是瞭解語言的最基本語法。npm

控制檯輸出,如 C 的 printf,Java 的 System.out.println 等。編程

普通程序員的第一行代碼通常都是輸出 「Hello World」 吧。數組

  • 基本數據類型

    不一樣編程語言的基本數據類型不一樣。基本數據類型是的申請內存空間變得方便、規範化。

  • 變量

    不一樣編程語言的聲明變量方式有很大不一樣。有的如 Java 、C++ 須要明確指定變量數據類型,這種叫強類型定義語言。有的語言(主要是腳本語言),如 Javascript、Shell 等,不須要明確指定數據類型,這種叫若類型定義語言。

    還須要注意的一點是變量的做用域範圍和生命週期。不一樣語言變量的做用域範圍和生命週期不必定同樣,這個須要在代碼中細細體會,有時會爲此埋雷。

  • 邏輯控制語句

    編程語言都會有邏輯控制語句,哪怕是彙編語言。

    掌握條件語句、循環語句、中斷循環語句(break、continue)、選擇語句。通常區別僅僅在於關鍵字、語法格式略有不一樣。

  • 運算符

    掌握基本運算符,如算術運算符、關係運算符、邏輯運算符、賦值運算符等。

    有些語言還提供位運算符、特殊運算符,視情節掌握。

  • 註釋(沒啥好說的)

  • 函數

    編程語言基本都有函數。注意語法格式:是否支持出參;支持哪些數據做爲入參,有些語言容許將函數做爲參數傳入另外一個參數(即回調);返回值;如何退出函數(如 Java、C++的 return,)。

數組、枚舉、集合

枚舉只有部分編程語言有,如 Java、C++、C#。

可是數組和集合(有些語言叫容器)通常編程語言都有,只是有的編程語言提供的集合比較豐富。使用方法基本相似。

經常使用類

比較經常使用的類(固然有些語言中不叫類,叫對象或者其餘什麼,這個不重要,領會精神)請了解其 API 用法,如:字符串、日期、數學計算等等。

語言特性

語言特性這個特字反映的就是各個編程語言自身的"獨特個性",這涉及的點比較多,簡單列舉一些。

編程模式

比較流行的編程模式大概有:

面向對象編程,主要是封裝、繼承、多態;函數式編程,主要是應用 Lambda;過程式編程,能夠理解爲實現需求功能的特定步驟。

每種編程模式都有必定的道理,我從不認爲只有面向對象編程纔是王道。

Java 是面嚮對象語言,從 Java8 開始也支持函數編程(引入 Lambda 表達式);C++ 能夠算是半面向對象,半面向過程式語言。

語言自身特性

每一個語言自身都有一些重要特性須要瞭解。例如,學習 C、C++,你必須瞭解內存的申請和釋放,瞭解指針、引用。而學習 Java,你須要瞭解 JVM,垃圾回收機制。學習 Javascript,你須要瞭解 DOM 操做等。

代碼組織、模塊加載、庫管理

一個程序通常都有不少個源代碼文件。這就會引入這些問題:如何將代碼文件組織起來?如何根據業務須要,選擇將部分模塊啓動時進行加載,部分模塊使用懶加載(或者熱加載)?

最基本的引用文件就不提了,如C、C++的#include,Java 的 import 等。

針對代碼組織、模塊加載、庫管理這些問題,不一樣語言會有不一樣的解決方案。

如 Java 能夠用 maven、gradle 管理項目依賴、組織代碼結構;Javascript (包括 Nodejs、jquery、react 等等庫)能夠用 npm、yarn 管理依賴,用 webpack 等工具管理模塊加載。

容錯處理

程序總不免會有 bug。

因此爲了代碼健壯性也好,爲了方便定位問題也好,代碼中須要有容錯處理。常見的手段有:

  • 異常
  • 斷言
  • 日誌
  • 調試
  • 單元測試

輸入輸出和文件處理

這塊知識比較繁雜。建議提綱挈領的學習一下,理解基本概念,好比輸入輸出流、管道等等。至於 API,用到的時候再查一下便可。

回調機制

每種語言實現回調的方式有所不一樣,如 .Net 的 delegate (大量被用於 WinForm 程序);Javascript 中函數自然支持回調:Javascript 函數容許傳入另外一個函數做爲入參,而後在方法中調用它。其它語言的回調方式不一一列舉。

序列化和反序列化

首先須要瞭解的是,序列化和反序列化的做用是爲了在不一樣平臺之間傳輸對象。

其次,要知道序列化存在多種方式,不一樣編程語言可能有多種方案。根據應用的序列化方式,選擇性瞭解便可。

進階特性

如下學習內容屬於進階性內容。能夠根據開發須要去學習、掌握。須要注意的是,學習這些特性的態度應該是不學則已,學則死磕。由於半懂半不懂,特別容易引入問題。

對於半桶水的同窗,我想說:放過本身,也放過別人,活着很差嗎?

併發編程:好處多多,十分重要,可是併發代碼容易出錯,且出錯難以定位。要學習仍是要花很大力氣的,須要瞭解大量知識,如:進程、線程、同步、異步、讀寫鎖等等。

反射:讓你能夠動態編程(慎用)。

泛型:集合(或者叫容器)的基石。精通泛型,能大大提升你的代碼效率。

元數據:描述數據的數據。Java 中叫作註解。

庫和框架

學習一門編程語言,不免須要用到圍繞它構建的技術生態圈——庫和框架。這方面知識範圍太龐大,根據實際應用領域去學習吧。好比搞 JavaWeb,你多多少少確定要用到 Spring、Mybatis、Hibernate、Shiro等大量開發框架;若是作 Javascript 前端,你可能會用到 React、Vue、Angular 、jQuery 等庫或框架。

小結

總結以上,編程語言學習的道路是任重而道遠的,將來是光明的。

最後一句話與君共勉:路漫漫兮其修遠,吾將上下而求索。

相關文章
相關標籤/搜索