¿Hasta dónde vas con YAGNI?


Estoy desarrollando una nueva aplicación web revolucionaria para el mercado empresarial. Claro, muchos antes que yo pensaron que su aplicación web sería revolucionaria solo para descubrir que no lo es (o lo es, pero el negocio no es bueno de todos modos).

Así que estoy pensando, con el fin de averiguar si mi idea tiene alguna tracción con el menor costo, para seguir un extremo YAGNI:

  • Sin características de seguridad (es decir, sin usuarios, etc.). Para cualquier cliente nuevo instalo una nueva instancia de base de datos y una nueva webapp instancia. Cada instancia de webapp está protegida por una contraseña de servidor http (digest o autorización básica, tal vez a través de https).

  • Sin internacionalización. Solo cadena en inglés incrustada en el código fuente.

  • Sin desacoplamiento. Sólo páginas web que hablan con la base de datos.

  • Sin trucos de actuación. Sin colas, cachés, temporizadores, trabajos en segundo plano, llamadas asíncronas, etc.

  • Sin escalabilidad. Sin particionamiento de bases de datos, sin fragmentos, sin clústeres o replicación.

  • Además, utilice YAGNI a nivel micro siempre que sea adecuado.

Solo quiero comenzar el proyecto y llegar lo más rápido posible a un punto donde pueda vender (o tratar de vender) mis características innovadoras con una interfaz de usuario simple y atractiva.

Si el plan falla, lo sabré pronto. Si tiene éxito, veré qué quieren los clientes entonces. ¿Quieren una versión francesa? ¿O quieren usuarios y roles dentro de la organización?

Es esto lo que la gente quiere decir con YAGNI, o es este un ejemplo patológico y exagerado de YAGNI?

Author: flybywire, 2010-01-08

14 answers

Estoy totalmente de acuerdo con el principio de YAGNI, pero todavía quieres planear para el éxito. Si una aplicación necesita una reescritura completa cuando de repente tiene más de diez usuarios, entonces es YAGNI llevado demasiado lejos.

Algunas cosas Que Vas A Necesitar. Desde mi perspectiva, los dos puntos más importantes:

  • No te pegues un tiro en el pie al no preparar tu aplicación para la internacionalización. Si tu aplicación es buena, la internacionalización va a estar sobre la mesa un día. Además, la capacidad de manejar caracteres extranjeros mediante el uso de UTF-8 es un requisito absoluto al crear una aplicación desde cero en 2010. La internacionalización puede parecer no tan importante para un hablante nativo de inglés, pero créeme, es esencial y el dolor de internacionalizar una aplicación más tarde es horrible.

  • Piénsalo dos veces sobre lo de no tener elementos de seguridad. ¿Qué pasa con una organización o grupo que quiere trabajar con su aplicación con usuarios en diferentes niveles de seguridad. podría ser que esta es una característica que realmente puede prescindir - tengo un sistema de seguridad de grano fino integrado en muchos de mis productos que nunca se ha utilizado a su máximo potencial todavía. Pero piense bien si su aplicación específica puede prescindir de ella, incluso si tiene éxito.

 37
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:15:42

Esto es lo que llaman "prototipado". Adelante.

Hay una sutileza entre YAGNI y prototipado.

  1. Cuando es featuritis solicitada por el usuario, y dices que no, eso es YAGNI.

  2. Cuando es implementación (I18N, "desacoplamiento" (?), colas, cachés, temporizadores, etc.) y te dices no a ti mismo. Eso no es realmente YAGNI. Eso es prototipado.

La mayor parte de lo que tienes aquí no parece estar orientado al usuario. Yo no llamaría este precisely precisamente Y YAGNI.

 17
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:06:08

YAGNI se trata de recordarle que vea la diferencia entre lo que puede hacer y lo que necesita hacer para satisfacer sus requisitos.

Por ejemplo,si su requisito dice "permitir que las personas creen cuentas e inicien sesión", simplemente use los métodos de autenticación predeterminados de su marco y pase al siguiente requisito.

Su aplicación web puede admitir OpenID, Active Directory, Base de datos Local, Archivo plano y un millón de otros tipos de métodos de autenticación, pero puede satisfacer el requisito mediante la aplicación de la más simple. (Para mí, YAGNI implica DTSTTCPW).

"Puedo hacer cualquier cosa, con tiempo suficiente"

- Todos Los Programadores Que He Conocido

 9
Author: Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:14:52

No soy un fan del principio YAGNI; veo que se utiliza con demasiada frecuencia en la justificación de software mal diseñado. El exceso de software diseñado es un problema también, por supuesto, pero "YAGNI" realmente no deja mucho espacio para el análisis de impacto real.

Resulta que en el mundo del software, muchas de las cosas que crees que no vas a necesitar, en realidad vas a necesitar. Y algo más. ¿Quién es pathunkit.

He escrito una o dos aplicaciones que se suponía que debían ser aplicaciones desechables o retenidas que todavía están en producción después de dos años. Son un dolor de mantener.

Especialmente cuando se trata de algo como la seguridad - probablemente es va a necesitarla.

 6
Author: Aaronaught,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:15:27

YAGNI es un buen principio, pero no es el único principio de diseño. Muchas de las anteriores tienen sentido para obtener un producto frente a los usuarios rápidamente. Pero si, por ejemplo, las páginas web que hablan directamente con la base de datos comienzan a tener código duplicado, encontrará que la dependencia servil de un principio (YAGNI) con exclusión de otros (en este caso DRY) limitará su capacidad para responder a su esperanzadamente creciente número de solicitudes de características de los usuarios.

 3
Author: mattjames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:08:51

Si realmente vas a desarrollar una aplicación web revolucionaria para el mercado empresarial No estoy realmente seguro de cuál de esas cosas You Aint Gonna Need.

También sus ejemplos son bastante específicos. Por ejemplo, cuando dices: "sin características de seguridad"... Yo diría que los usuarios es una cosa que tal vez puede hacer sin, pero la desinfección de sus entradas es una que no se puede. También "escalabilidad" no es una cuestión de fragmentación de la base de datos o la replicación, los son decisiones que toma después de darse cuenta de que su aplicación no se escala bien.

Prefiero tener cuidado cuando se utiliza YAGNI como una guía de diseño de alto nivel, Se ajusta mejor cuando se habla de características de productos extraños o tal vez componentes de software extrema flexibilidad.

Solo mi 0.2

 3
Author: Pablo Fernandez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:15:16

Si llevas "YAGNI" a ese extremo (y evitaré las discusiones sobre si es o no una buena idea, así como las discusiones sobre si es o no realmente "YAGNI"), debes estar preparado para refactorizar sin piedad tu base de código para agregar más tarde lo que omites ahora sin crear una Bola de Barro.

 3
Author: quentin-starin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:18:01

En mi mente, YAGNI se usa más comúnmente en contexto con un desarrollador que piensa: "oh, sería inteligente si también agregáramos la característica X. Es posible que la necesitemos en el futuro."Nunca nunca agregue características que no sean un requisito.

Dicho esto, su código siempre debe estar abierto a modificaciones si su cliente cree que la función Y es absolutamente necesaria. Una buena arquitectura es una necesidad!

En cuanto a escalabilidad, colas, almacenamiento en caché: depende. ¿Cuál es el requisito para el ¿solicitud? Es un sitio de intranet utilizado por 10 usuarios simultáneos o es un sitio web popular con millones de usuarios. Depende. Encuentre los requisitos y haga eso, nada más. YAGNI. Si su requisito cambia; cambie su aplicación-debe estar abierta para modificaciones.

 2
Author: Tim Skauge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:13:58

YAGNI es bueno si hay una posibilidad decente de que nunca lo necesite. Si no lo necesita ahora, pero está casi seguro de que lo necesitará en un futuro previsible, entonces casi siempre es más fácil colocarlo por adelantado que más tarde. Cuando justificas no implementar cosas que no necesitas este segundo pero que seguramente necesitarás en un futuro cercano por YAGNI, ahí es donde comienzan los problemas.

 2
Author: dsimcha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:19:47

El punto de que YAGNI es solo un gran principio entre muchos es bueno para recordar; a veces YAGNI sugiere una decisión, pero hay razones igualmente buenas (o mejores) para preferir otra.

Aquí hay un área donde creo que algunos defensores de YAGNI pueden llegar muy lejos: si te sientes cómodo con OOD/polimorfismo, generalmente te cuesta muy poco "hornear" algunos grandes puntos de extensión para uso futuro, incluso en un prototipo.

Aquí hay un ejemplo...

Estás creando un prototipo de webapp que incluye la capacidad de mostrar una versión para imprimir de un informe. Usted necesita trabajar rápidamente,pero tener una sensación bastante buena los steakholders pedirán la capacidad de enviar por correo electrónico el informe, así en la línea.

En su código Java del lado del servidor, oculte el conocimiento del hecho de que el informe se está preparando para la impresora detrás de una interfaz. Cree una clase concreta que extienda la interfaz para mantener esa responsabilidad. No te vayas y escribir una versión de correo electrónico de la interfaz, porque YAGNI. Pero si alguna vez lo hace, está listo para agregarlo sin carnicería a sus características existentes.

 2
Author: Drew Wills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:24:05

Yo diría que si usted está empezando por tirar todo el sentido común y hacer todo el proyecto de la manera más expedita posible, entonces lo que va a terminar con es una gran pila de fracaso... Que de ninguna manera es Revolucionario (tm).

Si realmente quieres saber si va a ser útil, haz algunas maquetas de pantalla. Tal vez incluso un código html normal. Llévaselos a clientes potenciales y mira si puedes poner tu pie en la puerta. Si algunos de ellos comienzan a morder, entonces rompe tu trasero y constrúyelo.

Va a tomar tiempo para conseguir un contrato en su lugar, obtener el pago, y conseguir que alguien en el personal de sus clientes para empezar a usarlo. Mientras eso sucede, construyelo.

Lo más probable es que los clientes potenciales vean tu aplicación y, con suerte, te digan por qué no funciona para ellos. Cambia las maquetas y regresa. Itere según sea necesario hasta que tenga un diseño frontal para su producto que alguien esté dispuesto a pagar para.

 2
Author: NotMe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 21:30:05

Lo que haría es:

1) Diseñarlo tomando en consideración las decisiones arquitectónicas correctas. La internacionalización y la seguridad son probablemente imprescindibles en este caso.

2) Al desarrollar, cree los hooks para que esos principios se implementen más tarde. Así que cuando tenga tiempo y presupuesto, puede implementarlos sin hacer una remodelación importante.

3) Entonces puede concentrarse en las características que harían que su aplicación vuele y sean más importantes para su potencial cliente.

Así que creo que en este caso estaría usando más el enfoque KISS que "YAGNI extremo" como usted sugirió.

 1
Author: Wagner Silveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-11 00:57:04

En mi opinión, YAGNI debe ser seguido por defecto, ya que permite aumentar la productividad en gran medida.

Hay algunas excepciones, pensó. Por ejemplo, si desarrolla una biblioteca de terceros, necesita pensar al menos un poco antes de tiempo y anticipar las necesidades de algunos usuarios futuros. Eso no quiere decir que tengas que renunciar por completo a YAGNI, pero no deberías seguirlo tan estrictamente como con un desarrollo interno.

 1
Author: Vladimir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-11 12:42:46

Sí, PERO...

Tiendo a estar de acuerdo con muchas de sus consideraciones excepto el " no desacoplamiento", porque el " it " en YAGNI significa funcionalidad, no pasos de pensamiento. La introducción de algunas abstracciones (solo las necesarias para el desacoplamiento) pague inmediatamente en términos de errores no cometidos o errores encontrados más rápidamente y eliminado.

Una buena (porque te ahorra pensar) manera de introducir esas abstracciones sería utilizar un buen marco web y simplemente siga su aplicación sugerida estilo de estructuración .

Como beneficio adicional, entonces sería mucho más fácil agregar la seguridad, internacionalización, rendimiento y escalado más tarde y tu comportamiento YAGNI ahora debería ser razonablemente seguro.

(Desafortunadamente, el argumento se aplica solo si conoce la marco web ya. El conocimiento reina supremo en el reino YAGNI.)

 0
Author: Lutz Prechelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 14:06:24