programming  

Apr 12, 2017 • Michael Chen

最近在 Quora 討論區上,發現有許多人會問那個程式語言適合新手,我相信國內也有一些朋友會詢問這個問題。很多人會說 Python,也有一些人說 Java 或其他的語言。雖然這是一個老問題,但筆者也提出一些個人的意見,供大家參考。

說實在的,語言的選擇,其實並沒有想像中那麼重要。在程式設計中,學習語法其實只是其中一部分,占學習程式設計的時間不會很久。對於初學者來說,第一個語言的時間會比較久,這是由於一開始沒有相關的經驗,一邊學習新語法,一邊還要學習程式設計的概念。但對於有經驗的程式設計者來說,語法本身不是占最多時間的,反而是這個語言相關的生態圈,包括套件、函式庫、框架等,需要花更多的時間去熟悉。所以,筆者也不建議頻繁地更換語言,這樣只是在基本的議題上打轉。

撰寫程式的目的,是將待解決的問題轉化為可在電腦上執行的程式,換言之,語言是將想法轉化為電腦程式的媒介。並不是選擇了程式語言,再處理問題,反過來,應該是先了解問題,再選擇語言。例如,某個程式設計者 A 君學過 Python,現在 A 君想投入手機軟體開發的領域,A 君是否該使用 Kivy?其實 Kivy 並不是手機軟體開發的原生工具,以目前主流的手機平台來說,Android 使用 Java 或 Kotlin,iOS 使用 Swift 或 Objective-C。而 Kivy 是跨平台框架,可以通吃兩大平台,但不代表 Kivy 比原生工具好,反而有可能會受到 Kivy 的限制,筆者也在先前的文章討論過跨平台框架的議題。

除了程式語言外,更重要的應該是學習抽象的思維。在學習程式設計一段時間後,應該要試著學習一些更進階的議題,像是資料結構、演算法、物件導向分析與設計等。透過學習資料結構和演算法,不僅可以學習如何撰寫正確的程式,更重要的,可以學習撰寫有效率的程式。當程式設計者撰寫程式時,可以用「那個函式庫的實作更有效率、更穩定,較適合這個專案」的方式來思考,而不再盲目地依潮流選擇語言、函式庫或框架,就代表已經脫離初學者的階段。而學習物件導向分析與設計,是為了在撰寫中大型程式時,以較好的方式組織程式碼,避免重覆摸索前人所犯的錯誤。

程式語言的選擇,常常是諸多考量的結果,我們不會只用一種程式語言來處理所有的問題,而會依據不同的使用情境選擇不同的語言。像是一些自己使用來處理小型任務的程式,這些程式的效率不是最重要的,易寫易用才是考量點,通常會使用 Perl 或 Python 來處理,而不會使用 C 或 C++。像 Lua 不是主流的程式語言,但由於 Lua 易於內嵌,在很多遊戲引擎都會看到 Lua 的踪跡。我們在開發 Android 軟體時,通常會使用 Java 或是 Kotlin,但我們用 Gradle 做為專案管理的工具,因為 Groovy 比 Java 好寫,但效率不若 Java。

對於真正的初學者,總是要選擇一個語言,這時候,筆者推薦 Python 或 Ruby。但筆者不僅僅是因為這兩種語言很流行,而有一些考量點:

  • 這兩個語言相對簡單
  • 這兩個語言的語法清晰易讀
  • 程式設計者不需要處理低階的細節,而可專注在處理問題上
  • 這兩種語言支援指令式、物件導向式、函數式等多種模式 (paradigm)。使用 Java 或 C#,即使不寫物件導向程式,仍然需要物件導向的觀念

而 Python 比 Ruby 有一些額外的優點:

  • Python 對 Windows 支援較佳
  • Python 的學習資源較豐富
  • Python 的應用層面較廣泛。Ruby 目前仍是以 web programming 為大宗,尤其是 Ruby on Rails 為中心的生態圈

其實 Ruby 本身是通用型語言,設計得還不錯,但目前的生態使得 Ruby 變成一個用於 web programming 的語言,而在其他領域較少使用。

透過本文,讀者應該對程式語言的選擇有一些概念,而不會在這個議題上面打轉。希望各位讀者都可以早日脫離新手期,真正享受程式設計帶來的苦與樂。