Rustで本番システムを6ヶ月運用して気づいた、ネットの半分は誇大広告だった話

Go・Python歴10年のエンジニアがRustで実務システムを書いて分かったこと。学習曲線、パフォーマンス、開発効率の現実的な感想を赤裸々に。

Rustに手を出した理由——正直に言うと「興味本位」だった

これまで10年間、Go や Python で大規模バックエンドシステムを書いてきた。正直、Rust なんて「難しくて、学習コストが高い」という先入観を持ってた。ただ、去年チームのマイクロサービス群をパフォーマンス最適化する案件が来て、「ここで Rust を試してみるしかない」と腹をくくった。

そこから 6 ヶ月間、小規模の本番システムを Rust で書き、検証した。結果、正直なところ「ネットの記事の半分は本当、半分は誇大広告」だと気づいた。

学習曲線は本当に急(その先には価値がある)

Rust を始めた時、一番ぶち当たったのは所有権とライフタイムアノテーションだ。Go のポインタや Python のメモリ管理なら気にならなかったことが、Rust では必ず向き合わされる。

実際に、初期段階で書いたコード:

fn main() {
    let s = String::from("hello");
    let s2 = s;  // ここで所有権が移動
    println!("{}", s);  // コンパイルエラー: sはもう使えない
}

こんなコードでコンパイラに怒られる。最初は「面倒だな」と思ってたんですよね。ただ、3 週間経つと、この制約があるから実行時エラーが激減することに気づいた。Go や Python で「あ、ここバグってたのか」という問題が、Rust ではビルド時に検出される。これが本当に便利。

うちのチームで試した結果、Rust で書いたサービスは本番デプロイ後の Critical Bug がほぼゼロ。Go や Python のサービスは大体 1〜2 個あるから、1000 行のコード規模では無視できない差が出た。

パフォーマンスは本当だけど、作戦を間違えると意味がない

「Rust は速い」という話、これは本当だ。ただし、前提条件があるんですよね。

うちが最初に書いたのは、バッチ処理のデータ変換パイプライン。Python で 10 分かかってた処理を Rust で書き直したら、2 分 30 秒に短縮した。メモリ効率も 80% 削減。

use std::fs::File;
use std::io::{BufRead, BufReader};

fn process_large_file(path: &str) -> Result<Vec<String>, Box<dyn std::error::Error>> {
    let file = File::open(path)?;
    let reader = BufReader::new(file);
    
    let result: Result<Vec<_>, _> = reader
        .lines()
        .map(|line| {
            let line = line?;
            // 重い処理
            Ok(line.to_uppercase())
        })
        .collect();
    
    result
}

ただ、ここからが大事なポイント。本番環境では、このバッチが 1 日 1 回しか走らない。2 分 30 秒 vs 10 分の差は、月に数時間程度。それに対して「Rust の学習コストに 200 時間使った」とのバランスを考えると、この案件は ROI 的には微妙だった。

正直に言うと、Rust の本当の価値が出るのは「API サーバー」や「リアルタイム処理」、「高スループット通信」。つまり、1 秒 1 回以上走るコードにおいてはじめて差が出るんだ。

バッチ処理とか、定期実行タスクなら、Go でいい。ここは皆さんへの本音の提言。

メモリ安全性の本当のメリット——本番で起きるのは「メモリリーク」じゃなくて「不可解な死」

ネットでは「Rust はメモリリークがない」と書かれている。正確には「GC がないことでメモリリークが起きにくい」だけで、100% ではない。ただ、うちが 6 ヶ月運用してわかったのは、心理的安全性が全然違うってこと。

Python や Go だと、本番で深夜に「謎のメモリリーク」が起きて、日中に「あ、あのループで文字列配列をずっと貯めてた」と判明する。Rust だと、そもそもそういう無意識のバグが書けない

実際、Clean Architecture でレイヤー設計を厳密に進める場合、Rust のコンパイラが「この所有権は疑い満載」と教えてくれるのは地味に有効。設計のリマインダーになるんですよね。

参考記事:Clean Architecture実践ガイド2026|Go・Rustで学ぶレイヤー設計

実装してみてわかった、Rust の「地味に大変な部分」

1. エコシステムの成熟度がまだ足りない

Python なら「データ分析は pandas」「Web は Django」と決まってる。Rust は、同じ機能を 5 〜 10 個のライブラリが争ってる状態が多い。結構ストレスだ。

例えば、Web フレームワークを選ぶだけで迷う:

フレームワーク特徴本番向き
Actix-web高速、複雑な設定も対応
Rocket開発速度重視、シンプルな構文
Axum最新、カスタマイズ性が高い
Tauri + Yewフロントエンド系、ユニーク

正直、どれを選んでも「3 ヶ月後に別のフレームワークが流行ってた」なんてザラ。Go なら Gin が定番だから迷わない。Rust はこの「選択肢の多さ=不確実性」がストレス。

2. 非同期処理の概念が Tokio に染まってる

Rust の async/await は強力だけど、tokio ランタイムの理解が必須。Go の goroutine や Python の asyncio とは違う思想なんですよね。

use tokio::task;

#[tokio::main]
async fn main() {
    let handle = task::spawn(async {
        // 別タスク
        println!("hello from task");
    });
    
    handle.await.unwrap();
}

このシンプルなコードですら、初心者は「なぜ #[tokio::main] が必要?」「handle.await の意味は?」で 1 日潰す。

うちのチームで新人に説明する時、「Go の goroutine と考えて OK」と簡略化するんだけど、実際には細かく違う。3 ヶ月経つと、「あ、Rust の非同期は所有権に厳しいから、この書き方しか許されない」と気づく。

3. ビルド時間が長い——これは本当にストレス

これは正直、開発効率に響く。Go なら数秒、Python なら即座。Rust は初回ビルドで 3 〜 5 分かかる。以降の変更時は 30 秒〜2 分。開発効率が Python/Go より落ちるんだ。

本番環境のビルドなら気にならないけど、ローカル開発での「試す → コンパイル待機」のループが多いと、集中力が途切れる。地味に辛い。

「Rust で本当に活躍する場面」を整理してみた

実際に 6 ヶ月やってみて、Rust が真価を発揮する場面は限定的だと気づいた。結論から言うと、こんな感じだ:

Rust が活躍する場面:

  • API サーバー(スループット重視、可用性が critical)
  • CLI ツール(単一バイナリ、配布が簡単)
  • 組み込みシステム、エッジコンピューティング
  • ライブラリ・低レベルシステムコード
  • リアルタイム処理(ストリーム処理、WebSocket サーバーなど)

Go で十分な場面:

  • マイクロサービス(開発速度重視)
  • バッチ処理(頻度が低い)
  • gRPC サーバー(シンプルさ重視)

Python で十分な場面:

  • データ分析、ML パイプライン
  • スクリプト、自動化
  • プロトタイピング

参考までに、イベント駆動アーキテクチャを Rust で実装することも検討したけど、チームのスキルレベルと開発速度のバランスから Go に戻した。ここは正直な判断。

参考記事:イベント駆動アーキテクチャ実装ガイド|Kafka・マイクロサービス対応

Rust 入門者へのアドバイス——やるなら「小さく始める」

僕がやった学習ステップを共有する:

月 1:基礎を確実に

  • The Book(公式ドキュメント)を 1 周
  • 所有権、ライフタイム、トレイトをコード例で 100 回以上書く
  • 時間の目安:80 時間

月 2:Web フレームワークで実装

  • Actix-web や Axum の Tutorial を書く
  • 簡単な REST API を書く
  • 時間の目安:60 時間

月 3:本番に近い小規模実装

  • チームの小さなマイクロサービスを Rust で書き直す
  • DB 接続、非同期タスク、エラーハンドリングを全部実装
  • 時間の目安:100 時間

重要:Go や Python を既に書いてるエンジニアなら、「言語文法」より「所有権の考え方」に 60% の時間を使うべき。ここが本当の山場だ。

結論——Rust は「本当に必要な場面」では無敵

正直、Rust を使わなくていいプロジェクトは 90% だと思う。ただ、残り 10% の「本当に速く、本当に安全でなくちゃいけない」プロジェクトでは、Rust の価値は無限大。

うちのチームでも、次は「高スループット API サーバー」を Rust で書く予定。そこでメリットが出ると見込んでる。

最後に、Rust は「学習コスト高い」は本当だけど、「やりきると得られる知見の価値も高い」も本当。Python/Go しかやってないエンジニアにとって、Rust の設計思想は「こういう制約の下で書く選択肢もあるのか」という気づきをくれる。キャリア投資としては悪くない。

ただし、以下の 3 点は忘れずに:

  • 時間に余裕があるときに始める
  • 小規模プロジェクトで実装する
  • チーム全体で学習する気がないなら、1 人で突っ走らない

まとめ

  • Rust の学習曲線は本当に急だけど、その先の設計思想は価値がある——6 ヶ月で所有権とライフタイムが体感できれば、他の言語のメモリモデルも深く理解できるようになる
  • パフォーマンスと安全性は本当だが、全てのプロジェクトで活躍するわけではない——高スループット API、CLI ツール、エッジコンピューティングなど、本当に必要な場面を見極めることが重要
  • エコシステムの成熟度はまだ Go/Python より劣る——フレームワーク選択やライブラリ品質にばらつきがあるため、プロジェクト開始時の調査が大事
  • ビルド時間が長く、開発ループが遅い——ローカル開発での効率性は落ちるので、チーム全体の生産性を考慮する
  • やるなら「本当に必要な場面」で、小規模から始める——まずは月 3 ヶ月の学習+小規模マイクロサービスの実装で、Rust の本当の価値を体感することをお勧めする

次のステップとしては、Rust で簡単な REST API サーバーを書くか、既存の Python/Go スクリプトを Rust の CLI ツールで置き換えるのが現実的な入口。そこで「言語を選ぶ意思決定」の解像度が上がるはずだ。

U

Untanbaby

ソフトウェアエンジニア|AWS / クラウドアーキテクチャ / DevOps

10年以上のIT実務経験をもとに、現場で使える技術情報を発信しています。 記事の誤りや改善点があればお問い合わせからお気軽にご連絡ください。

関連記事