Back to Blog
Rustプログラミング初心者個人開発AI

Python・VBA畑の自分が初めてRustを書いて感じたこと

Python・VBA畑の自分が初めてRustを書いて感じたこと

Excel Sheet Picのデスクトップアプリ版を作るために、初めてRustを書きました。

普段使っているのはPythonとVBA。型を意識することも少なく、動的に書いて動かして直す、というスタイルに慣れきっていました。

そんな自分がRustに飛び込んでみて、率直に感じたことをまとめます。

Rustを選んだ経緯

デスクトップアプリを作るフレームワークとして Tauri を選びました。TauriのバックエンドはRust。つまり、Rustを避けては通れない。

詳しい開発の流れは別記事にまとめています。

Excel Sheet PicをTauriでデスクトップアプリ化した話

最初の壁:所有権と借用

Rustで最初にぶつかる壁は、間違いなく所有権(ownership) です。

Pythonでは何も考えずに変数を渡せます。

data = [1, 2, 3]
process(data)
print(data)  # 普通に使える

Rustでは、値を関数に渡すと所有権が移動します。

let data = vec![1, 2, 3];
process(data);
// println!("{:?}", data);  // エラー!もうdataは使えない

最初は「なんで使えないの?」と混乱しました。

解決策は借用(borrowing)&をつけて「貸す」だけにすれば、元の変数も使い続けられます。

let data = vec![1, 2, 3];
process(&data);  // 借用(参照を渡す)
println!("{:?}", data);  // OK!

概念を理解するまでは苦しかったですが、「誰がこのデータの責任者か」を常に意識する設計は、コードの安全性を確実に高めていると感じました。

コンパイラが厳しい、でもそれがいい

Rustのコンパイラは本当に厳しいです。

型が合わない、借用ルールに違反している、未使用の変数がある...。些細なことでもコンパイルを通してくれません。

最初はストレスでした。Pythonなら動かしてからエラーを直せばいいのに、と何度も思いました。

でも、途中から気づきました。

コンパイルが通ったコードは、ほぼ確実に動く。

Pythonだと「動いているつもりが、特定の入力で落ちる」ということがよくあります。Rustではそれがほとんどない。コンパイラが事前に問題を潰してくれるからです。

しかも、エラーメッセージが親切。「ここが問題です、こう直してみてください」と具体的に教えてくれます。慣れてくると、コンパイラとの対話がむしろ楽しくなってきました。

Python・VBAとの違いで驚いたこと

型を明示する安心感

PythonやVBAでは型を省略できます。楽ですが、「この変数、何が入ってるんだっけ?」と迷うことも多い。

Rustでは型が明確です。関数の引数も戻り値も、何を受け取って何を返すかが一目でわかる。

fn load_sheets(path: &str) -> Vec<String> {
    // pathは文字列の参照、戻り値はStringのリスト
}

これは規模が大きくなるほど効いてくると感じました。

エラー処理が強制される

Pythonではtry/exceptを書き忘れても動きます。RustではResult型でエラー処理が強制されます。

let file = File::open("data.xlsx")?;  // 失敗したらエラーを返す

面倒に感じる反面、「エラーを握りつぶして気づかないまま進む」ということが起きない。業務ツールを作る上で、これは大きな安心材料です。

nullがない

Rustにはnullがありません。代わりにOption型で「値があるかもしれないし、ないかもしれない」を表現します。

let sheet_name: Option<String> = find_sheet("keyword");
match sheet_name {
    Some(name) => println!("見つかった: {}", name),
    None => println!("見つからなかった"),
}

PythonのNoneチェック忘れでクラッシュ、という経験がある人には刺さる設計です。

難しかったこと

正直に書きます。

  • ライフタイム - 借用がどこまで有効か。これは今でも完全には理解できていない
  • 文字列型の多さ - String&strの使い分けに最初は混乱した
  • エラー型の変換 - 異なるエラー型をまとめて扱うのが面倒だった

でも、今回のようなTauriアプリ(Rustコマンドを3つ書く程度)なら、これらの難しさは最小限で済みました。

正直に言うと、AIエージェントなしでは無理だった

ここまで読むと「Rust初心者が短期間でデスクトップアプリを完成させた」ように見えるかもしれません。

実際には、OpenAIのCodex(AIコーディングエージェント) の力を大きく借りています。

Rustの所有権やライフタイムの概念は理解できても、実際にコードとして書き起こすのは別の話です。umya-spreadsheetのAPIの使い方、Tauriコマンドの書き方、エラー型の変換...。Rust初心者の自分がゼロから調べて書いていたら、何倍もの時間がかかっていたはずです。

AIエージェントにやってもらったこと:

  • Rustコマンドの実装コード生成
  • コンパイルエラーの原因特定と修正提案
  • umya-spreadsheetのAPI利用パターン
  • Tauri v2の設定ファイルの書き方

自分がやったこと:

  • 「何を作りたいか」の設計と判断
  • 書式保持のアプローチ選定(「コピー」か「削除」か)
  • 生成されたコードの検証と動作確認
  • 実際のExcelファイルでのテスト

つまり、「何を作るか」は自分で考え、「どう書くか」はAIと一緒に進めた という形です。

これは恥ずかしいことではなく、むしろ2026年の個人開発のリアルだと思っています。AIエージェントがあるからこそ、未経験の言語でも「やってみよう」と踏み出せる。学習コストの壁が大きく下がっている今、挑戦しない理由がない。

「また書きたい」と思えた理由

Rustは難しい。それは間違いない。

でも、書き終えたあとの安心感が全然違います。

  • コンパイルが通れば実行時エラーはほぼない
  • メモリ管理をランタイムに任せないから、パフォーマンスが安定
  • 型とエラー処理が厳密だから、数ヶ月後に読んでも意図がわかる

Python・VBAは「速く書ける」、Rustは「安心して動かせる」。

業務ツールのバックエンドのように、確実に動いてほしい部分にはRustが向いていると感じました。次に何かローカルで動くツールを作るときも、Tauriを使うと思います。

まとめ

観点 Python / VBA Rust
学習コスト 低い 高い
実行時エラー 起きやすい ほぼない
型安全性 弱い 強い
エラー処理 任意 強制
書く速さ 速い 遅い(最初は)
動かす安心感 普通 高い

初めてのRustは戸惑いの連続でしたが、「コンパイルが通れば動く」という体験は新鮮でした。

Tauriのおかげで、UIはいつものWeb技術で書きつつ、バックエンドだけRustに挑戦する、という入り方ができたのも大きかったです。

Rustが気になっているけど踏み出せない方には、Tauriアプリ開発から入るのをおすすめします。Rustを書く量が限定的なので、無理なく始められます。

→ 実際のTauriアプリ開発の流れは こちらの記事 にまとめています。

Share:
View all posts