プログラミングが大好きです。私は子供の頃からコードをいじっています。私はプロの道を行ったことはありませんが、銀行の内部取引管理/報告システムを構築したところにロープを張ったプロジェクトを含め、さまざまな雇用主向けにいくつかの社内アプリケーションをコーディングしました。私はすぐに物を手に入れ、多くの概念を理解し、コーディングのプロセス全体に安心しています。
とはいえ、自分のプログラムが優れているかどうかはわかりません。確かに、それらは機能しますが、コードはクリーンでタイトでよく書かれたものですか、それとも別のコーダーがそれを見て頭を叩きますか? Stack Overflowで気が狂い、コーディングの試みが完全に微妙に見えるようなものをいくつか目にしました。私の雇用者は私がやったことに満足していますが、査読なしでは、それ以外の場合は暗いです。
私はピアコードレビューを調査しましたが、 NDAs または機密性の問題のため、多くの項目を投稿できません。あなたの専門家の多くは、肩越しに物事を見たり、アイデアを跳ねたりするチームメイトを持っているかもしれませんが、私のような独立したソロの人はどうですか?どのようにしてベストプラクティスを学び、コードが適切に機能するようにしますか?
それとも、期待どおりに実行され、優れたユーザーエクスペリエンスを提供する限り、「最高」であるかどうかは問題ではありませんか?
私にとって最大の手がかりは:
戻って機能を追加/変更する必要がある場合、難しいですか?変更を加えるとき、既存の機能を常に壊していますか?
上記の答えが「はい」の場合、おそらく全体的なデザインが悪いです。
変更に対応する必要があるまで、デザインを判断するのは(少なくとも私にとっては)少し難しいです(当然のことですが、一部のコードはただ不良であり、すぐにわかりますが、それでも経験が伴います)。
これは確かに私が働いているかなり標準的な方法です。
コードを表すドアはどれですか?あなたのチームまたはあなたの会社を表すドアはどれですか?なぜ私たちはその部屋にいるのですか?これは単なる通常のコードレビューですか、それともライブ開始直後に恐ろしい問題のストリームを見つけましたか?私たちはパニックに陥ってデバッグを行っているのでしょうか?大勢の人が立ち去る顧客やマネージャーは私たちの首を呼吸していますか?.
(Robert C Martin、 クリーンコード -上記の画像で開く本)
良いコードを書いているのは、次の場合です。
これを行う他のプログラマーはいないと言っていましたが、他の人のためにこれを含めます。
コード品質テスト:コードを見たことのない別のプログラマに、コードを読んでもらい、肩越しに各モジュールが何をするか説明してもらいます。ジャンプして何かを説明したいという強い衝動は、コードが悪化している可能性が高いです。口を閉じた状態で静かに座ることができ、多くの質問をする必要がない場合は、おそらく問題ありません。
参考までに、ピアが手元にない場合の一般的なガイドラインをいくつか示します。それらは絶対的なものではなく、単に「におい」です。
コードのにおい のより長いリストを次に示します。これも役立つはずです。
個人的には、コードを忘れたときだと思います。言い換えると:
1年前に作成したファイルを開いて、クラスへのすべてのニースの追加を見ると、それはいい感じですが、modifications、and-非常に高いファンイン! :)
もちろん、これらはmeが私が良いコードを書いているように感じさせるものですが、実際にはそれを知るのは本当に難しいです。私の推測では、人々があなたのコードをからかう以上にあなたのコードをからかい始めるなら、それは心配する時です。
私には3つの黄金律があります。
これらのルールは私にいくつかの本当のアーキテクチャの改善をするように導き、最終的には小さくてクリーンでメンテナンス可能なクラス/メソッドになりました。
これはすばらしい質問です。質問をしてもらったことを感謝します。
まず、ときどき心を吹き飛ばされるのはいいことです。謙虚さを保ち、あなたが知らないすべてを知っていること、これよりもあなたに優れた人がいること、そしてあなたにより良い何かを与えることをあなたに認識させ続けます努力する。
さて、良いコードを書いていることをどのようにして知っていますか?
他の人が言ったように、基本的に、オブジェクト指向プログラミングを行っていて、糸のもつれをほどいて巻き戻しようとするような何かを変えるときが来た場合、コードはオブジェクト指向の原則に従っていない。
これについてもう少し詳しく知りたい場合は、本 "Clean Code"、 を強くお勧めします。初心者にもエキスパートにもお読みいただけます。
私の主なポイントは次のようになると思います:
Designをこのリストに入れていません。プロジェクト内で一貫している限り、デザインパターンに固執することなく、優れたコードを書くことができると思います。 。
このトピックに関する優れたMSDN記事: 優れたコードが優れている理由
お気に入りの言語で優れたオープンソースプロジェクトを探して、それらが何をしているかを確認してください。
たとえば、 sendmail は、 spaghetti code と書いたかどうかを確認する場所です。 sendmailのせいではありません。たった20年しか経っていないので、そこにはたくさんのくずがあります。したがって、コードがsendmailコードのように見える場合、おそらく間違った方向に進んでいます。
私は最近は Postfix を見ていませんが、おそらく非常によく設計されています。したがって、もしあなたのものがpostfixのように見えるなら、あなたは正しい軌道に乗っています。
私が子供の頃にプログラミングを始めたとき、インターネットはなく、あなたは何も比較することができませんでした。しかし、比較のために表示できる膨大な数のコード行が用意されたので、正しく実行しているかどうかを理解する必要があります。
LinuxカーネルがLinuxカーネルであるからといって、それが適切に記述されているとは限りません。心に留めておきます。
これは、過去5か月間に大学のプログラミングの世界から業界に移行してからの私の経験です。
ぜひオープンソースプロジェクトをご利用ください。他のプログラマーの利益と一緒に作業する場合、実際にどれだけ知っているかを確認する機会が得られます。オープンソースプロジェクトは、おそらくあなたのバックグラウンドに基づいて調べる最良の方法です。
良いコードを読んで、なぜそれが良いのかを理解してください。悪いコードを読み、なぜそれが悪いのかを理解してください。平凡なコードを読んで、どの部分が良いか、どこが悪いか、どこが良いかを理解してください。独自のコードを読んで、同じようにしてください。特に例を見て、なぜ彼らが彼らのやり方でそれらを書いたのかを理解する目的で、いくつかの(評判の良い)教科書を取り上げます。ほとんどの場合、悪い部分と良い部分の違いがわかるまでコードを読み、独自の「Wtf?」を実行できます。テスト。
一般的に優れたコードを認識できるようになるまで、優れたコードを記述しているかどうかはわかりません。頭に何かがあったからといって、それがうまく書かれているとは限らない...
(「他の人のコードを読む」はこのスレッドのいくつかのコメントでポップアップしましたが、私はそれが独自の投稿に値すると思いました)
コードと設計の観点から、保守性について他の人がすでに言っていることが好きです。
また、安定性も見てみます。生産サポート統計を見てください。基本的な機能のように思われるが、多くの人がソフトウェアの使用方法を理解できない、またはニーズを満たしていないことに気づいているサポート対応の高いインスタンスを取得している場合は、何か問題があります。
もちろん、本当に無知なユーザーもいますが、時間の経過とともに、破損、混乱、または重大な機能変更要求のレポートが引き続き表示される場合は、次の1つまたはすべてが当てはまることを示しています。
他の誰かに1日仕事を引き継ぐよう依頼し、その日の終わりに彼または彼女がどれほどストレスを感じているかを確認してください;-)
ドキュメント化とクリーンアップが苦手です-だから私はそれをチェックする方法です。
散文のように読めるとき。
特定のコードについて:
それが機能し、保守可能である場合(優れたプラクティスを選択)、それは優れたコードです。
時間をかけて開発者として:
良いとは、言語ドメイン、問題ドメイン、現在のトレンド、そして最も重要なのはあなたの経験に対して、相対的で動的な用語です。この連続体の「良い」酸テストは単にあなたの前の仕事を振り返っているかもしれません、そしてあなたが「ため息と言ったら私は本当にそのようにそれを解決しましたか?」その後、あなたはまだ成長していて、良いコードを書き続ける可能性が高いです。
振り返って完璧なコードを見ると、どちらか-完璧であり、停滞しているリスクがあり、すぐに優れたコードの作成をやめる可能性があります。
良いコードは人にとって主観的です。たくさんの本を読んだり、セミナーに行ったり、さまざまなコーディング技術を使用したプロのコーダーは、おそらくコードを細断処理するでしょう...しかし、コードは、コーダーの経験レベルがどこにあるかを本当に示していることがわかりました。私にはそれは歴史書や自伝のように読みます。それは、コーダーが当時知っていたこと、または彼/彼女が制限されていたツールです。
自問してみてください...マイクロソフトが何かを正しくするために3つのバージョンのソフトウェアを採用するのはなぜですか?彼らは以前のバージョンで犯した間違いを常に修正しているからです。私のコードは改訂後は常に良くなることを知っています。確かに、私は初めて完璧なコードを書く人がいるでしょう。あなたがそれを信じるなら、私にはあなたを売るための沼地があります...
概念を理解すると、物事が簡単になります。私にとって、何か新しいことを学ぶことの始まりは「私はそれを働かせることができますか?」、そして次のステップは「私はこのようにそれを行うことができるのだろうか...」です。 「どうすれば速くできるか」...
もしあなたがプログラマーになりたいなら、あなたはそれに飛び込んで、ただそれをしなければなりません。それは多くの仕事を必要とし、正直に言うとそれは決して完成できない芸術作品のようです。ただし、カジュアルな趣味になりたい場合は、問題なく機能します。あなたはあなたの環境に適応する必要があります。コードレビューを行う方法がない場合、無知は至福です=)
しかし、何があっても...誰もが自分の意見を持つことになります。確かに、物事を行う正しい方法と間違った方法があります...しかし、ほとんどの場合、間違った方法よりも、より良い方法がほとんどあることがわかりました...
とはいえ、自分のプログラムが優れているかどうかは決してわかりません。確かに、それらは機能しますが、コードはクリーンでタイトでよく書かれたものですか、それとも別のコーダーがそれを見て頭を叩きますか?
質問別のコーダーがあなたのコードについてどう思うか考えましたか?
一部の場所では、コードリポジトリに受け入れられる前に、コードmustが別のコーダーに受け入れられる「ピアレビュー」を使用しています。
私見、それ自体「良いコード」はありませんが、「良いソフトウェア」はあります。
私たちが何かに取り組んでいるとき、私たちの仕事には多くの制約があり、他のプログラマーの「良いコード」の標準から外れるコードを生成することがよくあります。
「良いコード」は維持しやすいコードであると言う人もいるかもしれません。私にとってのこの発言に対する反論は、どれほど簡単ですか? 「良いコード」の標準のために、コードを200%程度維持する必要があるのでしょうか。それをそれほど維持する必要がないことがわかっているとしても、申し訳ありませんが、そうは思いません。
実際、私は私のチームで「良いコード」を本当に宣伝している人です。私は彼らのコードを見るたびに、彼らが完璧なコードを書いていることに気づかなかった。しかし、私は彼らが本当に仕事を成し遂げたことを認めなければならず、また私たちの会社のニーズのためにそれを適切に維持することができなければなりません。もちろん、このアプリケーションにはバグがある場合がありますが、私たちは間に合っただけで、顧客とユーザーを満足させ、競合他社よりはるかに前の位置にいる会社を確保しています。
したがって、「良いコード」は、必要なものを生成するコードであると言えます。本当に必要なものを考え、それを使用してコードを評価するだけです。
決して。
「良いコード」とは、まだ改善の余地がないコードだけです。 Jeff Atwoodによる :
世界には、見事で完璧なコードを作成できるプログラマーが少数います。私たちの残りのすべてができることは、時間の経過とともにソフトウェアの不快感を減らし続けることです-継続的な改善のプロセス
ちなみに、「 十分な設計は不十分な設計を意味する 」となる場合があるため、完璧に到達する必要はありません。
誰かがあなたのコードを見て経験するのに勝るものはありませんが、自分でコードを評価して改善するのに役立つリソースがいくつかあります。 Martin Fowlerの Refactoring (または website )を見てください。 SutterとAlexandrescuの C++ Coding Standards は、C++で記述している場合に適しています。そこにある推奨事項の多くは言語にとらわれませんが、他の言語では他の同様の本を推奨できるかもしれません。テスト駆動型開発は、開発者がいくらかの品質チェックを提供し、テストの作成が困難になると、コードがおそらく再構築を使用する可能性があることを知っているため、ソロ開発者にとって非常に役立ちます。
他のいくつかの兆候は、よりプロセス指向です。それらは通常、より良いコードにつながりますが、直接にはつながりません。これには、ソース管理の使用、ライブサーバーで直接開発しない自動ビルドプロセス、バグ追跡ソフトウェアの使用などが含まれます。
うまくコーディングするために、プログラムが非常に機能的で迅速であることを確認することを目指しています。ファイル、データ、機能、抽象化がかなり明白になるように、すべてが適切な場所にあることを確認してください。
この後、私はそれをテストにかけました。一般的にコンピュータにかなり精通していない人を見つけ、主要なコードパターンのいくつかを説明してみてください。彼らがちょっとそれを読むことができるならば、すごい。よくやった。
ほとんどの場合 [〜#〜] kiss [〜#〜] だけで、何もクラッシュせずに革新的になるようにしてください。また、コードに戻って、コードの改善とメンテナンスを行う時間についても詳しく説明しますが、それはかなりうまくカバーされています。
FindBugs 、 [〜#〜] pmd [〜#〜] などのコード分析ツールを使用できます。これにより、コードの品質に関する情報が提供されます。
あなたのコードをリリースし、何人かがそれをいじって、それがいつも想定されていることを確実に実行するようにします。または、必要に応じて、仕様を設計し、それらの仕様をすべて満たしていることを確認してください。これらのテストの1つまたは両方に合格した場合、コードは「今のところ適切」です。ほとんどの人にとって、あなたのコードは素晴らしいものにはなりません。なぜなら、あなたは1年後に戻ってきて、「なぜ私はやったのかと思うでしょう」 これのようにうまく機能しましたか?」
より多くの経験があれば、より良いコードが得られます。しかし、同じ習慣を続けていると、同じ落とし穴に陥ってしまいます。これは、「慣行はpermanent。あなたが継続的に正しい方法で物事を行う場合(コードをテストして、それが想定されているように機能することを常に確認するなど)、その後は改善されます。あなたが継続的に間違った方法で物事を行う場合(たとえば、特定の状況でコードをテストしない、またはバグが発生する可能性のある場所を認識できないなど)は、コードに頑固になるだけです。