¿Cuántos detalles poner en la primera iteración del proyecto?

15

Acabo de comenzar un nuevo proyecto personal (Python), y estoy escribiendo lo que equivale a un "borrador" del programa, el mínimo requerido para hacer lo que quiero hacer. Todavía no estoy poniendo un extenso manejo de errores / excepciones o elementos estéticos de la interfaz de usuario (incluso en los casos en que sé que estas cosas finalmente serán necesarias), y la documentación es suficiente para ayudarme a ver lo que estaba haciendo en el futuro.

¿Va en contra de algún principio establecido de diseño / gestión de proyectos comenzar tan duro? Soy un científico, no un programador, así que no estoy al tanto de estas cosas. Entonces, la pregunta principal es, ¿existe un consenso sobre dónde se debe tratar de caer entre los dos extremos de:

  1. Escriba un código completo y de alta calidad desde el principio, con todo el manejo de excepciones y de tal manera que sepa que finalmente lo necesitará.

  2. Escriba un borrador aproximado que funcione mínimamente desde el principio, e ingrese para completar todas las minucias más adelante.

Pregunta relacionada: ¿ Cuándo está bien sacrificar la "pulcritud" del diseño para realizar un proyecto?

neuroneta
fuente
1
Nota para los posibles respondedores: el OP pregunta específicamente cómo equilibrar la calidad del código con la velocidad de desarrollo en los (probablemente) primeros ciclos de iteración de un proyecto. La pregunta no es si el producto final debe ser de alta calidad (manejo de errores robus, etc.) sino cuándo el prototipo debe comenzar a incluir o convertir a código de alta calidad.
Lilienthal

Respuestas:

10

No hay una respuesta única, ya que esto depende completamente del proyecto. Necesitamos pensar en dos cosas aquí. ¿Cuál es tu objetivo final? ¿Cómo esperas llegar allí?

Resultado final

¿Estás escribiendo el software de control Mars Orbiter? Entonces es mejor que te asegures de estar escribiendo el código más robusto posible. Será mejor que verifiques que cada excepción se maneje de manera sensata.

¿Está escribiendo un programa que solo usted ejecutará, y solo se ejecutará manualmente de vez en cuando? Entonces no te molestes con excepciones. No te molestes con la arquitectura pesada. Haz que funcione hasta el punto en que funcione para ti.

¿Cómo esperas llegar allí?

¿Estás haciendo un gran desarrollo en cascada, donde pasas mucho tiempo descubriendo lo que se necesita y luego te vas a ir durante meses, desarrollándote? Si es así, entonces desea alcanzar esa calidad objetivo mencionada anteriormente bastante temprano. Obtenga toda su infraestructura de comprobación de errores planificada desde el principio.

¿Está haciendo un desarrollo ágil y pesado, en el que está armando algo durante una o dos semanas, que luego se mostrará a las partes interesadas, que pueden solicitar revisiones radicales, y donde espera poder iterar durante muchos 1-2 sprints pequeños? hasta que alcanzas el objetivo? Entonces es mejor que haga que algo funcione, pero se fragilice rápidamente y solo agregue cinturones y tirantes a medida que se solidifiquen los requisitos del producto.

Si tiene el control sobre la cascada o la decisión ágil (que en realidad es un continuo, no una elección binaria), tome esa decisión en función del cambio esperado. Si está seguro de saber exactamente cómo se verá el resultado final, entonces la cascada es su mejor opción. Si solo tienes una idea vaga de lo que necesitas terminar, ágil es tu mejor opción. (Agile es más popular en estos días no porque sea inherentemente mejor sino porque la segunda situación es mucho más común).

Ahora encuentra tu propia respuesta

Para la mayoría, la respuesta estará en algún lugar en el medio. Responda ambas preguntas sobre su proyecto, y debería guiarlo en una dirección básica.

Puedo decirlo por mí mismo, si a menudo escribo scripts únicos que están diseñados de manera abismal y no tienen ningún error para verificar lo que sea. También manejo el código de producción, donde el manejo de errores y la arquitectura llaman mucho la atención. Todo depende de lo que estés haciendo.

Una advertencia final: si decides que estás haciendo scripts únicos que se pueden hacer rápido y sucio, asegúrate. Desafortunadamente, a menudo sucede que los scripts rápidos y sucios que hacen algo interesante se aprovechan para un uso amplio cuando otros lo notan. Asegúrese de que cuando esto suceda, se dé tiempo para el endurecimiento.

Gort the Robot
fuente
Información muy útil! El mío es un proyecto pequeño que no es crítico para el sustento de nadie, y quiero comentarios pronto sobre un modelo de trabajo mínimo, para tener una idea de cómo se sienten las personas sobre la estructura general. Así que creo que un borrador aproximado está bien, pero su punto final es excelente: otro temor es que termine un borrador, pero nunca haga las mejoras que necesitaría para llevarlo al nivel de buena programación (en lugar de " apenas funciona "programación").
neuronet
1
@neuronet: a veces la robustez de "apenas funciona" es suficiente. Una forma de pensarlo es comparar la frustración que se siente al trabajar con el software con la solidez requerida. Cuanto más frustrantes son los problemas con el software, más importante es que se resuelvan.
Bart van Ingen Schenau
11

Todos los conceptos y patrones de diseño y codificación de software surgen en respuesta a algún problema. El patrón o concepto es una solución a ese problema. Con el tiempo, algunos patrones se vuelven "conocidos" como soluciones preferibles porque resuelven el problema de una manera que cumple con ciertos requisitos de consistencia, familiaridad, rendimiento, mantenibilidad, etc.

De ello se deduce que, si el problema que el patrón de software está destinado a resolver no existe en su software particular, entonces no necesita el patrón. Además, cualquier discusión sobre qué patrones podría necesitar su software también debe incluir discusiones detalladas de su software propuesto: ¿qué se supone que debe hacer? ¿Qué problema soluciona? ¿Cuántos usuarios habrá? ¿Los usuarios compartirán datos de alguna manera? Etcétera.

El problema que se supone que deben resolver las excepciones es cuando sucede algo sobre lo que el código no puede hacer nada. Un ejemplo sería una operación de Archivo / Abrir donde se especifica un nombre de archivo que no existe en el medio de almacenamiento. Las excepciones le dan al código una forma de decirle a la persona que llama "Algo sucedió que me impide continuar, y no hay nada que pueda hacer al respecto, así que me doy por vencido". Si no tiene ningún lugar en su código donde existan condiciones como esa, entonces no necesita excepciones. O simplemente puede devolver un código de error y evitar la excepción por completo.

A medida que gane experiencia, aprenderá sobre los patrones de software y cuándo es apropiado su uso. También sabrá cuánto diseño inicial necesita; de nuevo, eso depende totalmente de la aplicación que esté escribiendo. Las pequeñas utilidades se escriben de una manera fundamentalmente diferente de las grandes aplicaciones empresariales, en otras palabras.

Robert Harvey
fuente
Puntos positivos: he dejado más claro en mi pregunta que estoy posponiendo cosas que (en base a otros proyectos) que finalmente necesitaré en un proyecto terminado.
neuronet
Espero haber dejado en claro que, incluso si sabes estas cosas, si no las necesitas, entonces no las necesitas.
Robert Harvey
4

Hay un enfoque muy simple y práctico para esto, que funciona para una amplia gama de proyectos pequeños y medianos. Aunque probablemente no funcionará bien para los Exploradores de Marte.

Primero, calcule lo que desea que haga el sistema y anote cada una de las características individuales. Esto puede ser tan sofisticado como un guión gráfico de usuario completo o tan simple como unos pocos puntos anotados en una hoja de papel frente a usted. Pero es importante que sepa lo que quiere que haga.

En base a eso, elabora la estructura general del sistema. Nuevamente, esto a menudo es solo un dibujo rápido de las diferentes clases / módulos y cómo se relacionan entre sí, pero puede ser tan complejo como un documento completo. Lo importante es que tenga una idea de cómo va a implementar el sistema. Pero, esto probablemente se refinará a medida que trabaje en él, así que no intente ir a lo complejo y detallado.

De todas estas características, descubra cuáles son las cosas clave que el programa debe hacer: las características principales.

Luego impleméntelos uno por uno. Ahora, la clave aquí es asegurarse de que una vez que haya implementado una característica, esto se haga y funcione completamente; idealmente, esto va acompañado de una prueba unitaria que se asegura de que siga funcionando. Por lo general, asumo que estaré tan ocupado que nunca tendré tiempo de volver a la función y solucionarlo.

Una vez que se implementan las funciones principales, generalmente trato de usar el sistema lo más cerca posible del entorno de producción. Esto le proporciona a) cualquier error que haya pasado por alto anteriormente yb) tenga una buena idea de la prioridad de las siguientes funciones.

Luego puede seguir implementando las características restantes según sea necesario.

Código de calidad versus características

Con lo anterior en mente, tiendo a sacrificar las características por la calidad del código, si tengo que cumplir un plazo. Simplemente porque, al menos en mi línea de trabajo, cuando termino algo, mi gerencia asume que está hecho. Y que me pueden dar la próxima tarea. No tengo mucho tiempo para mejorar el código después del hecho.

Ahora, ¿qué pasa con el manejo de excepciones?

Si no desea implementarlo de inmediato, puede enumerarlo como otra característica de la lista. Y cuando llegues a eso, puedes implementar eso. Pero lo más probable en su caso es que probablemente haya muchas otras cosas que son más importantes primero.

Sin embargo, hay un requisito mínimo para las excepciones: asegúrese de que se notifique al usuario si algo sale mal, sin importar cuán feo pueda ser el resultado. No tragues excepciones en alguna parte.

ced-b
fuente
1
"Por lo general, asumo que estaré tan ocupado que nunca tendré tiempo de volver a la función y arreglarla". Esta es la preocupación que tengo que debería haber mencionado. Me alegro de que lo hayas mencionado, y por la útil publicación.
neuronet