Существует один всеобъемлющий принцип, который регулирует необходимость рефакторинга и оптимизации как в водопаде, так и в Agile: YAGNI (вам это не нужно). Второй принцип является следствием первого: «Преждевременная оптимизация - корень всего зла», кодовый эквивалент общей пословицы «враг совершенства - совершенство».
Давайте возьмем принципы и применим их. У вас есть требование для построения алгоритма ETL, который принимает файл определенного типа, извлекает его информацию, а затем помещает эту информацию в базу данных. Ваша цель на этой неделе (для наших целей не имеет значения, находитесь ли вы в магазине Agile или SDLC) - добиться этого.
Вы умный парень, и вы получили представление о большой картине. Вы знаете, что это не единственный тип файла, для которого проекту понадобится ETL. Итак, вы рассматриваете реализацию этого алгоритма ETL, чтобы также работать с файлами другого типа, у которых есть только незначительные различия. Это нарушит YAGNI. Ваша задача - не разрабатывать алгоритм для этого другого файла; это разработать алгоритм для одного файла, который нужен к концу недели. Чтобы достичь этой цели и пройти приемочные тесты, вам нужно разработать этот алгоритм и заставить его работать правильно. Вам не понадобится дополнительный код, чтобы он работал с другим файлом. Вы можете подумать, что это сэкономит вам время, чтобы включить его сейчас, и вы можете быть правы, но вы также можете быть ужасно неправы; алгоритм для другого файла, возможно, придется использовать в той части системы, в которой ваш код не может быть использован, или требования к новому файлу могут отличаться от ваших, если вы не знаете (в Agile требования могут еще не существовать). Тем временем вы потратили впустую время и излишне увеличили сложность своего алгоритма.
Теперь на следующей неделе, и в качестве сомнительной награды за отличную работу над первым алгоритмом, вам было поручено создать алгоритмы для двух новых типов файлов. Теперь вам нужен дополнительный код, чтобы ваш алгоритм работал с большим количеством файлов. Вы можете расширить существующий алгоритм, используя шаблонный шаблонный метод, который будет использовать базовый шаблон с отдельными шагами для конкретного файла, или вы можете просто извлечь общий интерфейс из существующего алгоритма, разработать два новых, которые следуют интерфейсу, и подключить их к объект, который может выбрать, какой алгоритм использовать.
При разработке вы знаете, что у вас есть требование, чтобы система могла обрабатывать 10 КБ необработанных данных в секунду. Вы делаете нагрузочный тест и находите, что ваш первоначальный алгоритм черновика обрабатывает 8 КБ / с. Ну, это не будет проходить AAT. Вы посмотрите и увидите, что в вашем алгоритме есть некоторая структура цикла сложности O (Боже мой); Вы оптимизируете его и получите 12 КБ / с. «Довольно хорошо», вы думаете, «но если бы у меня был такой плохой цикл в коде, что еще я мог бы сбрить?». buzz Вы только что нарушили правило «преждевременной оптимизации». Ваш код работает и отвечает всем требованиям. Все готово до тех пор, пока требования не обновятся и не потребуют 15 КБ / с. Если и когда это произойдет, ТОГДА вы вытаскиваете код обратно и ищите, что можно улучшить.
Следуйте этому простому процессу при разработке, будь то в Agile или в традиционных SDLC: «На первом проходе сделайте так, чтобы он работал. На втором проходе сделайте его красивым. На третьем проходе сделайте его твердым». Это означает, что когда вы впервые создаете строку кода, заставьте этот код выполнять свою работу правильно и без ошибок, но не обращайте слишком много внимания на правила разработки в этом коде, как вы уже знаете сейчас ». Я никогда не коснусь этой области снова. В следующий раз, когда вы посещаете эту строку кода, вы просто доказали, что ошибаетесь; это больше не единственная часть системы. Рефакторинг его для удобочитаемости, краткости кода и / или принципов СУХОГО (возможно, вы скопировали некоторый код, чтобы сделать что-то пять раз; реорганизовать его в цикл и / или вызов метода). В третий раз, когда вы работаете в или около этой строки кода,
O(my God)-complexity
если не что иное, заставило меня смеяться!