¿Es una mala señal que a menudo estoy rediseñando a medida que desarrollo un proyecto?


39

Cuando comencé a programar por primera vez, asumí que algún día llegaría al punto en que comenzaría un proyecto sentándome y dibujando un diagrama UML de todas las clases, y luego me apegaría a eso. He estado programando durante un par de años y no está resultando así. A medida que avanzo en un proyecto, a menudo digo

  • "Oye, necesito una clase para hacer _ _. No había pensado en eso antes".
  • "Espera, esta función realmente debería estar en esa clase en lugar de esta. Lo moveré".
  • "Esto debería ser en realidad dos clases en lugar de una. Lo dividiré".
  • "Debería hacer que estas tres clases independientes hereden todas de una clase abstracta".
  • Etcetera, etcétera.

¿Es una mala señal de que a menudo estoy rediseñando así a medida que avanzo? ¿Esto significa que soy un mal programador o es esto normal?

Respuestas:


41

Esta es una parte normal del desarrollo. Dos de los principios básicos del diseño continuo es que:

  1. No eres omnisciente, no puedes conocer todo el sistema de principio a fin antes de comenzar.
  2. El diseño no es estático. Esto es más frecuente cuando un proyecto ha estado en uso durante mucho tiempo y los problemas que ahora está resolviendo no son los problemas que estaba resolviendo cuando se escribió por primera vez.

Mi opinión personal al respecto es que debe tener una buena idea del diseño macro , pero permitir que el micro diseño evolucione. Otra forma de expresarlo es que el diseño de alto nivel (que es hasta donde llego con UML / herramientas de modelado) probablemente permanecerá bastante estático durante la vida de un proyecto. El diseño detallado de qué métodos hacen qué y la jerarquía de clases deben ser libres para ser maleables.

Cuando realmente no sabes mucho sobre el problema que estás resolviendo, harás muchos más errores iniciales. Sin embargo, después de haber trabajado con él el tiempo suficiente, el diseño general comenzará a establecerse en su lugar y las refactorizaciones de las que está hablando son todo lo que se necesitará para mantener el código ordenado.


3
+1, es por eso que siempre me estremezco cuando la gente habla de serializar objetos en una base de datos -> y qué pasa si mañana su clase ha sido explotada en varias partes, ¿cómo se deserializa sin mantener el código antiguo? Prefiero la alternativa Protobuf (clases dedicadas para almacenamiento / intercambio de mensajes) donde sus clases principales son libres de evolucionar, y solo necesita adaptar la capa de serialización / deserialización.
Matthieu M.

@ Matthieu: usted escribe una migración de base de datos. Rara vez lleva más de una hora escribir y probar. Ruby on Rails tiene una instalación muy buena para migraciones de bases de datos.
Kevin Cline

1
@kevin: supongo que no tenemos las mismas bases de datos, las mías contienen algunos cientos de millones de líneas. La migración no es una opción.
Matthieu M.

+1: ser demasiado orgulloso / terco para admitir que cometiste un error no es algo bueno. Algunas personas ven admitir sus errores como un signo de serenidad, pero la mayoría probablemente lo respetará, y ciertamente si su estrategia para enfrentar un error grave es negar que sea un error, es muy probable que ese segundo error sea fatal.
Steve314

12

Lo que estás haciendo se conoce popularmente como "refactorización". Si alguna vez dejas de hacerlo, entonces estás en problemas.

El hecho es que la mayoría del código es complejo y los humanos, incluso los bastante inteligentes, no pueden resolverlo de una vez.



5

Eso está perfectamente bien (a menos que estos rediseños sean siempre revisiones importantes o reconstrucciones desde cero). No te preocupes Puede ser bueno comenzar con un diagrama UML al comienzo del proyecto, pero no lo grabe en piedra, ya que casi siempre descubrirá que las cosas cambian a medida que trabaja. Es posible que aprenda nuevas técnicas que no conocía al principio, es posible que desee mejorar algunas características de formas que no había pensado durante el diseño inicial, los requisitos comerciales cambian, a veces hay incógnitas durante el diseño inicial que solo pueden se contabilizará más tarde, etc.

Lo que es importante es ir y actualizar los documentos iniciales UML para que reflejen los cambios significativos en el diseño, desarrolladores futuros demás (incluido usted mismo) podría terminar muy confundido. Esto puede ser difícil y, a menudo, requiere una buena diciplina (y tiempo).

Es muy, muy raro comenzar con un diseño y cumplirlo al 100% hasta la implementación. Personalmente, nunca he visto algo así, excepto por programas muy pequeños y triviales.


66
Paso 1: crea un diagrama UML. Paso 2: escribe el código. Paso 3: deseche el diagrama UML para que nadie lo vea y se confunda sobre cómo funciona realmente el código.
kubi

4

Lo que estás haciendo es perfectamente normal (siempre que no estés comenzando desde cero desde el principio). He estado en esto durante más de veinte años, y todavía es un proceso iterativo.

La única vez que podrá diseñar todo por adelantado y cumplirlo es si está resolviendo exactamente el mismo problema que resolvió la última vez, e incluso entonces probablemente pueda encontrar margen de mejora.


2

De ninguna manera soy un desarrollador altamente experimentado, pero también hago esto. En los últimos años, mi capacidad para construir mentalmente la arquitectura necesaria ha mejorado enormemente. Sin embargo, mientras escribo una pieza de software, no importa cuánto planifique, siempre hay lugares que necesitan un poco de rediseño. Manchas de las que no me di cuenta que me repetiría hasta que el código se esté escribiendo.

Mi punto de esta publicación es decir que hago todo en su lista y no siento que esas cosas sean necesariamente malas a menos que estén sucediendo constantemente y tengan un efecto negativo real en su productividad.


0

Eso se llama proceso iterativo y es un concepto básico en todas las técnicas modernas de desarrollo de software.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.