この記事は 「Pythonって、たぶんそういう意味じゃない」シリーズ の第12弾です。
Python歴5年以上、メインで使い続けてきた変態が書いています。
この記事は 個人の経験に基づくポエムです。
環境・用途・経験によって異なる場合があります。
Rustが、全く書けない。
誇張ではない。読める。理解もできる。ドキュメントを読めば「あ、こういうことね」と納得できる。
でも、ゼロから書こうとすると手が止まる。
一方で私は何をしているかというと、
- Pythonで不正アクセス検知のロジックを書いている
- Discordボットを何個も作っている
- AI学習データの処理パイプラインを組んでいる
- OSSライブラリを公開して、コンパイル機能まで実装している
いわゆる「普通にコードを書いている人間」ではある。
それでもRustは、全く書けない。
先に断っておくこと
先に断っておくと、この記事はRustを否定したい話ではない。
型システムと所有権モデルを武器に、安全性と速度を両立させる設計は、普通に考えてかなり高度だと思っているし、実際に使いこなしている人は素直にすごいと思う。
この記事は、「なぜ自分はそれができないのか」を整理するための、ほぼ自己分析だ。
結論:私は「新しいことをする」が苦手だ
最初に結論を書く。
私はプログラミングができないのではなく、新しい環境で一からやり直すことができない。
この2つは似ているようで、実際にはかなり別物だ。
具体的に、何につまずくのか
Rustのコードを見て、毎回こう思う。
で、これはなんで怒られてるんだ?
たとえばこんなコードがある。
let str = String::from("Hello, world!");
let str2 = str; // ①所有権がstr2に移動する
println!("{}", str2); // ②これは動く
println!("{}", str); // ③これはコンパイルエラーになる
Pythonの感覚だと、変数に代入したものを後で参照するのは当たり前のことだ。
でもRustでは、str2 = strをした瞬間に所有権が移動してしまい、
元のstrは「もう使えない変数」として扱われる。
Pythonなら何も起きない一行が、Rustではコンパイルすら通らない。
Vec(Pythonでいうリスト)でも同じことが起きる。
let v1 = vec![1, 2, 3];
let v2 = v1; // 所有権がv2に移動
// この後 v1 を使おうとするとエラー
Rustの所有権システムを解説している記事の多くが、
「初心者が挫折して諦めてしまうのはもったいない」と書いているのを見て、少し安心した。
自分だけがつまずいているわけじゃなかった。
Pythonならstr2 = strと書いて、そのままstrもstr2も自由に使い続けられる。
その気軽さに慣れているぶん、Rustの厳格さに毎回面食らう。
PythonとRustは方向性が真逆
業務でPythonを書くとき、だいたいこう考える。
- とりあえず動くものを書く
- エラーが出たら直す
- 型は気にしすぎない
- 動いたら次に進む
Rustではどうか。
- コンパイラが通らないと何も動かない
- 所有権でまず詰まる
- 型を正確に理解していないと一行も進まない
- 「動いたら次」が通用しない
私はRustを書いていて、
これ、あとで直せばいいや……
と考えてしまう。しかし「あとで」は来ない。来る前にコンパイルエラーで止まる。
「勉強しよう」と思っても続かない理由
これはRustに限った話じゃない。
心理学には「現状維持バイアス」という言葉がある。
人は変化に伴うリスクや不確実性を避けるため、慣れ親しんだ状態を維持しようとする傾向がある、という認知バイアスだ。
さらに、人間には損失回避性という性質もある。
未知のものを受け入れると、今より損をするかもしれないというリスクを感じ、それを避けようとする心理的な作用が働く。
新しいことを学ぼうとするとき、人はすでにできることと無意識に比較する。
Pythonなら30分でできることが、Rustだと3時間かかる。
その「3時間の非効率」が損失のように感じられて、脳が「今日はPythonでいいか」と判断してしまう。
これは怠慢ではなく、脳の仕組みだったらしい。
現状維持バイアスは誰にでも起こる一般的な傾向で、意志の弱さの問題ではないとされている。
すでに効率的にできる手段があるのに、あえて非効率な方を選び続けるのは、脳の初期設定からして自然なことだった。
Rustはスポーツに近いのかもしれない
最近思う。
Rustを書くのは、Pythonを書くのとは使っている筋肉が違う。
- 所有権を意識する
- ライフタイムを追う
- コンパイラと対話する
- 一行進むごとに正しさを確認する
私が普段鍛えているのは、
- とりあえず動かして確認する
- 試行錯誤しながら形にする
- ライブラリを組み合わせて素早く作る
という筋肉だ。だから、Rustをすらすら書けるエンジニアを見ると、素直に「すごいな」と思っている。
自分にはない訓練を積んでいて、自分にはない感覚を持っている。
じゃあ、どうすればいいのか
Pythonを覚えたときのことを思い出した。
最初から複雑なものを作ろうとしていない。
Discordの電卓ボットとか、簡単な設定ファイルの読み込みとか、
「作ってみたいもの」を、簡単なところから少しずつ始めた。
「勉強しなきゃ」ではなく「これ作ったら楽しそう」から始めると、
非効率さより楽しさが上回る瞬間が来る。
- いきなり難しいことをしない → 挫折するだけ
- 作りたいものを決める → モチベーションが勉強を上回る
- 簡単なところから → 「動いた」の成功体験を積む
Rustも、多分同じように始めればいい。
不正アクセス検知のロジックを移植するとか、ハードルの高いことからではなく、
もっと小さい「作ってみたいもの」から始めればよかったのかもしれない。
じゃあ、Rustができない私はダメなのか
別にダメではない、と思いたい。
- Rustが書ける = 優れたエンジニア、ではない
- Rustが書けない = 仕事ができない、でもない
ただし、
- 所有権への感覚が鈍い
- 型に厳密に向き合う訓練が足りていない
という事実はある。
それを自覚したうえで、
- Rustを頑張るのか
- Python特化で生きるのか
選べばいいだけだと思っている。
まとめ
- 私はRustが全く書けない
- それでも毎日プログラミングをしている
- 「新しいことができない」のは怠慢ではなく、現状維持バイアスという脳の仕組み
- 作りたいものを、簡単なところから始めると勉強は続く
同じように、「新しい言語や技術になかなか手が伸びない」という人がいたら、それは多分、あなただけではない。
少なくとも私がそうだからだ。
「Pythonって、たぶんそういう意味じゃない」 シリーズでは、
こういう"なんとなくで語られがちなPython"を言語化していきます。
👉 ストックをフォローしておくと次の記事を見逃しません!