Login Barrapunto
"El arte de programar en Unix" y la complejidad
Sencillez como objetivo
Me he permitido ampliar el espectro de lo vertido en el libro para proporcionar un enfoque universal aplicable a cualquier solución tecnológica. Deseo mostrar cómo es posible implementar mucho de este trabajo más allá de su aplicación al mundo UNIX, al que concretamente se refiere Eric S. Raymond.
El diseño de un sistema implica en sí mismo un concepto difícil de tratar: Complejidad.
Un sistema, (sea operativo, de aplicaciones y hasta social) debe mantenerse lo más sencillo posible, tanto que le permita ser altamente eficaz pero lo necesariamente complejo para evitar convertirse en algo inútil.
¿Cuál es el problema con esto? La simplicidad es compleja. Es necesario un desarrollo amplio de ideas antes de proponer siquiera un diseño. Veamos un análisis al Capítulo 13 del libro.
Complejidad
Sabemos ya que no existe una metodología de programación definida, lo cual nos lleva a deducir que tampoco existe un método específico para el diseño conceptual de ningún sistema. Si a esto sumamos el hecho de que existen una gran variedad de sistemas, soluciones o aplicaciones que pueden ser creadas, el problema es mucho más complejo todavía.
Tenemos entonces que solamente la experiencia durante la definición y prueba de diversos procesos de diseño puede acercarnos a la sencillez buscada para solucionar el gran problema de la Complejidad.
¿Hacia dónde dirigirnos? Aún cuando las diversas referencias realizadas por programadores hacen posible una mínima relación al respecto, es prácticamente imposible establecer fórmulas para la integración de cada proceso, lo cual como es obvio, hace a cada problema único.
Sin embargo, es necesario establecer ciertas definiciones básicas acerca de nuestro problema a fin de poder tratarle.
Haremos pues, para facilitar el tema, distinciones verticales y horizontales entre los tipos de complejidad más comunes y las explicaré.
1. Actores de la complejidad
Fuentes de Complejidad:
Tipos de Complejidad:
2. Fuentes de Complejidad
2. 1. Tamaño del Código Base
Una de las tres fuentes de Complejidad es el tamaño del código, entendido como el número total de líneas de código usadas para la solución.
Veremos entonces que un sistema será más complejo en tanto mayor número de líneas de código contenga, por tal, será más difícil de mantener y el costo del ciclo total de desarrollo será más elevado.
2. 2. Complejidad de la Implementación
El nivel de Complejidad de la Implementación es el grado de dificultad que experimenta el programador al intentar entender un programa o la solución misma a un problema dado.
Es decir, la implementación requerida para la solución de un problema, debe tener un nivel de complejidad tal que sea posible abstraerse mentalmente y crear el modelo de la solución. Si esto es así, el diseño será sencillo y extremadamente útil y comprensible.
2. 3. Complejidad de la Interfaz
Los usuarios deberán decidir qué tan complejo o no es el sistema, por tal razón la importancia de realizar un análisis profundo que permita salir avante de esto.
Como hemos visto, es necesario tener siempre en mente una solución para estas tres fuentes de complejidad. No es posible atender en mayor grado una mientras se deja sin atención la disminución de Complejidad en la Interfaz, por ejemplo.
3. Tipos de Complejidad
En situaciones ideales, (donde se observen los mecanismos que he citado) la solución o material resultante del trabajo realizado bajo estos preceptos, será entregado al usuario final o implementado para sus funciones como un sistema poco complejo, cuyo perfil principal será su sencillez, elegancia y capacidad de perfeccionamiento.
Ahora que, en el supuesto de que esto no ha sucedido así, existen varios niveles o tipos Complejidad a los cuales debemos atenernos a fin de reducir el grado de afectación a nuestro sistema. Veremos ahora cuáles son los Tipos de Complejidad.
3. 1. Complejidad Esencial
Existen sistemas cuya Complejidad Esencial está dada por ellos mismos o por los requerimientos especiales de ese sistema.
En ocasiones no es posible llevar la Complejidad a tal grado que la pieza final cumpla con el perfil que mencioné arriba (Sencillo, Elegante, Perfectible). Cuando esto sucede, debe hacerse lo posible por reducirle complejidad a la complejidad, lo más importante aquí es, asegurarnos de que el sistema no fallará por un exceso de complejidad y que no será tan complejo que sea prácticamente imposible mantenerlo o actualizarlo en caso de ser necesario.
La premisa es pues, mantener un sistema lo menos complejo posible, si por la solución misma tiene que ser complejo -Complejidad Esencial-, manténlo sencillo.
3. 2. Complejidad Opcional
Otros sistemas pueden encontrarse en la siguiente situación: Ser o no complejos. La razón de esto es, que la complejidad de un sistema está dada por el objetivo que debe cumplir dicho sistema -Complejidad Esencial-. Esto puede ser cambiado si los objetivos del sistema son cambiados o modificados -Complejidad Opcional-.
3. 3. Complejidad accidental
Si tomamos como ejemplo uno de los sistemas anteriormente mencionados -Complejidad Opcional- nos encontraremos en una situación peculiar:
Alguno de ellos no estará realmente en la situación que nos parece que está, sino que ha sucedido que el sistema no ha sido diseñado atendiendo a las Fuentes de Complejidad de tal manera que dicho sistema no ha sido realizado con el mejor diseño para la función requerida.
Diseñar nuevamente o rediseñar este sistema nos significará haber encontrado un sistema de Complejidad Accidental.
Simplicidad y término
Como hemos visto, uno de los pilares de la programación en UNIX, que debe ser aplicado a la programación en general, es el mantener nuestro sistema lo más sencilo posible.
Para terminar quiero hacer hincapié en el hecho de que muchas de las normas usadas en materia de programación, pueden ser usadas en otras áreas en materia de TI.
Existen para ello ciertos procesos que representan un gran avance para crear un entorno mucho más homogéneo y ventajoso para países en vías de desarrollo que pueden usar esto como un detonante para mejorar sus procesos productivos y conseguir un mercado interno estable que pueda, a mediano plazo, representar un beneficio económico para su sociedad.
Edgar Hernández Zúñiga.

Bien
(Puntos:4, Interesante)De todas formas, seguramente más de uno de nosotros mismos nos hemos encontrado alguna vez con código que no sigue estos principios y no se sabe ni de donde cojerlo.
Es bueno, de vez en cuando, refrescar estos conceptos.
Acabo de encontrar al amor de mi vida! soy feliz...
Edgar, chiquillo
(Puntos:1, Divertido)Simplicidad
(Puntos:1, Inspirado)Pues podrías aplicarle el cuento a tus artículos...
La idea no es nueva...
(Puntos:2, Informativo)( http://barrapunto.com/ | Última bitácora: Sábado, 02 Abril de 2005, 16:44h )
No veo porqué ponerlo como noticia de portada, pero bueno, aceptaremos barco.
En otras noticias
(Puntos:1, Informativo)Las responsabilidades son las obligaciones que tiene un objeto respecto a su comportamiento. Esas responsabilidades pertenecen principalmente a dos categorías:
Entre las responsabilidades de un objeto relacionadas con hacer tenemos:
Entre las responsabilidades de un objeto relacionadas con conocer se encuentran:
Realizamos la tarea de asignación de responsabilidades, normalmente, cuando nos disponemos a crear los diagramas de secuencia. Gracias a los diagramas de secuencia, podemos modelar cómo los objetos interactuan, colaboran entre sí, aplicando en la práctica sus responsabilidades para cumplir los objetivos de los casos de uso.
Las responsabilidades no son los métodos. Los métodos se crean para cumplir las responsabilidades. Para cumplir una misma responsabilidad puede haber uno o varios métodos, que trabajan solos o en colaboración con otros métodos y objetos.
Como referencia para saber qué responsabilidades asignar a cada clase, podemos utilizar los patrones: “Experto” y “Creador”.
Patrón Experto: Asignar una responsabilidad al “experto” en información: La clase que cuenta con la información necesaria para cumplir la responsabilidad.
Patrón Creador: Asignarle a la clase B la responsabilidad de crear una instancia (un objeto) de la clase A en uno de los siguientes casos:
Alfredo Currupipi Jones.
El metodo
(Puntos:2)"No hay balas de plata"
No voy a poner una firma aquí.
Vale
(Puntos:1)( http://barrapunto.com/ )
--
Safe sex [linux.org]
Muy buen artículo, ¡Así se hace! :-)
(Puntos:1, Interesante)Es que hacía tiempo que no veía en la portada de Barrapunto una "noticia" tan elaborada; tanto tiempo que incluso me ha sorprendido al principio.
Está claro que la dinámica habitual de Barrapunto no es colgar esta clase de material tan trabajado. Más bien notas cortas o recortes citando a noticias.
En fin, decir que estos escritos en portada me hacen recordar cómo era Barrapunto (ya sabéis el dicho, "Barrapunto ya no es lo que era" jeje)
Un saludo & thanks for the fish! ;)
KISS
(Puntos:1)Sobre la "Complejidad"
(Puntos:2)( http://www.boriel.com/ )
Para el que no lo sepa, la complejidad se puede definir grosso modo como una forma de medir cuán eficiente es un algoritmo, independientemente de la plataforma donde se haya implementado (CPU, lenguaje, etc.) - ver enlace a WikiPedia. Varias veces se ha discutido en Barrapunto sobre los problemas NP, por ejemplo.
Re:Joder con los modulines...
(Puntos:1)( http://barrapunto.com/ | Última bitácora: Miércoles, 06 Febrero de 2008, 20:41h )