Web開発のために、次はどの言語を学ぶべきか?
今年の目標の一つは、新しいプログラミング言語を学ぶことです。新しい言語を学ぶのは久しぶりですし、私がよく知っている言語(Go、Python、C++)は互いによく似ていると感じています。そこで、少しコンフォートゾーンから बाहरに出て、自分には奇妙に感じられる言語を試してみたいと思っています。
要件
探しているのは、次のような言語です。
- 私がよく知っている言語とは大きく異なる
- Webアプリが一級市民である
- 小さくてシンプルなアプリを簡単に作れる
- Angularとは正反対のものがいいです。Angularは大規模プロジェクト向けに最適化されすぎているように感じます。
- バックエンドとフロントエンドをサポートしている
- フロントエンドフレームワークまで備えている必要はありませんが、GoやPythonのように、バックエンドとフロントエンドで同じツールチェーンを使えることが条件です。
- Elmのようなフロントエンド専用のものは使いたくありません。
- フロントエンドとバックエンドのコードで別々のビルドチェーンを使いたくありません(軽いバックエンドのテンプレート処理を使いながら、素のJavaScriptを書くのは構いません)。
- データストアとしてSQLiteと互換性がある
- ユニットテストのサポートが充実している
- オープンソースである
- 現在も活発にメンテナンスされている
あるとうれしい条件
- 良い電子書籍がある
- 有料の本でも構いません。
- 抽象化が少なく、「魔法」が限定的である
- 静的型付け
目標ではないもの
- 最高性能
- 私が書くアプリのほとんどは、性能要件がとても小さいものです。たいていはユーザーが自分一人で、そうでない場合でも、同時に数十人を超えるユーザーは想定していません。
- 一人のユーザーに対して遅いものは使いたくありませんが、大規模化を実現するために何かを犠牲にしているものは避けたいと思っています。
さまざまな言語をどれくらい楽しめるか
参考までに、私が知っているほかのプログラミング言語について、そこでの開発をどれくらい楽しめるかを示します。
| 言語 | 評価 | 経験 | メモ |
|---|---|---|---|
| Go | 9 | 高 | GoはWebアプリ向けに美しく設計されています。 |
| Zig | 8 | 低 | 非常に効率的、または高性能なコードを書くのはとても楽しいですが、Webアプリに使う理想的なツールというわけではありません。 |
| Python | 6 | 高 | Pythonではたくさんのことをしてきましたが、貧弱なパッケージングと型付けの欠如が気になり始めました。 |
| JavaScript | 5 | 中 | node.jsに依存しない、もっと優れたパッケージング/テストツールがあればいいのにと思います。 |
| Angular | 2 | 低 | 魔法が多すぎて、複雑すぎます。 |
| Vue | 4 | 中 | しばらくはVue2が大好きでしたが、自分のコードではなく、フレームワークのバグや落とし穴が原因でアプリが壊れることが何度もあり、すっかり懲りました。 |
| C++ | 4 | 中 | しばらく書いていません。Googleのようにツールのサポートが充実した環境なら悪くありませんが、2025年にC++の開発環境をゼロから構築するのは楽しめないでしょう。 |
| C | 6 | 低 | C++と同じ問題がありますが、シンプルさは評価しています。 |
調査方法
各言語について、次のことを調べました。
- その言語の機能ページを読む
- その言語で主流のWebフレームワークの機能ページを読む
- 各言語で書かれたシンプルな「Hello, world!」Webアプリの例を探す
- LLMに、各言語の機能を私が知っている言語と比較させる
候補
Elixir / Phoenix / LiveView
Elixirは私の候補の上位にあります。頭が良いと思っているブロガーの多くが、Elixirを楽しんでいるようだからです。概念や機能にも、奇妙で興味深そうなものがあるように思えます。
Elixirに非常に公式なWebフレームワークがあるのは気に入っています。それがPhoenixです。PhoenixがデフォルトでTailwind CSSに依存しているのはあまり好きではありませんが、無効にすることはできそうです。
新しい要素はPhoenix LiveViewです。LiveViewはWebSocketを使って、ページを再読み込みせずにバックエンドの状態をフロントエンドへ送り込むため、JavaScriptをあまり書かずにWebアプリを作れる仕組みのようです。ただし、LiveViewはSPAを生成します。私はSPAにはもううんざりしていて、これ以上SPAに投資したくありません。LiveViewなしでPhoenixを使うこともできますが、彼らが多くのリソースを投入しているのはLiveViewのように感じます。
- 良い点
- ✅ クールな言語機能がある
- ✅ Webアプリ向けに魅力的な解決策がある
- ✅ Erlang上に構築されているため、Erlangのエコシステムを利用できる
- 悪い点
- ❌ 静的型付けがない
- ❌ LiveViewはSPA向けに設計されている
- ❌ LiveViewは「魔法」のように感じられる
Gleam / Lustre
GleamはElixirの、いわばやんちゃな弟分のように見えます。パターンマッチングやパイプライン処理など、Elixirと共通する言語機能が多くありますが、静的型付けを備えています(これはうれしい!)。
Gleamはメタプログラミングをサポートしていません。これについては複雑な気持ちです。一般的に、私はメタプログラミングが好きではなく、いつも自分には賢すぎて扱えないと感じるので、ある意味では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の「検証するのではなく、パースする」という記事です。それまで静的型付けをさほど気にしていなかった私にも、その考え方の価値がわかるようになりました。AlexisのアイデアはGoにも取り入れていますが、Haskellはデータ型によってはるかに多くのことを表現できます。これは面白そうです。
Haskellには、モナド、無限データ構造、代数的データ型など、頭の中を広げてくれそうな奇抜な機能がたくさんあります。ただ、言語を使って生産的になれるまでの学習曲線はかなり急なのではないかとも感じます。
人気のあるWebフレームワークはIHPとYesodのようです。IHPはPostgreSQLを必須としているようで、それは受け入れられないため、残るのはYesodでしょう。でも、Yesodはよさそうです。無料のO'Reilly本がありますし、シンプルな例も、構文が少し異質ではあるものの、わかりやすく書かれています。
Haskell / Yesodは、学ぶべき技術スタックのように感じます。でも、ElixirやGleamほど楽しそうには見えません。
- 良い点
- ✅ 豊富で成熟したエコシステム
- ✅ 私が知っているどの言語よりも強力な型システム
- ✅ Nixを理解する助けになるかもしれない
- ✅ 無料のものも含め、学習リソースが豊富
- 悪い点
- ❌ コードが私には少し見づらい。ただ、単に慣れていないだけかもしれない
- ❌ 学習曲線が急に見える
- ❌ 変わったHaskellの人になってしまう
Ruby / Rails
Ruby on Railsが魅力的なのは、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テンプレートのようです。HTMLテンプレート言語としては、これは実際かなり良さそうに見えます。
- 良い点
- ✅ 静的型付けをサポートしている
- ✅ 一見したところ、Bladeテンプレートが気に入った
- 悪い点
- ❌ 言語の見た目が気持ち悪い
- ❌ Laravelの良い入門資料を見つけられなかった
Scala
Scalaについては、良い評判を聞きます。言語の見た目は興味深く、これまでどの言語でも触れたことのない機能がたくさんあります。構文は冗長さを減らしたJavaのように見え、そこは好印象です。
Scalaはオブジェクト指向がかなり強いようです。以前はオブジェクト指向が好きでしたが、Goの、はるかに制約の多いオブジェクト指向機能を何年も使ってきた結果、継承やポリモーフィズムは、得られるものより厄介さのほうが大きいと感じるようになりました。
主流のWebフレームワークはPlayのようですが、ドキュメントを読んでいると、時代遅れでエンタープライズっぽく感じます。Hello Worldチュートリアルは、Playのアーキテクチャを複雑な図で説明するところから始まります。これはとても退屈で、このフレームワークを学びたいという気持ちにはなりません。
Scalatraは、よりシンプルさに重点を置いた別のScala製Webフレームワークです。ただし、ドキュメントに載っている例はかなり少なめです。それでも、購入できる電子書籍はあります。
- 良い点
- ✅ 変性注釈や複合型など、型に関する興味深い機能がある
- 悪い点
- ❌ Scalaのオブジェクト指向的な側面は、C++の悪い部分を思い出させる。ただし、C++ほどひどくはない
- ❌ あまり好きではないJavaエコシステムと密接に絡み合っているように見える
- ❌ Webフレームワークのどれにも、心を躍らせるものがない
まとめ
自分の目標と経験に最も合っているのはGleamで、Elixirが僅差の2番手という印象です。Haskellは、勇気と忍耐力が身についたときに学ぶべき言語でしょう。
まずはGleam + LustreとElixir + Phoenixを少し試してみて、どちらのほうが面白く感じるかを確かめるつもりです。
記事をランダムに読む