¿Qué planificar antes de comenzar el desarrollo de un proyecto? [cerrado]

17

Digamos que recibí las especificaciones para un proyecto de un cliente, y ahora es el momento de comenzar a desarrollarlo. Normalmente, empiezo con el primer módulo (generalmente registro de usuario) y luego paso de un módulo al siguiente. Solo planifico en mi cabeza justo antes de comenzar un módulo cómo va a funcionar, pero no hay planificación antes de eso.

Sin embargo, creo que sería mejor si revisara las especificaciones y planificara cómo funcionaría el sistema antes de codificarlo, por ejemplo, cuáles son los componentes principales, cómo van a interactuar, etc. Solo estoy No estoy seguro exactamente qué debo planear.

Para dar una mejor idea de lo que estoy pidiendo, ¿cómo debería:

a) Divida el proyecto en componentes,

b) Planifique sus interacciones, por ejemplo, ¿debería hacer diagramas de clase, escribir pruebas unitarias, etc.?

¿Algunas ideas?

Haga clic en Upvote
fuente
"Simplemente no estoy seguro de qué debo planear". Por qué no? Enumeraste temas específicos. ¿Qué hay de malo con los temas que enumeras? ¿Qué tiene de malo "cuáles son los componentes principales, cómo van a interactuar"? Dado que esas son las cosas que te preocupan, ¿por qué no comenzar allí?
S.Lott
44
Su cliente tarde o temprano cambiará las especificaciones. Planifique las interacciones del módulo de tal manera que los cambios no alteren toda su base de código.
Reno

Respuestas:

23

Cuando tiene el privilegio de comenzar un nuevo proyecto, tiene un lienzo en blanco, que es emocionante y desalentador al mismo tiempo. Trabajo en iteraciones, y así es como divido el trabajo:

  • Comience con los objetivos del proyecto. Los objetivos son necesariamente los más vagos, pero lo ayudan a enfocarse en lo que el cliente o usuario intenta hacer con el software. Al final del día, desea satisfacer esos objetivos, incluso si eso significa dejar caer algunas características realmente geniales.
  • Luego empiezo a dividir la aplicación en sus subdominios. Probablemente hay cientos de formas diferentes de hacer esto, por eso comenzamos con los objetivos del proyecto. Queremos dividir la aplicación en algunos subsistemas relacionados que admitan esos objetivos. Esto nos ayuda a centrarnos en la próxima tarea.
  • Identifique cómo y cuándo los subsistemas necesitan interactuar. No estamos manejando los detalles, solo la información de alto nivel para asegurarnos de que tenemos un sistema integrado de subsistemas. Necesita una idea general de esto para poder desarrollar los detalles que respaldan los objetivos generales del proyecto.
  • Solo proporcione detalles para el subsistema en el que estoy trabajando en este momento (similar a su estrategia actual). Ya sé cómo este subsistema necesita interactuar con otros subsistemas, pero es posible que necesite encontrar un par de alternativas para que tenga más sentido. Cada subsistema está separado por una interfaz, por lo que puedo ajustar la implementación tanto como sea posible sin romper el sistema en su conjunto.
  • Revise cómo se implementan las cosas en mi subsistema actual en comparación con cómo se implementa en otros subsistemas. Cada enfoque que no es consistente es algo que el usuario tiene que aprender. Está bien si estamos hablando de un nuevo concepto. Por el bien de la usabilidad, no queremos 5 formas diferentes de eliminar la información que está presente simplemente porque éramos perezosos. Reutilizar los mismos elementos de la interfaz de usuario es la forma más rápida de hacer que la aplicación sea más intuitiva. Aprender tres conceptos es mucho más fácil que aprender 20.

Esencialmente, este enfoque de definir progresivamente un proyecto desde un nivel muy alto hasta un diseño más detallado me ha sido útil. Incluso las interacciones entre subsistemas se refinan a medida que intenta implementarlas. Eso es bueno.

Berin Loritsch
fuente
"Probablemente hay cientos de formas diferentes de hacer esto, por eso comenzamos con los objetivos del proyecto". Creo que es más probable que comience con patrones de diseño aplicables que se ajusten a los objetivos. No creo que pienses en 'objetivos'.
S.Lott
1
La mayoría de los clientes con los que me he encontrado pueden articular sus objetivos bastante bien, pero tienen dificultades con todo lo demás. Esencialmente, quiero asegurarme de que mi diseño satisfaga lo que necesitan. Cuando los objetivos del proyecto y los objetivos del cliente están alineados, realmente ayuda. Entonces, para ser más concreto, sí, estoy refinando mi diseño y eligiendo la forma en que analizo el problema para que todo se alinee.
Berin Loritsch
8

Creo que sería mejor si revisara las especificaciones

Correcto. Buena idea.

planeé cómo iba a funcionar el sistema antes de codificarlo.

Bueno. Haz más de eso.

¿Cuáles son los componentes principales?

Excelente.

cómo van a interactuar,

Correcto.

Simplemente no estoy seguro exactamente qué debo planear.

¿Cómo puede no estar seguro cuando ya ha enumerado un montón de cosas? Si esas son las cosas que te preocupan, ¿por qué no solo enfocarte en esas cosas?

Lea sobre el modelo de vista 4 + 1: http://en.wikipedia.org/wiki/4%2B1_Architectural_View_Model

Lea sobre el marco de Zachman: http://en.wikipedia.org/wiki/Zachman_Framework

Eso es lo que necesitas planear.

¿Cómo debería a) dividir el proyecto en componentes,

Utilice patrones de diseño ampliamente adoptados para otros proyectos similares.

En caso de duda, lea los planos J2EE para obtener ideas.

http://www.oracle.com/technetwork/java/javaee/blueprints/index.html

¿Cómo debo b) planificar sus interacciones, por ejemplo, debo hacer diagramas de clase, escribir pruebas unitarias, etc.?

Si. Buenas ideas, todas.

S.Lott
fuente
4

Lo más importante que debe hacer: revisar las especificaciones, interactuar con el cliente para obtener especificaciones más refinadas.

Los requisitos son indudablemente incompletos, vagos o incorrectos. La mayor pérdida de tiempo es hacer lo incorrecto. Los clientes no son ingenieros de software profesionales, y no se puede esperar que sean buenos para desarrollar un buen conjunto de requisitos.

Por lo tanto, debe revisar las especificaciones, entrevistar al cliente y averiguar si esto es lo que realmente necesita y desea, y puede pagar, etc.

Desarrolle casos de prueba / uso y revise con el cliente. Si un requisito no es comprobable, deséchelo.

Desarrolle el diseño y asegúrese de que si todas las piezas funcionan correctamente, en teoría haría lo que necesita.

Desarrolle un prototipo de arquitectura que pruebe toda la tecnología que se utilizará en cada capa pero ignore la funcionalidad. Está probando la arquitectura, no la especificación funcional. Tener la arquitectura incorrecta significará que debe reescribir todo, por lo que es importante obtener la arquitectura correcta. Asegúrese de que pueda cumplir con sus requisitos de velocidad, eficiencia, seguridad, etc.

Larry Watanabe
fuente
3

Definitivamente desea tener algún diseño en su lugar antes de comenzar a codificar.

Una vez que tenga eso, generalmente prefiero hacer una fase de arquitectura inicial primero para definir cómo encajan las capas de su aplicación. Esto incluiría cosas principales como la seguridad y el registro.

Luego construyo 1 característica de arriba a abajo para que implementes algo completamente.

Entonces ve desde allí.

ozz
fuente
0

Todo

Planifique todo, es más fácil cambiarlo en papel que una vez que parte de él ya está codificado, obtendrá una excelente base para la documentación y muchos otros beneficios.

Tim
fuente
3
-1 No creo que la respuesta sea útil y, en la mayoría de los casos, 'todo' definitivamente no es el camino a seguir.
KeesDijk