大事なこと🥺
僕自身の感想であって、何かを押し付けるわけではなく、感想は人それぞれです。
自己紹介
経験で言うと
Rubyだけ (型なし)
↓
Ruby, Vue (型なし)
↓
Go, React (型あり)
みたいなキャリアを歩んできました。
初めて型を書いた日はカルチャーショックが強くて、なんて無駄な時間なんだと小一時間悩みました。
動的型付けも静的型付けも、結局のとこ書き慣れてる方が楽に感じると思ってて
静的型付けじゃなきゃ嫌だって人は、好みに引っ張られまくりな気がする。
一方で、広い目線で見渡すと、Rubyもjavascriptも動的型付けだったのに、静的型付けっぽく書けるようにrbs
やTypeScript
ができたり、型を書き慣れてる人がいっぱいいて、需要があるんだろうなと思っていて、結局は全エンジニアが型を書くことになるんだろうなとゆるく思ってます。
注意時刻
以下、デメリットは裏返しになるだけなので、書きません。
またパフォーマンス面での比較も重要な指標になりますが、表面的なメリットしか考えないことにします。
大概のwebサービスは静的型付けでも動的型付けでも、試行錯誤である程度のパフォーマンスは出せるはずです。
メリットを考える
開発速度が速い/遅いについては議論しないです。あなたの実力次第だと思いました😈
静的型付けのメリット
ソースがすぐ見つかる
ライブラリのソースを見つける速度が、本当に体感100倍ぐらい違います。
一方でTypeScript
はライブラリのソースを読みたいのに、型定義書に飛ぶので、ムカつく(vscodeの設定で解決できそうだけど知らん)
typoが存在しない
地味なんですが、開発効率上がってるはずです。コンパイルする前から、vscode側が判定して指摘してくれるので、railsみたいに、ローカルでは動くのに、デプロイした時だけ動かないみたいなこともないです
どういうオブジェクトが渡されているのか、一目でわかる
当たり前なんですが、、威力のあるメリットだと思っていて、ソースが膨大になる程、良い影響がありそうです。
// go
func Xxxx(u User) {
fmt.Println(u.name)
}
動的型付けのメリット
オブジェクトを気軽に生成できる
一時的にしか使わないオブジェクトとかはRuby
とかjs
っぽいなと思ってて、
Rails
だと、ActiveRecord
のレコードの集合をパースして、扱いやすいオブジェクトの配列に変換したりするコードって、動的型付けらしいなと思います
# ruby
name_with_num_items = User.all.map do |user|
{
name: user.name,
num: user.num
}
end
静的型付けのメリットをデメリットだと思っていない
身も蓋もない話なのですが、地味にあるなと思ってて.
ソースを見つける速度
Rails
だと、クラスからソースの場所がわかるようになっていたり、何だかんだオブジェクトはActiveRecord
に集約されたり、動的型付け言語側がわかりやすい仕様にしているなと感じることが多いです(js
は除く)
typoが起きるかどうか
静的型付けも動的型付けであっても、統合テストするので、結果的に気づくには気づくはずです
引数のオブジェクトの型が何なのか
動的型付けだと、変数名を変に省略せずにわかりやすくする傾向があることや、オブジェクトがファイル名になっていたり、見つけやすいことが多いとも思ってます.
少しダックタイピングな感じで気持ち悪いと感じる人も多いかもしれないですが😇
# ruby
# app/models/user.rb
class User < ApplicationRecord
end
def xxx(user) # ActiveRecordのUserしか考えられない
p user.name
end
勘違いしていたこと
動的型付け言語の現場から、静的型付け言語の現場に転職するときに、思っていたことの答え合わせを少しします。
静的型付け言語だとバグが少ないのでは?
そんなことありませんでした。
バグが少ないかどうかは、エンジニア側の実力とチームのテストやレビューの精度が影響するのであって、静的型付けは安全だと思ってる人は、滝に打たれるべき😵
TypeScriptを一度経験したら、TypeScirpt信者になるのでは?
そんなことありませんでした。
むしろ、脳死でTypeScript
って言ってる人はヤバいということがわかりました。
TypeScript
にするかは、
- ソースコードの規模が大きい
- メンバーで
TypeScript
に慣れてる人がいる - API側が静的型付け言語
辺りを考慮に入れて、最終的にはCTOがどうしたいのか、ぐらいの意思決定になりそうだなと思いました。
特にAPIがRails
で、エンドポイントごとに返却するオブジェクトの型が様々ある場合は、意外とTypeScript
だとしんどくなりそうだなと思いました🤲
逆にGo
だと、構造体を丸ごと返却することが多いので、TypeScript
と相性が良いなと思いました.
更に細かい話をすると、Vue
はTypeScript
が書きにくくて、React
はTypeScript
が書きやすい、みたいな宗教上の違いもあって、TypeScript
を使いたいからフレームワークの選定が変わってきたりもすると思いました😤
初めて静的型付け言語を書くので、適応できなくて苦労しそう...
そんなことありませんでした。
TypeScript
もGo
も初日はビックリビックリすることが多かったのですが、何だかんだ半年もすればある程度は手に馴染みます。
もちろん、業務外でもいっぱい自習してる前提です😈
とはいえ、ライブラリのソースを読むときに、ジェネリクスがふんだんに使われたりしていて、読むのに少し時間かかったりもします。
まあ、両方やったことが自分にとって良い経験になっています。