- Rust 1.0 の公開直後から10年間にわたり Rust を実務導入してきた経験と、これからの10年への期待をまとめた記事
- 初期にはバージョン互換性の問題、ビルド時間、borrow checker への適応が難しかった
- Rust コミュニティとエコシステムは、「卓越したプログラミング感覚」と強い共同体文化によって急速に発展し、優れた開発者が Rust に集まる傾向が際立っていた
- **いまや一般的なシステムおよびバックエンド分野において Rust は「堅実な選択肢」**となっており、標準ライブラリの発展とクレートエコシステムの成熟によって不確実性が大きく減った
- ビルド速度、移植性、const 機能、並行性、さまざまなドメインへの拡張など、Rust が解決すべき残る課題と発展の方向性を具体的に示している
- 今後の10年は、より高速なコンパイル、幅広いドメインへの拡張、開発者体験の革新が続くと見込まれ、Rust エコシステムのポジティブなフィードバックループが加速すると期待している
- 2015年6月、Rust 1.0 公開の熱気が落ち着き始めた約1か月後に、最初の Rust コードを書いた
- C、Python、JavaScript を使ってきたが、Rust に触れてからはもう振り返ることがなくなった
- Rust ベースのスタートアップ2社で、50万行を超えるコードを書いた経験をもとに、この10年を振り返る
初期はつらい時代だった - The early days were painful
- Rust 導入初期には、クレートとコンパイラのあいだのバージョン互換性が非常に不安定で、小さなバグ修正のためにもビルド環境全体の更新を強いられることが多かった
- borrow checker の概念とライフタイム管理は難しく感じられ、複雑な型が増えるほどコンパイル時間が急激に伸びる問題も深刻だった
- 新機能やバグ修正が必要になるたびに「世の中のあらゆるバージョン」を更新しなければならず、互換性のあるバージョンを探すのに多くの時間を費やした
Rust コミュニティの卓越性 - The people were and are exceptional
- Rust エコシステムには、シンプルでエレガントな実装と、高速で堅牢な性能を志向する卓越したプログラミング文化が根付いていた
- TypeScript や Python を使うときよりも、Rust の依存関係の構造ははるかにクリーンで、ビルドも単純だった
- コミュニティのボランティアによる献身的な貢献と、「今ではない/まだその時ではない」という慎重な姿勢が中核的な役割を果たしている
- ロンドンでは Rust 開発者の採用に大きな利点があり、Rust 開発者の平均的な力量は非常に高い
Rust は(いくつかの分野では)堅実な選択肢になった - Rust has become a safe bet (in some domains)
- 初期には標準ライブラリ(std)の不足のため、自前でユーティリティ関数やパッチを作る必要があったが、いまでは機能の大半が std とクレートに組み込まれており、不確実性は大きく減っている
- ビルドやアップグレードの予測可能性、外部依存の減少、semver の遵守、borrow checker と推論エンジンの改善などによって、Rust を使う体験は大幅に安定した
- 新しいクレート(例: jiff, polars, tauri)は過去の試行錯誤を踏まえて作られており、tokio, hyper, regex などは実運用で実証済みだ
- かつては「車輪の再発明」が避けられなかったが、いまではビジネスロジックに集中して高性能で堅牢なアプリケーションを開発できるようになった
今日の Rust が示す開発環境 - Rust today feels like what programming should be
- Rust は簡潔で堅牢なビルドシステム、最高水準のエラーメッセージと lint、優れたドキュメントと IDE 統合、強力な CI/回帰テストなど、プログラマ中心の共感性を備えた言語だ
- 大規模なオープンソースプロジェクトの中でも、Rust ほどプログラマに優しい言語はまれだ
- 数多くのコミュニティと貢献者による「長期的な投資」こそが、現在の Rust を形作った中核要因である
今後10年への期待 - What I’m looking forward to over the next 10 years
よりシンプルで高速なビルド - Simpler and faster builds
- 複雑または遅い依存関係を、シンプルで高速なものに置き換える取り組みが今後も続くと期待している
- pure Rust の標準ライブラリ、システム linker やライブラリ依存の削減、pure-Rust 暗号、永続 BTreeMap、Rust ベースのゲームエンジンなど、新たな試みに期待している
- Tably でもここ数か月でフロントエンド/バックエンドのコンパイル速度が 60% 向上した
移植性の向上と #[cfg()] の最小化 - Improved portability and less #[cfg()]
- さまざまなプラットフォームやオプションの組み合わせをテストするのは難しく、
#[cfg()] による未検証コード、ドキュメントの不完全さ、IDE の問題などが生じる
#[cfg()] を trait system の内部へ移すことで、プラットフォーム/オプション保証や再コンパイルの最小化、MIR キャッシュ、高速な CIの実現が期待される
すべてのコードが const になること - Everything being const
- コンパイル時により多くの処理を先に実行することで、マクロやビルドスクリプトへの依存を減らし、ランタイムエラーも事前に防げる
- 現時点では制限があるものの、将来的には**「すべてのコードが const context で実行可能」な Rust を目指している**
並行性の単純化 - Simpler concurrency
- 現行 Rust の非同期(Async)モデルは、
'static bound、cancellation-safety、trait の制約など複雑さが高く、実務では扱いづらさがある
- かつての user-space green thread(libgreen)のように、言語レベルでのシンプルな並行性の追求が必要だ
より多くのドメインで競争力を持つこと - Excelling in more domains
- Rust のWeb ブラウザ内での活用(特に wasm/rustwasm)はまだ未開拓であり、クロスブラウザのスタックトレースなど多くの課題が残っている
- leptos、sycamore などのフレームワークは発展を続けているが、なお改善の余地がある
- Rapid prototyping、ビジネスロジック、GUI、機械学習、ゲーム開発など、Rust がまだ完全には切り開けていない領域も継続的に改善されていくと期待している
結論
- Rust の成長の未来は非常に明確で希望に満ちている
- 導入が進むほどエンジニアリングやテストの能力が高まり、それによってより広い採用と改善が生まれるという好循環がある
- これからの10年で、より高速なコンパイル、多様な分野での適用、なめらかな開発体験が現実のものになるだろう
- Rust の新たな10年に期待している
5件のコメント
Rustはとても良いのですが、言語が要求してくることが多すぎます。
Rustを使っていると、アイデアの実装そのものに集中するというより、Rustという言語そのものを研究しているような気がします。
C++から移行するなど、すでに作られたプロジェクトを移すぶんには特に支障はないでしょうが、
新しいアイデアを実装するときに使いやすいのかは、正直よく分かりません。
プロトタイピングにはPythonをおすすめします
個人的に型システムが好みなので、今はC#を使っていますが、このくらいで十分満足だと思います。
個人的に地球環境を考えるなら Rust。レガシーな Spring コードを Axum に!!!
Hacker Newsの意見
"asyncは
'staticバウンド、キャンセル安全性、トレイトやdynに関する制約などのため、比較的高い複雑性コストを抱えている。現時点ではこの問題が解決される気配はない。同期/非同期プリミティブ間の分岐とエコシステム固有の特性がasync tax(追加コスト)を高めている。Effectsベースの解決策もあまり期待できない。""Rust 1.0以前には
libgreenという解法があった。分岐なしにユーザー空間で並行性を実装していたが、性能、移植性、保守コストが大きく、結局削除された。エンジニアリング能力さえ十分なら、もう一度検討する価値はあると思う。いつかstd::{fs, net}とfiber::{spawn, select}をgeneratorでzero-cost wrappingしたPoCを作ってみたい"'staticboundが複雑性を高めている」という議論は、Tokio async runtimeの設計上の選択にすぎず、Rust全体の設計と見るべきではないという意見。Embassy async runtimeはこうしたバウンドなしでも動作するが、その代わりpinningを自分で管理する必要がある。'staticboundは実際には複雑さを下げる意図によるものadvanceのたびに内部状態を変更するパーサーを作っていたが、可変性とborrow systemのために難しく、statelessなパーサーに変えざるを得なかった。内部インデックスを更新する代わりに、インデックスを返す構造へと変更することになった。こういうふうに、従来のやり方がうまく通用せず、Rustでは新しいアプローチが必要になることはよくあるのか気になるspawn、spawn_blocking、futures::streamが活用の90%を占めるし、適切に「境界」を設けておけばasyncが伝播する必要もない