web-dev-qa-db-ja.com

「賢い」コードを書かないように自分を訓練するには?

Expressionsで新しいトリックを披露したり、3つの異なる手順を一般化したりする必要があるときの気持ちを知っていますか?これは Architecture Astronaut スケールである必要はなく、実際には役立つかもしれませんが、他の誰かが同じクラスまたはパッケージをより明確で直接的に(そしてときどき退屈に)実装することに気付かずにはいられません)マナー。

問題を解決してプログラムを設計することがよくあります。どちらの場合でも、正反対に正反対に証拠が見つかるまで私の解決策は非常に明確でエレガントであると信じていますが、それは通常手遅れです。 がコードの複製に対して文書化されていない仮定を好む単純さの賢さも私の一部です。

「== --- ==」にできることは、「賢い」コードを書く衝動に抵抗し、いつベルを鳴らすべきか私は間違っていますか

私は経験豊富な開発者のチームと一緒に作業しているので、問題はさらに強くなっています。スマートコードを書く私の試みは、優雅さの幻想を払拭した後、自分自身にさえ愚かに思えることがあります。

76
Dan

私は経験豊富な開発者のチームと一緒に作業しているので、問題はさらに強くなっています。スマートコードを書く私の試みは、優雅さの幻想を払拭した後、自分自身にさえ愚かに思えることがあります。

あなたの解決策はここにあります。この文脈における「経験した」とは「あなたよりも経験した」という意味だと思います。少なくとも、あなたは明らかにそれらを尊重します。これは貴重な学習機会です-あなたの自我がヒットすることができると仮定します。 (厄介なこと、エゴ。私たちがそうする必要があるのは残念です。)

これらの人々とのコードレビューはありますか?もしそうなら、彼らがまだやっていないなら、あなたのでたらめであなたを呼ぶように彼らに明示的に頼んでください。自分で過剰設計する傾向に気づいたことに言及してください。シンプルなクローハンマーで十分な場合は、細心の注意を払って設計された最上級の空気圧削岩機(ある種の自動化されたロードワーカーのAndroidが望ましい)を使用する傾向があります。 。

コードのレビュー中に顔が赤くなっている間、自分の席に身をよじらせていることがよくあります。耐える。あなたは学んでいます。

次に、これらのいくつかを手に入れたら、おそらく過剰に設計していると思われる瞬間に注意を払います。それらの瞬間が来たら、自問してください。「コードレビュー中に誰かがこれについて私に電話をかけた場合、私のソリューションを利用可能な最善のものとして擁護できますか?それとも、私が見逃しているより簡単なソリューションはありますか?」

時々、ピアレビューはあなた自身の仕事をよく見るための最良の方法です。

54
BlairHippo

最善の方法は、Brian Kernighanの格言に留意することです。

「デバッグは、そもそもコードを書くより2倍難しいです。したがって、コードをできる限り巧妙に書くと、当然、デバッグするほど賢くはありません。」

20
Daniel Roseman

通常、重要なソフトウェアの問題には少なくとも3つの解決策があります。明白な方法、明白でない複雑な方法(巧妙な方法)、および明白でない単純な方法(エレガントな方法)です。著者についての引用はここに適用されます:

頭に浮かぶすべてを書き留めれば、あなたは作家になります。しかし、作者とは、自分の価値を惜しまずに判断し、そのほとんどを破壊できる作家です。 —コレット

自分のコードの価値を、かわいそうにせずに判断して、ほとんどを破壊するまで、エレガントなコードを書くことはできません。エレガントなコードを最終結果で判断すると、一見簡単そうに見えますが、速度を落とし、多くの下書きを通過し、他の人の助言を求め、ページに正しくないものを取り除く必要があります。つまり、コードが完全に機能している場合でも、答えに満足するまで、何かがうまくいかない理由を自分または同僚に尋ねます。多すぎると感じたり、繰り返しが多すぎたり、コンパイラーが特定の種類のバグを検出できるはずだったと感じるかもしれません。経験が少しあるほとんどのプログラマーはrecognizeエレガントなコードを簡単に作成できます。秘訣はなぜを理解することです。

これが、より洗練されたコードを書くための系統的な方法です。また、問題を新しい方法で見るのに役立つ洞察のフラッシュが頻繁に必要になります。これは達成するのがより困難ですが、コーディングに飛び込む前に速度を落として問題を考えるのに役立ちます。良い解決策を見つけたら、より良い解決策を探してください。他のコードを読むと役立ちます。クラスを受講したり、ベストプラクティスについて本を読んだりすることが役立ちます。他のプログラミングパラダイムを学ぶことは役立ちます。尊敬するコードを手助けしてくれる同僚にアドバイスを求める。

15
Karl Bielefeldt

既存の回答に追加してTDD方式で開発するので、まずコードで何をすべきかについてテストを記述し、次に実装してテストを環境にやさしくします。このようにして、テストが課す要件のみを満たします。テストを作成するので、開発に対する自己規律のあるアプローチに適しています。

9
Matteo Mosca

多くの異なるスキルセットや年にまたがる大規模でダイナミックなチームで働く場合、開発は、チームの最も保守的または最も知的欠陥のあるメンバーの現在のレベルまたは過去のメンバーの最も低いレベルに「低下」する自然な進展があります。

賢いコードはデバッグが難しく、技術仕様を伝えることが難しく、作成に時間がかかり、開発時間が遅くなるため、これは必ずしも悪いことではありません。

ソフトウェアの成熟度サイクルの後半で、パフォーマンスが必要になったときに、賢いコードによって効率とパフォーマンスが向上するなど、賢いコードが重要な場合があります。

巧妙なコードには、新しい言語機能やライブラリー呼び出しにさらされない可能性があるチームに、より迅速に開発し、より読みやすく理解しやすいコードを伝える方法もあります。たとえば、私がジュニア開発者から初めてLinqを紹介されたとき、私はすぐに不必要で、デバッグが難しく、愚かで、「賢い」と嫌悪感を持っていました。自分で遊んで、Linqクエリがどれほど有用で強力であるかを発見した後、時間をかけて学習し、私のDALコードはこれまで以上に簡潔で読みやすく、デバッグと拡張が容易になりました。

私は以前にオープンマインドを持っていなかったことを後悔し、私がそのような「賢い」ジュニア開発者にそれほど厳しいものでなかったらよかったのにと思います。

私の要点は、「賢い」コードは疑わしいはずですが、それは創造性と革新を阻害する可能性があるため、それに対して反対運動をすべきではありません。

編集:質問に完全には答えていないことに気づきました。プロジェクトに非常に簡単に巧妙なコードを作成する能力がある場合、おそらくチームはより厳密なコーディング標準を採用して、統一された明確なテンプレートとスタイルに従う必要があります。これは、サンドボックスのラインを引き出すのに役立ちますので、ボールを追いかけて通りをさまよいません。

6
maple_shaft

20%(%は異なる場合があります)または追加された行の多くがドキュメントである必要がある場合-ステップバックしてrethink

私はあなたが賢いように努力するべきだと本当に思います、それはより熟達することの自然な副作用です。明確にするために必要なコメントの%のような一般的なガイドラインを自分に与えることは、自分が立ち戻って、学んだ新しいことを使用することが賢明な選択であるか、または単に新しいおもちゃを自慢するための方法であるかどうかを評価する良い方法です。

6
DKnight

私は何か賢いことに挑戦するのに抵抗できません。

だから私はおもちゃプロジェクトで、自分の時間に、家でそれをしています。

目新しいものがすり減ったとき-問題は解決しました。

4
Mike Dunlavey

私のコードが「賢すぎる」かどうかを確認する1つの方法は、一歩下がって次のことを自問することだと思います。

このプロジェクト/コードに取り組んだことのない人にこのコードのプリントアウトを渡した場合、彼らはそれを読んで、機能について(簡単なコンテキストを提供した後)私に説明できますか?そうでない場合、どのくらい説明する必要がありますか? CS101を服用している人にこれをどのように説明しますか?

メソッドまたはクラスのすべての行またはほとんどの行を誰かに紹介しなければならないことがわかった場合、それはおそらく賢すぎるでしょう。言語構成(たとえばLINQ)に慣れていない人に説明する必要がある場合は、おそらくそれで問題ありません。行を見て説明する前に少し考えなければならない場合は、コードをリファクタリングする必要があります。

4
Becuzz

Expressionsで新しいトリックを披露したり、3つの異なる手順を一般化したりする必要があるときのその気持ちを知っていますか?

番号

これが、新しい開発者が文書化されていないspeghettiコードの大規模な混乱に放り込まれ、保守とリファクタリングを行うときに、それが良いことだと私がいつも言う理由の1つです。それは彼らが書かなかった過度に「賢い」コードを維持する現実を彼らに教え、うまくいけば今から5年後に彼らのコードをデバッグしなければならない貧しいシュマックに共感を植え付けます。

2
GrandmasterB

トピックはよく選ばれていると思います。一度に1万の処理を実行するPerlの行を書くのは「かっこいい」ですが、それを再検討しなければならないときは不便です。

賢いかどうかは別として、コードは文書化する必要があります。業界で受け入れられているプログラミング言語と、人間として私たちが慣れ親しんでいる高水準の概念との間には、固有のインピーダンス不整合があります。自己文書化コードは、それが自然言語になるまで、つまり実際には実現できません。 Prologコードでさえ文書化する必要があります。たとえそれが高レベルであっても、それはまだかなり正式なものだからです。

きめ細かい命令型コードは、きめ細かい計画を実装するのに役立ちます-これは文書化する必要があります。簡単な3行のロードマップコメントで、メソッドの50行すべてを読み通す必要はありません。

後の編集:より雄弁な例は、コンピューターを超越したものです。本は非常によく書かれているかもしれませんが、私たちはしばしばそれを抽象化のさまざまなレベルで処理したいと思います。多くの場合、本の要約で十分であり、それがコメントがコードに提供できるものです。もちろん、適切に抽象化されたコードは自己文書化に大いに役立ちますが、抽象化のすべてのレベルを提供することはできません。

また、本文のクレームの裏付けとなる推論プロセスを説明する必要がある場合、コメントを本の傍注のように機能させることができます。

この文脈で、コメントの必要性を超越した自然言語に関する私の以前の発言は正しくないことがわかりました。本のような自然言語でさえ、文書に組み込まれ、テキストで具体化された抽象化をまばらに説明したり、メインテキストを逸脱することなく迂回を提供したりできます。十分に抽象化されたコードは、すでに自己文書化するのに長い道のりを進んでいる可能性があることに注意してください。

最後に、重要なことに、コメントは、コーダーが高度な抽象化を維持するのに役立ちます。手順のリストに含めた2つの連続するコメントは、同じレベルの抽象化では話さないことがよくあります。そのため、そのコードを使って何をしているのかを批判的に検討する必要があります。

特定の問題は、コーディングを超越し、他のアクティビティと同様にコーディングに影響を与えます。コメントは、コードの背後にある理論的根拠とファセットを明確にするのに役立ちます。私は、変更のために人に利益をもたらすために、より穏やかな言語を話す快適な仲間だと思います。

2
Mihai Danila

おそらく、簡単なコードを書き始めるための良い方法は、プロジェクトの賢さへの情熱を解放することです賢さを求めます残りの答えは.NETに固有ですが、他の言語で同様のレベルのプロジェクトを見つけることができると確信しています。

オープンソースの依存性注入フレームワークExpressionトリックの知識を求めるだけの作業があり、 F# があり、試してみたい素晴らしいタスクの範囲がありますそれのために。

数学に夢中なら(そしてlanguage agnostic)、 Project Euler があります。

最後になりますが、.NETの世界には Mono Project が多くあります 開発者の注意が必要な領域 があり、その一部はかなり複雑です。 オープンソースの静的.NETコードアナライザツール に貢献してみませんか?いくつかのIL分析と、高レベルなものがあります。 Jb Evain は、セシルリフレクションライブラリ、Expressionサポート、.NETデコンパイラーのいずれであっても、常に興味深いものに機能します。

何も収まらない場合は 独自のモックフレームワークを開始する :-)

2
Dan

1)それが悪いことであることをあなたが知っているように、前にそれでやけどすること。ずっと前から巧妙に書かれた何かをデバッグしようとするのはとても楽しいです。あなたはそれをカバーしていると思います。
2)コードにコメントし、コードの各セクションの前に何をしているか説明します。
3)説明に苦労している場合や、図を挿入する必要があると感じた場合は、先ほど行ったことが賢すぎて、おそらくもっときれいに行うことができます。

問題の賢い解決策は、デバッグまたは拡張する必要があるまで、素晴らしいものになる可能性があります。時々それが唯一の解決策です。地獄が何をしているか、どのようにしているかを正確に説明できれば、賢い解決策も受け入れられます。

私は通常、コメントを使用して、コードのセクションで何をしているかを説明します。混乱が最も少ないと思われる場合は、それをどのように行っているかも説明します。理想的には、コードは単純明快で自明である必要があります。しかし、私が今やったことをどうやってやったのかを説明するのに苦労しているのであれば、一歩下がってもう一度試す必要があることは明らかです。

2
Philip

どうやって?経験豊富な開発者にコードを見せ続けてください。そして、あなたがソフォモリックで派手であることを非難されたら、それを吸い上げて、彼らがそれをどうやってやったのか、そして理由を尋ねます(もちろん、非対立的な方法で)。

-1に照らして編集:

多くの月前、私は同じ状況にありました-私はDelphiまたは「構造体付き」でポインターを使用するたびにうんざりする1人のボスと、すべてのブール値の短絡を停止しないと私を攻撃すると脅したもう1人0-1で、どこでも1文字の変数を使用します。

私は理由を尋ねたので私は学びました、そして彼らは私が何かに達するかもしれないと思ったので彼らは説明するのに苦労しました-LOL ....

1
Vector

自慢する必要はありますか?いいえ、もうありません。どうやってそれを乗り越えたのですか?ほとんどの人が他の悪い習慣を乗り越えるように...適切なテクニックの意識的かつ意図的な実践。あなたはそれを十分に行うと、ベストプラクティスの価値を理解し、それらを常に使用することで、良い習慣を身につけることができます。

また、機能的なソフトウェアに焦点を合わせると、時間どおりに簡単にメンテナンスできるため、求めている認識を得ることができます。経験豊富な開発者があなたのところにやって来て、「あなたが書いたモジュールはうまく設計されていました。プロジェクトにプラグインするためのコンポーネントを1つだけ実装する必要がありました」と言うでしょう。 「私はあなたが書いたモジュール全体を別のコンポーネントで使用するためだけに作り直す必要がありましたか?ボブ・マーティンやウォード・カニンガムについて聞いたことはありますか?」

TLDR:あなただけではありません。スキルの認識は、問題をスマートに解決することの副産物として最もよく達成されます。

1
Heath Lilley

私にとって、過度に巧妙なコードは、今日の要件に集中するのではなく、想像上の将来の要件を解決しようとすることがよくあります。ビッグトラップ!

0%過度に複雑なコードは、達成可能な目標ではありません。たぶん最善を尽くすことさえできません。過度に複雑なコードは悪いですが、プログラマーとして成長するには、新しいことに挑戦する必要があります。回避できる場合は、実稼働コードで試してはいけません。機械とは異なり、人間は間違いを犯します。

コードレビューが役立ちます。他の人の「賢い」コードを修正するのに何年も費やすことは役立ちます。クライアントが今日本当に必要としているものに集中し続けることが役立ちます。

学校やビジネスには、清掃やメンテナンスのスタッフがいます。コードもクリーンアップとメンテナンスが必要です!可能であれば、ごちゃごちゃ(特にあなた自身)を片付けましょう!それができる最高のことだと思います。

0
GlenPeterson