[程式語言]學習和觀念

在公司訓練一些新人或者回學校教學弟妹時,總是會遇到一些很莫名其妙但又不知道該如何解釋的問題,這邊稍微整理了一下這些問題背後更為基礎的問題。

語言:不管什麼語言都一樣



1.要怎麼把參數傳到函式裡頭?

問這種問題真的是會很想拿他面前的教科書往他頭上K下去,看他會不會想起來裡面的函式章節怎麼介紹的...不管什麼語言都會有個最既定的函式模型

例如C的

宣告
int add(int x, int y);
定義
int add(int x, int y){
    return x+y;
}
使用
main(){
    add(10,20); // 30
}

拆解開來看就是
回傳型態 函式名稱 (傳入參數型態 傳入參數名稱,傳入參數型態 傳入參數名稱, ...)
int             add           (int                     x                      ,int                     y)

回傳的型態會相對應到return關鍵字上面,如果回傳的型態和定義的回傳型態不一樣,編譯器會出現錯誤提示。
要把參數傳進去就是在使用的時候在括弧裡面放進你要傳送的參數,唯一需要注意的就是型態和數量要一致。

2.要怎麼trace程式碼

很多人看到程式碼落落長,就開始不知道從何開始看起,完全TMD的忘了什麼叫做main什麼叫函式。就算是官方的code,也會照著他們創造出來的語言規則走,並不是官方就是神,他就可以亂寫一下你不能用的東西,那只是單純你沒學過不會用而已。

看到括弧()就應該想到它是個函式,看到return就應該想到會有人去接收的它回傳,看到*就該知道它會是個指標(除了四則運算的乘法之外),請不要太訝異他寫得函式名稱很醜就覺得他不應該是函式。

3.[C]read(0)是什麼?為什麼可以對null取值
你必須要先知道的是 read所接收的參數是一個fd,既然是一個fd,0又怎麼會代表null呢?
fd中會有三個數字是不管你怎麼open都不可能出現的數字,0、1跟2,分別代表的是STDIN、STDOUT和STDERR,STDIN就是標準輸入,舉凡從外部輸入訊號到電腦上的都可以說是輸入,在這裡所代表的就是鍵盤輸入的東西。

4.怎麼在網路上搜尋資料?keyword怎麼下?
首先,不管你要搜尋什麼資料,請不要只找台灣網站,不是說台灣人不強,而是台灣強的工程師也不一定想寫教學文章,要寫也是英文,才會有人回應及討論。

大部分都會出現在stackoverflow或者是外國人的部落格裡面。如果你真的想要有獨自開發的能力,就請靜下心來把文章看完,看不懂大不了找翻譯,走馬看花的看了一百篇說你找很多文件找不到答案我才不相信。

keyword大致上分成 OS環境 語言名稱 模組名稱、Lib名稱或問題類型
如果是程式遇到bug或是錯誤 就把錯誤code或訊息直接拿去找,需要注意的是不要把路徑名稱也當成你的錯誤訊息,除非你遇到跟你用同一個環境變數而且同一個資料夾名稱的...

例如:linux c socket connect refuse

另外如果在你找到的文章看到太多專有名詞不懂,請接著向下搜尋看不懂的名詞,如果是比較底層或是用C實作的東西,也可以看看man page。

結語:
學習程式語言並不難,而是太多人把他們看作像是數學一樣的東西去理解,他並不是死規則被發現出來的東西,而是人類有所需求需要才去發明出來的一套規則,其中慧有原因和邏輯可以去思考的,不要想著兩段程式碼很像很像,意義就一樣,而是從根本上去學習他的原理,推出他的結果。

純資工系的朋友會很苦惱以後找工作的時候,不知道自己可以在哪個領域上寫程式,對他們來說寫程式不困難,困難的是他們不知道可以寫出什麼亦或者是怎麼去規畫,因為寫程式並非有結果就好,而是要有對的架構和流程,才會有萬無一失的結果。

不要再嘗試著從結果去歸類程式的用法了,而是去了解推理程式的來龍去脈,再去看結果匹不匹配。

會寫程式的人不一定懂程式,也許餓不死,但一定會是 "永遠的工程師" 。

4 則留言:

  1. C語言裡面的stdin、stdout與stderr是File pointer,而File descriptor是STDIN_FILENO、STDOUT_FILENO與STDERR_FILENO。

    請問Node.js裡面的stdin、stdout與stderr,跟C語言一樣有分int或是File pointer類型嗎?

    回覆刪除
    回覆
    1. 我不確定有沒有,不過nodejs本身是用C實作而成的,大部分在nodejs官方套件中已經把這些教底層的觀念包裝過而不會使用到。
      如果是從C語言想要轉到nodejs的工程師,多多少少也可以從類似功能的套件中找到一樣的用法,像是fs.open(),fs.read(),fs.write()。
      所以在用法上和C語言並無兩異,只是我也沒有寫到需要區別這兩者差別的部分,所以無法給你更正確的答案。

      刪除
    2. 好的,我知道了!

      請問可以寫個node.js module的hello world嗎@@

      刪除
    3. 我寫再另外一篇囉!
      http://shachkuo.blogspot.tw/2016/03/nodejsmodule.html

      刪除