---
title: "想嘗試新的程式語言該怎麼辦？"
date: 2022-09-02T00:00:00+08:00
publishDate: 2022-09-02T00:00:00Z
lastmod: 2022-09-01T17:09:04+08:00
tags: ["經驗","程式語言","Ruby","Golang","Elixir"]
toc: true
permalink: "https://blog.aotoki.me/posts/2022/09/02/how-to-try-new-programming-language/"
language: "zh-tw"
---


有一天在 Facebook 的社團看到有人提到，朋友推薦他多嘗試看看不同的語言，卻不知道該怎麼下手去嘗試。剛好我自己蠻喜歡嘗試各種程式語言，這篇文章會簡單分享該怎麼選擇程式語言。

<!--more-->

## 流行{#popularity}

一般來說，跟著學流行的語言大多不會有問題。畢竟使用的人多、工作機會也豐富，然而缺點就是不一定會是你喜歡的語言。

大多數時候，選擇跟著當下流行的語言應該是有職涯上的考量，可能會是想換工作或者增加競爭力之類的，如果單純是興趣的話，我倒是不太推薦「花費大量心力」在這類型的語言上，除非你本身也喜歡這個語言。

## 朋友{#friends}

如果是新手，我最推薦的其實是跟著會寫程式的朋友學。對方在教你的過程中也能有所成長，你自己也能得到一個相對安心的幫手。

有人一起學習的話，在過程中也不會那麼枯燥乏味。要說缺點的話，大概就是你沒辦法保證朋友的能力足夠教你，或者擅長教人如何寫程式，但就整個學習的過程和體驗上來說，還是會遠比自己摸索好上不少。

## 應用{#application}

通常會不知道該選擇怎樣的語言來學習，很可能是不清楚自己想做什麼。如果知道想做的主題，其實能選擇的語言還是相對明確的。

舉例來說，想做人工智慧、機器學習就可以選 Python 來使用，跟雲端、網路的應用 Golang 在設計時就針對這類情境考慮，因此不少雲端相關的軟體都是用 Golang 所使用的。

如果是網站類型的，就相對複雜一點，因為這數十年非常多專案都基於這個領域投入資源。這個時候我們就可以從解決方案的角度去看，像是 Ruby 的 Rails 框架的目的是快速上手、快速開發，因此在起步上幾乎不需要有特殊知識，而 Elixir 為了解決 Ruby 在大量即時連線上的弱點而設計出來。

至於 .NET / Java 的話則是為了企業等級的應用為主，對於許多系統架構、設計模式的知識就會需要有所了解在使用上才會更加順利，目的在於穩定而非快速，因此寫起來就會感到非常囉唆，同時 C# 也經常被遊戲業所使用。

## 特性{#feature}

從語言特性上下手是比較有趣的切入點，大多數語言支持者也都是因為喜歡這個語言的特性，缺點也是沒有人詳盡地為你介紹，你就很難了解差異。

以我個人最愛用的 Ruby 來說，最初想要用來替代 Shell Script 的，因此在他的標準函示庫中其實有著非常豐富的功能，另一方面在語言上非常開放，因此可以實作出非常強大的 DSL（Domain-specific language，特定領域與言）因而產生了 Rails 框架，利用大量「客製化語法」讓網站開發變的相當直覺。

然而 Ruby 在語言的設計上和發展中，還是有了「慢」的缺點，雖然受限於整個生態系的套件、語言發展的進度有所影響。也因此催生了以 Erlang 為基底的 Elixir 語言想來解決這樣的問題，類似於 Ruby 的語法讓我們可以非常容易的「轉換」到 Elixir 上。

而 Elixir 和 Erlang 不同於 Ruby 有著 Let it crash 的概念，因為語言特性讓「出錯」的程式碼得以輕易恢復，搭配上 [Actor 模型](https://zh.wikipedia.org/wiki/%E6%BC%94%E5%91%98%E6%A8%A1%E5%9E%8B)的設計，也讓 Elixir 在處理非常大量的即時連線表現得非常好。

## 喜好{#preferences}

不管透過哪種方式選擇了一個語言，最後還是要回歸到「是否喜歡」這件事情上，如果對這個語言的特性、社群、應用沒辦法感到喜歡的話，即使學了也很難持續下去。

然而，在選擇要學習的語言階段，不妨多嘗試看看不同的語言。程式語言也是軟體，所以會不斷更新，因此當一個好的概念或設計被其他語言使用時，也可能加入到你主要在使用的語言，此時就可以透過不同語言的「差異」更深入了解某項語言特性。

當接觸的語言更多之後，也比較能對應不同的情況。像是 Serverless 的應用，我們不一定要完整地將整個服務替換成其他語言，而是可以針對特定情況使用少量的語言，搭配 Function as a Service 類型的雲端服務針對性的處理（像是 [imgproxy](https://github.com/imgproxy/imgproxy)）來解決部分語言無法完善處理的情況。

> 在比較大型的公司，大多也很難只使用單一語言解決問題。通常會是主系統（使用最多的語言）以及各類輔助主系統的服務、工具，使用不同的語言針對性的解決問題。

