Web開発で次に学ぶべき言語はどれか
原文は Michael Lynch により に公開されました。 このブログを購読する
今年の目標のひとつは、新しいプログラミング言語を学ぶことだ。しばらく新しい言語を学んでいなかったし、よく知っている言語(Go、Python、C++)は互いに似ていると感じるので、少しコンフォートゾーンを抜け出して、自分にとって違和感のある言語に挑戦してみたい。
要件
求めている条件は以下のとおりだ。
- よく知っている言語とは大きく異なること
- Webアプリが第一級に扱われていること
- 小さくシンプルなアプリを簡単に作れること
- 大規模プロジェクト向けに過剰に最適化されていると感じるAngularとは逆のものが欲しい
- バックエンドとフロントエンドの両方をサポートしていること
- フロントエンドフレームワークは必須ではないが、GoやPythonのようにバックエンドとフロントエンドで同じツールチェーンを使えることが欲しい。
- Elmのようなフロントエンド専用のものは使いたくない。
- フロントエンドとバックエンドのコードで別々のビルドチェーンを使いたくない(素のJSに、バックエンド側での軽いテンプレートを組み合わせる形で十分だと思っている)。
- データストアとしてSQLiteに対応していること
- 単体テストのサポートが充実していること
- オープンソースであること
- 活発にメンテナンスされていること
あると嬉しいこと
- 良い電子書籍があること
- 有料でも構わない。
- 抽象度が低い/「魔法」が少ないこと
- 静的型付けであること
対象外とすること
- 最大限のパフォーマンス
- 自分が作るアプリのほとんどは、パフォーマンス要件が非常に小さい。たいてい唯一のユーザーは自分自身で、そうでない場合でも同時に数十人を超えるユーザーは想定していない。
- 一人のユーザーにとって遅いものは使いたくないが、大規模化を実現するためにトレードオフを強いるようなものは避けたい。
各言語をどれくらい気に入っているか
参考までに、私が知っている他のプログラミング言語をどれくらい気に入っているかを示す。
| 言語 | 評価 | 経験 | 備考 |
|---|---|---|---|
| Go | 9 | 高 | GoはWebアプリのために美しく設計されている。 |
| Zig | 8 | 低 | きわめて効率的で高性能なコードを書くにはとても楽しいが、Webアプリには理想的な道具ではない。 |
| Python | 6 | 高 | Pythonでは多くのことをやってきたが、パッケージングの貧弱さと型付けの欠如が気になり始めている。 |
| JavaScript | 5 | 中 | Node.jsに依存しない、より良いパッケージング/テストツールがあればいいのにと思う。 |
| Angular | 2 | 低 | 魔法的すぎて複雑すぎる。 |
| Vue | 4 | 中 | しばらくVue 2が大好きだったが、自分のコードではなくフレームワークのバグや落とし穴のせいでアプリが壊れることに何度も悩まされてきた。 |
| C++ | 4 | 中 | しばらく書いていない。Googleのようなツールサポートが充実した環境では悪くないが、2025年にC++の開発環境をゼロから構築するのは楽しめそうにない。 |
| C | 6 | 低 | C++と同じ問題はあるが、シンプルさは評価している。 |
調査方法
各言語を調査するにあたって、以下のことを行った。
- その言語の機能紹介ページを読んだ
- その言語で主流のWebフレームワークの機能紹介ページを読んだ
- 各言語でシンプルな「Hello, world」Webアプリの例を探した
- LLMに、知っている言語との言語機能の比較をさせた
候補
Elixir / Phoenix / LiveView
Elixirは、賢いと思うブロガーの多くが楽しんでいるようなので、候補の中でも上位にある。概念や機能も、奇妙で面白そうに聞こえる。
Elixirには非常に公式なWebフレームワークであるPhoenixがあるのが気に入っている。PhoenixがデフォルトでTailwind CSSに依存しているのはあまり好きではないが、オフにできるようだ。
最近の目玉はPhoenix LiveViewで、WebSocketを使ってバックエンドの状態をページのリロードなしでフロントエンドにプッシュするため、あまりJavaScriptを書かずにWebアプリを作れる仕組みのようだ。ただLiveViewはSPAを生成するもので、私はもうSPAにはうんざりしていて、これ以上投資したくない。PhoenixはLiveViewなしでも使えるが、リソースの多くがLiveViewに投入されている印象を受ける。
- 良い点
- ✅ 面白い言語機能がある
- ✅ Webアプリのための魅力的なソリューションがある
- ✅ Erlang上に構築されているため、Erlangエコシステムを利用できる
- 悪い点
- ❌ 静的型付けがない
- ❌ LiveViewはSPA向けに設計されている
- ❌ LiveViewが「魔法的」に感じる
Gleam / Lustre
Gleamは、Elixirのやんちゃな弟分のように思える。パターンマッチングやパイプラインなど、Elixirと共通する言語機能を多く持っているが、静的型付けがある(これは嬉しい!)。
Gleamはメタプログラミングをサポートしていないが、これについては複雑な気持ちだ。一般的にメタプログラミングは好きではなく、いつも自分には頭が足りないと感じるので、ある意味この機能が除外されているのは嬉しい。一方で、目標が新しいことに挑戦することなら、あえてメタプログラミングに挑戦すべきかもしれない。
GleamのWebフレームワークはlustreと呼ばれ、HTMLをGleamの関数呼び出しの形で書く。
pub fn main() {
let app =
lustre.element(
html.div([], [
html.h1([], [html.text("Hello, world!")]),
html.figure([], [
html.img([attribute.src("https://cdn2.thecatapi.com/images/b7k.jpg")]),
html.figcaption([], [html.text("A cat!")])
])
])
)
let assert Ok(_) = lustre.start(app, "#app", Nil)
Nil
}正直、こんな形でHTMLを書くのは非常に面倒で見た目も悪いと思うが、試してみるつもりはある。
Gleamはまだクリティカルマスに達していないので、5年後にこの言語が存在しないリスクはあるが、それはそれで構わないと思っている。Gleamでビジネスを築くつもりはなく、ただ遊んで新しいことを学ぶだけだ。
- 良い点
- ✅ 面白い言語機能がある
- ✅ Erlang上に構築されているため、ErlangやElixirのエコシステムを利用できる
- 悪い点
- ❌ 比較的新しく未成熟な言語である
- ❌ 公式ドキュメント以外に学習リソースが少ない
Haskell
私の知っているHaskellを楽しんでいる人たちは、コンパイラや言語設計について考えるのが大好きな、鼻につくほど頭の良い言語オタクばかりだ。自分はそうではない。
Haskellに最も興味を引かれたきっかけは、Alexis Kingの「Parse, don’t validate」だ。これまであまり気にしていなかった静的型付けの価値を教えてくれた。AlexisのアイデアはGoでも実践しているが、Haskellはデータ型でもっとはるかに多くのことを表現でき、面白そうだ。
Haskellにはモナドや無限データ構造、代数的データ型など、頭を広げてくれそうな突飛な機能がたくさんあるが、一方で生産的になるまでの学習曲線は急そうだとも感じている。
人気のWebフレームワークはIHPとYesodのようだ。IHPはPostgreSQLを厳密に要求するようで、これは致命的なので、消去法でYesodが残る。ただYesodは良さそうだ。無料のO’Reilly本もあるし、シンプルな例も、構文は少し異質だが分かりやすそうだ。
Haskell / Yesodは、本来学ぶべきスタックのように感じるが、ElixirやGleamほど楽しそうには思えない。
- 良い点
- ✅ 豊富で成熟したエコシステムがある
- ✅ 私が知るどの言語よりも強力な型システムがある
- ✅ Nixの理解に役立つかもしれない
- ✅ 学習リソースが豊富にある(無料のものも含めて)
- 悪い点
- ❌ コードが少し醜く見えるが、単に慣れていないだけかもしれない
- ❌ 学習曲線が急そうだ
- ❌ 変なHaskell信者になってしまいそうだ
Ruby / Rails
Ruby on Railsは、多くの人が愛用し、非常に生産的だと感じているのを知っているので魅力的だ。ただ言語機能を見ると、Pythonから来た身としては新しく革新的に感じるものは見当たらない。
Railsについての印象は、意見がはっきりしたフレームワークだが、その意見がとても良いということだ。Railsファンは、開発者から力やカスタマイズ性を奪うことなく、面倒な作業をフレームワークがうまく抽象化してくれる点を絶賛している。
- 良い点
- ✅ 豊富で成熟したエコシステムがある
- ✅ スケールダウンがうまくいくように設計されている
- ✅ 多くの人が愛用しているようだ
- 悪い点
- ❌ 静的型付けがない
- ❌ RubyはPythonとかなり似ているので、どれだけ学べるかわからない
PHP / Laravel
白状すると、PHPに対してエリート意識的な嫌悪感がある。
大学時代はPHPと楽しくやっていたが、他の言語を学ぶと、PHPはただ気持ち悪く感じられるようになった。
ここ数年、PHPは成熟し、LaravelによってPHPでのWeb開発がプロフェッショナルでスムーズになったと聞いたので、見てみることにした。
驚いたことに、基本的なLaravelアプリの例を見つけるのは意外と難しかった。Laravelのドキュメントには基本アプリを作成するコマンドは載っているが、コードがどう見えるかや、どうレンダリングされるかは示されていない。Laravelのビジネスモデルの一部がLaracastsでの動画コース販売にあるため、公開されているテキストベースのドキュメントがあまり良くないのだろうと推測した(追記:LaravelはLaracastsを所有していないが、一部のLaravelコア開発者がLaracastsでコースを公開している)。
見つけられた基本的な例に最も近いものはスターターキットで、React(遠慮したい)、Vue(遠慮したい)、あるいはLivewire(知らないが、あまり良い仲間とはいえなさそうだ)を引っ張ってくるものだった。ただ、Laravelに組み込まれたフロントエンドソリューションであるBlade Templatesは、HTMLテンプレート言語としては実際かなり良さそうに見える。
- 良い点
- ✅ 静的型付けをサポートしている
- ✅ 第一印象では、Bladeテンプレートが気に入った
- 悪い点
- ❌ 言語が見た目に気持ち悪い
- ❌ Laravelについての良い入門記事が見つからなかった
Scala
Scalaについては良い話を聞く。言語は面白そうで、これまで経験したことのない機能がたくさんある。構文は冗長さを抑えたJavaのようで、良い感じだ。
Scalaは強くオブジェクト指向のようだ。昔はオブジェクト指向が好きだったが、Goのずっと制限の多いオブジェクト指向機能を何年も使ってきた結果、継承やポリモーフィズムは割に合わないと感じるようになった。
主要なWebフレームワークはPlayのようだが、ドキュメントを読むと古臭くエンタープライズっぽく感じる。Hello WorldチュートリアルはPlayのアーキテクチャの複雑な図から始まり、非常に退屈で、フレームワークを学ぶ気が起きない。
Scalatraはシンプルさを重視した別のScala Webフレームワークだが、ドキュメントの例はかなり少ない。ただ購入できる電子書籍はある。
- 良い点
- ✅ 分散アノテーションや複合型など、型周りの面白い機能がある
- 悪い点
- ❌ Scalaのオブジェクト指向的な側面はC++の嫌な部分を思い出させる。そこまでひどくはないが
- ❌ Javaエコシステムと密接に絡んでいるようで、あまり好きではない
- ❌ どのWebフレームワークにもワクワクしない
まとめ
Gleamが自分の目標や経験に最も合っているように感じ、僅差でElixirがそれに続く。Haskellは、勇気と忍耐が出てきたときに学ぶべき言語だ。
Gleam + LustreとElixir + Phoenixの両方を少し試してみて、どちらがより面白く感じるか確かめるつもりだ。
記事をランダムに読む
コメント
ログインしてコメントする