
2025/12/25 8:11
「プロセスを Rust 化」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
著者は何年も Rust を学び続け、現在ではプロセスを十分に信頼できるほど自信がありコードを書き始めました。初期の勉強は The Rust Programming Language の第 4章までで、実務は主にミシガン州のソーラーカーと SpaceX で C++ を使って行われており、Rust はほとんど使用されていませんでした。
今年、著者は積極的に Rust コーディングを始めました。まず rustlings で構文を練習し、その後「Raytracing in One Weekend」のプロジェクトを Rust に移植して実際のタスクで自信をつけました。htop のようなターミナル UI ツールに触発され、著者は OpenSnitch 用の TUI を作ることにしました。OpenSnitch はオープンソースの Linux ファイアウォールデーモンで、優れたターミナルインターフェイスが不足しているためです。
OpenSnitch は gRPC API で機能を公開していますので、著者は Rust から通信するために Tokio と tonic を使用し、その後 UI を ratatui で構築しました。完成した TUI は GitHub に公開され、OpenSnitch の軽量なターミナルベースのインターフェイスを提供します。
開発全体を通じて、このプロジェクトは Rust の強みを際立たせました:関連データ付きの表現力豊かな列挙型、
Result を使った堅牢なエラーハンドリング、内部可変性パターン、およびユニットテスト・フォーマッティング・静的解析といった強力なツールチェーンです。著者はまた、所有権/借用チェッカーのエラーや HTTP ライブラリの奇妙さなど具体的な課題にも直面しましたが、型安全性のおかげで async Rust は JavaScript/NodeJS よりも楽だったと述べています。時折 LLM を使って内部可変性や async タイムアウトといった概念を明確にしたものの、ほぼ実践的なコーディングに頼りました。この経験は、Rust の制約が C/C++ でよく見られる落とし穴を回避するのに役立ち、新規プロジェクトを推進する助けになることを再確認させました。一方で組織的なトレードオフや技術債務への配慮も必要であると認識しています。
この改訂版要約は主要ポイントを網羅し、根拠のない比較を排除し、GitHub ホスティングと限定的な LLM 使用についての欠落情報を追加しています。
本文
執筆 – プログラミング(2025‑12‑24)
何年も前から Rust を学び始め、やっと「(t)rust」できるレベルに達しました。 いや、実際には
<T>rust というのが正しいかもしれません。
大学時代は The Rust Programming Language(通称 “The Book”)を読んで学びましたが、4章前後でほぼ壁にぶつかってしまい、進めることができませんでした。 その失敗の大きな原因は、本だけを読むことに偏りすぎた点だと反省しています。 数学のテストで RTFM(Read The Fine Manual)ばかりして練習問題をスキップした経験に似ています。 まあ、私はそんなに賢くはありません。
同時期に大学授業やミシガン州立大学の Solar Car チームで C++ の実務経験も続けていました。 Solar Car チームでは、ミシガン大学の CS カリキュラムで教わった C++ 基礎を土台に開発しましたが、フレッシュマンやソフォモアといった若手メンバーが多く、複雑な言語・ライブラリ・インフラは「1人の熱意ある学生が卒業した後も続けられない」ケースが多かったので、実装はシンプルに抑えました。
SpaceX で働いていたころは C と C++ が主流でした。 C++ の使用量は適度で、コードを「フライトソフトウェアとして決定論的」に書く必要があるかどうかの判断基準も柔軟に設けていました。 Go や Rust など新しいエコシステムが時折登場しましたが、ネットワーク/フライトソフトウェアチームで主流になることは稀でした。 SpaceX を退職した頃には、言語の神話的な「ホーリーウォーズ」が依然としてソフトウェア領域を混乱させていました。
そこで今年からは、本当に Rust だけ読むのではなく書くことに意識的に取り組むようになりました。 Rust の仲間たちは絶賛しており、システムプログラミングコミュニティも確実に Rust を受け入れています。
まず rustlings で文法と基本パターンを確認しましたが、それだけでは「Rustを書く」自信には十分になりませんでした。 「本格的なプロジェクト」で学びながら、言語機能については指導付きで進めたいという欲求が湧きました。
そこで Raytracing in One Weekend をブックマークから見つけました。 そのサンプルはフィードバックが即座に可視化できるため、学習効率が高く(Gen Z のドーパミンヒットにも最適)、Rust 版の翻訳も手厚いガイドになっていました。 数学的な詳細をすべて覚えているわけではありませんが、実装に取り組んでみると十分に理解できました。
Raytracing から TUI へ
Raytracing の練習後、さらにアイデアを探していたところです。 近年 htop や k9s といったターミナル UI(TUI)ツールの使用が増え、自分で TUI を作ることに興味が湧きました。
同時期に Linux 用の LittleSnitch のオープンソース版 OpenSnitch を見つけ、実行してみたいと考えていました。 OpenSnitch は機能的には優れていますが、ユーザー体験はやや煩わしいです:
- 接続ごとにフルスクリーンの UI が表示されるため、中断が多い
- 端末中心の環境(ヘッドレスサーバーやコンテナなど)では、X/VNC/RDP を経由するか GUI バイナリをローカルで実行しないと UI が使えない
この問題に対処するため、TUI が適切な中間層になると考えました。 OpenSnitch の作者は gRPC API でデーモンと UI の責務を明確化しているので、その設計が基盤となります。
tokio と tonic を組み合わせて、実際にネットワーク上のバイト列を確認できるようになりました。 アプリケーションロジックを構築する中で borrow checker の壁や HTTP ライブラリの奇妙な振る舞いに直面しましたが、C++ や Go に戻ろうという衝動は抑えました。
最終的には async を取り入れ、ratatui ベースの TUI と tonic で駆動される gRPC サーバー間にメッセージング層を構築しました。 非同期 Rust は JavaScript / Node.js の過去の苦い経験よりずっと楽しいと感じました。 強力な型システムが助けてくれます。
現在の TUI は下図のようになっており、GitHub で公開しています。 TUI を作る過程でグラフィックデザインへの興味も蘇りました(Adobe のサブスクリプションに縛られることは望みません)。 さらに、AI 支援開発時代のツールとして有用だというユーザーからの報告もあります。
開発旅路で得た散漫なノート
- 関連データを持つ列挙型 はネットワークソフトウェアにおいて頻繁に使われるパターン(アドレスファミリ、プロトコル、バリアント、オプショナルなど)で、Rust が安全性を確保してくれる点がありがたいです。
- Rust のエラーハンドリング哲学は SpaceX での「戻り値型+例外なし(panic)」と似ており、馴染み深いパターンでした。
- 可変性と所有権ルールが結合され、一部のデータ共有を禁止するケースに遭遇した際には 内部可変性 と共有状態パターンを学びました。
- 単体テスト、フォーマット、静的解析が言語ツールチェーンに組み込まれている点は非常に便利です。 ただしコードカバレッジのデフォルト設定があればさらに良いでしょう。 オープンソース拡張でフラメグラフを生成できました。
- C/C++ がデータの配置(スタック vs ヒープ、構造体アラインメント)を明示してくれる一方、Rust はやや抽象化されていると感じます。 Go でも同様です。 現在はそのレベルの最適化に踏み込む必要はありませんが、将来的には学びたい領域です。
- TUI に使っている tokio の非同期ランタイムも同じ感覚を強めます。 深く掘り下げる必要は無いという点は良い抽象化だと感じていますが、さらに知識を深めたくなります。
- LLM を使って TUI 開発を高速化できたかもしれませんが、学びの機会として 99 % は避けました。 残り 1 % は内部可変性や非同期タスクにタイムアウトを設定する方法を理解するためでした。
全体的に進捗には満足しています。 私の限られた視点では、今後のグリーンフィールドプロジェクトは C/C++ よりも Rust で書く方が賢明だと考えます。 Rust のプリミティブと制約は多くの落とし穴を防ぎます(ただし Cloudflare の例のように完全ではありません)。 読みにくいコードもあるものの、これは C++ と同じ「取得味」であり、80/20 原則にも当てはまります。
プラットフォームが一般的なプロセッサや OS でない場合にはさらにニュアンスがあります。 こうした決定は単なる言語比較以上に複雑です。 組織は技術債とイノベーターのジレンマを天秤にかけながら、大学のエンジニアチーム向けに持続可能なソフトウェアスイートを構築するという人間的要因も考慮しなければなりません。 したがって「すべて Rust 化」にはまだ踏み切れていません。 大学で 100 レベルのコンピュータサイエンスコースに Rust を導入し、AI エージェントがソーラーパワーのレースカーを作るような時点まで、再検討したいと思います。
それまでは、遅れてバンドワゴンに乗ったとしても、自分でこれらの練習を通じて Rust を学べたことに感謝しています。 OpenSnitch TUI の構築は楽しく、今後の個人プロジェクトや職場でも Rust に直面する際により自信が持てます。 学び続ける余地はまだ多いと確信しています。 迷っているなら、(t)rust the process.
— Amal