「良いコード」を書くとはどういう意味ですか?[閉まっている]


41

、この質問、私はあなたが良いコードを書くことから悪いライター妨げているかどうかを尋ねました。答えの多くは「良いコードの意味に依存します」で始まりました。

「良いコード」と「悪いコード」という用語は非常に主観的なもののようです。私は一つの見方をしているので、他人の見方とは非常に異なるかもしれません。

「良いコード」を書くとはどういう意味ですか?「良いコード」とは何ですか?


15
良いコードは、2年後にそれを見て、最初の考えが「おい、wtf」ではない場合です。
ボビー

回答:


91

優れたコーダーは、優れたプールプレーヤーのようなものです。

プロのプールプレーヤーを見ると、最初は感心しないかもしれません。「確かに、彼らはすべてのボールを入れましたが、簡単なショットしかありませんでした!」これは、プールプレーヤーがショットを行うときに、どのボールがどのポケットに入るかを考えず、キューボールがどこに到達するかを考えているためです。次のショットを準備するには、ものすごいスキルと練習が必要ですが、簡単に見えることも意味します。

さて、このメタファーをコードに持ち込むことで、優れたコーダーは簡単でわかりやすいコードを記述します。ブライアン・カーニガンの著書の多くの例は、このパターンに従っています。「トリック」の一部は、問題とその解決策を適切に概念化することです。問題を十分に理解していないと、ソリューションが複雑になりやすくなり、アイデアを統一することができなくなります。

問題を適切に概念化すると、読みやすさ、保守性、効率性、正確性など、他のすべてが得られます。解決策は非常に簡単に見えるため、追加の説明は不要であるため、コメントが少なくなる可能性があります。優れたコーダーは、製品の長期ビジョンを確認し、それに応じて概念化することもできます。


10
「優れたコーダーは、簡単でわかりやすいコードを記述します。」<<正確に!これは、人々は通常、優れたコーダーは非常に「賢い」ハックを書くことができる人だと考えるからだと思います。コードがクリーンで過度に「巧妙」ではない場合、簡単である必要があります。
ハッセン

3
私の2セント:簡単な自動リファクタリングを備えた言語を手に入れたとき、JavaとC#が私が最もよく知っている2つの例です-良いコードに繰り返し移動するのは簡単です。そうでなければ、そもそもよく概念化する必要がありますが、そこには鶏卵の問題があります。
ダンローゼンスターク

3
一部のアルゴリズムは本質的に複雑です。優れたコーダーであれば、本当に必要なときにそれらを記述しても問題はありません。できるだけ読みやすくしてください。
J-16 SDiZ

2
@hasenj:はい、これはこの補題のためです:愚かな人々はコンパイラが理解するコードを書きます。賢い人は、愚かな人が理解するコードを書きます。
v.oddou 14年

49

1分あたりのWTF

オリジナル


編集:基本的な考え方は、「コード品質」をルールに入れることはできないということです。同じ方法で、「グッドアート」や「グッドポエトリー」をルールに入れることはできません。または「いいえ、悪い詩」。現在、唯一の方法は、コードが他の人間にとってどれだけ簡単に理解できるかを確認することです。


1
私たちはこれを職場のホワイトボードに貼り付けています:-)
誰も

1
@ケープコッドガニーもボブおじさんの本に載っていた
mlvljr

2
素晴らしい漫画であることはさておき、私はそれが本当に要点に達すると思います-良いコードとは、他の人が読みやすく保守しやすいと感じるコードです。
-FinnNk

1
つまり、良いコードとは、悪くないコードのことです。例えば、良いコードを定義するのは難しい、悪いコードを定義するのは簡単です。
エルネリ

5
通常、良いコード会議でそれらの「WTF?」はすぐに「Ooooohわかりました...あなたが何をしたかわかります」と続きます。
AndrewKS

7

コードを理解できる速さ以外に、本当に良い基準はありません。簡潔さと読みやすさの完璧な妥協点を見つけることで、コードの見栄えを良くします。

「WTF's per minute」(上記)は正しいですが、それは単なるより一般的なルールの結果です。WTFが多いほど、理解が遅くなります。


1
@rmx:「仕事をうまくやる」と定義する
-mojuba

2
まあ、RemoveCustomerメソッドは実際にめちゃくちゃにすることなくcutomerを削除すること。見た目を美しくするために何時間も費やすことができますが、実際に機能するという意味ではありません。私が言っているのは、「コードをどれだけ速く理解できるか」だけではありません。
誰も

2
@rmx:しかし、バグがないことは暗示されていますよね?コードが適切に機能しない場合は、まだコードではありません。
mojuba

4
@rmx:実際、いいえ。あなたのコードが理解しやすいなら、結論としてそれがそれがひどく仕事であるかどうかを理解するのは簡単です。OTOH、理解するのが難しい場合、それが仕事であるかどうかを理解するのは難しいです。
-pillmuncher

2
@rmx:PSは簡単に言えば、decrement()は古典的なWTFであるため、この関数が使用されているコードの一部の理解が遅くなります
mojuba

5

良いコードを書くのは次の場合です...

  1. 顧客は幸せです
  2. 同僚はあなたのコードを出発点として借ります
  3. 真新しい男/ギャルは、あなたが6ヶ月前に構築したシステムに変更を加えるように言われただけで、彼/彼女はあなたに一度も質問をしませんでした
  4. 上司から、チームが使用する新しいウィジェットを開発するように求められます
  5. 今日書いたコードを見て、「2年前にこのようなコードを書いていたらよかった」と言う

コードが良いかどうかをどのように測定しますか...

  • 応答時間は?
  • サーバーへの往復は何回行われますか?
  • アプリケーションを個人的に使用しますか、それとも不格好だと思いますか?
  • 次回も同じ方法で構築しますか?

適切なコードは、想定どおりに機能します。良いコードは、必要なときに簡単に変更できます。良いコードを再利用して利益を上げることができます。


2
「顧客は満足しています」はこれとは正反対です。

1
@TRA-顧客が満足している場合、要件を理解し、彼らが期待するソリューションを提供したことを意味します。
マイケルライリー-別名ガニー

6
もちろん、悪いコードでも同じことができます。

4

あるコード

  1. バグフリー

  2. 再利用可能

  3. 独立した

  4. それほど複雑ではない

  5. よく文書化されている

  6. 簡単に変更できます

良いコードと呼ばれます。

優れたプログラムは問題なく機能し、バグはありません。しかし、どのような内部品質がそのような完璧さを生み出しますか?それは謎ではありません、私たちは時々いくつかの思い出させる必要があります。C / C ++、C#、Java、Basic、Perl、COBOL、またはASMのいずれのコードを作成しても、優れたプログラミングはすべて同じ昔からの品質を示します:シンプルさ、読みやすさ、モジュール性、階層化、設計、効率、エレガンス、明快さ効率、エレガンス、そして明快

ソース:MSDN


シンプルさ、読みやすさ、優雅さ、明快さはすべて同じです。モジュール性と階層化は、コードを明確かつエレガントにするための単なる方法です。その場合、リストに残っているのは効率だけです。これは一種の暗示であり、それ以外にも効率と明快さの間で妥協する問題です。
mojuba

これを確認してください:goo.gl/hdQt8
Chankey Pathak

2
コードにバグはありませんか?
ケーシーパットン

いいえ、できません。(実際)
チャンキーパタック

効率的なリストに追加する必要があります。速度は必ずしも優れたコードの主要な指標ではありませんが、優れたコードが不必要に遅くなったり無駄になったりするべきではありません。
カレブ

3

これはおなじみですか?

フィリップスは私に新製品のデザインを見る機会を与えてくれました。それが発展するにつれて、私はますます不安になり、私の懸念を監督者に打ち明け始めました。私は彼に、デザインは「きれい」ではなく、ダイクストラのデザインが美しいように「美しく」あるべきだと言った。彼はこれが有用なコメントであるとは思わなかった。彼は私たちがアーティストではなくエンジニアであることを思い出しました。彼の心の中で私は単に自分の好みを表現していたので、彼は私が判断を下すのにどの基準を使っていたかを知りたいと思っていました。私は彼に話すことができませんでした!違反している原則を説明できなかったため、私のコメントは単に無視され、作業は続行されました。私の「味」を説明し、動機付けを提供する方法がなければならないと感じ、私は、良いデザインと悪いデザインを区別する原理を見つけようとし始めました。エンジニアは非常に実用的です。彼らは美しさを賞賛するかもしれませんが、実用性を求めています。「美」が役立つ理由の説明を見つけようとしました。

ここで残りを見てください。


1
:@ mlvljrのポスト内のリンクが壊れているので、ここではGoogleブックスのページへのリンクですbooks.google.co.in/...
balajeerc

@balajeercありがとう(リンクも修正したので、同じpdfのSpringerでホストされたバージョンを指しています):)
mlvljr

1

自然なコード品質基準(最小限のコピー/貼り付け、スパゲッティなしなど)を除いて、優れた産業用コードは、常に少し素朴で、少し冗長すぎて、

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

とは対照的に

Record r = cache.get(i++, false);

しかしdo_not_create = false、「引数falseとして渡されてdo_not_create作成される」または「引数falseとして渡されて作成されない」という意味do_createですか?引数名を使用できる言語では、私は好むでしょうcache.get (key:i, create: false); i += 1;
PJTraill

1

おそらく、反対を説明することで答えが得られるでしょう(さらに、ここでXKCDを取得するのは言い訳です)。

代替テキスト

良いコードは

  • わかりやすい、
  • メンテナンスが簡単、
  • 目の前の問題だけを解決しようとはしません
  • 開発者に代替手段を探させることなく、長生きします

例が含まれます

  • Apache Commons
  • 春のフレームワーク
  • Hibernateフレームワーク

1

私は単に「維持可能」で行きます

すべてのコードを維持する必要があります。そのタスクを必要以上に難しくする必要はありません

読者がこの単純な要件を理解していないか、それを詳しく説明する必要がある場合、その読者はコードを書くべきではありません...


1

良いコードは人によって異なり、彼らが使用している言語も良いコードとみなされるものに影響を与えます。一般的に、プロジェクトに近づくと、次のことを探します。

  • プロジェクトはどのように構成されていますか?ソースファイルはきれいに整理されていますか?
  • コードはどのように構成されていますか?ファイルヘッダーの使用や、独自のファイルにある各クラスの使用など、ファイル内のコードが行うことを明確に文書化していますか?ファイルには、アプリケーションで使用されなくなった機能がありますか?
  • 機能はどのように構成されていますか?変数が宣言されている場所に明確なパターンがありますか、それともかなりランダムなパターンですか?コードには論理的な流れがあり、不必要な制御構造を回避していますか?必要に応じてコードが自己文書化され、コードが何をしているのか、および/またはどのように行われているのかをコメントで明確に表現して、すべてが明確に文書化されていますか?

これらすべてを超えて、アプリケーションの設計は全体として理にかなっていますか?アプリケーションに常駐するコードは世界で最高のものになる可能性がありますが、アプリケーションの全体的な設計が意味をなさない場合、作業するのは依然として苦痛かもしれません。


1

読みやすさについて、私は親切に反対させてください。いいえ、完全ではありません:良いコードは読みやすいはずであり、十分なコメントで簡単に達成できます。

しかし、私は2種類のWTFを検討します。プログラマーがプログラミング101よりもさらに進歩したかどうか疑問に思うものと、コードの優しさを絶対に把握していないものです。最初は非常に奇妙に見えるコードもありますが、実際には難しい問題に対する非常に独創的なソリューションです。2番目のものは、WTFメーターには含まれません。コメントで回避できます。

非常に読みやすいコードは、非常に遅くなります。読みにくいソリューションでは、速度が大幅に向上します。Rは、それがよく当てはまる言語の優れた例です。可能な限りforループを避けるのが好きです。一般的に、読みやすさは劣りますが、最速のコードはより良いコードだと思います。つまり、改善が大幅に改善され、コードの機能を説明するために十分なコメントが挿入される場合です。

さらに、多くの科学アプリケーションではメモリ管理が重要になる場合があります。非常に読みやすいコードは、メモリ使用量が少しずさんな傾向があります:作成されるオブジェクトはさらに多くあります。かなりの場合、メモリを賢く使用するとコードが読みにくくなります。しかし、たとえばギガバイトのDNAシーケンスをジャグリングする場合、メモリは重要な要素です。繰り返しになりますが、可読性に関係なく、メモリ集約度の低いコードは優れたコードであると考えています。

そのため、良いコードには読みやすさが重要です。私はUwe Liggisの宣伝を知っています。思考の痛みとコンピューターは安いです。しかし、私の分野(統計ゲノミクス)では、1週間の計算時間と40 Gbを超えるメモリ使用量は異常とは見なされません。したがって、2倍の速度と半分のメモリの改善は、余分な可読性よりもはるかに価値があります。


例外なしのルールはありません
-user2664856

1
あなたの意見の不一致に反対させてください。あなたのフィールドでは速度が非常に重要であると言い、読みやすさよりも重要だと言います。私は同意しません、あなたは正しいバランスを使うよう努力するべきです。速度が必要ない場合、たとえば高レベルのインターフェースの場合、保守が簡単なものを好むかもしれません。速度が必要な場合は、私も同意します。厳しいルールよりも、常識を使用する方が適切であり、早すぎる最適化は避けてください。
ブルートリン

@BlueTrinなぜこれらの高パフォーマンスのソースcodezを脳でコンパイルし、そこで起こっていることの地獄を文書化しないのですか(コメントですぐに)?
mlvljr

1

私にとっては...別のプロジェクトで仕事をしている同僚がやって来て、コードの各ブロックを調べなくても自分がやっていることを理解できるようになったとき、私は良いコードを書いていることを知っています。そしてそれが何をしているかを示す。
彼が「ちょっと待って、何を!?」と言う代わりに。彼は言っています、「ああ、わかりました、あなたがそこで何をしたかわかります。」

また、優れたコードには、巧妙な回避策や「ハッキング」はあまりありません。あなたがそれを書いている間、あなたは自分自身にも言っているとき、「私はこれがそれをする良い方法ではないことを知っていますが、私は今のところこの方法でそれをしなければならないつもりです。私は思い出します後で改善するために自分自身...」


1

「良い」コードには多くの機能がありますが、最も重要なのは、読みやすさと保守性です。

あなたのコードはバグ含まれており、おそらく拡張されて再利用され、ある時点でリファクタリングされるべきです-あなたがそれを再訪しても、あなたは何の地獄の手掛かりを持っていない可能性がありますそもそも、あなた自身に恩恵を与え、邪魔をしないようにしたのです。

確かに、その複雑でありながら非常に効率的なアルゴリズムを使用しますが、それを文書化するために少し余分な時間を費やすことを確認してください。そうでなければ、コードを明確で一貫性のあるものにしてください。

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