3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

静的型付けと動的型付けを実務で扱った感想

Last updated at Posted at 2021-12-24

大事なこと🥺
僕自身の感想であって、何かを押し付けるわけではなく、感想は人それぞれです。

自己紹介

経験で言うと

Rubyだけ (型なし)
 ↓
Ruby, Vue (型なし)
 ↓
Go, React (型あり)

みたいなキャリアを歩んできました。
初めて型を書いた日はカルチャーショックが強くて、なんて無駄な時間なんだと小一時間悩みました。

動的型付けも静的型付けも、結局のとこ書き慣れてる方が楽に感じると思ってて
静的型付けじゃなきゃ嫌だって人は、好みに引っ張られまくりな気がする。

一方で、広い目線で見渡すと、Rubyもjavascriptも動的型付けだったのに、静的型付けっぽく書けるようにrbsTypeScriptができたり、型を書き慣れてる人がいっぱいいて、需要があるんだろうなと思っていて、結局は全エンジニアが型を書くことになるんだろうなとゆるく思ってます。

注意時刻
以下、デメリットは裏返しになるだけなので、書きません。
またパフォーマンス面での比較も重要な指標になりますが、表面的なメリットしか考えないことにします。
大概の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と相性が良いなと思いました.

更に細かい話をすると、VueTypeScriptが書きにくくて、ReactTypeScriptが書きやすい、みたいな宗教上の違いもあって、TypeScriptを使いたいからフレームワークの選定が変わってきたりもすると思いました😤

初めて静的型付け言語を書くので、適応できなくて苦労しそう...

そんなことありませんでした。
TypeScriptGoも初日はビックリビックリすることが多かったのですが、何だかんだ半年もすればある程度は手に馴染みます。
もちろん、業務外でもいっぱい自習してる前提です😈
とはいえ、ライブラリのソースを読むときに、ジェネリクスがふんだんに使われたりしていて、読むのに少し時間かかったりもします。

まあ、両方やったことが自分にとって良い経験になっています。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?