Historias
Slashboxes
Comentarios

"El arte de programar en Unix" y la complejidad

editada por Yonderboy el 04 de Septiembre 2006, 12:34h   Printer-friendly   Email story
desde el dept. revisiones
edgarhz nos cuenta: «Como había mencionado anteriormente, el Arte de Programar en Unix representa un material indispensable y debe convertirse en un clásico necesario para cualquier programador o interesado en los modelos creativos más trascendentales de la industria de las TI. Una de las razones para esto es la gran cantidad de información enriquecedora que puede y debe ser usada por países con un nivel incipiente de investigación y generación de tecnología.» Se trata de un análisis a partir del capítulo 13 del libro, que trata sobre la complejidad. En la página ampliada.

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:

  • Tamaño del Código Base
  • Complejidad de la Implementación
  • Complejidad de la Interfaz
  • Tipos de Complejidad:

  • Complejidad Esencial
  • Complejidad Opcional
  • Complejidad Accidental
  • 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.

    Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
    Mostrar opciones Umbral:
    Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
    • Bien

      (Puntos:4, Interesante)
      por magankie (18594) el Lunes, 04 Septiembre de 2006, 13:45h (#805689)
      Buen artículo de lo que deberían ser los fundamentos de programación, tanto en unix como en cualquier tipo de código (C, HTML, PHP, ETC...). Creo que cualquiera que haya estudiado los fundamentos de la programación debería tener en cuenta estos fundamentos, ya sea tanto por optimización en el programa, haciéndolo más eficiente su ejecución, como por seguridad, ampliación del mismo, etc...

      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)
      por pobrecito hablador el Lunes, 04 Septiembre de 2006, 14:30h (#805712)
      Tú eres consultor de Accenture, ¿verdad?
    • Simplicidad

      (Puntos:1, Inspirado)
      por pobrecito hablador el Lunes, 04 Septiembre de 2006, 14:38h (#805719)
      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.

      Pues podrías aplicarle el cuento a tus artículos...
    • La idea no es nueva...

      (Puntos:2, Informativo)
      por magmax (2363) el Lunes, 04 Septiembre de 2006, 14:42h (#805722)
      ( http://barrapunto.com/ | Última bitácora: Sábado, 02 Abril de 2005, 16:44h )
      ... porque ya existía en el principio KISS [wikipedia.org], cuya acepción más típica es la de "Keep It Simple, Stupid" (Mantenlo simple, estúpido).

      No veo porqué ponerlo como noticia de portada, pero bueno, aceptaremos barco.
    • En otras noticias

      (Puntos:1, Informativo)
      por pobrecito hablador el Lunes, 04 Septiembre de 2006, 14:53h (#805729)
      La asignación de responsabilidades es una de las tareas más importantes del análisis orientado a objetos. Si las responsabilidades son asignadas correctamente, los sistemas tienden a ser más fáciles de entender, mantener y ampliar.
      Las responsabilidades son las obligaciones que tiene un objeto respecto a su comportamiento. Esas responsabilidades pertenecen principalmente a dos categorías:
    • Conocer
    • Hacer
      Entre las responsabilidades de un objeto relacionadas con hacer tenemos:
    • Hacer algo en uno mismo
    • Iniciar una acción en otros objetos
    • Controlar y coordinar actividades en otros objetos
      Entre las responsabilidades de un objeto relacionadas con conocer se encuentran:
    • Estar enterado de los datos propios (datos privados encapsulados por el objeto).
    • Estar enterado de la existencia de objetos conexos
    • Estar enterado de cosas que se pueden derivar o calcular

      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:
    • B agrega los objetos de A
    • B contiene los objetos de A
    • B registra los objetos de A
    • B utiliza específicamente los objetos de A
    • B tiene los datos de inicialización que serán transmitidos a A para crear un objeto (De modo que B es un “Experto” respecto a la creación de objetos A).

      Alfredo Currupipi Jones.
  • El metodo

    (Puntos:2)
    por daganu (11952) el Lunes, 04 Septiembre de 2006, 15:24h (#805738)
    Hay una guia bastante mas pequeña, menos optimista, mas realista, y que no pone limites a lo que ha de ser o no:
    "No hay balas de plata"
    --
    No voy a poner una firma aquí.
  • Vale

    (Puntos:1)
    por sexoseguro (25887) el Lunes, 04 Septiembre de 2006, 17:19h (#805800)
    ( http://barrapunto.com/ )
    Ahora todos sabemos que puedes traducir bien (que conste que no he leido el original todavia) documentos en ingles y te sientes orgulloso de ello.
    --

    --
    Safe sex [linux.org]
  • Muy buen artículo, ¡Así se hace! :-)

    (Puntos:1, Interesante)
    por pobrecito hablador el Lunes, 04 Septiembre de 2006, 17:31h (#805808)
    Jeje, da gusto la verdad haber leído algo así por estos lares.

    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 es un principio [wikipedia.org] de Slackware, y por eso es mi distro Linux preferida, porque está configurada con scripts sh y no con ficheros de configuración que sólo el parser de una interfaz gráfica puede conocer.
  • por Boriel (20804) el Martes, 05 Septiembre de 2006, 08:45h (#806158)
    ( http://www.boriel.com/ )
    Pues me parece bastante confuso este nombre: en primero de carrera (ing. informática) nos dieron complejidad (complejidad computacional [wikipedia.org]), y no tiene nada que ver con esto. La elección del nombre se presta a confusión, creo yo, porque se refiere a otra complejidad (de implementación, parece) y de simplicidad, a si que se refiere a otra cosa. De hecho, cuando se habla de "complejidad" a secas, se suelen referir a la computacional.

    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.
  • por flojito (13223) el Martes, 05 Septiembre de 2006, 10:53h (#806288)
    ( http://barrapunto.com/ | Última bitácora: Miércoles, 06 Febrero de 2008, 20:41h )
    Hombre, no creo que "condición de carrera" sea la traducción más adecuada para "race condition". Mejor "condición de competencia" o algo así ¿no? ;)
    [ Padre ]
  • 11 respuestas por debajo de tu umbral de lectura actual.