この記事は セゾン情報システムズ Advent Calendar 2020 23日目の記事です。
#はじめに
この記事は、C言語開発で育ったおっさんがRust学習の体験を淡々と描く物です。
#今回の記事のきっかけ
入社してからずっと、私はC言語を中心とした世界で開発をしてきました。
開発しているものの特性上ネイティブモジュールを新旧様々な環境に提供する必要性があり、他の言語への置き換えが難しかったためです。
ただ、近年発展しつつある様々な開発支援ツールもC言語開発ではうまく使うことができず、昔ながらの開発やテスト手法で開発速度をあげつつ品質を向上させる事に限界を感じていました。
そこで開発チームでは一部機能の開発ではGoでの開発を模索していているのですが、性能を求められる製品ではRustが向いているのではないかとも考えており、そのためにまずはどのようなものかを試してみようと考えました。
おっさんの特徴
項目 | 内容 |
---|---|
年齢 | アラフォー |
職業 | C言語開発者→製品企画担当→プロダクトマネージャー (実は最近開発していない) |
得意な言語 | C言語。そもそも他の言語開発経験が少ない |
開発環境 | Windows OS/ WSL2 /VS Code(vim操作) |
学習した内容
Rustには様々な学習コンテンツが用意されています。
細かいことは、ちょうど弊社の他の方が書かれた以下の記事などがわかりやすいので参照してみてください。
Rust やろうぜ!
その中でも、入門書的な以下のサイトを参考に、頭から学習を実施しました。
The Rust Programming Language 日本語版
ただ、無料の学習資料だしそこまで量無いだろうと完全に舐めていて思ったよりも量が多く、最後まで到達できず今回は9章までの学習となりました。
またのんびり勉強して、いつか後編を上げたいと思います。
学習して感じたポイント
勉強をしてみて、C言語での開発と比較して感じたポイントとしては
- C言語だと苦労しないと実現できなかった事が簡単に実現できる
- C言語ではできてしまうがゆえにバグを生む部分を、うまく制限できている
- 基本的な機能がC言語より多いため、覚えることが多く大変
学習コストは高いものの、学習すればそれだけの恩恵を受けられそうな言語だと感じました。
特に良いと感じたのは、所有権の概念により安全かつ高速にメモリ管理が行える事。
C言語開発でありがちなメモリ管理ミスを大幅に減らしてくれるのではないかと。
まとめ
やはりC言語に変わるプログラミング言語を目指しているだけあり、C言語の欠点を見事に改善しているイメージがあります。
さらに学習情報などが無料で豊富に公開されており、学びやすいことも好印象でした。
ただし、いくらシステム的にミスを減らす取り組みがされていると言っても、やれることが多いが故に、綺麗なコードが書けるかというのは別問題だと感じました。
まだまだRust開発が可能な開発者も少ないため、如何にRustで綺麗なコードを書ける開発者を育てていくかが製品採用に向けた課題かと考えています。
そうは言ってもRustへの期待値は高いので、まずはこの学習を一通り終え、次は通信できるコマンドあたりを開発してみたいと思います。
(おまけ)学習して感じたメモ
ここからはThe Rust Programming Language 日本語版の章毎に感じたことをダラダラと記載。
-
事始め
Cargo、Rust公式のビルドシステム。
こういった仕組みがデフォルトで用意されているのがありがたい。
C言語だと有志で作られたものはあれど環境によっては使えなかったりするので…… -
数あてゲーム
変数の扱いで若干戸惑い。この後語られるという変数と可変性とは……
Result型、C言語のように混迷極める帰り値の世界ではないのが嬉しい。
分岐の書き方、かっこじゃないので戸惑い。これは慣れかな。 -
一般的なプログラミングの概念
やはり変数の扱いが、ある程度開発をしてみないと慣れないかも。
ただ、コーディングミスを減らしてくれそうな期待はある。
あと、文と式の概念は戸惑いました。以下のような何の計算もしない値だけを置くのが許されるのかと。
fn five() -> i32 {
5
} -
所有権を理解する
書いてあること複雑だけど、感動した。
Cでありがちな参照地獄でどこからいつ使われるのかわからなくなる問題を発生させなくしてくれるなと。
あと、スライスいいですね。C言語でやろうとしたらとてつもなく面倒ですから…… -
構造体を使用して関係のあるデータを構造化する
「トレイトの導出で有用な機能を追加する」デバッグ機能など便利なのですが、理屈がわからず。
あと構造体のメソッド、Cでも頑張れば実現できなくはないけど簡単で安全で便利。 -
Enumとパターンマッチング
enumと思ったら、データを直接添付できるのか……
便利やん……
しかも構造的な型も行けるのか……
さらにメソッドも定義できるのか……
なんでもありやん……
そしてNULLの代わりのOption。やっとぬるぽ地獄から開放されるのか……
match/if letはCのswich/if elseよりちょっと便利になっている感じ。 -
肥大化していくプロジェクトをパッケージ、クレート、モジュールを利用して管理する
モジュールの構造や公開あたりは概ね理解。ただ、慣例的なやり方など意識して使うよう注意がいるのだなと。
例えばglob演算子は便利そうだけど、便利だからと製品コードで使ってしまうようなことが無いようにしないと。 -
一般的なコレクション
ベクタ、(C言語以外では)見かける配列構造。Enum使えば色々な方を混在できるというのが不思議。
String、必ずUTF-8エンコードされている。逆に日本語データ扱う際に注意しないと。
文字列の扱い自体はC言語のsprintfなどでもできそうなものだけれども、複雑なメモリ管理が不要だったり所有権のおかげでミスなどの発生は抑えられそう。
ハッシュマップ、基本機能として説明されるのですね。あまり使われないと補足はあるけれども。 -
エラー処理
panic!すべきかするまいか。明示的にassert呼ぶかどうかと同じ考え。
製品コード内で正規の処理で呼ぶことはないかなと。デバッグやテストで使うのかしら。