Archivos Mensuales: mayo 2013

¿Porque los Programadores Requieren de Patrones de Diseño para Comunicarse Efectivamente?

Los patrones de diseño han sido reconocidos como una herramienta muy útil para la ingeniería de software, pero más que eso, son una herramienta de comunicación eficaz. En este artículo por Jason McC. Smith se muestra cómo los patrones de diseño cumplen con los requisitos para una comunicación efectiva, y cómo a su vez, elevan y mejoran la ingeniería de software con su aplicación.

Actualmente los patrones de diseño son una parte estándar de la ingeniería de software, sin embargo, siguen siendo uno de los elementos más incomprendidos de la disciplina de programación. La exposición de un desarrollador a los patrones de diseño usualmente  inicia como una colección de recetas, o un conjunto de fragmentos de código para copiar y pegar fielmente. La aplicación de patrones de diseño como soluciones sacrosantas no ayuda ni a los desarrolladores, ni a su código, y menos a su equipo.

Como desarrolladores somos más que simples ensambladores de curiosidades, y en general somos capaces de mucho más que poner una pieza A en la ranura B. En el fondo, los patrones de diseño son a menudo la tácita evidencia de una simple verdad sobre la programación: básicamente, la programación es comunicación.

Cuando programamos, escribimos simultáneamente la descripción de un sistema que está dirigido a dos audiencias muy diferentes: el compilador, y otros desarrolladores. El compilador es feliz mientras cumplamos estrictamente con la especificación del lenguaje. Otros desarrolladores, incluyendo nosotros en el futuro, tendemos a ser un poco más exigentes. Todos nos hemos encontrado con un pedazo de código que escribimos meses o años antes, tratando de reconstruir nuestro razonamiento. Los desarrolladores quieren y necesitan saber no sólo de qué trata la funcionalidad, sino también el porqué del diseño. Queremos saber lo que es robusto, y lo que es frágil. Queremos saber lo que es maleable, y lo que está detrás de una línea invisible que no se debe tocar. Los desarrolladores necesitamos más información que el compilador.

La documentación es una forma de proporcionar esta información, pero en la mayoría de los casos esta termina desactualizada con respecto al código fuente. Presiones inmediatas, tales como las fechas de liberación o los plazos de los clientes preceden a los objetivos de largo plazo, como la robustez del producto. Los patrones de diseño, por otro lado, se tejen en el código fuente en sí, y no pueden estar fuera de sincronía. Para un desarrollador adiestrado en su significado, le ofrecen una gran cantidad de información más allá de una descripción funcional.

Los patrones de diseño son un destilado de la experiencia de muchos desarrolladores en una sabiduría comunal, y su aprendizaje puede incrementar aumentar en gran medida las posibilidades de comunicación con otros programadores. Proporcionan además un vocabulario común, la semántica y la documentación para conceptos y temas de diseño que quedan fuera de los aspectos estrictamente informáticos de nuestro campo.

Sin embargo, la experiencia en patrones de diseño puede ser difícil de adquirir en el campo. La existencia de patrones de diseño en el código a menudo no es tan explícitamente obvio como, digamos, la definición de un algoritmo, y los patrones de diseño describen situaciones y soluciones que pueden estar fuera del actual conjunto de conocimientos de algunos desarrolladores. Obtener la capacidad de comprender por qué una solución particular se considera una buena práctica puede resultar difícil para un desarrollador, hasta que este obtiene un profundo conocimiento de por qué existen ciertos problemas. Esa comprensión, a su vez requiere experiencia, lo que lleva a una especie de situación del huevo y la gallina.

Para comprender un tema como patrones de diseño se debe comenzar por las bases. Determinar la existencia de problemas comunes de programación y algunas soluciones exitosas ayuda a los desarrolladores a entender la evolución de aquellas que se han convertido en patrones. Esto se convierte en un trampolín para zambullirse en la literatura de patrones y obtener una comprensión más profunda de las experiencias obtenidas a través de un gran esfuerzo. En última instancia, el desarrollador deberá ser capaz de crear sistemas robustos y flexibles con mayor rapidez, y será un mejor comunicador de sus intenciones, sobre todo de los puntos más sutiles de sus implementaciones y diseños. A medida que trabaje con desarrolladores que tengan un conocimiento similar de patrones de diseño, usted encontrará que puede comprender más rápidamente el código de sus compañeros.

La comunicación se mejora gracias a que los patrones de diseño facilitan entre los desarrolladores  un lugar común requerido para una transferencia eficaz de información. Una lista utilizada en los campos relacionados de la comunicación refiere algunos temas comunes que incluyen, en ningún orden particular, claridad, concisión, coherencia, exactitud, integridad, concreción y cortesía. Una vez más aprovechando la idea de aprender de las experiencias de los demás, podemos pedir prestadas estas ideas y demostrar cómo los patrones de diseño cumplen con los mismos objetivos de la comunicación efectiva.

Claridad

La claridad en el código no depende de si las llaves se colocan en la línea siguiente, o si se sigue un estilo de sangrado específico. Es posible que el uso de un oportuno artilugio ingenioso para salvar el día le pueda dar al desarrollador de una fantástica sensación de logro. Sin embargo, la  producción de código obscuro y complejo de forma regular se puede comparar con un fuerte carga del cuerpo en el fútbol: una habilidad muy útil en una situación de presión, pero si lo hace con sus colegas de la nada durante un día normal, usted acaba siendo un idiota. El código debe ser claro en lo que hace y cómo lo hace. La selección de nombres significativos para las variables, funciones y tipos es un comienzo, pero el diseño general debe ser también rápidamente comprensible. Los patrones de diseño dan un desarrollador ideas sobre la forma de nombrar y estructurar soluciones de manera que los demás puedan identificarlas fácilmente, proporcionando pistas semánticas tanto en la forma de una clara nomenclatura como en construcciones de diseño evidentes.

Concisión

Cuando utiliza patrones de diseño, usted puede ser conciso en sus expresiones. En lugar de tener que generar documentación para explicar los antecedentes por los qué eligió resolver un problema de una manera particular, cómo espera que sea utilizado y no utilizada la solución, y así sucesivamente, se puede hacer referencia al modelo de diseño subyacente directamente. Incluso mejor, si se pueden usar nemónicos identificables del patrón de diseño en el código en sí, ni siquiera se tiene que generar la documentación. El patrón que está usando va a ser claro, y un desarrollador que lea su código puede investigar ese patrón sólo si es necesario. Esto hace que sea  menos lo que usted deba escribir, y menos lo que otros tienen que leer. Todo el mundo gana.

Consistencia

Ya sea que usted esté trabajando en un procesador de textos o el sistema de control de un avión de combate, un Singleton es un Singleton. No importa si usted programa en Java, C + + o Python, un Decorador es un Decorador. Las implementaciones pueden variar, pero los conceptos y las motivaciones detrás de ellos siguen siendo los mismos. Los patrones de diseño trascienden dominios e idiomas, y nos otorgan una terminología y comprensión coherentes. No sólo su actual sistema se beneficia de un lenguaje consistente, también encontrará mucho más flexibilidad en sus opciones de carrera, porque mucho de su conocimiento y experiencia pueden ser transferidos a diferentes situaciones, lenguajes de programación y entornos de programación.

Exactitud

Crear la solución correcta para un problema dado no siempre es trivial o evidente. Cualquier problema de programación puede ser resuelto en un número casi infinito de formas. Muy pocas de estas implementaciones son buenas soluciones, y mucho menos son las soluciones adecuadas. La literatura sobre patrones de diseño funciona como una referencia para conectar las mejores prácticas con sus soluciones relacionadas. Si se ve que un patrón trabajará adecuadamente en un problema, pero usted recibe un cambio difícil o raro en la asignación y este a su vez hace que el patrón ya no sea adecuado, la redacción en el patrón de diseño usualmente hará referencia a otros patrones relacionados, que le permitirán seleccionar una solución más apropiada.

El uso de un patrón de diseño como una guía para la solución de un problema también le ayuda a asegurarse no únicamente de que se está produciendo la solución correcta, sino que la solución correcta se está aplicando correctamente. Con demasiada frecuencia, resolvemos problemas de manera que se ven muy bien al principio, pero no tomamos en cuenta casos en el límite y pequeños detalles que regresan a mordernos más tarde. La sabiduría colectiva que se encuentra en los patrones de diseño lleva las cicatrices de muchas de estas mordidas. Los patrones de diseño se han probado en batalla y se determinó que son las mejores soluciones prácticas, y que además  han resistido la prueba del tiempo. Las soluciones incorrectas nunca duran mucho tiempo en un ambiente así.

Integridad

La integridad va de la mano con la exactitud. ¿Ha encontrado todos los casos en el límite de la solución? ¿Ha pensado en lo que sucederá dentro de dos años cuando las necesidades cambien, pero el código todavía esté en uso? ¿Ha pensado en todos esos pequeños detalles que parecen surgir más adelante, o va a tener que entrar en un ciclo de eliminación de defectos para mantener el sistema en funcionamiento? ¿Qué tan completa es su cobertura conceptual? Aprenda de aquellos que vinieron antes que ustedes, que han encontrado las grietas y huecos, y encontraron maneras apropiadas para evitarlos o llenarlos. Mediante la utilización de patrones de diseño, otros desarrolladores pueden tener mayor confianza en la integridad y exactitud de la solución.

Concreción

Cuando producimos una solución que nuestros colegas no han visto antes, a menudo hay una buena cantidad de saludable escepticismo. Cuando estamos en el proceso de creación de una nueva solución, a menudo hay una buena cantidad de incertidumbre dentro de nosotros mismos. En ambos casos, los ejemplos concretos y parámetros conocidos del diseño son una ayuda en la definición del problema y la solución. Al referirse a una especificación existente y su descripción no sólo fomenta la discusión, sino que a menudo resalta las limitaciones que no fueron reconocidas o previstas. Al usar patrones de diseño en sus discusiones y codificación, ofrece implícitamente un enlace a un conjunto amplio de información concreta. Al implementar un patrón de diseño en el código y también dejando en claro qué patrón se está utilizando, reduce las preguntas que un desarrollador pueda tener más adelante.

Cortesía

Por último, y volviendo al punto anterior sobre que el código obscuro y complejo es una afrenta  a sus colegas, la comunicación efectiva es simplemente cortés. Cuando se escribe código que requiere que sus compañeros de equipo pasen tiempo reconstruyendo su pensamiento en detalle sólo para usar o mantener el código, les está diciendo que su tiempo vale poco para usted. Diseñe y escriba sus sistemas como si usted fuera el que va a tener que averiguar las intenciones en el camino, porque lo más probable es que sea usted el que termine haciéndolo. Los patrones de diseño son una ayuda en este proceso, ya que le permiten utilizar una abreviatura conveniente y común para conceptos a veces esotéricos que requieren mucho tiempo y esfuerzo de sus colegas para desentrañar. Es en el mejor interés de todos que su código se comunique tan efectivamente como sea posible.

Al final, la programación es acerca de la comunicación efectiva. Hasta que podamos llegar a usar la telepatía, no existe una solución perfecta para que la comunicación entre los desarrolladores sea perfecta, pero podemos utilizar herramientas como los patrones de diseño para hacer más fácil la tarea en muchos frentes. En el frente de comunicación con el compilador, el soporte de herramientas para patrones de diseño sigue mejorando. Existe soporte para la aplicación de patrones en una implementación y vienen avances interesantes en la detección automática de patrones directamente en la comprensión de código y para el cumplimiento de reglas de diseño. Los patrones de diseño son una herramienta de comunicación que todos podemos usar en conjunto para crear una comunidad mejor para nosotros y nuestros clientes. A medida que nuestra comunicación sea más efectiva, también lo hacen nuestros productos, nuestros sistemas y nuestra disciplina. Use los patrones de diseño para catalizar la lista de elementos para su propia comunicación efectiva, y tal vez estará agradecido consigo mismo al crear un sistema claro y cortés. El resto de nosotros lo estará, sin duda.

El artículo original en Inglés se encuentra en Why Programers Need Design Patterns to Communicate Effectively

Jason McC. Smith es Autor de Elemental Design Patterns

Anuncios