コードをコピぺして機能拡張していくことについて最近思うところが出てきたのでメモしておく。
コードをコピーして拡張していくことのデメリット
- ビルド時間が増える
- 送信されるスクリプトサイズが増える
- 帯域費用の増加
- レイテンシの増加
- リーダビリティが低い
- リファクタや修正が非常にしづらい
- 単にgrepできないケースがあるため複数個所同じことをしないといけない。
- ast-grepのようなセマンティックに対応したツールを使えば負荷軽減はされるが。
- 手動だとミスにつながるが自動化する場合はスクリプト組んだりしないといけない。でその自動化ツールの妥当性も考えないといけない
- 単にgrepできないケースがあるため複数個所同じことをしないといけない。
- ChatGPTやCopilotで解析するときのトークン数がボトルネックになる
コードをコピーしたほうがいいケース
- POCで使い捨てられることがほぼ明らかな場合
- POCの場合でもコピーしないほうが結果的に早く実装できるケースも往々にしてありそうだが実装者のスキルに依存する
- となると実装者のスキル底上げが課題となるがなかなかその時間が取れない。。下記のような内容を上層部に訴えかけていくしかない気がする。
- 優秀なエンジニアを採用するか
- スキル底上げがペイすることを説得して勉強会などの時間をとるか
- となると実装者のスキル底上げが課題となるがなかなかその時間が取れない。。下記のような内容を上層部に訴えかけていくしかない気がする。
- POCの場合でもコピーしないほうが結果的に早く実装できるケースも往々にしてありそうだが実装者のスキルに依存する
- 既存コードに絶対に影響を与えたくないケース
- これも有効な理由に思えるかもしれないが個人的にはこんな理由でコピペしていると負の遺産がたまっていく一方で一時しのぎにしか過ぎないと思っている
- ただ、影響を与えていないことを担保するためには自動テストなりの仕組みがないとしんどいが、テストされている状態にするのにもまたスキルが必要となる。
- ただ、自動テストがない状態だと手動テストに頼ることになるのだがフォームのバリデーションの網羅テストも含めてすべての細かいテストを手動で実施することになる
- その時間をスキルアップや自動テスト作成の時間に割いた方が結果ペイするのでは?
- 冗長に見えても分岐ししていく可能性があるケース
- これもYAGNIの法則にあるように、必要になったらコピーして分岐させれば良い気がするので妥当な理由には思えない。
まとめ
- 実運用していく可能性が少しでもあるのであればコピペは可能な限り避けるべきだと思う。