ソフトウェアを書くのは、最初から読んで理解するよりも簡単ですか?[閉まっている]


12

私と私の友人は、昨日、大規模なC ++ソフトウェアを書くことと、それを新規採用者として理解することとの違いについて話し合っていました。

ソフトウェアは一度に1行ずつ実行され、このプロセスは私たち(人間)が物事を学び、別の物の上に物事を構築する方法に似ているので、大きなソフトウェアを書くことは実際にそれを読んでそれが何をするかを理解するよりも簡単です(コードをステップスルーすると役立ちますが、複数のクラス/ソースファイルを一緒に覚えておく必要があります。それらが何のために書かれているのかさえ知らない、マルチスレッドコードは悪意のあるポイントを追加します)?

これは最初は奇妙に聞こえますが、少し考えた後、合理的であるように見えました


1
閉鎖の簡単な説明:これは素晴らしい質問ですが、単に答えることができず、議論するだけです(広範囲に)。考慮すべき要素が多すぎます。コードの品質とスタイル、読者の学習スキル、プロジェクトと言語の知識、プロジェクトのサイズなどです。閉鎖についてさらに議論することに興味がある場合は、すでにメタサイトでそれについての質問があります。
ヤニス

本「見習いパターン」は、初心者からマスター職人への旅について語っています。初心者、実習生、職人レベルのプログラマーのキャリア成長に関する多くの質問に答えます。多くのパターンを使用するには時間がかかりますが、それは旅の一部です。パターンの1つは、「壊れたおもちゃ」または「プロトタイプ」を書くことです。これは、実動システムを見つけて比較するのに役立ちます。さらに多くの便利なパターンがあります。
GuruM

回答:


41

私の経験に基づいて、次のアクティビティを最も簡単なものから最も困難なものの順にランク付けします。

  1. 良いコードを読む
  2. 悪いコードを書く
  3. 良いコードを書く
  4. 悪いコードを読む

上記のランキングは2つの結論につながります

  1. 悪いコードを読むよりもコードを書く方が簡単ですが、独自のコードを書くよりも良いコードを読む方が簡単です
  2. 悪いコードを書くことは良いコードを書くよりも簡単ですが、悪いコードを書くことは悪いコードを読むための準備をします。これはすべての中で最も難しいことです。特に、悪いコードは書かれているよりも多く読み取られるためです。

もちろん、良いコードと悪いコードは広く一般化されています。良いコードの詳細については、コードの完成クリーンコードをお勧めします。


他の多くのことが「悪いコード」につながる可能性があります-内部の一貫性の欠如、ビジョンの統一、または計画。コードの計画または適切なモジュール化の一般的な欠如。うまく機能するはずの組み込み言語機能を使用しなかったため、意味のない良いコードを見てきました。
ベンデモット

また、どのように良いコードを書く:cdn.thenextweb.com/files/2011/01/65987_700b.jpg
CurtisHx

2
私の規模では、良いコードを書くよりも悪いコードを読む方が簡単です。最悪の場合、読み込もうとしている不良コードでデバッガを起動したり、リファクタリングツールで編集したりできます。
ムービシエル

2
悪いコードを書くことは、それが統合されて動作しなければならない、または変化する要件に関して変更するまで、簡単です。「自分をコーナーにプログラムする」なら、それはもう簡単ではありません。
カズ

@mouviciel悪いコードを書くべきではない非常に賢いプログラマーによって書かれた悪いコードを読むのは難しい場合があります。素朴なプログラマーによって書かれた悪いコードを読むのは簡単です。「素朴な帽子」をかぶるだけで、コードが何を達成しようとして失敗しているかが明らかになります。:)
カズ

13

この質問は、誤ったコンセンサスに訴えます。http://en.wikipedia.org/wiki/False-consensus_effect

異なる人々は異なる方法で情報を学び、吸収します。聴覚学習者、視覚学習者、運動学習者に似ています。コードを読むのが簡単な人もいれば、コードを作成するのが簡単な人もいます。私にとっては後者です。私のチームの他の人にとっては、前者です。ある種のコンセンサスや多数派を見つけることが有用だとは思わない。脳が情報をどのように吸収して学習するかを理解し、その知識を使って自分自身を改善し、異なる人を受け入れることを学ぶのがよいでしょう。


1
この(または他の)仮説が自動的に正しいと単純に信じるよりも、質問をし、意見を検討する方がはるかに優れています。さまざまな人々が同じ問題にどのように取り組んでいるかを認識することは、多くの場合、チームのパフォーマンスにプラスの効果をもたらし、社会的相互作用を改善します。
ロビーディー

7
あなたは絶対に正しいです。質問は始まりです。また、誤ったコンセンサスがあることを理解することは、理解に有益です。だからこそ、私は質問を単に無視するのではなく、「答えた」のです。
mawcsco

7

大規模なC ++ソフトウェアの作成と新規採用者としての理解の違い

これは、ソフトウェアの読み取りと書き込みの違いと同じではありません。プロジェクトを初めて使用するとき(特に会社を初めて使用するとき)、コードが何をするのかだけでなく、学ぶべきことがたくさんあります。理解する理由コードが、それは多くの場合、ビジネスのプロジェクトは、組織の残りの部分とどのように関連するか、どのように動作を理解する必要がないものを行います。要するに、背景知識の恩恵なしにコードを読むことは、コードが機能するコンテキストを完全に理解しているとき、コードを読むことよりも遅くて難しい作業です。

グリーンフィールドプロジェクトで新しいコードを作成することと、既存のコードを読み取り、変更することには違いがあります、必ずしも一方が他方より簡単であるとは言いません。新しいものを作成する場合、既存のコードを使用してコードを機能させる方法を心配する必要はありませんが、プロジェクトが将来も有用であるように十分に拡張可能かつ適応可能にすることを心配する必要があります。既存のプロジェクトで作業している場合、多くの場合、すでに存在するものをガイドとして使用できますが、最初に存在するものを理解する必要があります。

「新人」として、通常、既存のプロジェクトで作業する方が良いでしょう。なぜなら、ビジネスの仕組み、さまざまなプロジェクトがどのように連携するか、標準と実践のコーディング、さらには(特に)改善できるもの。


システムの「コンテキスト」の広さ/深さ、および経験を積んだ基盤APIを理解する。システムの論理コンポーネントは何ですか?これらのコンポーネントはどのように相互作用しますか?基礎となるビルディングブロックのどのようなメカニズムを使用していますか?基礎となるビルディングブロックは異なるパスでどのように動作しますか?システムの制約/目標は何ですか?なぜ他の候補者よりも特定の経路が選ばれたのですか?新しいコンポーネントを追加する必要がある場合、何を再利用でき、何を新たに追加する必要がありますか?「システム内部」から見ることができますか?実用的な思考と学習を見るためのスーパーブック。
GuruM

「プロトタイプ」または「壊れたおもちゃ」(既知の欠陥があり、代替案を検討するためだけのもの)を構築することは、上記の質問を考えさせるために自分自身を「強制」するのに役立ちます。コンポーネントの追加と機能の追加に続いてリファクタリングを行うと、手元の問題と候補ソリューションの「感触」を得るのに役立ちます(おそらくフォーラム検索を介して)。
GuruM

4

興味深い質問ですが、作成するよりも読みやすく、理解しやすいという側面に傾く傾向があります。

ベテランでベテランのプログラマーなら、コードを読んで「はい、良い選択、チェック、ああ、YではなくXを行ったかもしれません」などに進む可能性があります。ゼロからの書き込みよりも膨大な時間を節約します(そうする理由がない限り)。

あなたがより新しいプログラマである場合、「あなたが知らないことを知らない」ので、あなたはすべてのささいなことを発明/学習しなければならず、おそらくあなたはいくつかの非効率性を持つことになりますコード。ただし、言語の理解が深まる可能性があります。

ただし、どちらの場合でも、コードを完全にゼロから作成するよりも、コードを読み取ってそこから移動する方が簡単です。


2

ほとんどのプログラマーは、他の人が書いたコードと比較して、自分で書いたコードを理解しやすいと感じています。これは、あなたが言及した行ごとの学習だけでなく、個々のスタイルと才能の問題によるものです。そんなに多くの車輪の再発明が起こる理由です。

しかし、それは木の眺めです。フォレストビューでは、コードを最初から記述するよりもコードを読む方がはるかに簡単です。たとえば、新しいワードプロセッサをゼロから作成したり、既存のコードベースを十分に学習して改善するのは簡単ですか?

コードの読み取りを開始すると、コードを読みやすくするための膨大な方法を考えることができます。コードをたどるだけで、土地のレイアウトを把握しようとするときに、最初に時間を費やします。アーキテクチャーでは、その方法を完全に嫌うこともあります。しかし、実際に大規模なコードベースであっても、そのアプリケーションの作成にすでに数十万時間を費やしているのに比べて、ホイールを回転させるのに40〜80時間かかります。


コードを書いても理解できませんか?多分コピーします。
ジェフ

@JeffOすべての時間-笑...
ロビーディー

1

ソフトウェアの一部を書いている人は、ほとんどの場合、プログラムを書いている間にロジックとその思考プロセスを知っているだけで、プログラムを最もよく理解します。

コードを書くことは、コードを読むことと理解しやすさの点でまったく比較できるとは思いません。一方では、単にソフトウェアを書くだけで、コードの各セクション、使用されるライブラリなどに関連するコンテキストの知識により、特定のソフトウェアをより深く理解できます。ただし、他の人が書いたコードを読むことは、実際のソフトウェアですが、言語を理解するという点では、使用を検討していなかったライブラリの新しい方法や使用法についての洞察を提供することができます。これにより、コードの記述が簡単になります。

ビルドの知識に関しては、コードの読み取りとコードの記述は非常に関連性があり、多くの点で相互に関係していると思います。コードの記述経験は、他のコードの理解を容易にし、コードの読み取りにより、(新しいロジックの概念、ライブラリの使用などを通じて)コードを簡単に書くことができます。


1

これは私が個人的に自明であると感じたものですが、プログラミングの大衆全体に当てはまることを完全に確信したことはありませんでした。たとえば、ドキュメントを読むのではなく、他の人のコードを喜んで選択し、自分のコードのように理解できる非常に才能のあるコーダーを知っています。

これは質問につながります:これは重要ですか?

コードを読んでいる場合、書き換えるのではなく変更を行っている可能性があります。書き換えている場合でも、新しい言語/バージョンでこれを書いている可能性が高いため、必ずしも同じ方法でコードを作成できるとは限りません。私が言いたいのは、常にすべてのコードを理解する必要はないということです。

これはすべて真実であり、BDDなどの新しい開発方法論は、単にマシンを駆動する手段であるコードではなく、ビジネスロジックをコードから明確にすることが重要であることを認識しています。もちろん、これは新しいものではありません。コンセプトは、ドナルドクヌースの独創的な研究:Literate Programming以来です。


1

私はStMotorSparkの答えに興味を持っています。ただ追加するだけです。
それは多くの要因に依存しているので、イエスかノーの質問にはなりえません。

  • 既存のコードは適切に文書化され、適切に作成されていますか、それとも意味やコメントのないスパゲッティのように見えますか?
  • 解決方法を見つけるのに無限の時間を費やす非常にまれな状況の小さなアプリですか、それとも大きくてシンプルなアプリですか?

1
非常に良い点; しかし、私はそれが人により依存していると主張します。たとえば、ドキュメントがほとんどないコードがあったとしても、「それは奇妙なことだと思います」という形で洞察を提供できます。誰かが本当に学びたいのであれば、プログラムやドキュメントのサイズに関係なく役立つものを見つけるでしょう。ただし、そのことを念頭に置いて、優れたドキュメントとコードがサイズを超えていないことは、実質的に役立ちます。
StMotorSpark

1
完全に同意し、それは人にも大きく依存します。仕事上の要件のために、私たちの中にはゼロから多くの開発を行う人もいれば、多くのメンテナンスを行う人もいます。この必然的に完璧な二つの異なるexpertises、彼らは思考、論理や言語仕様の理解と同じレベル、同じよく組織化の方法の両方を開始した場合に関係なく...
JoseTeixeira
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.