El ciclo que describe es normal. La forma de mejorar las cosas no es evitar este ciclo, sino simplificarlo. El primer paso es aceptar que:
- Es casi imposible saber todo el primer día de un proyecto.
- Incluso si de alguna manera lo sabes todo, para cuando hayas terminado el proyecto, algo (los requisitos del cliente, el mercado en el que se encuentra, la tecnología con la que estás trabajando, los deseos de sus clientes) habrá cambiado y hecho en menos parte de lo que sabías inválido o incorrecto.
Por lo tanto, es imposible planificar todo por adelantado, e incluso si pudieras, seguir ese plan te llevaría a construir algo imperfecto u obsoleto. Sabiendo esto, integramos el cambio en nuestra planificación. Veamos tus pasos:
- Comience con algunos casos de uso
- Comience a codificar
- Me doy cuenta de algunas cosas que no manejé bien y que no encajan bien en la base de código actual.
- Reescribe la mayor parte del código
Ese es realmente un gran punto de partida. Así es como lo abordaría:
1. Comience con algunos casos de uso
Bueno. Al decir "casos de uso", que está centrado en lo que el software es para . Al decir "algunos", no estás tratando de descubrirlo todo; te estás apegando a una cantidad manejable de trabajo. Todo lo que agregaría aquí es priorizarlos. Con su cliente o usuario final, calcule la respuesta a esta pregunta:
¿Cuál es el software más pequeño y simple que podría ofrecerle para mejorar su situación?
Este es su producto mínimo viable : cualquier cosa más pequeña que esto no es útil para su usuario, pero cualquier cosa más grande corre el riesgo de planificar demasiado pronto. Obtenga suficiente información para construir esto, luego continúe. Tenga en cuenta que no sabrá todo en este momento.
2. Comience a codificar.
Excelente. Te pones a trabajar lo antes posible. Hasta que haya escrito el código, sus clientes no han recibido ningún beneficio. Cuanto más tiempo dedique a planificar, más tiempo pasará el cliente esperando sin amortización.
Aquí, agregaría un recordatorio para escribir un buen código. Recuerde y siga los Principios SÓLIDOS , escriba pruebas unitarias decentes sobre cualquier cosa frágil o compleja, tome notas sobre cualquier cosa que pueda olvidar o que pueda causar problemas más adelante. Desea estructurar su código para que el cambio no cause problemas. Para hacer esto, cada vez que tomas la decisión de construir algo de esta manera, en lugar de hacerlo de esa manera, estructuras tu código para que esa decisión afecte la menor cantidad de código posible. En general, una buena forma de hacerlo es separar su código:
- use componentes simples y discretos (dependiendo de su idioma y situación, este componente puede ser una función, una clase, un ensamblaje, un módulo, un servicio, etc. También puede tener un componente grande que está construido a partir de otros más pequeños, como una clase con muchas funciones, o un ensamblaje con muchas clases).
- cada componente realiza un trabajo o trabajos relacionados con una cosa
- los cambios en la forma en que un componente realiza su funcionamiento interno no deberían causar que otros componentes tengan que cambiar
- componentes deben ser dadas las cosas que usan o dependen de, en lugar de ir a buscar o crear ellos
- los componentes deben proporcionar información a otros componentes y pedirles que hagan el trabajo, en lugar de buscar información y hacer el trabajo ellos mismos
- los componentes no deben acceder, usar o depender del funcionamiento interno de otros componentes, solo usar sus funciones de acceso público
Al hacer esto, está aislando los efectos de un cambio para que, en la mayoría de los casos, pueda solucionar un problema en un lugar y el resto del código no se dé cuenta.
3. Encuentra problemas o deficiencias en el diseño.
Esto va a pasar. Es inevitable. Acepta esto. Cuando encuentre uno de estos problemas, decida qué tipo de problema es.
Algunos problemas son problemas en su código o diseño que dificultan hacer lo que el software debería hacer. Para estos problemas, debe regresar y modificar su diseño para solucionar el problema.
Algunos problemas son causados por no tener suficiente información o por tener algo en lo que no había pensado antes. Para estos problemas, debe volver a su usuario o cliente y preguntarles cómo les gustaría abordar el problema. Cuando tenga la respuesta, vaya y actualice su diseño para manejarlo.
En ambos casos, debe prestar atención a qué partes de su código tuvieron que cambiar, y a medida que escribe más código, debe pensar qué partes pueden cambiar en el futuro. Esto facilita la tarea de determinar qué partes pueden estar demasiado interconectadas y qué partes deben estar más aisladas.
4. Reescribe parte del código
Una vez que haya identificado cómo necesita cambiar el código, puede ir y hacer el cambio. Si ha estructurado bien su código, esto generalmente implicará cambiar solo un componente, pero en algunos casos también podría incluir agregar algunos componentes. Si descubre que tiene que cambiar muchas cosas en muchos lugares, piense por qué es así. ¿Podría agregar un componente que mantenga todo este código dentro de sí mismo y luego hacer que todos estos lugares solo usen ese componente? Si puede, hágalo, y la próxima vez que tenga que cambiar esta función, podrá hacerlo en un solo lugar.
5. Prueba
Una causa común de problemas en el software es no conocer los requisitos lo suficientemente bien. Esto a menudo no es culpa de los desarrolladores; a menudo, el usuario tampoco está seguro de lo que necesita. La forma más fácil de resolver esto es revertir la pregunta. En lugar de preguntar "¿qué necesitas que haga el software?", Cada vez que sigas estos pasos, dale al usuario lo que has construido hasta ahora y pregúntale "Construí esto, ¿hace lo que necesitas?". Si dicen que sí, entonces has creado algo que resuelve su problema, ¡y puedes dejar de trabajar! Si dicen que no, podrán decirle en términos más específicos qué hay de malo en su software, y usted puede mejorar esa cosa específica y volver para obtener más comentarios.
6. Aprende
A medida que avanza en este ciclo, preste atención a los problemas que está encontrando y los cambios que está realizando. ¿Hay patrones? Puedes mejorar
Algunos ejemplos:
- Si sigue descubriendo que ha pasado por alto el punto de vista de cierto usuario, ¿podría lograr que ese usuario se involucre más en la fase de diseño?
- Si sigue teniendo que cambiar las cosas para ser compatible con una tecnología, ¿podría construir algo para interactuar entre su código y esa tecnología para que solo tenga que cambiar la interfaz?
- Si el usuario sigue cambiando de opinión sobre las palabras, los colores, las imágenes u otras cosas en la interfaz de usuario, ¿podría crear un componente que proporcione al resto de la aplicación esos para que estén todos en un solo lugar?
- Si encuentra que muchos de sus cambios están en el mismo componente, ¿está seguro de que ese componente se queda en un solo trabajo? ¿Podrías dividirlo en algunas piezas más pequeñas? ¿Puedes cambiar este componente sin tener que tocar ningún otro?
Ser ágil
Lo que está avanzando hacia aquí es un estilo de trabajo conocido como Agile. Agile no es una metodología, es una familia de metodologías que incorporan una gran cantidad de cosas (Scrum, XP, Kanban, por nombrar algunas), pero lo que todos tienen en común es la idea de que las cosas cambian, y como desarrolladores de software, debe planear adaptarse a los cambios en lugar de evitarlos o ignorarlos. Algunos de sus principios básicos, en particular los que son relevantes para su situación, son los siguientes:
- No planifique con más anticipación de lo que puede predecir con confianza.
- Tenga en cuenta que las cosas cambien a medida que avanza
- En lugar de construir algo grande de una vez, construya algo pequeño y luego increméntelo gradualmente
- Mantenga al usuario final involucrado en el proceso y obtenga comentarios rápidos y regulares
- Examina tu propio trabajo y progreso, y aprende de tus errores