Programming
這邊指的「新的」是指對學的人而言,並不是在業界或是某個人創造出的新語言。
身為工程師的我們很難只會一種程式語言打天下,剛出社會工作的我,除了學習「對於我來說」新的技術概念,也會需要配合團隊學習一門新的程式語言。最近在工作上我就需要學習一門近年來挺熱門的語言 - Golang (2020.08)
我接觸到的第一門語言是學校教的C,再來聽說遊戲業界大廠都是使用C++,所以我開始學C++,之後為了學習Unity引擎,學習了C#,之後又想與所謂「主流」和「新潮」搭上邊,稍微看了一下Javascript與Rust。
以上所述,我並不是只接觸過一門程式語言了,雖然任何一種我都寫不出任何一個可以看甚至可以用的專案
我會盡可能的把它拆成四大區塊
基本上大家都有的
if...else...
, for
, while
)struct
)常用集合
map
)、雜湊表語言特性與- 「解決了XX語言的問題」
第一到第三就不說了,經典的Hello, world!
、比大小、猜數字,這些陪伴我們的小範例再次因為學習新的語言而見到它們。
第四點除了基本函式的宣告、定義、調用,我還會特地關注對於函式的參數是pass by value
還是pass by reference
,原因來自我初學的語言C
與C++
,這點非常之重要。
第五點的自訂新型別不是只OOP的封裝,只是單純的把資料集中起來處理,不然在函式裡,一個一個丟進去,會崩潰!
現今許多語言在他們的內建函式庫有許多常用的資列結構,或是直接原生在語言裡面了,例如映射在Golang
就是原生的,但回顧一下我最常用的結構不外乎就上面那幾個。
固定陣列、與雜湊表不用說,至於第二點我把動態陣列、鏈結串列(Linked List)放在一起是因為大部分在使用這兩種集合時,我們對於它們的用法,大多是一樣的,就是把同類型的物品經過我們篩選後,然後丟進或從箱子拿出來,至於箱子是甚麼工法做的,我們通常都不理他,但往往就是這個「工法」是需要在意的,這關係到優化也關係到對於計算機組織結構的理解程度,是要用動態陣列還是鏈結串列是門學問。
字串更不用說,我們很常做的一項工作,就是對「字」做各式各樣的組合排列以及比較,所以這是必須的。
字串是我還在研究的部分
C
開始的,所以視其為「字元的動態陣列」,但在其他語言內,貌似沒這麼簡單,而且例如在C++17
中,又有所謂的string_view
,所以我認為大部分語言所提供的字串,底下的資料結構沒這麼簡單。
上面我有標號碼的項目同時也使我認為的學習順序,但在語言特性這一塊就沒有了,因為不是所有語言都有這些功能或是特性。
一門語言可能囊括了許多特性,例如C++
,但上面那幾個是我常用,也是一般專案就夠用的了。
關於物件導向、函數式、程序式,雖說是特性,也的確像有像是Java
跟C#
語言設計上綁死物件導向的,我一直覺得這些應該說是對於整體程式架構的思考模式,他驅使我們用哪一種方向出發,就會對於整體中的「資料」與「演算」進行甚麼處理。
語言特性通常是當你問一個前輩:「這是一門甚麼樣的語言」的時候,很大的機率他會回答用該語言的特性來回答你,同時也會聽到「這個XX語言的OO特性解決了B語言的痛處」,例如垃圾回收解決了需要釋放記憶體時,釋放到已經是「空」的區塊,就某方面來講,他確實就是廣告詞,也正是我們可能要去學該語言的原因。
除了寫一些小範例,建議還要寫一個小小的專題,不管是TCP聊天室或貪吃蛇都可以,這樣除了熟悉新語言的語法與概念外,更重要的的可以知道使用該語言的社群生態,像是怎麼Debug,怎麼管理package,怎麼做測試等等…
這邊推薦一步youtube影片供大家參考可以做甚麼小專題試試身手。
在這裡寫下結尾,學習一門新的語言很難嗎?如果是完全初學沒有學過任何一種程式語言,難,很難。如果已經有經驗了呢?我想可以很快就上手了,除非有你先前沒碰過的語言特性。
我非常喜歡遊戲,尤其是黑暗靈魂系列,有些人可能知道,該系列是已困難出名的,所以勸退了許多玩家。以前我在reddit的時候看到一個問題:「黑暗靈魂歷代那一款最困難」,而最普遍的回答是,「你所接觸過的第一款系列作最難。」,我認為這句話同時也可以對應在這篇主題上。