ウォーターフォールとアジャイルの両方でリファクタリングと最適化の必要性を管理する包括的な原則が1つあります。YAGNI(You Ai n't Gonna Need It)です。第2の原則は、第1の帰結です。「時期尚早な最適化はすべての悪の根源です」、コーディングは、一般的なことわざ「卓越性の敵は完全である」に相当します。
原則を取って適用しましょう。特定のタイプのファイルを取得してその情報を抽出し、その情報をデータベースに入れるETLアルゴリズムを構築する必要があります。今週の目標(私たちの目的では、アジャイルショップにいるかSDLCショップにいるかは関係ありません)は、それを成し遂げることです。
あなたは賢い仲間であり、全体像を垣間見ることができます。これは、プロジェクトがETLを必要とする唯一のタイプのファイルではないことを知っています。したがって、このETLアルゴリズムを実装して、わずかな違いしかない別のタイプのファイルでも機能することを検討してください。これを行うと、YAGNIに違反します。あなたの仕事は、他のファイルのアルゴリズムを開発することではありません。週の終わりまでに必要な1つのファイルのアルゴリズムを開発することです。その目標を達成して受け入れテストに合格するには、そのアルゴリズムを開発して正しく動作させる必要があります。他のファイルで機能させるために、追加のコードは「必要ありません」。今組み込むことで時間を節約できると思うかもしれませんし、あなたは正しいかもしれませんが、ひどく間違っているかもしれません。他のファイルのアルゴリズムは、コードを使用できないシステムの領域で使用する必要がある場合があります。または、新しいファイルの要件が、自分の方法とは異なる方法で(Agileでは、要件がまだ存在しない場合があります)。その間、あなたは時間を無駄にし、不必要にアルゴリズムの複雑さを増しました。
さて、来週です。最初のアルゴリズムの優れた成果に対する疑わしい報酬として、2つの新しいファイルタイプのアルゴリズムを作成するタスクが与えられました。アルゴリズムをより多くのファイルで動作させるには、追加のコードが必要です。ファイル固有の個々のステップで基本パターンを使用するテンプレートメソッドパターンを使用して既存のアルゴリズムを拡張するか、または既存のアルゴリズムから共通のインターフェイスを派生させ、そのインターフェイスに従う2つの新しいインターフェイスを開発してそれらをプラグインすることができます。使用するアルゴリズムを選択できるオブジェクト。
開発中に、システムが毎秒10KBの生データを処理できる必要があることを知っています。負荷テストを行い、最初のドラフトアルゴリズムが8KB / sを処理することを確認します。まあ、それはAATを通過するつもりはありません。見てみると、アルゴリズムにO(私の神)の複雑さのループ構造があることがわかります。あなたはそれを合理化し、12KB /秒を取得します。「かなり良い」とあなたは思う、「でも、もしコードにループが貧弱だったとしたら、他に何ができますか?」バズ「時期尚早の最適化」ルールに違反しました。コードは機能し、すべての要件を満たします。15KB /秒を必要とするように要件が更新されるまで、「完了」します。その場合は、コードを元に戻し、改善すべき点を探します。
アジャイルであろうと従来のSDLCであろうと、開発中は次の簡単なプロセスに従ってください。「最初のパスで機能させる。2番目のパスできれいにする。3番目のパスでしっかりさせる。」つまり、最初にコード行を作成するときに、そのコードが正しく機能し、バグが発生しないようにしますが、このコード内のデザインルールにはあまり注意を払わないでください。この領域には二度と触れないでください。次にそのコード行にアクセスしたとき、自分が間違っていることがわかりました。システムの一時的なものではなくなりました。読みやすさ、コードの簡潔さ、DRY原則のためにリファクタリングします(一部のコードをコピーアンドペーストして5回何かを実行したり、ループやメソッド呼び出しにリファクタリングしたりする場合があります)。そのコード行またはその周辺で3回目に作業する場合、
O(my God)-complexity
すぎないので、笑わせました!