Я спробував запланувати речі заздалегідь, але не можу, здається, справді все передбачити, поки не почну вибивати якийсь код.
Заманливо думати, що ідеальне планування дасть вам ідеальний дизайн / архітектуру програмного забезпечення, однак, виявляється, це категорично помилково. З цим є дві великі проблеми. По-перше, "на папері" та "коді" рідко збігаються, і причина полягає в тому, що легко сказати, як це потрібно зробити, а не насправді робити це . По-друге, непередбачені зміни вимог стають очевидними в процесі розробки, про які не можна було міркувати з самого початку.
Ви чули про рухливий рух? Це спосіб мислення, де ми цінуємо "реагування на зміни", а не "слідуючи за планом" (серед іншого). Ось маніфест (це швидке читання). Ви також можете прочитати про Великий дизайн переднього фронту (BDUF) та які підводні камені.
На жаль, корпоративна версія "Agile" - це купа хибних (сертифіковані майстри scrum, важкий процес на ім'я "Agile", примушування scrum, примушування 100% покриття коду тощо), і зазвичай призводить до зміни процесів асиніну, оскільки менеджери думаю, що 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): і можу також стверджувати, що він надзвичайно добре працює для даного домену.
Caveat: Дизайнерська частина TDD працює менш добре в системах, де фундаментальний рефакторинг (наприклад, вирішити, що потрібно, щоб ваше програмне забезпечення було одночасно) було б важким, як у розподіленій системі. Наприклад, якщо ви повинні були розробити що - щось на зразок Facebook , де у вас є мільйони користувачів одночасно, роблячи TDD (диск вашого дизайну) було б помилкою (все ще добре використовувати після того, як у вас є попередній проект, і просто зробити «тест першого розвитку "). Важливо подумати про ресурси та структуру вашої програми, перш ніж переходити до коду. TDD ніколи не приведе вас до високодоступної розподіленої системи.
Як я можу уникати того, щоб завжди відчувати себе так, якби я повністю переобладнав свою програму з нуля, я б зробив це набагато краще?
З огляду на вищесказане, має бути дещо очевидним, що ідеального дизайну насправді неможливо досягти, тому переслідувати ідеальний дизайн - це дурні ігри. Ви дійсно можете лише наблизитися. Навіть якщо ви думаєте, що можете переробити з нуля, мабуть, все ще є приховані вимоги, які не проявили себе. Крім того, переписування займає щонайменше стільки, скільки потрібно для розробки оригінального коду. Це майже напевно не буде коротшим, оскільки, ймовірно, новий дизайн матиме власні непередбачені проблеми, плюс вам доведеться знову реалізувати всі функції старої системи.
Інша річ, яку слід врахувати, - це те, що ваш дизайн дійсно має значення лише при зміні вимог .Не має значення, наскільки дизайн поганий, якщо нічого ніколи не змінюється (якщо припустити, що він повністю функціональний для поточних випадків використання). Я працював над базовою лінією, в якій було 22000 операторів комутації ліній (функція була ще довшою). Це був жахливий дизайн? Чорт забирай, це було жахливо. Ми це виправили? Ні. Це працювало чудово, як було, і ця частина системи ніколи насправді не спричиняла збоїв чи помилок. Це торкнулося лише один раз за два роки, коли я був над проектом, і хтось, як ви здогадалися, вставив ще один випадок у вимикач. Але не варто витрачати час на те, щоб виправити щось, що торкається так рідко, це просто не так. Нехай недосконала конструкція буде такою, якою вона є, і якщо вона не зламалася (або постійно ламалася), тоді не виправляйте її. Тож, може, ти зможеш зробити краще ... але чи варто було б переписати? Що ви здобудете?
HTH.