見出し画像

RustとTypeScriptを半年書いたおっさんの感想

どうも~!おっさんです。

プログラマー15年目の私が、TypeScriptを仕事で7か月半、Rustを趣味で5か月半ほど並行して書きました。この2つの使用感を述べたいと思います。

いずれも半年程度ですけど、やはり、TypeScriptのほうが仕事で使ってる分、時間的には長いので、使い込んではいると思います。ですので、比較の際はその点は割り引いて考える必要があるとは思います。

TypeScriptはとにかくスムーズ

今まで使ってきたプログラミング言語の中では、最もスムーズに仕事ができてる感じはします。本当にストレスが無い。VSCodeも使いやすい。。

少し気になる点があるとしたら、素のenumはあんまり使わないほうがいいよ、と言われていることと、オーバーロードの書き方がアレなことと、たまにany型を使わないといけない部分くらいですね。

でも、普通の範囲のことをやるなら、これで十分ですね。モジュールもnpmにいっぱいあるので、選び放題ですし。。

ストレスフリーな仕事をしたい方とか、プログラミング言語なんていくつも覚える気無いよ!という方にはマジでおすすめ。
1. AIを作りたいとか
2. AIの前提になるデータ分析がしたいとか
3. 超絶圧倒的に高速なbotが作りたいとか
そういうの以外の普通のことでいいのであれば、TypeScriptでできることだけやっていても、縦横無尽に動ける気がします。EthereumのブロックチェーンとかNFTもTypeScriptでいじれますし。。

言語仕様だけで言ったら、Kotlinとかも良い部分は多いとは思いますけど、やっぱり、TypeScriptのほうが、VSCodeで使いやすいって所がポイント高いですね。VSCodeは何にでも使い回せてホント便利なんですよね~。Kotlinの本家はやっぱ、IntelliJなんで。。

Rustはアタマをひねる場面も

上に3つ挙げたうちの3番目をやりたいと思ったので、Rustもいじってます。それと、NFT開発の際の画像生成処理にもRustを使ってます。Rustじゃなくてもできたかもしれませんが、Rustを使う機会も欲しかったので。。

で、使ったみた感想なんですが、大体は慣れました。でも、ライフサイクルが出て来るあたりで、アタマをひねる場面が出て来る気がします。単純なケースだったらまだいいんですけど、ライフサイクルとジェネリクスとなんやかんやと同時に扱う場合に、「ハイ!わけ分からん!」って諦めて、ダサい書き方に甘んじてるケースがあります。そこで粘ってれば、分かるようになるかもしれませんが、業務外の貴重な余暇を費やして書いているため、それよりも、さっさと動くものが欲しいので、あまり深く考えてるひまもない感じです。「C++だったら、ああ書いて終わりなのになぁ」みたいな感じです。C++を5年半書いたおれでも、ライフサイクルはC++には出て来ないので、まだ慣れない感じですね。

Rustで最初にハマったのは、文字列結合ですね。よくあるプログラミング言語では、単純に「+」で結合して終わりなんですけど、Rustの場合、もっと処理効率の良いメソッドがあって(まぁ、Javaで言う所のStringBuilderみたいなもんなんでしょうけど)、でも、ちょっとした作業にそこまでやる気無いわ、ってなります。特に、ソースコード生成みたいなことをやる場合って、やっぱり、+で連結できたほうが、分かりやすいっていうのもあるんですよね。その場合は、そんなにパフォーマンスは大事でもないですし。。結局、そういうケースでは、こう書いてます。

lines.push(String::new() + "let val = " + &hoge + ";");
lines.push(String::new() + "let val2 = val * 2;");
lines.push(String::new() + "let val3 = val * 3;");

String::new()は冗長やな、ってなりますけど、結局、こう書けば、1行ずつ完結するし、左側が揃うことで右側が見やすくなるんですよね。

というわけで、たまに
「あぁ、Rust、マジ、めんどくせー」
「ちょっとしたことがいちいちメンドイ」
「これがやりたいだけなのに!」
って、Twitterに書き込んだり、ぶつぶつ独りごと言ってることがちょいちょいあります。

まぁ、これが現実なんで、そこまでの苦行をするメリットが感じられない人はやめといたほうがいいかもです。TypeScriptとかKotlin、Java、C#、Goとかで困らない内容だったら、素直にそのへんのやつにしときましょう。しかし、そこを超えて、超高速、超ハイパフォーマンスを求めるクレイジーな方だけがRustをやれば良いと思います。ちなみに、おっさんは、Rustをやめる気は毛頭無いです。そのおかげか、毛根もなくなってきましたが(笑)。

まぁ、Rustは、比較対象がC++で、「C++より便利だな」「C++より安心だな」って思える人が使うのが良い感じです。。

とは言え、TypeScriptとかよりRustのほうがしっくり来る場面もあるにはあります。色々あるとは思うんですけど、forやifの内側の括弧が要らない所とか(たまにTypeScriptでも省略して怒られる)、小数と整数別にできる所とか(これは普通でしょうけど、TypeScriptはこれがない)、変数の変更可or不可を関数の呼び出し元で指定できるところとか、自クラスをSelf(selfではなく)で参照できるところ、テストを簡単に書けるところとか、VSCodeでテストやデバッグの実行がテスト関数1個1個に付いてるボタンをポチッと押すだけで実行できるところとか、などなどです。特に最後のは、いちいちmain関数とか用意せずにエントリーポイントいくつも持てる、みたいな感じなので、それほどパフォーマンスが要らないちょっとしたことなら、テストではなく、エントリーポイント代わりに使ってます。手軽です。あ、それ言っちゃうと、この人、あんまりまともなテスト書いてなさそうだな、ってバレそうですが、まぁ、テストガッツリ書かないといけなくなったら、使い分けは考えます。

おまけ:おっさんが使ってるVSCode拡張機能

このへんです。

> code --list-extensions
dbaeumer.vscode-eslintRustでも要るんだったかどうだったか忘れた。
esbenp.prettier-vscodeRustでも要るんだったかどうだったか忘れた。
jebbs.plantuml:たまにUML図書いてます。
JuanBlanco.solidityNFT用。
matklad.rust-analyzerRust用。他にダウンロード数多い別のやつもあるけど、あっちはダメです。
ms-python.python:たまにデータ分析やってます。
ms-python.vscode-pylance:何用だっけ。。
ms-toolsai.jupyter:何用だっけ。。
ms-toolsai.jupyter-keymap:何用だっけ。。   
ms-toolsai.jupyter-renderers:何用だっけ。。
statiolake.vscode-rustfmtRust用。自動整形します。
vadimcn.vscode-lldbRustのビルド用だったような。。Qiitaの記事とかに書いてます。

関連記事

以前に書いた関連記事として、このへんがあります。良かったら、どうぞ。


この記事が気に入ったらサポートをしてみませんか?