He intentado planificar las cosas por adelantado, pero parece que no puedo prever todo realmente hasta que empiezo a elaborar un código.
Es tentador pensar que una planificación perfecta le dará un diseño / arquitectura de software perfecto, sin embargo, resulta que es categóricamente falso. Hay dos grandes problemas con esto. En primer lugar, "en papel" y "el código" rara vez coinciden, y la razón es porque es fácil decir cómo se debe hacer en lugar de hacerlo realmente . En segundo lugar, los cambios imprevistos en los requisitos se vuelven aparentes tarde en el proceso de desarrollo que no pudieron haber sido razonados desde el principio.
¿Has oído hablar del movimiento ágil? Es una forma de pensar donde valoramos "reaccionar al cambio" en lugar de "seguir un plan" (entre otras cosas). Aquí está el manifiesto (es una lectura rápida). También puede leer sobre Big Design Up Front (BDUF) y cuáles son las dificultades.
Desafortunadamente, la versión corporativa de "Agile" es un montón de falsos (maestros de scrum certificados, procesos pesados en nombre de "Agile", forzar scrum, forzar una cobertura de código del 100%, etc.), y generalmente resulta en cambios de proceso estúpidos porque los gerentes Creo que Agile es un proceso y una bala de plata (de los cuales no lo es). Lea el manifiesto ágil, escuche a las personas que comenzaron este movimiento como el tío Bob y Martin Fowler, y no se deje engañar por la versión sin sentido de "ágil corporativo".
En particular, generalmente puede salirse con la suya haciendo TDD (Test Driven Development) en código científico , y hay una buena probabilidad de que su proyecto de software resulte bastante bueno. Esto se debe a que el código científico exitoso en su mayoría tiene interfaces ultra utilizables, con el rendimiento como una preocupación secundaria (y a veces competitiva), y por lo que puede salirse con la suya con un diseño más "codicioso". El tipo de TDD obliga a su software a ser ultra-utilizable , porque usted escribe cómo quiere que se llamen las cosas (idealmente) antes de implementarlas. También fuerza pequeñas funciones con pequeñas interfaces que pueden llamarse rápidamente de manera simple, "entrada" / "salida", y lo coloca en una buena posición para refactorizar en caso de que los requisitos cambien.
Creo que todos podemos estar de acuerdo en que numpy
es un software informático científico exitoso. Sus interfaces son pequeñas, súper utilizables y todo funciona muy bien juntos. Tenga en cuenta que numpy
la guía de referencia recomienda explícitamente TDD: https://docs.scipy.org/doc/numpy-1.15.1/reference/testing.html . He usado TDD en el pasado para el software de imágenes SAR (Synthetic Aperature Radar): y también puedo afirmar que funciona extremadamente bien para ese dominio en particular.
Advertencia: La parte de diseño de TDD funciona menos bien en sistemas donde una refactorización fundamental (como decidir que necesita que su software sea altamente concurrente) sería difícil, como en un sistema distribuido. Por ejemplo, si tuviera que diseñar algo como Facebook donde tiene millones de usuarios simultáneos, sería un error hacer TDD (para impulsar su diseño) (todavía está bien usarlo después de tener un diseño preliminar y simplemente hacer "probar primero el desarrollo "). Es importante pensar en los recursos y la estructura de su aplicación antes de saltar al código. TDD nunca lo llevará a un sistema distribuido de alta disponibilidad.
¿Cómo puedo evitar sentir siempre que si reconstruyo completamente mi programa desde cero lo haría mucho mejor?
Teniendo en cuenta lo anterior, debería ser algo evidente que un diseño perfecto es realmente imposible de lograr, por lo que perseguir un diseño perfecto es un juego tonto. Realmente solo puedes acercarte. Incluso si crees que puedes rediseñar desde cero, probablemente todavía hay requisitos ocultos que no se han mostrado. Además, las reescrituras tardan al menos el tiempo necesario para desarrollar el código original. Es casi seguro que no será más corto, ya que es probable que el nuevo diseño tenga sus propios problemas imprevistos, además de que tiene que volver a implementar todas las características del sistema anterior.
Otra cosa a tener en cuenta es que su diseño solo importa cuando cambian los requisitos .No importa cuán malo sea el diseño si nada cambia (suponiendo que sea completamente funcional para los casos de uso actuales). Trabajé en una línea de base que tenía una declaración de cambio de línea de 22,000 (la función era aún más larga). ¿Fue un diseño terrible? Diablos, sí, fue horrible. ¿Lo arreglamos? No. Funcionó tan bien como estaba, y esa parte del sistema nunca causó fallas o errores. Solo se tocó una vez en los dos años que estuve en el proyecto, y alguien, lo adivinaste, insertó otro caso en el interruptor. Pero no vale la pena tomarse el tiempo para arreglar algo que se toca con poca frecuencia, simplemente no lo es. Deje que el diseño imperfecto sea como es, y si no se rompe (o se rompe constantemente), no lo arregle. Entonces quizás podrías hacerlo mejor ... pero valdría la pena volver a escribir? ¿Qué ganarás?
HTH.