11.21.2012

為什麼要學各種程式語言

最近我一直為了系上的講座在準備投影片
主題是 新世代程式語言 這個看起來很酷炫的標題
(其實單純是改動畫標題
目的是讓同學還有學弟妹們能夠初窺各種當代程式語言的面貌

為什麼要學這些程式語言呢? 有C/C++還不夠嗎?




現在台灣資訊相關的科系 幾乎都只會教C/C++
有些可能會學Java和C#

而以就業來說,如果你精通這些語言的其中一個,應該也不難找到工作

那到底我們為什麼要學習其他好像不這麼熱門的語言呢?
我想從我個人的經歷來講

我第一個學習的程式語言是在RPGMaker XP的說明書後面所講解的Ruby
當時我看了覺得好像很簡單 但去打開RGSS一看卻發現都看不懂
因為當時面臨升大學的壓力 也就沒有深入研究

第一個正式學習的語言是C,那是資工系大一的必修課程
當時醉心於用C寫出各種能跑的小程式
不斷的和BUG奮鬥,反覆地實作一些基本資料結構與演算法 覺得很有成就感

那時候一直認為"程式設計就是這樣子"

直到大二,修了一門課在教 LISP (common lisp)
(我現在還是覺得我們系會開這門課實在非常神奇

一開始我以為只要把C語言的想法換種寫法做出來就行了
過了一陣子之後,我才發現這是錯誤的

如果我不把用LISP的方式來思考,我永遠學不好LISP.寫不出優雅的LISP程式
於是我開始去了解LISP的哲學 去融入語言特性所帶來的思考模式

那個學期過後,我發現自己的思考方式更加豐富了
尤其是對 linked-list.function 與 recursion 的了解與熟練

修同一門課的同學 很多修到最後還是只認為LISP很奇怪. 很難學
其實不是天份不好或不認真 只是無法切換思考的方式罷了


"語言就是思考的本質"
現在的我十分贊同這句話


之後的一段時間,我因為"在Ubuntu上寫Lisp比較方便"的關係,而開始使用Linux (主要是Ubuntu)

然後自然而然的就開始尋找能在Linux平台上玩的GalGame
最後找到了 Katawa Shoujo 這款遊戲,然後因為他實在太開放了 就被勾去研究內部的實作
(大部分Windows上的遊戲都像個黑盒,除非是專業的駭客,很難這樣把軟體拆開來看

也因此碰觸到了 Python ,然後發現這個語言實在是不可思議的優美
就一頭栽了進去
然後就發現了很多 "居然可以這樣做". "這樣子真方便" 的東西

由此開始,就會在閒暇的時候去看看各種程式語言的寫法
包括 C#, Haskell, Scheme, Ruby, Python, Go... 還有其他稍微瞄一下的語言
探索語言設計中的哲學實在非常有趣



而把這些想法帶回平常寫的C/C++程式,也讓我自認寫得比以前更優雅了



舉例來說,學C的又只在要交作業時才寫程式的學生可能學了一兩年,寫出來的程式還是很醜陋,甚至連縮排的習慣都很差(這或許也要歸功於許多課程還把Dev-C++當成標準IDE來用)

但只要稍為學一點Python,有許多惡習都會被改正
因為語言本身強迫你寫出好看的程式

從其他語言偷回好的習慣與技巧遠比死記C/C++的coding rules來得輕鬆
Matz也曾在書中提到 "學習好的程式語言就能寫出好的程式"
(可能和原文稍有差異 不過意思大概是這樣


又一個同樣情況的學生,他用來儲存大量資料的時候永遠只會使用陣列(Array)
就算學了資料結構與演算法,他也不會在平常的程式中使用Linked-list. Hash 等等其他的資料結構
甚至因為處理動態分配的問題太麻煩,而總是寫 int a[100000]這種浪費記憶體的東西
反正大多數時候,只要程式的答案是對的就能交作業

但如果學習Ruby. Python...這些有內建Hash的語言,在需要的時候使用Hash就會變成很自然的習慣
之後也會在C++ STL中尋找類似的資料結構來使用


如果學習Haskell這類的純函數語言,就會很自然地練習到如何寫出沒有副作用(side effect)的function
由此更能夠割除掉以前愛用全域變數的壞習慣
另外對 recursion 的掌握也會精進萬分
而在正確的時機使用 recursion ,會讓程式優雅不少



把學習侷限在C/C++還有一個很大的問題是,你很難快速的把一些想法寫出來
因為C/C++ 的手續實在太多了
如果你不會用STL,一切都要自己創造
如果你會用STL,他還是長得很醜,用起來往往很不方便

你永遠需要為陣列範圍. 整數overflow這些問題煩心,
當要寫一些簡單的東西時,還是要不斷的反覆一些相同的作業

以實作簡單的快速排序法來說,用C可能需要20幾行寫完之後就看不懂的程式碼
然而用Python卻只要兩行簡明易懂的程式

如果使用語言本身的函式庫做一樣的事情,用C的qsort要多寫一個長得很奇怪全域函式
用C++STL的 sort 雖然簡單些,還是頗臭長
在Ruby卻只要一個 my_array.sort 就能解決事情

學C的人,如果沒有充足的熱忱
一開始還能為了"訓練自己寫程式"的想法,偶爾寫一些程式
但久了之後就會覺得很麻煩,最後漸漸懶得寫程式

然而如果熟練Perl.Python這些語言,就會很自然的在"懶得自己做事"的時候
寫個小工具解決一些煩人的工作
寫程式就不會是"麻煩" 而是"省事"又愉悅,自然會常常有練習寫程式的機會
你可以挹注更多時間在創意上,而不是重複的砌磚

更棒的是,這些以前寫過的程式,很多都能拿來改造或直接再利用
相較之下,C/C++要寫出能重複用在各種地方的程式 以及修改以前寫過的東西
都麻煩許多
因此你辛辛苦苦寫的程式都用過即丟,下次要用到類似東西時只好再寫一次
最後的結果就是 永遠都再寫相同的東西 自然進步緩慢


在學資料結構和演算法的時候,我告訴自己不要再靠考前看看考古題隨便賺學分
然後就決定在課後把學到的內容都寫成程式,卻發現這時在是件辛苦的工作
當時我用C/C++ 寫這些程式,課本和老師的投影片也都是C程式
不但看起來很累,寫起來很累,又很容易看不懂自己在寫甚麼,然後多數的時間都花在處理一些小問題(用C就很容易遇到的那些問題)
雖然是不錯的訓練,也有一點成就感,但實在難以說是樂事
然後當我為了要複習而回頭看這些程式,又得花一堆時間來看懂

如果用Ruby寫這些程式,能夠省下很多工夫,寫得快.又容易懂
甚至比許多 pseudocode 更短更好讀


另外還有一點是 有大量用scripting languages寫出來的 program 都是freeware或open-source
其中 Ruby 和 Python 程式大多很好讀
所以能夠打開別人的原始碼,快樂地學習別人的做法(甚至拿來用)

相較之下,C/C++的許多專案甚至函式庫都像個黑盒子
就算是open-source,對新手而言,閱讀資深C/C++ programmer的程式往往會充滿挫折



就實用面來說,雖然在台灣使用 C-based languages 的企業還是佔大多數
但其他語言也越來越受重視,尤其是在他們的開發效率和實用性都得到證明的時候
Ruby on Rails 就是一個很好的例子



最後我偷一句Matz的話來做結尾:
Learning a new language is harmless. It gives you new ideas and insights.

# 其實我自己會學習這些語言完全是因為興趣(真的很有趣),之後才慢慢發現我獲得了哪些好處,就拿出來和各位推銷囉。

8 件のコメント:

  1. 返信
    1. 我回家吃自己ლ( ゚∀ ゚ლ)

      削除
    2. 話說不知道有沒有人的第一個語言是Lua呢?

      削除
  2. C是超級無敵基礎
    不會C大概也很難懂其他的語言
    不過相較之下C的功能就輸給其他的語言

    返信削除
    返信
    1. 第二句話其實不太對
      像我們先學C之後去學其他語言會很快
      是因為程式語言的主要元素大概就是那幾樣
      雖然每個語言的作法稍有不同 還是可以很快地了解那些是在幹啥

      然而就算不學C而直接學其他語言 也不會特別困難
      從頭學會Python的基礎比學會C的基礎簡單多了

      國外很多學校的第一個程式語言是教Scheme . Python 甚至 ML


      C的功能也不輸其他語言,除了CG之外,
      其他語言能做到的事大多也能用C做到,而且效能高
      只是做起來麻煩許多

      削除
    2. 我知道有人是碰RM才開始碰程式語言的,
      所以他們第一個學的語言都是Ruby,
      他們也學得很厲害呢~XD

      削除
    3. 雖然是2年前的回文,但是我還是必須跨時空吐槽 www
      就算你會用 C 寫各種資料結構跟演算法 ... 當你學 Haskell 的時候,還是會覺得自己不會寫程式。以上是個人經驗,我第一次碰 Haskell 的時候連快速排序都寫不出來。

      削除
    4. 雖然現在大多語言都是混合各種特性 大致上還是可以分
      - 命令式. 結構式. (+物件導向)
      - 函數式 (+物件導向)
      - 邏輯式

      在這三個系統之間,不容易"一樣通樣樣通"
      Haskell 算是函數式語言中搞最多花樣的一個,當然很難馬上通XD

      削除