web-dev-qa-db-ja.com

コードの「コピーアンドペースト」が危険なのはなぜですか?

時々、上司が私たちに文句を言うでしょう:

機能を実装するのになぜそんなに長い時間が必要なのですか?

実際、この機能は以前に別のアプリケーションに実装されていて、そこからコードをコピーして貼り付けるだけです。コストは低くなければなりません。

私の観点では、コードのコピーと貼り付けはそれほど単純なものではないため、これは本当に難しい質問です。

これを技術者でない上司に説明する理由はありますか?

130
Yigang Wu

コピーアンドペーストコードにバグを見つけた場合は、行ったすべての場所で修正する必要があり、それらすべてを覚えておくことができます(変更された要件にも当てはまります)。

ロジックを1か所に保持しておけば、必要に応じて変更しやすくなります(したがって、アプリケーションの更新が必要であると判断した場合は、1か所でしか変更できません)。

上司に DRY原則 (自分自身を繰り返さないでください)について読んでもらいます。

あなたが記述しているのは、コードを共有し、1か所に保持するlibrariesの完璧な使用のように聞こえます。

すぐにリファクタリングすることを意図した場合にのみコードをコピーアンドペーストします-後で抽出された共通コードを確認して、できるだけ多くのロジックを再利用できるようにしますできるだけ。そしてまもなく、数日と数週間ではなく、数分と数時間後になります。

168
Oded

コピーコピーアンドペーストを使用するコードではなく、ライブラリを構築することで共有コードを使用する方がはるかに良いでしょう。

書き換え(DRYを検索)よりも速度の利点は得られますが、コードを維持する場所は1つだけです。

25
CResults

明らかな理由は、将来の「負債」を引き受けることです。コードに加える必要のある変更(バグ修正や変更だけでなく)は、2つの場所を更新する必要があるため、2倍の費用がかかります。そのうちの1つを忘れてしまうため、より危険です。言い換えれば、今より速く動作させると、将来的には動作がさらに遅くなります。これはcanは良いビジネスセンスですが、通常はそうではありません。

しかし、より重要な理由は、「これはそれと同じです」という仮定が微妙に間違っていないことよりも多いということです。暗黙の仮定に基づいてコードが正しいことに依存している場合、別の場所にコードをコピーすると、これらの仮定が新しい場所にも適用されない限り、エラーが発生します。したがって、貼り付けたコードは、次の変更後だけでなく、最初から間違っていることがよくあります。

12
Kilian Foth

設計上、コピー&ペーストされたコードは確かに災害であり、将来多くの問題を引き起こす可能性があります。しかし、なぜあなたはそれがあなたに多くの仕事を必要とするのか尋ねています たった今、答えは次のとおりです。なぜなら、単にコピーして貼り付けるだけではないからです。

元のコードが、柔軟性とクライアントの使用を念頭に置いて、かなり独立したライブラリとして再利用するために書かれた場合、それは素晴らしいですが、コピー&ペーストではなく、コードライブラリを使用しています。通常、実際のコードのコピーと貼り付けは次のようになります。

  • 「確かに、まさにそれを行うコードをすでに持っています!」
  • 「待って、これらの5つのバージョンのコードのうち、ソースとして使用したいのはどれですか?」
  • 「うーん、これらすべての「util_func_023」関数は何をしますか?それらを文書化しませんでしたか?どれが今必要ですか?」
  • 「ああ、そうです、このコードはコードベースYを使用しています。いずれかを選択してください: すべてのコードベースYを新しいプロジェクトにコピーする/コードベースYから必要な1つの関数を解放するために1日過ごす/コードベースYから1つの関数を解放するために1週間費やす]」
  • 「すべてコピーしました、イェーイ!」
  • 「これはなぜ機能しないのですか?」
  • これは、あなたが実際に始めたいコードを書く代わりに、あなたが望むものに似ている既存のコードをデバッグするのに何時間/何日/何週間も費やすポイントです。

要約すると、直接使用できない既存のコードは、せいぜい、同様のコードを記述するための良いリファレンスとして機能します。確かに全体を持ち上げることはできず、完全に異なるシステムで動作することが期待されます。一般に、書かれて完成したコードは、オリジナルそのものではなくコピーであっても、できる限り少なくしてください。これは安全な前提です。

プロジェクトをコピー&ペーストに基づいて作成する場合は、コーディングする必要があります そもそも 簡単に再利用できる方法で、 なしで 元のコードをコピーして、それをいじります。それはやりがいのあることであり、それが上司が期待しているものである場合、両方が最初に設計および作業する方法であることを確認する必要があります。

10
Ziv

コピーと貼り付けは起こるのを待っている災害です。上司は、壊れたコードをすぐにエンドユーザーに出荷したという価格に関して、出荷の価格を早期に評価する必要があります。

9
Stefano Borini

すでに機能を実装していて、needをコピーして貼り付けて再利用する場合は、何か間違ったことをしたようです。これらの機能をライブラリに入れて、コピー/ペーストせずに再利用できませんか?

9
Brian Rasmussen

DRY原則(自分自身を繰り返さないでください): ウィキペディアのDRY

「すべての知識は、システム内で単一の明確な権威ある表現を持たなければなりません。」

その他のリンク

8
Gauthier

技術者ではない上司の最悪の誤解は、あなたの仕事は主にタイピングだということです。タイピングをなくすことで時間を大幅に節約できると彼らは考えています。

この人に与えることができる最高の教育は、タイピング以外のすべての仕事を指摘することだと思います。その作業の大部分は、通常は目に見えないように、入力と同時に頭の中で行われます。

確かに、入力をなくすことで時間を節約できます。しかし、それよりもはるかに大きく、型付けされていない仕事の一部が大きくなり、時間の節約などにつながります。

7
Martin

上司がDRY原則、バグ、その他の技術に関することを聞きたいですか?

上司や会社がプロジェクトの完了に必要な時間を過小評価したときによく耳にするそのようなコメント。そして、間違った見積もりに基づいて、契約が署名されたなど。ほとんどの場合、プログラマーは見積もりに関与していませんでした。

なぜこれが起こるのですか?プロジェクトスポンサーの予算が少なすぎる場合があります。ソフトウェアを使用して自動化するビジネスプロセスは、チームの努力に値しないかもしれません。このような場合、一般的にマネージャーは悪いニュースに対して非常に閉鎖される傾向があります。プロジェクトの開始時には希望的観測があります。その後、マネージャーはプログラマーを責めようとします。あなたの場合、コピーアンドペーストを介して間接的に。極端な場合、これは 死の行進 と呼ばれます。

4
Greg Dan

通常、コードをコピーして貼り付けると、 一致によるプログラミング

3
Lucas Ayala

ここで「別のアプリケーション」が重要だと思います。他のアプリケーションが既にテストされ、使用されている場合、共通ライブラリを使用するには変更しないである必要があります。 tコードを共有します。

同じアプリケーション内では、「コピーアンドペースト」は悪いですが、異なるチームまたは異なるリリースサイクルで開発されたコードベース間では、「コピーアンドペースト」が最適なオプションです。

3
Ian Ringrose

同様の会社で働いていました。研修生だったので、私はそれ以上よく知りませんでした。そのため、新しいプロジェクトを始めたとき、上司はどこか他の場所からコードを貼り付けることも提案しました。ご存知のように、バグを修正しようとすると、2つの新しいバグが発生するまで、ソフトウェア全体がかなり混乱していました。

2
helpermethod

他のアプリケーションに必要な機能が既にある場合でも、その機能のコードは、大幅な書き換えなしでは現在のアプリケーションに収まらない可能性があります。それはフォードのモーターを取り、それをトヨタに適合させようとしているようなものです。一般的に、コピーするコードの25%以上を変更する必要がある場合は、最初から書き直す方が良い(安い)という経験則があります。

問題のコードをライブラリに抽出することは説得力がありますが、他のシステムの構築方法によっては、思ったよりも難しい場合があります。例えば。その機能のコードは、他の多くのコードと不明瞭な方法でインターフェースするため(たとえば、多くのグローバル変数にアクセスするなど)、抽出が難しい場合があります。

2

すべての変数名の一部に古いプロジェクトの名前が含まれていることを上司に伝え、今度はそれらをすべて手動で変更する必要があります。上司がコピー/貼り付けが悪い理由を知らない(または知りたい)場合、彼/彼女はそれを信じるでしょう:)

1
Simon

目の前の即時機能の開発速度(特にアプリケーションが小さい場合)と、アプリケーションの成長に伴う長期的なメンテナンスコストとの間にはトレードオフがあります。

コピーアンドペーストはすぐに機能する方が高速ですが、バグを修正し、システム全体の変更を行い、アプリケーションの異なるコンポーネント間のワークフローを維持するという点で、アプリケーションのサイズが大きくなるとコストが高くなります。

それはビジネスオーナーが聞く必要がある議論です。車両群を維持するために受け入れられているコストと似ていますが、ソフトウェアでは、ソフトウェアアーキテクチャの壊れた側面は一般にビジネス側に隠されており、開発者のみが見ることができます。

1
user2686692

ええ、最大の問題は、コピーして貼り付けるだけではなく、コピーしてから貼り付けてから少し変更することです。

その後、貼り付けられたバリアントの1つに問題が発生すると、変更されます。その後、別のバリアントが変更されます。

次に、元のコピーにバグがあったため、すべてのバリアントを変更する必要があることがわかります。これで、貼り付けられた領域がすべて同じではないため、本当にうまくねじ込まれています。

そして、あなたはそれを知らないでしょう、この種のくだらないコーディングは通常コメントのほとんど完全に無効です。

私にとっての違いは、同じことを行うコードのコピーが複数ある場合、あなたが持っているのは大量のコードであるということです。特定の各処理を実行するコードが1つしかない場合、システムができます。

システムの振る舞いは、単一ポイントの変更で非常に簡単に変更できます。コードの束の振る舞いを変更するには、コードの束が必要です。

私はシステムが好きで、コードの束ではありません。

0

チームが同様の機能を以前に実装したことがある場合、それを繰り返すと、2回目はmuchが簡単になるというのが彼の意見です。

ただし、おそらく各アプリケーションが異なることを説明する必要があります。ある家にドアを設置したからといって、別の家に別のドアを設置できるわけではありませんタイムフラットなしまだ機器を手に入れ、ドアを取り付け、垂直であることを確認し、フレームにねじ込んでください。

0
bobobobo

私の会社では、常にクラスとメソッドを使用し、それらの技術文書を作成しています。あなたが前に使用されたメソッドクラスを見つけるために良いキーで独自のsvn検索アプリケーションを使用できる場合、私はそのベストプラクティスだと思います:)

0