「TypeScript の型定義に凝りすぎじゃね?」の反応を眺める

昨日書いた「TypeScript の型定義に凝りすぎじゃね?」という記事に対して、はてブコメや Twitter でのコメントがいくつかあったので、勝手に取り上げて補足する。勢いで書いた雑文が思いの外見られていて驚いた。みんなどうやってこんな辺鄙なサイト見つけたの?まずは読んでくれてありがとね。

こんな感じの、「頑張って書いた後の効果があるのは分かるけど、頑張って書くコストに見合った効果なのか分からんよね」的なコメントが付いててよかった。僕が言いたかったのはそこ。

後述するけど「TypeScript による型定義なんて不要、皆書かなくていい」なんて一言も言っていない。そう捉えた人全然ちゃんと文章読めてないよ。TypeScript の効果は理解しているし、仕事だけじゃなくて Angular 書く時は個人でも書いてたりするから、言語全体として不要なんて全く思ってない。

もう少し誤解のないよう分かりやすく言っておくと、TS で頑張って型定義すればするほど、効果がある。良いコードになる。それは間違いなくそう思っている。

でも、そのメリットを享受するために払うコストが多すぎて、コストと効果が見合ってない場面が多いんじゃないの?少なくとも自分の観測範囲でさほどのメリットがあるようには見えていない、ということを書きたかった。

「この対象物をどうやって型定義しようか…」って悩んで、TS の機能調べ上げてこねくり回すくらいなら、設計見直してデータ構造をシンプルにするとか、リファクタリングして関数を小さく作るとかで対処した方がいいべな、と思っちゃう。さっさと動くモノ作ってそれから直したら?と。型定義による恩恵が少なく感じるぐらいに整理されたコードなら、平易で分かりやすいし、分かりやすければ色んな人に保守してもらいやすいし、というぐらいの感覚。

多少のコストならいいさ、コストかけたらいい。そうじゃなくてもっと、TS の型定義に多少じゃないコストをかけてる場合の話ね。

引数と戻り値の型が付いてると分かりやすいのは同意。自分が TS 書く時はココは必ず省略しない。僕は TS を書くとなったら、ローカル変数とか暗黙的に型が決まる場面でも必ず型書くぐらいの人間ではある。List<String> hoge = new ArrayList<String>() みたいなのを冗長とも面倒とも思わず書いてきた人間だ。そういうレベルの型定義はいくらでもしてればいいけど、もっと複雑なヤツね。「最新バージョンでようやくこういう型が定義できるようになりました!」みたいなアレ。あんなの使い時わかんねーって思ってた。

ライブラリ・フレームワークの開発者としての視点はなかった

自分はライブラリやフレームワークを開発して、広く使ってもらおうとする経験や意思がない。だから、mizchi さんなどのコメントで指摘されていたところは、自分が全然考慮していないところだった。

ライブラリを使う時に、裏で複雑な型定義がされているかもしれない。フレームワークを開発する時は、そういう型定義ができるスキルが要るかもしれない。それはおっしゃるとおりだと思った。前回記事を書いたときには全く考慮していないことだった。

なので、前回の記事は、アプリケーションコードを書くだけの人間の思い、と捉えてほしい。ココの明言ができていなかった。

そんで自分は、「既に肥大化しているプロジェクトには携わらない」ことにしているので、大規模開発における複雑な型定義がどのくらい必要なのかどうかは、そもそも論じられない。「いや、大規模化したら型どころじゃなくて何してたってつらいでしょ」と思っているから、自分の生きる世界では相手にしないことにしているのだ。乱暴だろうけど俺の生き方だし、大規模プロジェクトに関わっている人のことまで一個人の俺が配慮してブログ書いてやる必要なんかないんじゃ。そこが合わなかったら Not For Me で去ればええねん。

自分が携わる場合は「肥大化する前にアプリケーションを分割して一つひとつを小さく作る」ようにしているので、比較的小規模なアプリケーションを書くだけの人にとっては、型定義を頑張り過ぎることに対して、コストと効果が見合っていないと感じる、という主旨だと理解してほしい。「そんなに無理して型定義するより any で逃げてとりあえず実装して、テストコードちゃんと書いたら?」ぐらいに思っている。

コレはちゃんと文章読めてないんじゃない?

mizchi さんの連ツイの一箇所だけ気になったので突っ込んどく。

あと以下の悪意ある捉え方も気に食わん。

見識の狭さは確かにあった。でも、「言語そのもの」を「要らなかった」なんて、どっこにも書いてないんだよね。どっかそう書いてあるところある?あるなら訂正入れる。

そもそも個人が書いた記事に対して、あらゆる場面を全て考慮し尽くした文章だと思って読もうとするの、読み方が乱暴じゃねえか?思い込みや決め付けで勝手に拡大解釈しないでくれや。この感想こそ「全体に適用」してる悪い例そのものじゃん。あと「適応」じゃなくて「適用」な。言葉間違ってんだよね。

繰り返しになるけど、TS による型定義は書けば書くほど効果はあると思ってる。チーム開発では必要・重要なモノだと思ってる。

でも、個人や小規模なプロジェクトでは、プリミティブや簡単なクラス・インターフェースで表現できる範囲の型定義ができていれば十分だし、そういうレベルで済むようなシンプルなコードにしろや Stupid という思い。


反論を見てると、TS スキーな人が、タイトルだけ見てまずは TS をバカにされたようなイラつきを覚えて、そのイライラのまま文章読んでるから、TS の全てが不要だ、みたいな文章だと勝手に拡大解釈して怒ってんのかなと思った。筆者のポジションだ見識だ言ってるクセに、自分のポジション守りたくて先走っちゃってんじゃん。そっちがポジショントークしかける気満々じゃん。型定義頑張ってる人のことを無駄だとか止めろとか、そういうことは言ってないから落ち着いてね。プログラマでもそういうイチゼロ思考はやめなー。

バカに勘違いされて逆ギレされてんの癪だから、勘違いされないようにもっかい言っとくね。TS で型定義頑張ると、頑張った分だけ効果は間違いなくあると思ってるよ。頑張って書いてる人は偉いと思う。スゴいよね。

自分が書きたかったのは、「そこまで頑張って得られる効果が薄いと、自分は感じることが多い」「型定義を頑張らないといけない状態がまずおかしい可能性はないか・そのまま実装進めるより設計直した方がいいんじゃないか」って言いたかった。

どうしても複雑な型定義が要りそうな場面は、アプリケーションコードを書くだけの人の立場でいえば、any で逃げちゃって、テストでカバーしときゃいいかなと思う。それでいいといえるくらい、局所的で小さな問題として閉じ込めておけるよう、最初から小さく作ろうや、デカく作るなやってことを言ってる。

設計の悪さを見つける指標として

型付けしにくいデータ構造や設計が問題。そう、だから、そっちを直して簡単に型付けできるようにしなよ、と思うし、前回の記事でもそう書いたはず。

悪いデータ構造や設計をあぶり出すために、むりくりな型付けをしてみせることで表現するのもあり。でも自分は、そういう「ヤバい設計」に対しては any を付けることで違和感をもたせ、ドキュメンテーションコメントを読ませたいのよね。意図から何から、文章で書いちゃった方が、手っ取り早いかなと思ってる。


以上。

「個人で書く時は TS 使ってない、個人で書く時は TS 使わなくていいと思ってる」って、TS 不要論になるの?全然人の話聞いてないよね。「チーム開発では TS 使ってる・TS の効果はある」って何度も書いてんじゃん?「効果とコストが釣り合ってるか分からないような、複雑な型定義を見かける、そういうのは any で逃げていいんじゃない?まず設計直しなよ」って主旨がどうしてこうも伝わんなかったかな?

TS スキーな人って何か JS にトラウマ抱えてるのかな。JS 理解しないまま、TS で書いたから大丈夫みたいなこと言ってるヤツの方が暴論だと思うんだけどな。いちいち書いてない文脈だってたくさんあるし、考慮できていない・していない領域だって人間だからあるっつーの。目くじら立て過ぎじゃって。アクセス数稼げたからいいけどさ。

TS 関係なくなるけど、ココ最近、プログラミングで何か頑張るのが辛いのは、多分ワイが歳だからなんだろうな。設計や実装をシンプルにしたいというのも、皆さんより自分は頭が良くないから、僕の知性でも維持できる程度の規模に物事を留めたいだけなんだろうな。もうなんかそういう大きなことやりたいって思えないんだよね。沢山コード書きたいとか思えないの。大量に書くことは別にできるけど、コードって保守するフェーズではどうやったって読むことになるじゃん。その頃にはどう書いたかとか覚えてないし、読み解くのももうダルいのよね。だから、読み解く労力のかからない簡単なモノだけを書いていたいの。型定義が超絶技巧になっちゃうようなコードは俺が扱うのがしんどいの。そゆこと。歳とったよ。


更に追記〜。ブコメに低脳が湧いててワクワクすっぞ〜

もう TS については言いたいこと言ったからコレ以上追わないけど、反応に対する質のショボさ、読解力のなさについてはまた思ったことがあるので、明日書くねー。人のこと燃料としか捉えられない歪んだつまんない人は明日も来て読んでね。