簡単に言うと、それは依存します
詳細に
きれいにした光沢のあるものが必要ですか?
ここでは注意が必要なことがあります。実際の測定可能な利益と、個人的な好みとは関係のないコードに触れる可能性のある悪い習慣との間の限界を特定する必要があります。
より具体的には、これを知っている:
これはアンチパターンであり、組み込みの問題があります:
- それは、より拡張可能であり、より簡単ではないかもしれない、拡張します
- 理解するのは簡単ではないかもしれませんが、
- 最後になりましたが、間違いなく重要なことは、コード全体が遅くなる可能性があることです。
KISSの原則を参照として言及する人もいますが、ここでは直観に反しています。以下の残りの部分で説明するように、答えは必ずしも絶対ではありません。
YAGNI原理は、他の問題と完全に直交していないですが、それは自分自身に質問をすることができます:あなたはそれを必要とするつもりですか?
より複雑なアーキテクチャは、保守性が向上しているように見えることを除けば、本当にあなたに利益をもたらしますか?
これを大きなポスターに書いて、画面の横、職場のキッチンエリア、または開発会議室に掛けてください。もちろん、自分自身を繰り返す価値のある他の多くのマントラがありますが、この特定のマントラは、「メンテナンス作業」を行い、それを「改善」する衝動を感じるたびに重要です。
コードを読んで理解しようとするときに、コードを「改善」したり、無意識にコードに触れたりすることは自然なことです。それは良いことです、それは私たちが意見を述べられ、内部をより深く理解しようとすることを意味しますが、スキルレベル、知識にバインドされていることです(どうすれば良いかどうかを決めるのはどうですか?以下のセクションを参照してください...)、および私たちがソフトウェアを知っていると思うものについてのすべての仮定...:
- 実際に、
- 実際に行う必要がある、
- 最終的に行う必要があります、
- そしてそれがどれだけうまくいくか。
本当に最適化する必要がありますか?
これらすべてが、なぜそもそも「最適化」されたのでしょうか?彼らは、時期尚早の最適化がすべての悪の根源であり、文書化されておらず、一見最適化されたコードを見た場合、通常、おそらく最適化のルールに従わなかったと推測でき、最適化の努力を本当に必要としなかっただけであり、いつもの開発者のhub慢がはじまります。しかし、再び、多分それは今あなたの話しているだけかもしれません。
もしそうなら、どの制限内で許容可能になりますか それが必要な場合、この制限が存在し、物事を改善する余地、または手放すことを決定するためのハードラインが与えられます。
また、目に見えない特性に注意してください。おそらく、このコードの「拡張可能な」バージョンでは、実行時のメモリ容量も増え、実行可能ファイルの静的メモリフットプリントがさらに大きくなります。光沢のあるオブジェクト指向機能には、これらのような直感的でないコストが伴います。これらは、プログラムや実行する環境にとって重要な場合があります。
測定、測定、測定
Googleの今のように、それはすべてデータに関するものです!データでバックアップできる場合は、必要です。
それそれが続くことになるの開発に費やしたすべての$ 1本それほど古くない物語あります少なくともテストで$ 1と少なくともサポート$ 1(本当に、それは多くのだが)。
変更は多くのことに影響します:
- 新しいビルドを作成する必要があるかもしれません。
- 新しいユニットテストを作成する必要があります(まったくない場合は間違いなく、バグの表面が増えているため、より拡張性の高いアーキテクチャにはおそらく余地が残されています)。
- 新しいパフォーマンス・テストを(将来的にはこれは安定したまま確認するために、ボトルネックがどこにあるか確認するために)書く必要があり、これらを行うのは難しいです。
- あなたはそれを文書化する必要があります(そして、より拡張可能であることは詳細のためのより多くの余地を意味します)。
- あなた(または他の誰か)はQAで広範囲に再テストする必要があります。
- コードは(ほとんど)バグフリーではないため、サポートする必要があります。
したがって、ここで測定する必要があるのは、ハードウェアリソースの消費(実行速度またはメモリフットプリント)だけでなく、チームのリソース消費でもあります。両方をターゲットの目標を定義し、測定し、説明し、開発に基づいて適応させるために予測する必要があります。
そして、あなたのマネージャーにとって、それは現在の開発計画にそれを適合させることを意味するので、それについて通信し、猛烈なカウボーイ/潜水艦/ブラックオペレーションのコーディングに入らないでください。
一般に...
はい、でも...
誤解しないでください。一般的に、あなたが提案した理由を実行することに賛成します。ただし、長期的なコストに注意する必要があります。
完璧な世界では、それは正しい解決策です。
- コンピューターのハードウェアは時間の経過とともに向上します
- コンパイラとランタイムプラットフォームは時間の経過とともに改善され、
- 完璧に近い、クリーンで、保守可能で読みやすいコードが得られます。
実際には:
あなたはそれを悪化させるかもしれません
あなたはそれを見るためにより多くの眼球を必要とします、そしてあなたがそれを複雑にするほど、より多くの眼球が必要になります。
あなたは未来を予測することはできません
絶対に確実に知る必要はありません。必要な「拡張機能」を古い形式で実装する方が簡単で迅速だったとしても、それ自体を最適化する必要があるとしても。
それは、経営者の観点から、直接的な利益なしに莫大なコストを表しています。
プロセスの一部にする
あなたはここでそれはかなり小さな変更であり、いくつかの特定の問題を念頭に置いていると言います。この場合は通常大丈夫だと思いますが、私たちのほとんどは小さな変更の個人的な話、ほとんど外科的ストライキの編集もありますコードの背後にある理由を説明し、あるべきではない何かに触れました。
そのような決定を処理するプロセスがある場合、それらから個人的な優位性を取ります。
- 物事を正しくテストすれば、物事が壊れているかどうかをすばやく知ることができます。
- それらを測定すると、改善されたかどうかがわかります。
- 確認すれば、人々を追い払うかどうかがわかります。
テストカバレッジ、プロファイリング、データ収集は難しい
しかし、もちろん、テストコードとメトリックは、実際のコードで回避しようとしているのと同じ問題に悩まされる可能性があります。正しいことをテストし、将来のために正しいことを行い、正しいことを測定しますか物事?
それでも、一般に、テスト(特定の制限まで)と測定を行うほど、収集するデータが増え、安全になります。悪い類推の時間:運転(または一般的な生活)のように考えてください:車があなたに故障したり、誰かが今日自分の車で運転して自分を殺すことにした場合、あなたは世界で最高のドライバーになることができますスキルが足りないかもしれません。あなたを襲う可能性のある環境的なものが両方あり、人的エラーも重要です。
コードレビューは開発チームの廊下試験です
そして、ここで最後の部分が重要だと思います:コードレビューを行います。ソロにした場合、改善の価値がわかりません。コードレビューは「廊下のテスト」です。バグを検出し、オーバーエンジニアリングやその他のアンチパターンを検出するため、およびコードがチームの能力に合っていることを確認するために、レイモンドのLinusの法則に従ってください。誰もがそれを理解し、維持できなければ、「最高の」コードを持つことは意味がありません。そして、それは不可解な最適化と6層の深いアーキテクチャ設計の両方に当てはまります。
最後に、覚えておいてください:
デバッグは、そもそもプログラムを書くよりも2倍難しいことを誰もが知っています。それで、あなたがそれを書くときにあなたがそうすることができるのと同じくらい賢いなら、どのようにそれをデバッグしますか?- ブライアン・カーニガン