はじめに
Node.js、Rust、Go、C++、C#、Next.js、Vite、Flask、FastAPI…
高校生の身でありながら、数多くの言語やフレームワークを実際に手を動かして触ってきた。
それでも結局、Pythonに帰ってくる。
フロントエンドにはJavaScript/TypeScript、リアルタイム処理にはNode.js、速度が要求される場面にはRustやC++。適材適所でいろんな言語を使い分けてきたつもりだ。でも「それ以外」は、気がつけばいつもPythonで書いている自分がいる。
なぜここまでPythonが手放せないのか。他言語との比較も交えながら、主観全開で語ってみたい。
これまで触ってきた技術スタック一覧(クリックで展開)
| カテゴリ | 技術 |
|---|---|
| 言語 | Python, JavaScript, TypeScript, Rust, Go, C++, C# |
| フロントエンド | HTML/CSS, Next.js, Vite |
| バックエンド | Node.js, Flask, FastAPI, Quart |
| インフラ | Docker, Git, GitHub Actions |
圧倒的なエコシステムと「何でもできる」汎用性
「ライブラリが豊富」という言葉で片付けてしまうと少し勿体ない気がしている。
AI/機械学習(PyTorch, TensorFlow)、Webバックエンド(FastAPI, Flask)、スクリプト・自動化、データ分析(pandas, NumPy)、Discord Bot、画像処理(OpenCV, Pillow)、セキュリティツール…
一つの言語がこれだけ幅広い用途に、ファーストクラスのライブラリ付きで対応しているのは、なかなか他に見当たらないんじゃないかと思う。
個人的な体験として、「何か作りたい」と思ったとき、ライブラリを探す前に「Pythonにないか」を疑わなくなったのが、このエコシステムの豊かさを一番実感した瞬間だった。
後方互換性とメンテナンスコストの低さ
個人的にこれが一番大きいかもしれない。
⚠️ ファクト補足:Python 2→3 の移行は歴史的に見て非常に破壊的な変更だった。ここで言う「後方互換性の高さ」は、現在主流のPython 3.x系内での話に限定している点はご注意を。
Node.jsを使っているとバージョンアップ時に依存関係が壊れる経験がどうしても出てくる。
npm install
# → peer dependency conflicts, deprecated warnings...
# → 動いていたコードが突然動かなくなることがある
Python 3.x系では「新機能を使わなければ古いコードがそのまま動く」という設計思想のおかげで、数年前に書いたコードが今でも普通に動くことが多い印象だ。書き直さなくても動く、というのは個人開発では特に助かる。
Node.jsエコシステムでのライブラリ開発経験は深くないため、あくまで「ユーザーとしての主観」です。もし認識が誤っていればぜひご指摘ください 🙏
Rust/C++連携による拡張性
「Pythonは遅い」という話はよく聞く。これは否定しにくい。
ただ、速度が必要な部分だけRustやC++で書いて、Pythonからラッパー経由で呼び出すという選択肢があることを知ってから、速度面の不満がかなり薄れた。
# PyO3(Rust)やpybind11(C++)で作ったネイティブ拡張を呼び出す例
import my_fast_module # Rustで書かれたネイティブ拡張
result = my_fast_module.heavy_computation(data)
# Pythonの書きやすさ + Rustの速度、という組み合わせが可能になる
実際、NumPyやOpenCVはC/C++で実装されており、Pythonはその「指揮者」として機能している。速度が必要な処理は他言語に任せ、全体の制御はPythonがやるという構成が自然に取れるのが、個人的には強みだと感じている理由の一つだ。
書きやすさと読みやすさ
これは正直、好みの問題もあると思う。ただそれを踏まえても、Pythonの構文は気に入っている。
# 英語の文章を読むようにコードが読める感覚
fruits = ["apple", "banana", "cherry"]
expensive_fruits = [f for f in fruits if is_expensive(f)]
// JavaScriptも同じことはできる
// ただしスタイルの自由度が高い分、書き手によって見た目が大きく変わりやすい
const expensiveFruits = fruits.filter(f => isExpensive(f));
// アロー関数?function宣言?var / let / const? 選択肢が多い
JavaScriptが悪いわけではない。自由度の高さはそれ自体が強みだとも思う。
ただ、インデントで構造が強制されるPythonは、チームや自分の過去コードを読み返すときに迷いにくいというのが、個人的には合っていると感じる。
Pythonの弱点と、それでも使う理由
正直に言うと、根本的な設計段階から非同期を前提としているNode.jsには、スループットや速度では勝てないと思っている。I/O多重処理が中心のAPIサーバーを本番運用するなら、Node.jsのほうが向いているケースもあるだろう。
それでも個人開発の規模では、書きやすさ・メンテナンスのしやすさ・エコシステムの広さというトレードオフがPythonに傾くことが多い。「最速の言語」が必要な場面は思ったより少なくて、「明日の自分が読んで理解できるコード」を書ける言語のほうが、結果として生産性が高いと感じている。
おわりに
Node.jsもRustもGoも、それぞれ本当に良い言語だと思う。使うべき場面はある。
ただ「とりあえず何か作る」「ちょっとスクリプトを書く」「新しいアイデアを試す」という場面では、自分はきっとこれからもPythonを選び続ける気がしている。
言語の優劣の話ではなく、自分の思考リズムに一番合っているというのが、結局のところ一番大きな理由なのかもしれない。