Un anti-patrón es una respuesta común a un problema recurrente que generalmente es ineficaz y corre el riesgo de ser altamente contraproducente. [1] [2] El término, acuñado en 1995 por el programador de computadoras Andrew Koenig , [3] [4] se inspiró en el libro Design Patterns , que destaca una serie de patrones de diseño en el desarrollo de software que sus autores consideraron altamente confiables. y eficaz.
El término fue popularizado tres años más tarde por el libro AntiPatterns , que extendió su uso más allá del campo del diseño de software para referirse informalmente a cualquier solución comúnmente reinventada pero mala a un problema. Los ejemplos incluyen parálisis de análisis , programación de culto de carga , marcha de la muerte , pensamiento de grupo y bloqueo de proveedores .
Definición
Según los autores de Design Patterns , hay dos elementos clave en un anti-patrón que lo distinguen de un mal hábito, una mala práctica o una mala idea:
- El anti-patrón es un proceso de uso común, estructura de patrón de acción que, a pesar de parecer inicialmente una respuesta adecuada y efectiva a un problema, tiene más consecuencias malas que buenas.
- Existe otra solución al problema que el antipatrón intenta abordar, que está documentada, es repetible y se ha demostrado que es eficaz cuando el antipatrón no lo es.
Ejemplos de
Operaciones sociales y comerciales
Organizativo
- Parálisis de análisis : Un proyecto que se ha estancado en la fase de análisis de desarrollo, y no puede lograr el apoyo para ninguno de los planes potenciales de su implementación.
- Cobertizo para bicicletas : dando un peso desproporcionado a cuestiones triviales
- Límite sangrante : funcionamiento con tecnologías de vanguardia que aún no se han probado o son inestables, lo que genera sobrecostos, rendimiento deficiente o retraso en la entrega del producto.
- Apatía del espectador : fenómeno en el que es menos probable que las personas ofrezcan o no ayuden a una persona necesitada cuando hay otras personas presentes.
- Vaca de efectivo : un producto heredado rentable que a menudo conduce a la complacencia con los nuevos productos.
- Diseño por comité : el resultado de tener muchos colaboradores en un diseño, pero sin una visión unificadora.
- Escalada del compromiso : no revocar una decisión cuando se demuestra que está equivocada
- Pensamiento grupal: un estado colectivo en el que los miembros del grupo comienzan, a menudo sin saberlo, a pensar igual y rechazar puntos de vista diferentes.
- Gestión por objetivos : Gestión que opera con el enfoque exclusivo de criterios de gestión cuantitativos, como el número de ventas, cuando estas no son esenciales o cuestan demasiado para adquirirlas.
- Microgestión : resultados ineficaces derivados de la observación excesiva, la supervisión u otra participación práctica de la dirección
- Riesgo moral : aislar a un tomador de decisiones de las consecuencias de su decisión
- Manejo de hongos : mantener a los empleados "en la oscuridad y alimentados con estiércol" (también "dejado para guisar y finalmente enlatado") sobre las decisiones que toma la gerencia
- Principio de Peter : Promover continuamente a los empleados que de otro modo tendrían un buen desempeño hasta un puesto para el que no son adecuados, con responsabilidades que no pueden cumplir, donde permanecen indefinidamente [5]
- Gestión gaviota : Gestión en la que los gerentes solo interactúan con los empleados cuando surge un problema, cuando "llegan volando, hacen mucho ruido, se descargan a todos, no resuelven el problema y luego salen volando"
- Stovepipe o Silos : una estructura organizativa de equipos aislados o semi-aislados, en la que se producen demasiadas comunicaciones hacia arriba y hacia abajo en la jerarquía, en lugar de hacerlo directamente con otros equipos de la organización.
- Encasillamiento : encerrar a los empleados exitosos en roles predecibles, estrictamente definidos y demasiado seguros en función de sus éxitos pasados en lugar de su potencial.
- Bloqueo del proveedor : hacer que un sistema sea excesivamente dependiente de un componente suministrado externamente
Gestión de proyectos
- Carro antes que el caballo : concentrar demasiados recursos en una etapa de un proyecto fuera de su secuencia
- Marcha de la muerte : un proyecto cuyo personal, mientras espera que fracase, se ve obligado a continuar, a menudo con mucho trabajo, por parte de la dirección que niega el posible fracaso del proyecto [6]
- Regla del noventa y noventa : tendencia a subestimar la cantidad de tiempo para completar un proyecto cuando está "casi terminado"
- Sobreingeniería : gastar recursos para hacer que un proyecto sea más robusto y complejo de lo necesario
- Fluencia del alcance : cambios incontrolados o crecimiento continuo en el alcance de un proyecto, o adición de nuevas características al proyecto después de que se hayan redactado y aceptado los requisitos originales (también conocido como avance de requisitos y avance de características )
- Humo y espejos : demostrando funciones no implementadas como si ya estuvieran implementadas
- Ley de Brooks : agregar más recursos a un proyecto para aumentar la velocidad, cuando el proyecto ya está ralentizado por la sobrecarga de coordinación
- Chapado en oro : continuar trabajando en una tarea o proyecto mucho más allá del punto en el que el esfuerzo adicional no agrega valor
Ingeniería de software
Diseño de software
- Inversión de abstracción : no exponer la funcionalidad implementada requerida por los llamadores de una función / método / constructor, de modo que el código de llamada re-implementa de forma incómoda la misma funcionalidad en términos de esas llamadas
- Punto de vista ambiguo : presentación de un modelo (generalmente análisis y diseño orientado a objetos (OOAD)) sin especificar su punto de vista
- Gran bola de barro : un sistema sin estructura reconocible
- Base de datos como IPC : uso de una base de datos como cola de mensajes para la comunicación rutinaria entre procesos donde sería adecuado un mecanismo mucho más ligero
- Efecto de plataforma interna : un sistema tan personalizable que se convierte en una réplica deficiente de la plataforma de desarrollo de software
- Input kludge : no especificar e implementar el manejo de una entrada posiblemente no válida
- Inflamación de la interfaz : hacer una interfaz tan poderosa que sea extremadamente difícil de implementar
- Botón mágico : un formulario sin validación dinámica o asistencia de entrada, como menús desplegables
- Peligro de carrera : no ver las consecuencias de eventos que a veces pueden interferir entre sí
- Sistema de tubo de estufa : un ensamblaje de componentes defectuosos que apenas se puede mantener
Programación orientada a objetos
- Modelo de dominio anémico : el uso del modelo de dominio sin ninguna lógica empresarial . Los objetos del modelo de dominio no pueden garantizar su corrección en ningún momento, porque su lógica de validación y mutación se coloca en algún lugar exterior (muy probablemente en varios lugares). Martin Fowler considera que esto es un anti-patrón, pero algunos no están de acuerdo en que siempre es un anti-patrón. [7]
- Llamar a super : Requerir subclases para llamar al método anulado de una superclase
- Problema de círculo-elipse : subtipificación de tipos de variable sobre la base de subtipos de valor
- Dependencia circular : introducción de dependencias mutuas directas o indirectas innecesarias entre objetos o módulos de software
- Interfaz constante : uso de interfaces para definir constantes
- Objeto de Dios : concentrar demasiadas funciones en una sola parte del diseño (clase)
- Pozo negro de objetos : reutilización de objetos cuyo estado no se ajusta al contrato (posiblemente implícito) para su reutilización
- Orgía de objetos : no encapsular correctamente los objetos, lo que permite un acceso irrestricto a sus partes internas
- Poltergeists : Objetos cuyo único propósito es pasar información a otro objeto.
- Acoplamiento secuencial : una clase que requiere que sus métodos se llamen en un orden particular
- Patrón Singleton : este patrón de diseño trae acoplamiento y se considera una mala solución
- Problema del yo-yo : una estructura (p. Ej., De la herencia) que es difícil de entender debido a una fragmentación excesiva
Programación
- Complejidad accidental : tareas de programación que podrían eliminarse con mejores herramientas (a diferencia de la complejidad esencial inherente al problema que se está resolviendo)
- Acción a distancia : interacción inesperada entre partes muy separadas de un sistema
- Ancla de barco : Retención de una parte de un sistema que ya no tiene ningún uso.
- Ocupado esperando : consumir CPU mientras espera que suceda algo, generalmente mediante comprobaciones repetidas en lugar de mensajes
- Fallo de almacenamiento en caché : Olvidar borrar un caché que contiene un resultado negativo (error) después de que se corrigió la condición de error
- Programación de culto a la carga : uso de patrones y métodos sin entender por qué
- Codificación por excepción : agregar código nuevo para manejar cada caso especial a medida que se reconoce
- Patrón de diseño : el uso de patrones se ha denominado en sí mismo un antipatrón, una señal de que un sistema no está empleando suficiente abstracción [8]
- Ocultación de errores : captura de un mensaje de error antes de que se pueda mostrar al usuario y no muestra nada o muestra un mensaje sin sentido. Este anti-patrón también se llama Patrón de pañal . También puede referirse a borrar el seguimiento de la pila durante el manejo de excepciones, lo que puede dificultar la depuración.
- Hard code : incrustación de supuestos sobre el entorno de un sistema en su implementación
- Código de lasaña : programas cuya estructura consta de demasiadas capas de herencia
- Flujo de lava : retención de código indeseable (redundante o de baja calidad) porque eliminarlo es demasiado costoso o tiene consecuencias impredecibles [9] [10]
- Secuencia de conmutador de bucle : codificación de un conjunto de pasos secuenciales mediante un conmutador dentro de una declaración de bucle
- Números mágicos : Incluyendo números inexplicables en algoritmos
- Cadenas mágicas : implementación de escenarios de entrada presumiblemente poco probables, como comparaciones con cadenas muy específicas, para enmascarar la funcionalidad.
- Repitiéndose : escribiendo código que contiene patrones repetitivos y subcadenas una vez más; evitar con una vez y solo una vez (principio de abstracción)
- Disparar al mensajero : lanzar excepciones del alcance de un complemento o suscriptor en respuesta a una entrada legítima, especialmente cuando esto hace que el alcance externo falle.
- Cirugía de escopeta : el desarrollador agrega funciones a una base de código de la aplicación que abarca una multiplicidad de implementadores o implementaciones en un solo cambio
- Código flexible: almacenamiento de la lógica empresarial en archivos de configuración en lugar de código fuente [11]
- Código espagueti : programas cuya estructura es apenas comprensible, especialmente debido al mal uso de las estructuras del código.
Metodológico
- Copiar y pegar programación : copiar (y modificar) código existente en lugar de crear soluciones genéricas
- Martillo de oro : asumiendo que una solución favorita es universalmente aplicable (Ver: Bala de plata )
- Inventado aquí : La tendencia a descartar cualquier innovación o solución menos que trivial que se origine dentro de la organización, generalmente debido a la falta de confianza en el personal.
- Síndrome de No inventado aquí (NIH): la tendencia a reinventar la rueda (no adoptar una solución adecuada existente)
- Optimización prematura : codificación temprana para la eficiencia percibida, sacrificando el buen diseño, la capacidad de mantenimiento y, a veces, incluso la eficiencia del mundo real
- Programación por permutación (o "programación por accidente", o "programación por coincidencia"): intentar acercarse a una solución modificando sucesivamente el código para ver si funciona
- Reinventar la rueda cuadrada : no adoptar una solución existente y, en cambio, adoptar una solución personalizada que funciona mucho peor que la existente
- Bala de plata : suponiendo que una solución técnica favorita puede resolver un proceso o problema más grande
- Desarrollo impulsado por probadores : proyectos de software en los que se especifican nuevos requisitos en informes de errores
Gestión de la configuración
- Infierno de la dependencia : problemas con las versiones de los productos requeridos
- Infierno de DLL : administración inadecuada de bibliotecas de vínculos dinámicos (DLL), específicamente en Microsoft Windows
- Conflicto de extensión : problemas con diferentes extensiones del Mac OS clásico al intentar parchear las mismas partes del sistema operativo
- Infierno de JAR : sobreutilización de varios archivos JAR , que generalmente causa problemas de ubicación y control de versiones debido a una mala comprensión del modelo de carga de clases de Java
Ver también
- Olor a código : síntoma de una programación incorrecta
- Olor de diseño
- Patrón oscuro
- Lista de filosofías de desarrollo de software : enfoques, estilos, máximas y filosofías para el desarrollo de software
- Lista de herramientas para el análisis de código estático
- Podredumbre de software
- Principio de software de Peter
- Modelo de inmadurez de capacidad
- ISO / IEC 29110 : Perfiles y pautas del ciclo de vida del software para entidades muy pequeñas (VSE)
- El dilema del innovador
Referencias
- ^ Budgen, D. (2003). Diseño de software . Harlow, Ing .: Addison-Wesley. pag. 225. ISBN 0-201-72219-4.
Como se describe en Long (2001), los antipatrones de diseño son "soluciones obvias, pero incorrectas, para problemas recurrentes".
- ^ Scott W. Ambler (1998). Patrones de proceso: construcción de sistemas a gran escala utilizando tecnología de objetos . Cambridge, Reino Unido: Cambridge University Press. pag. 4. ISBN 0-521-64568-9.
... enfoques comunes para resolver problemas recurrentes que resultan ineficaces. Estos enfoques se denominan antipatrones.
- ^ Koenig, Andrew (marzo-abril de 1995). "Patrones y Antipatrones". Revista de programación orientada a objetos . 8 (1): 46–48.
- ^ Posteriormente reimpreso en: Rising, Linda (1998). El manual de patrones: técnicas, estrategias y aplicaciones . Cambridge, Reino Unido: Cambridge University Press. pag. 387. ISBN 0-521-64818-1.
Un antipatrón es como un patrón, excepto que en lugar de una solución da algo que parece superficialmente una solución, pero que no lo es.
- ^ Peter, Lawrence J. (1969), El principio de Peter: por qué las cosas siempre van mal ; Libros de Buccaneer de 1969, ISBN 9781568491615
- ^ Yourdon, Edward (1997), marcha de la muerte ; ISBN 978-0137483105
- ^ "El modelo de dominio anémico no es un anti-patrón, es un diseño SÓLIDO" . SAPM: Blog del curso . 4 de febrero de 2014 . Consultado el 3 de enero de 2015 .
- ^ "La venganza de los nerds" .
En el mundo de OO se escucha mucho sobre "patrones". Me pregunto si estos patrones no son a veces evidencia del caso (c), el compilador humano, en acción. Cuando veo patrones en mis programas, lo considero una señal de problemas. La forma de un programa debe reflejar solo el problema que necesita resolver. Cualquier otra regularidad en el código es una señal, al menos para mí, de que estoy usando abstracciones que no son lo suficientemente poderosas, a menudo que estoy generando a mano las expansiones de alguna macro que necesito escribir.
- ^ "Flujo de lava" . antipatterns.com . 2 de abril de 2017.
- ^ "Los antipatrones de 'flujo de lava' indocumentados complican el proceso" . Icmgworld.com. 14 de enero de 2002. Archivado desde el original el 11 de marzo de 2011 . Consultado el 3 de mayo de 2010 .
- ^ Papadimoulis, Alex (10 de abril de 2007). "Codificación suave" . thedailywtf.com . Consultado el 27 de junio de 2011 .
Otras lecturas
- Laplante, Phillip A .; Neill, Colin J. (2005). Antipatrones: Identificación, Refactorización y Gestión . Publicaciones Auerbach. ISBN 0-8493-2994-9.
- Brown, William J .; Malveau, Raphael C .; McCormick, Hays W .; Thomas, Scott W. (2000). Hudson, Theresa Hudson (ed.). Anti-Patrones en la Gestión de Proyectos . John Wiley e hijos . ISBN 0-471-36366-9.
enlaces externos
- Anti-patrón en WikiWikiWeb
- Catálogo de anti-patrones
- Sitio web AntiPatterns.com para el libro AntiPatterns
- Patrones de comportamiento tóxico
- Antipatrón de puntero C
- Libro anti-patrones de correo electrónico
- Patrones de dominación social