見出し画像

Go とは違う。僕が Rust に感じた “育てる” 面白さ

効率の Go 、対話の Rust。
僕がシステムプログラミングの新たな扉を開くまで

プログラミング言語には「性格」がある。

僕にとって Go 言語は、多くを語らずとも背中を任せられる、寡黙で信頼できる “相棒” だった。

しかし、ある日出会った Rust は、まるで違った。彼は僕に絶えず問いかけ、対話を求め、そして共に悩みながらコードを “育てて” いく、厳しくも愛情深い “師” のようだった。

これは、僕が効率の先にある、プログラミングの新たな面白さを見つけるまでの物語。

もしかしたら、プログラミング言語をこんな風に語るのは、少し奇妙に聞こえるかもしれません。技術の世界では、もっとドライで客観的な事実だけが求められるのかもしれないから。

でも僕は、僕たちが書くコードの一行一行には、その裏側に必ず、喜びや苦悩、そして小さな発見といった「物語」が息づいていると信じています。

これからも僕は、そんな技術と心の交差点にある物語を、僕なりの言葉で綴っていきたいと思っています。もしよかったら、この少し風変わりなエンジニアの冒険に、もう少しだけお付き合いいただけると嬉しいです。


あなたの 「相棒」 は、どんな性格ですか?

フリーランスという孤独な航海において、プログラミング言語は単なる道具以上の存在だ。ときには羅針盤となり、ときには碇となり、そして多くの時間を共にする「相棒」とも言える。

みなさんにとって、その「相棒」は、どんな性格をしているだろうか?

僕にとって長年の相棒は、Go 言語だった。

彼との出会いは、僕のフリーランス人生に「静かな自信」という名の、大きな安定をもたらしてくれた。彼の魅力は、なんといってもそのシンプルさと実直さにある。余計なことは一切語らず、ただ黙々と、しかし確実に僕の指示をこなし、安定した成果物を生み出してくれる。

クライアントから託された複雑な案件も、彼と一緒なら大丈夫。そう思わせてくれる絶大な信頼感が、Go 言語にはあった。彼は、僕にとって最高のビジネスパートナーだったのだ。

寡黙な相棒、 Go 言語との日々

Go 言語との日々は、平穏そのものだった。

彼の得意技は、コンパイルの速さと、実行可能な単一のバイナリをポンと吐き出してくれる手軽さ。

Docker イメージは驚くほど小さくなり、デプロイの心理的ハードルをぐっと下げてくれた。まるで魔法のようだった。

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

この数行を書けば、すぐに世界が動き出す。複雑なルールも、難解な作法もいらない。「とりあえず動かして、それから考えよう」というフットワークの軽さを、彼は僕に教えてくれた。

ある API サーバー開発の案件では、彼の真価が遺憾なく発揮された。goroutine を使えば、並行処理も驚くほどシンプルに書ける。静的型付け言語でありながら、その書き味はまるで動的型付け言語のように軽やかだった。

納品したサーバーは安定して動き続け、クライアントからも高い評価を得ることができた。Go 言語は、フリーランスとしての僕の信頼を静かに、しかし確実に積み上げてくれる、最高の相棒だったのだ。

しかし、その安定した日々のなかで、僕の心にはある種の “渇き” が生まれていた。

Go 言語のシンプルさは、思考のノイズを減らしてくれる一方で、コンピュータの奥深くで何が起きているのかを、僕から少しだけ遠ざけてしまう感覚があった。

ガベージコレクタという優秀な執事が、僕の知らないところでメモリの後始末を完璧にこなしてくれる。それは非常に快適なのだが、心のどこかでこう思う自分がいた。

「もっと深く、コンピュータと対話したい」と。

僕は、ただ道具を使うだけでなく、その道具が動く仕組み、その魂の根源に触れてみたくなっていたのかもしれない。

Rust という名の、厳格な師との出会い

そんなとき、僕の目に飛び込んできたのが「Rust」という名前だった。

きっかけは、WebAssembly(Wasm) への興味だった。ブラウザ上でネイティブに近いパフォーマンスを発揮するというその技術は、僕の好奇心を強く刺激した。そして、その文脈で頻繁に登場するのが Rust だったのだ。

調べてみると、彼は Go 言語とは全く違う性格をしているようだった。

「メモリ安全性を、ガベージコレクタなしで保証する」

その一文だけで、僕の胸は高鳴った。それはまるで、魔法の裏側にある、緻密な物理法則を解き明かすような響きがあった。

公式ドキュメントを読み進めると、「所有権」「借用」「ライフタイム」といった、これまでのプログラミング人生ではあまり意識してこなかった、厳格で、どこか哲学的な響きを持つ言葉たちが目に飛び込んでくる。

Go 言語が「Just get things done.(とにかく、やり遂げよう)」という実践的な思想なら、Rust は「Do things right.(正しく、やり遂げよう)」という、職人的な哲学を感じさせた。

それは、僕が心の奥底で感じていた “渇き” を潤してくれる、甘美な響きを持っていた。

僕は、この厳格な師の門を叩いてみることに決めた。それが、長く険しい、しかし発見に満ちた対話の始まりになるとも知らずに。

赤いエラーコードは、対話の始まりだった

Rust の学習は、これまでのどんな言語とも違った。それは、自分のプライドが粉々に砕かれるような体験の連続だった。

意気揚々と書き始めた最初のコードは、コンパイルボタンを押した瞬間、おびただしい量の赤いエラーコードと共に僕に突き返された。

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}, world!", s1); // ここでエラー!
}

Go 言語なら何の問題もないはずの、単純な代入と表示。しかし、Rust コンパイラはそれを許してくれなかった。

error[E0382]: borrow of moved value: `s1`

「s1 の値は s2 にムーブ(移動)されたから、もう君は s1 を使うことはできないよ」

コンパイラはそう、冷たく言い放った。これが、かの有名な「所有権」の洗礼だった。

僕は何度もコードを書き直し、そのたびにコンパイラに突き返された。まるで、頑固な師匠に「基本がなっていない!」と、何度も竹刀で手を叩かれているような感覚。正直、心が折れそうになった。フリーランスとして十数年やってきた自信が、音を立てて崩れていくのを感じた。

「なぜ、こんな単純なことさえ自由にさせてくれないんだ…」

しかし、その格闘が数日続いたある夜、ふと気づいたのだ。

僕がうんざりしていた、あの長く丁寧なエラーメッセージ。それは、僕を貶すためのものではない。むしろ、僕が危険なコードを書いてしまうのを未然に防ぎ、より安全で、より良い設計へと導くための、彼からの真摯な「対話」の試みなのではないか、と。

彼は、僕が犯した間違いを指摘するだけでなく、なぜそれが間違いなのか、そしてどうすれば正しくなれるのかを、常に示唆してくれていた。

そう気づいた瞬間、僕の中で何かが変わった。

赤いエラーコードは、拒絶のサインではなく、対話の始まりを告げる合図になった。

僕は、ただ一方的に命令を「書く」のをやめた。代わりに、コンパイラと「対話」し、彼が納得してくれるまでコードを丁寧に「育てていく」という感覚に目覚めたのだ。

それは、効率や速度だけを追い求めていたときには決して味わえなかった、プログラミングの新しい面白さだった。

僕が Rust を “育てている” と感じる 3 つの理由

この「コードを育てる」という感覚は、一体どこから来るのだろうか。

メンバーシップに参加してくれているみなさんには、その感覚の正体を、Rust が持つ 3 つの哲学的な特徴と結びつけながら、もう少し深く共有したいと思う。

ここから先は

2,314字 / 1画像

メンバーシップ ¥ 500 /月

■メンバーシップ 15 年目フリーランス開発者のひとり戦略を支える作戦会議室です。\ 案件に追われる…

ベーシックプラン

¥500 / 月

最後まで読んでいただき、ありがとうございます。もしこの記事が「役に立った」「心に響いた」と感じたら、珈琲一杯分サポートいただけると嬉しいです。あなたの温かい応援を力に、また次の創作活動に励みます。