「Dominant-Negative(ドミナント・ネガティブ)」っていう言葉があって。
以前にここで取り上げたお題です。
https://gallu.hatenadiary.jp/entry/20101106/p5
生物は面白いもので、ある「重要ななにか(ここではとあるタンパク質)」が「まったく存在しない」場合、それなりにどうにか迂回路とか作っちゃってがんばっちゃうらしいのですが。
これが中途半端に「あるっぽいんだけど実は壊れている」と、「あるっぽい」から迂回路が作られず、でも「っぽいだけだから」役には立たず、で。
結果、全欠けよりもよっぽどたちの悪い「中途半端野郎」が横行する、というような状態になる、んだそうです。
この辺をもうちょっと広げて考えてみると。
「正常"っぽく見える"んだけど実際には動かないから、ぱっと見は"よいっぽい"んだけど、実際には機能しない」的な感じになります。
んで。
ここ最近、この「ドミナント・ネガティブ」という言葉を、特に AI を使った開発の文脈で思い出す場面が増えてきたんですね。
AI の登場で、コードの生成は一気に手軽になったと思う。実際、プログラミングを(さほど)知らない人でも、AI に聞きながらコードが書けたりする。
でも、この"あるように見えるけど実は欠陥がある"、という危うさって、なんか「今まで以上に身近になってないかなぁ?」っていう危惧が、おいちゃん的には気になるところなのでございます。
「ないなら気づける」が、「あるっぽい」と途端に見えづらくなる
実装が"ない"ってのが、まぁ……ないこともない。
未実装なら、まだ気づける。ログが出ない、画面が動かない、エラーメッセージが出る。問題は露骨で、目に入るんだよね……ちゃんとチェックしていれば、だけど。
ただ、「実装がある"っぽい"」だと、これが途端に「気づきにくくなる」と思われる。
見た目は整っているし、コンパイルも通るし、簡単なテストは通る。
ところが、細かい仕様を満たしていない、異常系でおかしな動きをする、なんなら「ちょっと複雑な正常系」でもおかしな動きをする、隅を突くと壊れる、性能が伸びない、などなど。
この手のを「ちょっとしたチェック」で確認しようとしても見つからず、結果、発見が遅れたりはしないだろうか? っていう危惧がある*1。
この辺になると。書き方と「そのコードの理解度」次第、にはなるんだけど、状況次第では「結構広域に、なんなら全コードの総見直し」とかになりそうな可能性が、ごくまれに、わずかに、時々、ちょいちょい。
「ちょっとしたコード」ならいいんだけど、「割と大きな規模」のコードでこれをやらかすと、いささか厳しくない?
AI 開発は「ドミナント・ネガティブ化」を促進しがちでは?
AI は、わかりやすいしよいコードをはいてくれる、とは思うんだけど、一方で「それっぽいコード」を出してくるのもうまいと思う。
ぶっちゃけ、自動補完とかでも「うんこんな感じのコードが欲しいんだよね……マテ、そのメソッド、ないのでは?」っての、一度や二度ではない経験がある。
- クラスや責務の分割が形だけ整っている
- コメントも丁寧
- テストも付いてくるし、基本的な項目はテストできている(っぽい)
- 代表的なユースケースは動く
表面を見るだけなら、「あぁ、できてるじゃん」と判断してしまいやすい感じである。
でも、それは本当に「必要十分」なコード??
境界条件は?
例外パスは?
テストは本当に十分?
性能とスケールの観点で地雷はない?
「それっぽく書かれている」とついチェックも「うん大丈夫そう」ってなってしまいそうになるだけに、「あるっぽい欠陥品」が入り込むリスクは、昔と同レベル以下に納められているんだろうか?
複数のレイヤーで「ドミナント・ネガティブ」化する
んで。おいちゃんが気にしているのは、上述だけではないんだよね。
1. 機能・ロジックの層
代表ケースだけ通り、境界や例外で落ちる。
「正常系だけできている世界」が構築されてしまうと、これが後からの修正を強烈に阻害する。
2. 性能とスケールの層
サンプルデータでは軽い。
本番データ量で、特に運用が始まってからどこかで「急激に重くなる」。
しかしテスト環境で少量のデータなら「ちゃんと動いている」。
3. 保守性の層
ぱっと見は「見目がよい」んだけど、じゃあ修正とか機能追加とかの時に「どこを修正したらよいの?」が不透明になったり、軽微な修正でも「かなりあちこちのファイルを変更」したり、場合によっては「一部変更が漏れたり」。
DRYになっていなかったり、抽象の切り口の問題があったりすると、この辺は運用中に、結構な阻害材料になる。
では、どう対処すべきか?
この辺は今でもきっと議論がつきないところだと思うんだよねぇ。
ただ、まず最低限するべきことはあると思う。
- 仕様を明示する(ために、仕様を明確化する)
まずはここ。
ここが抜けてたら全部アウトだから。
ただ、これ以降については、いろいろ。
例えば「コードレビューをしっかりする」についても色々と是非があるっぽいし、実際個人的には「是非はともかく、現実問題として"人間が全部コードレビューをする、のは、無理になるだろうなぁ"」って予想している。
個人的には「テストコードをしっかりチェック/レビューする」ほうがよいと思ってる。ただ、これもなんか反証とかあるっぽいんだよねぇ。
なので、ここはまだ「発展途上」ではあるんだと思う。
PDCAを回して、早期検知・早期修正を前提にする
だとすると結局は「早く間違えて早く直す」ほうが現実的なのだと思う。システムにもよるんだけど。
問題の発生自体をゼロにするより、発生したらすぐ検知し、すぐ修正するほうが合理的なケースは多い、っていうか、Webは割とそーゆー文化が強いよね。
仕様・レビュー・テストは必要条件だが、十分条件にはならない。
だからこそ、開発プロセス全体での回転速度が重要になるんじゃないか? って思ってる。
現実問題として「事前に全部のチェックができるか?」っていうと、やっぱり難しいんじゃないか、って思う。
なので「できてるっぽいんだけど実はできてない」ってのは、避けようがないんじゃなかろうか? と。ぶっちゃけ「人間が書いてるコードでもまぁよくある話だよねぇ」な内容ではあるし。
ただ、AIは「ぱっと見の良さ」が非常に洗練されているから、「できてるっぽいんだけど実はできてない」が、より一層深刻になりそうではあるんだよね。
なので。
この辺を「どうするか?」ってのが、AI を使って開発していく上で、一つ大事なんじゃないかなぁ? って思ってる。
ってのをツラツラと考えていた時に、ふと「Dominant-Negative(ドミナント・ネガティブ)」を思い出したので、忘れる前に備忘録。
*1:危惧ってことにしておいて……











