コピー&ペーストプログラミングの危険性を非プログラマーに説明するための良い、簡潔な方法は何ですか?[閉まっている]


27

コピーペーストプログラミングの問題を非プログラマーに説明できる優れた類似性または比metaを探しています。潜在的なクライアントのコード/システムのレビューを時折行いますが、よく見られる問題の1つは、コードベース全体に大量のコピーアンドペーストコードがあることです。それは私がレビューで定期的に呼びかけるものであり、毎回これがなぜ問題なのかを説明する必要がありますコピーと貼り付けは再利用の良い形ではありません)。明らかに、私はコード保守の観点から問題を説明することができます(しかし、説明します)。検索と置換がこの問題の効果的な解決策ではない理由を類推が示す場合のボーナス。助言がありますか?

明確にするために(以下のJaroslavの回答に基づいて)-ここではコードスニペットの使用については説明しません。私が目にするのは(多くの場合)膨大なコードのコピーと貼り付け、またはユーザーデータ(インラインSQLクエリを備えた)を多数のPHPまたはASP.NETページに貼り付けるための10行のコードです。そのため、同じプロジェクト内の別の場所からコードを複製します。

更新:ここには本当に良い答えがいくつかあります。スコットホイットロックの答えを選んだ理由についてはコメントで説明しましたが、製造に精通している顧客を扱っているなら、whatsisnameの答えを強くお勧めします。


うーん、それは難しいものです。それは古典的な車/建物/工場の類推にうまく翻訳されない
.....-whatsisname

3
米国の慣習法で共和党と民主党に言及し、3番目を追加しながら一方の党名を変更することを想像してください...多くの法律を書き換える必要があります。
ジョブ

たとえば、Wiki、フォーラムなどから理解できないコピー貼り付けコード(安全でない、構造が悪いなど)は、電子メールの添付ファイル(ウイルス、スパイウェア、スパムなど)を開くようなものです。第三者?
サヤスク

@faif:コピーアンドペーストされたコードは必ずしもゴミコードではありません。あなたの隣のオフィスの人が書いた良いコードかもしれません。コピーアンドペーストされたコードの問題は、それが非常に急速に管理不能なメンテナンス/デバッグの悪夢になることです。
-whatsisname

1
@faif:括弧で囲まれたセクションをザップします
-whatsisname

回答:


36

こんな感じです...家には時計が1つあります。すばらしいです!あなたはそれが何時かを知っていますが、あなたはそれを見るためにいつもその部屋に行かなければなりません。

しかし、もちろん、その部屋にずっと行くことなく、何時かを知りたいので、もう少し時計を買って、家中に配布します。これらの各クロックは独立しています。彼らはすべて自分の時間を保ちます。これの意味は:

  • 夏時間のために時間が変更された場合は、すべて変更する必要があります
  • それらがすべて設定されていても、それらはすべて少し異なり、完全に一致することはめったにありません。時間が経つにつれて、彼らはドリフトします。

ここで、数十または数百の時計を備えた大規模な施設で同じ問題を想像してください。そのため、中央のタイムベースとの同期を維持するこのネットワーク時計のようなものが必要です。そうすれ、時間は一度だけ定義されます。

コピーペーストプログラミングは、より独立した時計を購入するようなものです。スケーリングしません。


1
私がこの答えを選んだのは、私が通常いる状況に最適だと思うからです。私が見ているほとんどのソフトウェアはサービス部門の人向けであり、製造の類似性を理解するのは難しい場合が多いです。しかし、ほとんどの人は家に複数の時計を持っています。私はまた、あなたの家の各時計が時間を変更するための異なるプロセスを持っているという事実を使用できるので、それが好きです(そして、異なる量で速く/遅くなります)検索と置換がなぜないのかを説明する方法として'tコピーアンドペーストコードのメンテナンスオプション。
EZハート

38

飛行機を設計していると想像してください。単一のエンジンジェットがあります。よく売れています。今、あなたは海を渡る長距離輸送のために4エンジンの航空機を設計しようとしています。

さて、個々のエンジンごとにエンジニアリング仕様と図面の完全なセットを作成しませんか?いいえ、4つの場所すべてで同じエンジンを使用します。4セットの図面があり、何かを変更する必要がある場合を想像してください。次に、4つのエンジン図面すべてで変更する必要があります。間隔を空けていたために誤って4番目のエンジンの何かを変更するのを忘れた場合はどうなりますか?

したがって、ねじの長さ、またはパイプのねじ切りを変更するとします。エンジニアリング図面のデータベースを単に「検索して交換」することはできません。同じサイズであるために燃料ポンプの取り付けネジを誤って変更してしまう可能性があります。または、尾舵に動力を供給する油圧ラインは同じスレッドを使用していましたが、現在は異なり、尾に動力を供給することはできません。

エンジンがフロリダの南を飛行中にランダムにタービンブレードを投げて爆発するため、NTSBに悩まされることを想像してください。今、あなたはどのエンジン図面を見ていますか?それらのすべて、それらの1つ?4つすべてが同じであることをどのように知っていますか?おそらく修正が行われますが、エンジン1にのみ適用されます。これは、エンジンを設計した人がレゲエバンドでプレイするために1年を残し、4つのエンジンが別々のファイルにあることを覚えている唯一の人であり、爆発するタービンを修理した男が彼の代わりになりました。

コードのコピーと貼り付けは、ねじであろうとエンジンであろうと、構成部品の図面を複製することに似ています。コンポーネントを可能な限り再利用される基本的な部分に抽象化したい。

エンジンを複製せず、エンジンを翼に取り付けるコードを書くだけです。


11
ここで、4番エンジンが他の3番エンジンと異なることを想像してください。この違いは意図したものですか?離陸直後に左に曲がることによって生じる特定のトルクの問題に対処するように設計されていますか?それともコピーの間違いですか?
デビッドソーンリー

5
非常に類似していますが、誰かがコードのコピー/貼り付けを理解するのが難しい場合...ジェットエンジンも同じくらい難しいかもしれません:)
スティーブンエバーズ

この類推のために、ジェットエンジンの代わりに固体燃料ロケットについて話すべきです。そうすれば、「見る?ロケット科学のように」で終わります。
確実に

これは類推ではありません。ブループリントは、文字通り機械的なアーティファクトのコードです。
直観

7

同じリソースを共有するか、同じリソースを複製するかという点で説明する必要があります。

たとえば、大都市のすべての家が、家に電気を供給する専用の発電所を持つことは理にかなっているでしょうか、それともすべての家が同じ発電所を共有していることは理にかなっていますか?発電所で使用されている特定のコンポーネントで何か問題が発生し、修理が必要な場合は、1か所で修理を行う方が簡単で、各専用発電所でのみ修理を行うよりも、全員がこれらの修理の恩恵を受ける個別に家の利点。


7

すべての手術はやや ていますよね。だから、手術のためにさまざまな外科医のさまざまな手技の手術 指示をランダムにコピーしても構いませんか?」


1
すばらしいです!!!手術はナイフで行われますか?ブッチャーズナイフを使用して、脳外科手術を行います。
アディティアP

1
@AdityaGameProgrammer:持っている唯一のツールが肉切り包丁である場合、すべてがハムのように見えます。
ジョーイアダムス

6

コピーアンドペーストは、金型なしで部品を製造しようとするようなものです。速度が遅く、欠陥や破損があると判断されると、金型を修正して適切な交換品を作成することはできないため、各部品から一度だけ使用できます。

類推を探すには、まず、コピーアンドペーストプログラミングの危険性を考慮する必要があります

  • コピーが完全に適合しないために導入されバグ(不要な変数とコードパスがクリーンアップされない)
  • テスト要件の増加 -抽象化により、変更したもののみをテストし、ブランチではなくリーフのみを変更するため、回帰テストの必要性がなくなります。
  • 複製はすべてを複製し、バグも含まれます。コードの両方のセクションに適用されるすべてのバグ修正または機能は、実装に2倍のコストがかかり、完全に忘れる可能性が高くなります。
  • 重複したコードを簡単に見つけることができないため、検索と置換は上記の問題を悪化させます。

コピーアンドペーストプログラミングとの戦いにおける主な武器は抽象化です。良い類似性を見つけるために、私たちの周りの世界で抽象化の例を探してください。

抽象化は、定義を設定し、実行時にそれらの定義を使用するというアイデアに基づいています。定義のない世界はどうなるでしょうか?

  • 定義は法律用語の重要な部分です。コアの定義がなく、使用されるたびにすべての用語が完全に定義された契約を想像してください。
  • 定義とテンプレートは構築に使用されます。建設の一般的な問題は、最初に行われた単一の測定ではなく、最後に基づいて新しいカットを作成することです。これにより、時間の経過とともに大幅に長さが変化する可能性があります。
  • 会社の組織は、要約と定義に基づいています。会社を拡大するたびに、新しい役割をゼロから定義しなければならなかったとしたらどうでしょうか?それはうまくいきません。それで、もし彼らが同じような仕事の役割を選んで、それに合わせてわずかに変更することに決めたとしたらどうでしょう。リソースを移動することは不可能であるため、全員が所定の位置に固定されます。

コピーは、コピーされるピースが永続的な場合にのみ場所を持ちます。それ以外の場合、すべてのコピーは完全に新しいブランチを処理します-テスト、保守、および個別にアップグレードします。

抽象化は、すべてのブランチを1つのトランクにまとめ、小さなブランチやリーフへの変更を分離することにより、これと戦います。


2
私はカビの類推が好きで、残りは、技術系以外のユーザーにはあまり役に立たないでしょう。
マチューM.

@Matthieu-最初の箇条書きについて言及しているかどうかはわかりませんが、それらが類推であると言っているのではなく、開発者が良い類推を考えるための思考プロセスだと思うことを説明していました。
ニコール

4

コピー貼り付けではなく、重複したコードについて話していると思います(スニペットなどを使用)。

これは歴史書からの類推であり、非常によく説明しています。グーテンベルクのプレスの前に、僧ksたちは座って本を手で書き、同じ本を何度も書き直していました。修道士が書いた本はしばしばバグがあり、グーテンベルクのおかげでこの問題は解消されました。

別の例え:現金自動支払機。さまざまなカードを提供できるキャッシュマシンが1つあり、それらは常にうまく機能します。コードを複製すると異なる現金自動預け払い機が作成されるため、誰もが別の現金自動預け払い機に移動する必要があり、場合によっては機械がBSODを提供することさえあります。

ジェフhttp://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuseからコピーペーストに関する素晴らしい記事があります。 html

PSグーテンベルクの前に印刷機があったことは知っています。


2

プログラマーでない人にとっては、私たちはビジネスマンと話していると思いますので、私は簡潔でお金の現実を巻き込みます。

  1. コードのすべての行にお金がかかります(書面またはコピー)
  2. すべてのバグは、すべての行よりもはるかにコストがかかります。
  3. コードの各行は潜在的なバグを追加します
  4. 重複したコード=重複したバグ
  5. 同じテストサイクルでは、重複するバグはほとんど検出されません。

カットアンドペースト= Burning Money。


1

質問に答えることはできませんが、ここでアナロジーを本当に必要としないと言うことができます。また、各開発イディオムまたはパターンの正しいアナロジーを見つけようとすると、逆に思え、しばしば逆効果になります。扁平足でヨガをしようとするようなものです...

コピー/貼り付けが問題を引き起こす理由はいくつかあります。既存のバグが新しく貼り付けられた領域に伝播します。以前はパフォーマンスの向上と考えられていた環境で、実際には遅くなりました(興味がある場合は例を提供できますが、それはJITに帰着し、また、あなたはあなたが最新のコンパイラよりも賢いと思っているのでしょうか?)。

開発者が怠け者、利己的、またはその両方であることを示しています。これが現在チームで戦っている戦いである場合、このチームでのあなたのポジション(チームリード/ jnr dev、snr dev、これまで)に応じて、おそらく組織内の調停によってそれを修正する必要があります。

編集:以下のコメントに照らして、これはサードパーティ(または場合によってはサードパーティ)に代わってサードパーティのコードをレビューするコードであることを願っています。

まず、コードがサードパーティ向けに作成されたとき、サードパーティは適切なメトリックを備えていましたか?たとえば、コード行(LoC)。

私はまだ上記で言ったことのいくつかがまだ重要だと思います。私はおそらく、レビューの目標は何かを尋ねるべきだったでしょう。それを維持するための見積もりを取得するか、それを置き換える場合は、さまざまな質問をする必要があります。

いずれにせよ、コードの品質を評価しているので、コピーを貼り付けると、「開発者は抽象化および/またはプログラムフロー制御設計の適切な理解を示した」というカテゴリに分類されます。

コメント:開発者は抽象化の理解を示すことができず、プログラムフロー制御へのアプローチはエラーを起こしやすかった。ここで「サイクロマティックな複雑さ」を紹介できます。実際には理解するのは非常に簡単で、ある意味では、私は答えを見つけたかもしれないと思う:Dイェイ。

Ok Cyclomaticの複雑さはこのようなものです。地図があります。開始位置と可能なすべての目的地があります。たくさんある必要はありません。駐車場、カフェ、トイレを考えてください。サイクロマティックの複雑さは、目的地までのスタート位置に到達するために存在するさまざまなルートの数の尺度です。

コピーして貼り付けたコードは、それ自身の名前付きブロック(またはメソッド)に抽象化された可能性のある繰り返しのロジックを含むため、循環的複雑度を高める可能性があります。

理にかなっていますか?


明確にするために、これは他の組織が作成したコードであり、レビューのために組織に持ち込まれています。ですから、私の組織内での戦いではなく、別の組織の人(プログラマーではない人)に理解してもらう必要があります。
EZハート

知っておくと便利で、うまくいけば便利になります:)編集を追加します。
イアン

申し訳ありませんが、長い編集ですが、tldrはコピーであり、貼り付けられたコードは(特に)サイクロマティックの複雑さの増加を示すコードの匂いであり、サイクロマティックの複雑さは単一ファセットのメタファーを使用して非常に簡単に説明できると思います
イアン

1

何か英語の単語を考えてください。そのことを説明するたびに、単語だけでなく完全な辞書定義を使用することを想像してください。他の人があなたを理解するのはどれくらい簡単ですか?

は、存在しないか、そうでない(想像する)何かの精神的なイメージ形成します。意志の単純な過去。過去の時間に対する未来を示します。過去に繰り返しまたは一般的に発生したアクションを示すことは非常に簡単ではありません。達成または理解または耐えるために多大な肉体的または精神的な努力を必要とする(困難)。

また、重複を除去するためにリファクタリングされた実際のコードの前後の実際の例を表示しても害はありません。


レスリーニールセンスタイルを実現するために2番目の段落をリハーサルすることをお勧めします:
カールビーレフェルト

1

セキュリティとコードの整合性に関する懸念もあります。

ここ示すように、クリップボードに転送されるユニコード文字に悪意のあるデータを埋め込むことができます。

エディターがユニコード文字にどのように応答するかに応じて、ソースコードの予期しない変更、予期しないコンパイラー出力、または私がまだ考えていないことを引き起こす可能性があります。


0

ここで見ることができるいくつかの異なるルートがあります:

  1. 盗作 -知的財産の盗難が大したことではない学校からこれを覚えている人もいるかもしれません。誰かがソースを理解できないか、盲目的にコピーして貼り付けられた特定のソリューションを使用して得られるものが、この作業をどれだけうまく分析していないのか、なぜこれが可能かどうかを理解できないため、コピー&ペーストプログラミングはこのようになります問題の効果的な解決策。

  2. 盲目的に指示に従う-ほとんどの人は、おそらく以前に行ったことのない場所に行かなければならない経験があったでしょう。MapQuestまたはGoogle Mapsを使用して場所を見つけ、指定された指示に従う人もいるかもしれません。ソフトウェアがそこに着く方法の特定の指示を与えたにもかかわらず、人々が迷子になったり、彼らがどこにいるはずだったのか見つけられないという話がありました。これは、コピーペーストのもう1つの大きな危険性です。旅行を少し難しくする可能性のあるエリアの地図を表示せずに、誰かがAからBへの行き方を教えてくれただけのようです。それが難しくないと思われる場合は、目隠しをしてAからBに着くように依頼することで、他の感覚に頼ってどの方向を向いて目標に到達するかを判断することで、アンティを上げることができます。

データ、情報、知識、知恵は、コピーと貼り付けが非常に機械的であり、多くの思考がなく、転送されるデータが適切に使用する知識や知恵がありません。違いを理解することが非常に強力な例として、原子力を見ることができます。原子炉と安全性の観点から原子爆弾を対比し、原子の力を安全に利用するには、どこに何があるのか​​を知るだけでは十分ではないことを確認します。


0

グループの生徒と学校の一連のルールがあるとします。ルールを共通の場所に投稿する代わりに、すべての生徒は、ルールのコピーを各自に渡すように指示する必要があります。各生徒は、手紙のルールのコピーに従う必要があると伝えられます。

ここで、災害の場合には新しい災害避難所に行く必要があるというルールの1つを変更します。各生徒に行き、ルールのセットを変更する必要があります。生徒の一人が行方不明になって竜巻が当たった場合、生徒は古い場所に行き、恐ろしい死に方をします。


0

誰かがドキュメントテンプレートを添付したメールを送信します。テンプレートが変更されるまで、自由に使用してください。心配しないで、彼らはあなたに更新されたコピーを送ることを忘れないでしょう。


0

CoCoMoコストモデル。

http://en.wikipedia.org/wiki/COCOMO

適用された工数(E)= a *(KLOC)** b、ここでb> 1.0

その指数は、ビルド/メンテナンス/サポート/書き換えの努力がコードの行数より速く成長することを意味します。


0

誰もまだ考慮に入れたんこの悪い習慣へのもう一つの重要な側面があります:盲目的に(他の誰かから(完全または部分的)コードコピーすることによって、彼らの許可なしにあなたは、著作権法を破ることがあります


0

私が見るコピー&ペーストのコーディングは、開発者が自分のやっていることを理解していない、または推論したくないもので、必要なことを「多かれ少なかれ」行うさまざまな部分を一緒にコピーし、最後にランダムに揺らしますそれらを一緒に合わせます。

それには3つの大きな問題があります。

  1. バグのないコードにはなりません。今まで。
  2. 書き込み中にコードを理解できなかった場合、デバッグ中にコードを理解することはできませんでした。他の誰かだけが、追加費用で、作った混乱を片付けることができます。
  3. 彼らが書いているコードについて考えることを避ければ、学習を避けます。学習を避ければ、優秀なプログラマーになることはありません。彼らが決して優秀なプログラマーにならないなら、なぜ彼らはあなたのチームにいるのですか?

0

5人のガールフレンドがいて(あなたは陰険な犬を飼っています)、そのすべてにバレンタインメッセージを送信するとします。あなたは最初の文字を入力し、彼女の名前を追加し、皆さんが共有した記憶に残る何かに言及します。次に、文字を4回コピーして貼り付けます。そのたびに、タイプミスを犯したため、コピーアンドペーストでガールフレンド#1の名前のインスタンスが欠落しています。5人のガールフレンドのうち4人がガールフレンド#1の家に向かっています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.