「TypeScript の型定義に凝りすぎじゃね?」の反応を眺める
昨日書いた「TypeScript の型定義に凝りすぎじゃね?」という記事に対して、はてブコメや Twitter でのコメントがいくつかあったので、勝手に取り上げて補足する。勢いで書いた雑文が思いの外見られていて驚いた。みんなどうやってこんな辺鄙なサイト見つけたの?まずは読んでくれてありがとね。
- ahuさんはTwitterを使っています 「自分は個人用のでも書き捨てのコードじゃないならTSを使うけど、TSはlintの延長でしかなくて型定義頑張りすぎてコストに見合ってなさそうというのはわかる https://t.co/7OhyTimsdU」 / Twitter
-
TSはlintの延長でしかなくて型定義頑張りすぎてコストに見合ってなさそうというのはわかる
-
- TOEIC3点さんはTwitterを使っています 「TypeScript の型定義に凝りすぎじゃね? https://t.co/WuUKv9AJ84 わかるなー、TLに「型を表現するためのコード」とか流れてくるけど、それ型で表現すべきじゃないだろみたいな感想を持ったりする」 / Twitter
-
それ型で表現すべきじゃないだろみたいな感想を持ったりする
-
- RENOWANさんはTwitterを使っています 「自分もあんまり頑張らないほうなので仲間がいてほっとした https://t.co/4ysUL6JMgs」 / Twitter
こんな感じの、「頑張って書いた後の効果があるのは分かるけど、頑張って書くコストに見合った効果なのか分からんよね」的なコメントが付いててよかった。僕が言いたかったのはそこ。
後述するけど「TypeScript による型定義なんて不要、皆書かなくていい」なんて一言も言っていない。そう捉えた人全然ちゃんと文章読めてないよ。TypeScript の効果は理解しているし、仕事だけじゃなくて Angular 書く時は個人でも書いてたりするから、言語全体として不要なんて全く思ってない。
もう少し誤解のないよう分かりやすく言っておくと、TS で頑張って型定義すればするほど、効果がある。良いコードになる。それは間違いなくそう思っている。
でも、そのメリットを享受するために払うコストが多すぎて、コストと効果が見合ってない場面が多いんじゃないの?少なくとも自分の観測範囲でさほどのメリットがあるようには見えていない、ということを書きたかった。
「この対象物をどうやって型定義しようか…」って悩んで、TS の機能調べ上げてこねくり回すくらいなら、設計見直してデータ構造をシンプルにするとか、リファクタリングして関数を小さく作るとかで対処した方がいいべな、と思っちゃう。さっさと動くモノ作ってそれから直したら?と。型定義による恩恵が少なく感じるぐらいに整理されたコードなら、平易で分かりやすいし、分かりやすければ色んな人に保守してもらいやすいし、というぐらいの感覚。
- 水無瀬さんはTwitterを使っています 「型パズルになるのはそうだし、やる人によって型定義のレベルが変わるのもそうだと思うけど、多少コスト払ってでも型付けといた将来平和だと思うんだよなぁ。 少なくとも関数のIn/Outは全部付けときたい。」 / Twitter
-
多少コスト払ってでも型付けといた将来平和だと思うんだよなぁ。少なくとも関数のIn/Outは全部付けときたい。
-
多少のコストならいいさ、コストかけたらいい。そうじゃなくてもっと、TS の型定義に多少じゃないコストをかけてる場合の話ね。
引数と戻り値の型が付いてると分かりやすいのは同意。自分が TS 書く時はココは必ず省略しない。僕は TS を書くとなったら、ローカル変数とか暗黙的に型が決まる場面でも必ず型書くぐらいの人間ではある。List<String> hoge = new ArrayList<String>()
みたいなのを冗長とも面倒とも思わず書いてきた人間だ。そういうレベルの型定義はいくらでもしてればいいけど、もっと複雑なヤツね。「最新バージョンでようやくこういう型が定義できるようになりました!」みたいなアレ。あんなの使い時わかんねーって思ってた。
ライブラリ・フレームワークの開発者としての視点はなかった
自分はライブラリやフレームワークを開発して、広く使ってもらおうとする経験や意思がない。だから、mizchi さんなどのコメントで指摘されていたところは、自分が全然考慮していないところだった。
- OSSタダ乗りおじさんさんはTwitterを使っています 「ライブラリと利用側で提供すべき型のレイヤーが違う。 アプリケーション層でライブラリ層の自由度を持つ必要はない。ライブラリ提供側で複雑な型を提供するのは推論を効かせるためなので目的が違う / “TypeScript の型定義に凝りすぎじゃね? - Neo's World” https://t.co/74R2KLV3KR」 / Twitter
-
ライブラリと利用側で提供すべき型のレイヤーが違う。 アプリケーション層でライブラリ層の自由度を持つ必要はない。ライブラリ提供側で複雑な型を提供するのは推論を効かせるためなので目的が違う
-
- うじまる@🥇3319さんはTwitterを使っています 「> 複雑な型の考慮が必要になっているシステム設計が悪いんじゃないか? これはわかるので複雑な型定義はJSライブラリの型定義くらいで収めておきたい感 とは言え、型は欲しい TypeScript の型定義に凝りすぎじゃね? - Neo's World https://t.co/fWhykEq6zV」 / Twitter
-
複雑な型定義はJSライブラリの型定義くらいで収めておきたい感
-
- ベルリシア💭さんはTwitterを使っています 「凝ったやつはライブラリやフレームワークに必要な表現力で、アプリケーション開発者は要素として知ってるくらいで大丈夫だと思う。JSで書けるの例も書くけど、型が信じられないコードの近くだけで済ませたい。 / “TypeScript の型定義に凝りすぎじゃね? - Neo's World” https://t.co/UK51IVeYFJ」 / Twitter
-
凝ったやつはライブラリやフレームワークに必要な表現力で、アプリケーション開発者は要素として知ってるくらいで大丈夫だと思う
-
ライブラリを使う時に、裏で複雑な型定義がされているかもしれない。フレームワークを開発する時は、そういう型定義ができるスキルが要るかもしれない。それはおっしゃるとおりだと思った。前回記事を書いたときには全く考慮していないことだった。
なので、前回の記事は、アプリケーションコードを書くだけの人間の思い、と捉えてほしい。ココの明言ができていなかった。
そんで自分は、「既に肥大化しているプロジェクトには携わらない」ことにしているので、大規模開発における複雑な型定義がどのくらい必要なのかどうかは、そもそも論じられない。「いや、大規模化したら型どころじゃなくて何してたってつらいでしょ」と思っているから、自分の生きる世界では相手にしないことにしているのだ。乱暴だろうけど俺の生き方だし、大規模プロジェクトに関わっている人のことまで一個人の俺が配慮してブログ書いてやる必要なんかないんじゃ。そこが合わなかったら Not For Me で去ればええねん。
自分が携わる場合は「肥大化する前にアプリケーションを分割して一つひとつを小さく作る」ようにしているので、比較的小規模なアプリケーションを書くだけの人にとっては、型定義を頑張り過ぎることに対して、コストと効果が見合っていないと感じる、という主旨だと理解してほしい。「そんなに無理して型定義するより any
で逃げてとりあえず実装して、テストコードちゃんと書いたら?」ぐらいに思っている。
コレはちゃんと文章読めてないんじゃない?
mizchi さんの連ツイの一箇所だけ気になったので突っ込んどく。
- OSSタダ乗りおじさんさんはTwitterを使っています 「利用側で不要なものを言語全体として不要といってしまうこの筆者のポジションは間違ってるけど、ただ型提供の不出来で利用側にライブラリ水準と同じ型の複雑さを要求が利用側に滲み出てしまってるライブラリはよくある」 / Twitter
-
利用側で不要なものを言語全体として不要といってしまうこの筆者のポジションは間違ってる
- 前述のとおり、「言語全体として不要」なんて言ってない
- いつ使うんだか必要性が分からないような新機能や、それらを駆使した複雑な Tips 記事を見て、「無理してんな」と思っていた、ということは書いた。そしてそれは「ライブラリを使うだけの側で、アプリケーションコードを書くだけの人間にとっては、」という視点で書いたものだったのは確か
-
あと以下の悪意ある捉え方も気に食わん。
- ぶたの佃煮@赤色1号さんはTwitterを使っています 「この手の記事見るたびに思うけど、ライブラリとアプリ、アプリでも簡単なWEBサイトから従来ならネイティブで書いてたような複雑なWEBアプリまで幅がある中で画一的に論じるのは筆者の見識の狭さを感じる - TypeS… : https://t.co/s6ylLVyzJp #miteru」 / Twitter
-
ライブラリとアプリ、アプリでも簡単なWEBサイトから従来ならネイティブで書いてたような複雑なWEBアプリまで幅がある中で画一的に論じるのは筆者の見識の狭さを感じる
-
- ぶたの佃煮@赤色1号さんはTwitterを使っています 「たまたまそのユースケースで要らなかったからと言って、他のケースを考慮せずに全体(この場合だと言語そのもの)に適応してしまうのは危うさを感じる(自戒を込めて」 / Twitter
-
たまたまそのユースケースで要らなかったからと言って、他のケースを考慮せずに全体(この場合だと言語そのもの)に適応してしまうのは危うさを感じる(自戒を込めて
-
見識の狭さは確かにあった。でも、「言語そのもの」を「要らなかった」なんて、どっこにも書いてないんだよね。どっかそう書いてあるところある?あるなら訂正入れる。
そもそも個人が書いた記事に対して、あらゆる場面を全て考慮し尽くした文章だと思って読もうとするの、読み方が乱暴じゃねえか?思い込みや決め付けで勝手に拡大解釈しないでくれや。この感想こそ「全体に適用」してる悪い例そのものじゃん。あと「適応」じゃなくて「適用」な。言葉間違ってんだよね。
- u-sho🌃さんはTwitterを使っています 「思っきし「使う必要はない」って書いてあった。「厳密に書く必要はないよね」のあたりしか読んでなくて、うなづいていた。TSは便利なので使いたい https://t.co/0hTicXgQ0j」 / Twitter
- 思いっきし「使う必要はない」なんて書いてないからもっかい読んでね。「大仰に使う必要ない」とは書いたよ。「大仰に」ね。コレは、何度も書いている「複雑な技巧を駆使して型定義すること」を指してる。決して TS 不要論じゃない
繰り返しになるけど、TS による型定義は書けば書くほど効果はあると思ってる。チーム開発では必要・重要なモノだと思ってる。
でも、個人や小規模なプロジェクトでは、プリミティブや簡単なクラス・インターフェースで表現できる範囲の型定義ができていれば十分だし、そういうレベルで済むようなシンプルなコードにしろや Stupid という思い。
反論を見てると、TS スキーな人が、タイトルだけ見てまずは TS をバカにされたようなイラつきを覚えて、そのイライラのまま文章読んでるから、TS の全てが不要だ、みたいな文章だと勝手に拡大解釈して怒ってんのかなと思った。筆者のポジションだ見識だ言ってるクセに、自分のポジション守りたくて先走っちゃってんじゃん。そっちがポジショントークしかける気満々じゃん。型定義頑張ってる人のことを無駄だとか止めろとか、そういうことは言ってないから落ち着いてね。プログラマでもそういうイチゼロ思考はやめなー。
バカに勘違いされて逆ギレされてんの癪だから、勘違いされないようにもっかい言っとくね。TS で型定義頑張ると、頑張った分だけ効果は間違いなくあると思ってるよ。頑張って書いてる人は偉いと思う。スゴいよね。
自分が書きたかったのは、「そこまで頑張って得られる効果が薄いと、自分は感じることが多い」「型定義を頑張らないといけない状態がまずおかしい可能性はないか・そのまま実装進めるより設計直した方がいいんじゃないか」って言いたかった。
どうしても複雑な型定義が要りそうな場面は、アプリケーションコードを書くだけの人の立場でいえば、any
で逃げちゃって、テストでカバーしときゃいいかなと思う。それでいいといえるくらい、局所的で小さな問題として閉じ込めておけるよう、最初から小さく作ろうや、デカく作るなやってことを言ってる。
設計の悪さを見つける指標として
- アカベコさんはTwitterを使っています 「テンプレート メタ プログラミング的なのは確かに。けれどこれは柔軟性とのトレード オフで他の静的型付け言語も同様。実態として型はあるのだから定義しにくい状態はむしろ設計失敗のヒントとして有用だと思う。 / “TypeScript の型定義に凝りすぎじゃね? - Neo's World” https://t.co/N3GbdKJkea」 / Twitter
- アカベコさんはTwitterを使っています 「型付けしにくいデータ構造や設計が問題なのであって型の定義をやめても実態は変わらないのだから型付けによってそれを可視化したい。Generics を求められる汎用的なものと単に曖昧なデータへの型付けはどちらも「凝った = 複雑でわかりにくい」外観してるけど実態はまったく異なるよね。」 / Twitter
型付けしにくいデータ構造や設計が問題。そう、だから、そっちを直して簡単に型付けできるようにしなよ、と思うし、前回の記事でもそう書いたはず。
悪いデータ構造や設計をあぶり出すために、むりくりな型付けをしてみせることで表現するのもあり。でも自分は、そういう「ヤバい設計」に対しては any
を付けることで違和感をもたせ、ドキュメンテーションコメントを読ませたいのよね。意図から何から、文章で書いちゃった方が、手っ取り早いかなと思ってる。
以上。
「個人で書く時は TS 使ってない、個人で書く時は TS 使わなくていいと思ってる」って、TS 不要論になるの?全然人の話聞いてないよね。「チーム開発では TS 使ってる・TS の効果はある」って何度も書いてんじゃん?「効果とコストが釣り合ってるか分からないような、複雑な型定義を見かける、そういうのは any
で逃げていいんじゃない?まず設計直しなよ」って主旨がどうしてこうも伝わんなかったかな?
TS スキーな人って何か JS にトラウマ抱えてるのかな。JS 理解しないまま、TS で書いたから大丈夫みたいなこと言ってるヤツの方が暴論だと思うんだけどな。いちいち書いてない文脈だってたくさんあるし、考慮できていない・していない領域だって人間だからあるっつーの。目くじら立て過ぎじゃって。アクセス数稼げたからいいけどさ。
TS 関係なくなるけど、ココ最近、プログラミングで何か頑張るのが辛いのは、多分ワイが歳だからなんだろうな。設計や実装をシンプルにしたいというのも、皆さんより自分は頭が良くないから、僕の知性でも維持できる程度の規模に物事を留めたいだけなんだろうな。もうなんかそういう大きなことやりたいって思えないんだよね。沢山コード書きたいとか思えないの。大量に書くことは別にできるけど、コードって保守するフェーズではどうやったって読むことになるじゃん。その頃にはどう書いたかとか覚えてないし、読み解くのももうダルいのよね。だから、読み解く労力のかからない簡単なモノだけを書いていたいの。型定義が超絶技巧になっちゃうようなコードは俺が扱うのがしんどいの。そゆこと。歳とったよ。
更に追記〜。ブコメに低脳が湧いててワクワクすっぞ〜
- 雑な文章書いておいて反応が雑だってキレて全レスしちゃうの、全然「歳と」れてないガキの反応だなと思いました。 - trickart412 のブックマーク / はてなブックマーク
- 頭に血上ってカッコの位置もおかしいもんねー、ムカついてますかね?お疲れ様ですw。ガキの反応だと思ってるモノにいちいち反論しなくていいんだよ。ガキの戯言なんだから、お前は何も思わなくていい。何も意見しなくていいんだ。黙ってなー
- そっちが俺の独り言 (個人的見解・個人サイトなんだから当たり前だろ) を拡大解釈して反応してきてんだからこっちもやるで。黙ってりゃ良かったのに的外れなこと抜かしやがって
- つかお前 ID で検索したら前々から随分ズレたこと言ってんのね
- 「たかが TypeScript に頑張り過ぎじゃね?」とか「JS を普通に書ける自分個人は、ほとんど TS がなくても困らないと思っている」とか煽るから誤解されるんだよ - hatest のブックマーク / はてなブックマーク
- だからさー、「煽る・煽られた」って解釈がズレてんの。他人の文章を読む時に自分自身を投影しすぎなんだって。すぐ自分のこと混ぜてくんじゃん。文章中に「お前」のことなんか書いてねえって。なに勝手に自分を登場させて「煽られた」とか感じてんの?間違ってるよそれ。無関係な文章にお前自身を重ねて何か言おうとしなくていいんだって。自分大好きちゃんかよ
- "「チーム開発では TS 使ってる・TS の効果はある」って何度も書いてんじゃん?" 元記事見たけどそんなこと書いてるか? - haba-tsu-nero のブックマーク / はてなブックマーク
-
勿論、頑張って型定義をこしらえることに意味がないワケではない。コーディング中に、Typo や勘違いに気が付けるようになるし、強制力が増す。それは良いことだ。
-
仕事ではチーム開発ないしは引き継ぎが発生するので TypeScript を使うが、外部連携の部分では
as any
で逃げることも多々ある。ココを厳密に型定義できれば安全性が上がることは上がるのだが、…… - ↑ ほらちゃんと「チーム開発で TS 使ってる」ってことも、「TS に効果がある (安全性が上がる・良いこと)」って話も書いてあるよ?どこに目付けてんだよおのれは。他人の文章がちゃんと読めてないヤツがいっちょまえに意見しようとすんなって恥ずかしいから
-
- CubbitさんはTwitterを使っています 「まあそのうちうひょさんが焼き尽くしてくれるはず(?)」 / Twitter
- おお、焼き尽くすとな。人のことを燃料扱いか。コイツは自分でまともに反論も出来ずに他人に反論を任せていて、本当に何の能力もないノイズだなと思ったよ。俺のことを焼くとは書いてないって?でもブコメや Twitter の低脳コメはこういうレベルで書いてないこと勝手に妄想して書いてくるんだよー。前後のツイも削除したリプツイも全部見えてるからな、自分だけが石を投げてて相手に投げ返されないと思ってんじゃねえぞ
- CubbitさんはTwitterを使っています 「ひえっ……激おこじゃないですかスミマセン 「TypeScript の型定義に凝りすぎじゃね?」の反応を眺める https://t.co/evPwO72CRK」 / Twitter
- 謝るくらいなら最初から黙っとれって
もう TS については言いたいこと言ったからコレ以上追わないけど、反応に対する質のショボさ、読解力のなさについてはまた思ったことがあるので、明日書くねー。人のこと燃料としか捉えられない歪んだつまんない人は明日も来て読んでね。