Abordando sus preguntas ...
... ¿sería un error recomendar una arquitectura súper simple, incluso para resolver un problema complejo, para un cliente empresarial?
Absolutamente no.
Desde la perspectiva del cliente
Como se indicó anteriormente, depende en gran medida del cliente. También depende de su capacidad para medir con precisión qué soluciones son adecuadas para su cliente. Si bien siempre habrá un costo percibido para el valor deseado, como consultor, es su trabajo establecer las expectativas apropiadas del cliente. En algunos casos, tendrá que cumplir con esa percepción. En otros, será mejor para usted corregirlos. Después de todo, debe ser el experto para su cliente. Y si no lo eres, debes tener el conocimiento para poder convertirte en ese experto. Por eso te pagan.
Desde la perspectiva del desarrollador
La parte más difícil de elegir qué arquitectura usar es, a menudo, estimar correctamente la cantidad de trabajo requerida para utilizar la tecnología para satisfacer las necesidades específicas. Esto puede conducir rápidamente a proyectos que no cumplen con las expectativas del cliente. Comprenda que algunos proyectos en realidad se hacen más rápido utilizando estas piezas de código "complejas" que usted menciona. También se entiende que algunos no lo son. Debe proporcionar esa medida, en función de lo que usted o su equipo sepan.
¿Es la complejidad lo que define las soluciones empresariales, o es la confiabilidad, # usuarios concurrentes, facilidad de mantenimiento o todo lo anterior?
Si bien los detalles pueden variar, en general, una solución empresarial es una solución de software que se aplica a una amplia audiencia mixta. El número de usuarios concurrentes puede o no ser un factor, aunque a menudo lo es. El número total de usuarios, con frecuencia en una variedad de roles comerciales, es uno de los factores determinantes más importantes en cuanto a si la solución es "empresarial".
Muchas soluciones empresariales son muy complejas, pero algunas son bastante simples. Si bien la empresa le da un aire de confiabilidad (y ciertamente debe ajustarse a un determinado estándar), las diferentes soluciones tienen diferentes niveles de confiabilidad.
La facilidad de mantenimiento es algo por lo que creo que todo desarrollador (independiente o miembro del equipo) se esfuerza, no necesariamente se logra tan fácilmente. Lo importante es que haya un procedimiento de mantenimiento que tenga pautas firmes, en lugar de que sea "fácil". Recuerde, las diferentes bases de código tendrán niveles de facilidad sustancialmente diferentes dependiendo de las filosofías, las metodologías, la actividad del entorno (comercial) y la complejidad del código.
Reaccionando a sus otras declaraciones ...
En todos los casos, nunca hubo necesidad de hacer que el código sea intercambiable o reutilizable
A menudo nunca hay una necesidad específica de hacerlo. Sin embargo, este debería ser su objetivo, en todo momento. Considere esto ... Es posible que tenga un cliente que requiera la capacidad de acceder o mostrar su calendario desde la página web. Si hace que su propio código sea reutilizable, cuando otro cliente solicite lo mismo, ya tendrá parte del trabajo realizado. Si no lo hace, debe hacerlo de nuevo. Cada problema del cliente es a menudo uno que otro cliente en el futuro puede necesitar. En otras palabras, cada cliente con el que trabaje debe tener el potencial de reducir el costo del trabajo para sus futuros clientes (no necesariamente el costo del producto).
y las pruebas nunca se mantuvieron realmente más allá de la primera iteración porque los requisitos cambiaron, era demasiado lento,
Yo diría aquí que la metodología de prueba no fue lo suficientemente abstracta. Recientemente utilicé un código que hizo sus propias pruebas unitarias directamente dentro de sí mismo. Se hicieron una costumbre assert
y una expect
función que se adaptaban a las necesidades del proyecto. Cada vez que se necesita una prueba unitaria, se puede aplicar sin siquiera ajustar el código. De hecho, el código se distribuye activamente con las afirmaciones y espera aún allí. Hizo esas verificaciones como parte del código de trabajo.
... plazos, presión comercial, etc., etc.
A menudo he descubierto que la presión comercial adicional y los plazos que impiden el proceso de codificación han sido culpa del desarrollador, no del cliente. Si bien este no es siempre el caso, muchas veces la presión empresarial es causada por la percepción de incumplimiento de las expectativas del cliente. Cuando las fechas límite impiden el código, a menudo se debe a que el desarrollador no pudo medir con precisión la cantidad de trabajo requerida para el código funcional utilizable. En otras palabras, programarlos (los clientes lo esperan) , medirlos (los futuros clientes lo esperan) , realizarlos (los usuarios lo requieren) y recibir un pago por ellos (su contrato debe exigirlo) .