Я пытался планировать вещи заранее, но я не могу предвидеть все, пока не начну разрабатывать некоторый код.
Соблазнительно думать, что идеальное планирование даст вам идеальный дизайн / архитектуру программного обеспечения, однако оказывается, что это категорически неверно. Есть две большие проблемы с этим. Во-первых, «на бумаге» и «код» редко совпадают, и причина в том, что легко сказать, как это следует делать, а не делать это на самом деле . Во-вторых, непредвиденные изменения в требованиях становятся очевидными в конце процесса разработки, о чем нельзя было говорить с самого начала.
Вы слышали о гибком движении? Это способ мышления, в котором мы ценим «реагировать на изменения», а не «следовать плану» (среди прочего). Вот манифест (это краткое чтение). Вы также можете прочитать о Big Design Up Front (BDUF) и о подводных камнях.
К сожалению, корпоративная версия «Agile» является фальшивой (сертифицированные мастера Scrum, тяжелый процесс во имя «Agile», форсирование Scrum, 100% покрытие кода и т. Д.), И обычно приводит к изменениям процесса asinine, потому что менеджеры Подумайте, Agile - это процесс и серебряная пуля (чего нет ни у одного). Прочитайте проворный манифест, послушайте людей, которые начали это движение, таких как дядя Боб и Мартин Фаулер, и не впитывайте бессмысленную версию «корпоративного гибкого подхода».
В частности, вы обычно можете просто выполнить TDD (Test Driven Development) для научного кода , и есть большая вероятность, что ваш программный проект окажется чертовски хорошим. Это связано с тем, что успешный научный код в основном имеет ультраиспользуемые интерфейсы, а производительность является второстепенной (а иногда и конкурирующей) проблемой, и поэтому вы можете избежать неприятностей с более «жадным» дизайном. TDD отчасти заставляет ваше программное обеспечение быть универсальным , потому что вы пишете, как вы хотите, чтобы вещи назывались (в идеале) до того, как вы на самом деле их реализуете. Он также предоставляет небольшие функции с небольшими интерфейсами, которые можно быстро вызывать простым способом «ввод» / «вывод», и это дает вам хорошую возможность для рефакторинга в случае изменения требований.
Я думаю, что мы все можем согласиться, что numpy
это успешное программное обеспечение для научных вычислений. Их интерфейсы маленькие, удобные в использовании, и все прекрасно сочетается. Обратите внимание, что numpy
справочное руководство явно рекомендует TDD: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html . В прошлом я использовал TDD для программного обеспечения SAR (Synthetic Aperature Radar), и я также могу утверждать, что он работает очень хорошо для этой конкретной области.
Предостережение: часть разработки TDD работает не так хорошо в системах, где фундаментальный рефакторинг (например, решение о том, что ваше программное обеспечение должно иметь высокую степень параллелизма) будет трудным, как в распределенной системе. Например, если вы должны были разработать что - то вроде Facebook , где у вас есть миллионы пользователей одновременно, делая TDD (диск вашего дизайна) было бы ошибкой (все еще хорошо использовать после того, как у вас есть предварительный проект, и просто сделать «тест первого развития «). Важно подумать о ресурсах и структуре вашего приложения, прежде чем переходить к коду. TDD никогда не приведет вас к высокодоступной распределенной системе.
Как я могу избежать ощущения, будто полностью перестроив свою программу с нуля, я бы сделал это намного лучше?
Учитывая вышесказанное, должно быть несколько очевидно, что идеальный дизайн на самом деле невозможен, поэтому погоня за идеальным дизайном - игра для дураков. Вы действительно можете только приблизиться. Даже если вы думаете, что можете изменить дизайн с нуля, вероятно, все еще есть скрытые требования, которые не показали себя. Кроме того, переписывание занимает как минимум столько же времени, сколько потребовалось для разработки оригинального кода. Это почти наверняка не будет короче, так как вполне вероятно, что новый дизайн будет иметь непредвиденные проблемы самостоятельно, плюс вам придется заново реализовать все функции старой системы.
Еще одна вещь, которую следует учитывать, это то, что ваш дизайн действительно имеет значение только тогда, когда меняются требования .Неважно, насколько плох дизайн, если ничего не изменится (при условии, что он полностью функционален для текущих случаев использования). Я работал над базовой линией, в которой было 22 000 операторов переключения строк (функция была еще длиннее). Был ли это ужасный дизайн? Черт возьми, это было ужасно. Мы это исправили? Нет, все работало нормально, и эта часть системы никогда не вызывала сбоев или ошибок. Он был затронут только один раз за два года моего участия в проекте, и кто-то, как вы уже догадались, вставил в коммутатор еще один чехол. Но не стоит тратить время на то, чтобы починить то, к чему так редко прикасаются, просто это не так. Пусть несовершенный дизайн будет таким, какой он есть, и если он не сломался (или постоянно ломается), то не исправляйте его. Так что, может быть, вы могли бы сделать лучше ... но стоит ли это переписывать? Что вы получите?
НТН.