Try   HackMD

[Programming] 快速入門一門新的程式語言

tags: Programming

這邊指的「新的」是指對學的人而言,並不是在業界或是某個人創造出的新語言。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
這篇文是我的經驗談,也視為我對我所提出的方法的驗證,目前正在實驗中

身為工程師的我們很難只會一種程式語言打天下,剛出社會工作的我,除了學習「對於我來說」新的技術概念,也會需要配合團隊學習一門新的程式語言。最近在工作上我就需要學習一門近年來挺熱門的語言 - Golang (2020.08)

我接觸到的第一門語言是學校教的C,再來聽說遊戲業界大廠都是使用C++,所以我開始學C++,之後為了學習Unity引擎,學習了C#,之後又想與所謂「主流」和「新潮」搭上邊,稍微看了一下Javascript與Rust。

以上所述,我並不是只接觸過一門程式語言了,雖然任何一種我都寫不出任何一個可以看甚至可以用的專案

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
,但是在這東摸西摸的過程中,找到了一種學習新語言的模式。

拆解並分類

我會盡可能的把它拆成四大區塊

  • 基本上大家都有的

    1. 變數宣告、IO
    2. 基本型態、轉型
    3. 算數運算 & 邏輯運算
    4. 流程控制 (if...else..., for, while)
    5. 函數宣告與調用
    6. 自訂新型別 (struct)
  • 常用集合

    1. 固定陣列
    2. 動態陣列、鏈結串列(Linked List)
    3. 映射(map)、雜湊表
    4. 字串
  • 語言特性與- 「解決了XX語言的問題」

    • 物件導向、函數式、程序式
    • Lamda表現式
    • 泛型
    • 例外處理
    • GC

基本上大家都有的

第一到第三就不說了,經典的Hello, world!、比大小、猜數字,這些陪伴我們的小範例再次因為學習新的語言而見到它們。

第四點除了基本函式的宣告、定義、調用,我還會特地關注對於函式的參數是pass by value還是pass by reference,原因來自我初學的語言CC++,這點非常之重要。

第五點的自訂新型別不是只OOP的封裝,只是單純的把資料集中起來處理,不然在函式裡,一個一個丟進去,會崩潰!

常用集合

現今許多語言在他們的內建函式庫有許多常用的資列結構,或是直接原生在語言裡面了,例如映射在Golang就是原生的,但回顧一下我最常用的結構不外乎就上面那幾個。

固定陣列、與雜湊表不用說,至於第二點我把動態陣列、鏈結串列(Linked List)放在一起是因為大部分在使用這兩種集合時,我們對於它們的用法,大多是一樣的,就是把同類型的物品經過我們篩選後,然後丟進或從箱子拿出來,至於箱子是甚麼工法做的,我們通常都不理他,但往往就是這個「工法」是需要在意的,這關係到優化也關係到對於計算機組織結構的理解程度,是要用動態陣列還是鏈結串列是門學問。

字串更不用說,我們很常做的一項工作,就是對「字」做各式各樣的組合排列以及比較,所以這是必須的。

字串是我還在研究的部分

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
,由於我是從C開始的,所以視其為「字元的動態陣列」,但在其他語言內,貌似沒這麼簡單,而且例如在C++17中,又有所謂的string_view,所以我認為大部分語言所提供的字串,底下的資料結構沒這麼簡單。

語言特性

上面我有標號碼的項目同時也使我認為的學習順序,但在語言特性這一塊就沒有了,因為不是所有語言都有這些功能或是特性。

一門語言可能囊括了許多特性,例如C++,但上面那幾個是我常用,也是一般專案就夠用的了。

關於物件導向、函數式、程序式,雖說是特性,也的確像有像是JavaC#語言設計上綁死物件導向的,我一直覺得這些應該說是對於整體程式架構的思考模式,他驅使我們用哪一種方向出發,就會對於整體中的「資料」與「演算」進行甚麼處理。

「解決了XX語言的問題」

語言特性通常是當你問一個前輩:「這是一門甚麼樣的語言」的時候,很大的機率他會回答用該語言的特性來回答你,同時也會聽到「這個XX語言的OO特性解決了B語言的痛處」,例如垃圾回收解決了需要釋放記憶體時,釋放到已經是「空」的區塊,就某方面來講,他確實就是廣告詞,也正是我們可能要去學該語言的原因

小專題

除了寫一些小範例,建議還要寫一個小小的專題,不管是TCP聊天室或貪吃蛇都可以,這樣除了熟悉新語言的語法與概念外,更重要的的可以知道使用該語言的社群生態,像是怎麼Debug,怎麼管理package,怎麼做測試等等

這邊推薦一步youtube影片供大家參考可以做甚麼小專題試試身手。

學習一門新的語言很難嗎?

在這裡寫下結尾,學習一門新的語言很難嗎?如果是完全初學沒有學過任何一種程式語言,難,很難。如果已經有經驗了呢?我想可以很快就上手了,除非有你先前沒碰過的語言特性。

我非常喜歡遊戲,尤其是黑暗靈魂系列,有些人可能知道,該系列是已困難出名的,所以勸退了許多玩家。以前我在reddit的時候看到一個問題:「黑暗靈魂歷代那一款最困難」,而最普遍的回答是,「你所接觸過的第一款系列作最難。」,我認為這句話同時也可以對應在這篇主題上。