Un amigo mío está trabajando para una pequeña empresa en un proyecto que todo desarrollador odiaría: está presionado para lanzar lo más rápido posible, es el único que parece preocuparse por la deuda técnica, el cliente no tiene antecedentes técnicos, etc.
Me contó una historia que me hizo pensar en la idoneidad de los patrones de diseño en proyectos como este. Aquí está la historia.
Tuvimos que mostrar productos en diferentes lugares del sitio web. Por ejemplo, los administradores de contenido podrían ver los productos, pero también los usuarios finales o los socios a través de la API.
A veces, faltaba información de los productos: por ejemplo, un montón de ellos no tenía ningún precio cuando se creó el producto, pero el precio aún no se había especificado. Algunos no tenían una descripción (la descripción es un objeto complejo con historiales de modificación, contenido localizado, etc.). Algunos carecían de información de envío.
Inspirado por mis lecturas recientes sobre patrones de diseño, pensé que esta era una excelente oportunidad para usar el patrón mágico de objeto nulo . Así que lo hice, y todo fue suave y limpio. Uno solo tenía que llamar
product.Price.ToString("c")
para mostrar el precio, oproduct.Description.Current
para mostrar la descripción; No se requieren cosas condicionales. Hasta que, un día, la parte interesada solicitó mostrarlo de manera diferente en la API, al tener unnull
JSON. Y también de manera diferente para los administradores de contenido al mostrar "Precio no especificado [Cambiar]". Y tuve que asesinar mi querido patrón de Objetos Nulos, porque ya no era necesario.De la misma manera, tuve que eliminar algunas fábricas abstractas y algunos constructores, terminé reemplazando mi hermoso patrón Facade por llamadas directas y feas, porque las interfaces subyacentes cambiaron dos veces al día durante tres meses, e incluso el Singleton me dejó cuando los requisitos indicaban que el objeto en cuestión tenía que ser diferente según el contexto.
Más de tres semanas de trabajo consistieron en agregar patrones de diseño, luego desgarrarlos un mes después, y mi código finalmente se convirtió en espagueti lo suficiente como para que nadie pudiera mantenerlo, incluido yo mismo. ¿No sería mejor nunca usar esos patrones en primer lugar?
De hecho, tuve que trabajar yo mismo en ese tipo de proyectos donde los requisitos cambian constantemente y están dictados por personas que realmente no tienen en mente la cohesión o la coherencia del producto. En este contexto, no importa cuán ágil sea, encontrará una solución elegante a un problema y, cuando finalmente lo implemente, aprenderá que los requisitos cambiaron tan drásticamente que su solución elegante no encaja. más tiempo.
¿Cuál sería la solución en este caso?
¿No usa ningún patrón de diseño, deja de pensar y escribe código directamente?
Sería interesante hacer una experiencia en la que un equipo escriba código directamente, mientras que otro lo piense dos veces antes de escribir, arriesgándose a tener que tirar el diseño original unos días después: quién sabe, quizás ambos equipos tendrían misma deuda técnica En ausencia de tales datos, solo afirmaría que no se siente bien escribir código sin pensar previamente cuando se trabaja en un proyecto de 20 meses de trabajo.
¿Mantener el patrón de diseño que ya no tiene sentido e intentar agregar más patrones para la situación recién creada?
Esto tampoco parece correcto. Los patrones se utilizan para simplificar la comprensión del código; pon demasiados patrones y el código se convertirá en un desastre.
¿Comienza a pensar en un nuevo diseño que abarque los nuevos requisitos, y luego refactorice lentamente el diseño antiguo en el nuevo?
Como teórico y el que favorece a Agile, estoy totalmente metido en eso. En la práctica, cuando sabe que tendrá que volver a la pizarra cada semana y rehacer gran parte del diseño anterior y que el cliente simplemente no tiene fondos suficientes para pagarlo, ni tiempo suficiente para esperar , esto probablemente no funcionará.
Entonces, ¿alguna sugerencia?