La Filosofía UNIX


La filosofía de Unix, originada por Ken Thompson, es un conjunto de normas culturales y enfoques filosóficos para el desarrollo de software modular minimalista de UNIX.

La filosofía se basa en la experiencia de los principales desarrolladores del sistema operativo Unix. Los primeros desarrolladores de UNIX fueron los que incorporarón los conceptos de modularidad y reutilización en la práctica de ingeniería de software, generando un movimiento llamado de "herramientas de software".

Con el tiempo, los desarrolladores líderes de Unix (y los programas que se ejecutaron en él) establecieron un conjunto de normas culturales para el desarrollo de software, normas que se hicieron tan importantes e influyentes como la tecnología de Unix en sí; Esto se ha denominado la "filosofía de Unix".

La filosofía de Unix enfatiza la construcción de códigos simples, cortos, claros, modulares y extensibles, que puedan ser mantenidos y reutilizados fácilmente por desarrolladores que no sean sus creadores. La filosofía de Unix favorece la composabilidad en oposición al diseño monolítico.

Composabilidad en programacion se refiere a: La capacidad de ensamblar comportamientos complejos mediante la agregación de comportamientos más simples.

La descomposición funcional es un ejemplo de esto, donde una función compleja se divide en funciones más pequeñas y fáciles de comprender y se ensambla en el sistema final mediante una función de nivel superior. Se puede decir que la función de nivel superior ha "compuesto" las piezas en el conjunto.

Sistemas monolíticos: Los sistemas monolíticos son aquellos en los que su centro es un grupo de estructuras fijas, las cuales funcionan entre sí.

La filosofia de UNIX esta muy bien documentada por Doug Mcllroy en la revista tecnica de los Laboratorios Bell de 1978.

  1. Haz que cada programa haga una cosa bien. Para hacer un nuevo trabajo, cree un nuevo programa en lugar de complicarlo agregando nuevas "características".
  2. Espere que la salida de cada programa se convierta en la entrada de otro programa, aún desconocido. No desordene la salida con información extraña. Evite los formatos de entrada binarios o columnares. No insistir en la entrada interactiva.
  3. Diseñe y cree software, incluso sistemas operativos, para que se prueben pronto, idealmente en unas semanas. No dudes en tirar las partes torpes y reconstruirlas.
  4. Use las herramientas con preferencia a la ayuda no calificada para aligerar una tarea de programación, incluso si tiene que desviarse para construir las herramientas y espera desechar algunas de ellas una vez que haya terminado de usarlas.

 Despues resumidas en 1994:

  • Escribir programas que hagan una cosa y que lo hagan bien.
  • Escribir programas que trabajan en conjunto.
  • Escribir programas para manejar flujo de texto por ser una interface universal.

En el libro de Brian Kernighan y Rob Pike de 1984, "The UNIX Programming Environment", ambos de Bell Labs, dan una breve descripción del diseño de Unix y la filosofía de Unix: 

    "Aunque el sistema UNIX introduce una serie de programas y técnicas innovadoras, ningún programa o idea en particular lo hace funcionar bien. En cambio, lo que lo hace efectivo es el enfoque de la programación, una filosofía del uso de la computadora."

    "Aunque esa filosofía no se puede escribir en una sola oración, en su corazón está la idea de que el poder de un sistema proviene más de las relaciones entre los programas que de los programas en sí. Muchos programas UNIX hacen cosas bastante triviales de forma aislada, pero, combinados con otros programas, se convierten en herramientas generales y útiles."


En esa misma epoca, publicaron un artículo titulado "Diseño del programa en el entorno UNIX". En este documento, critican la acumulación de opciones y características del programa que se encuentran en algunos sistemas Unix más nuevos, como 4.2BSD y System V, y explican la filosofía de Unix de las herramientas de software, cada una de las cuales cumple una función general: 

     "Gran parte de la potencia del sistema operativo UNIX proviene de un estilo de diseño de programa que hace que los programas sean fáciles de usar y, lo que es más importante, fáciles de combinar con otros programas."

     "Este estilo se ha denominado uso de herramientas de software y depende más de cómo los programas se ajustan al entorno de programación y cómo pueden usarse con otros programas que de cómo se diseñan internamente. [...]

    "Este estilo se basó en el uso de herramientas: uso de programas por separado o en combinación para realizar un trabajo, en lugar de hacerlo a mano, por subsistemas monolíticos autosuficientes o por un special-purpose, one-time programs."


Los autores contrastan las herramientas de Unix como "cat", con paquetes de programas más grandes utilizados por otros sistemas. 

     "El diseño de cat es típico de la mayoría de los programas UNIX: implementa una función simple pero general que se puede usar en muchas aplicaciones diferentes (incluyendo muchas que no se previeron por el autor original). Otros comandos se utilizan para otras funciones. Por ejemplo, hay comandos separados para las tareas del sistema de archivos, como cambiar el nombre de los archivos, eliminarlos o indicar qué tan grandes son."

     "Otros sistemas en lugar de agruparlos en un solo comando de "sistema de archivos" con una estructura interna y un lenguaje de comandos propios. (El programa de copia de archivos PIP que se encuentra en sistemas operativos como CP/M o RSX-11 es un ejemplo). Ese enfoque no es necesariamente peor o mejor, pero ciertamente está en contra de la filosofía de UNIX."


En el libro "The Art of Unix Programming", publicado por primera vez en 2003 por Eric S. Raymond, un programador estadounidense y defensor de código abierto, resume la filosofía de Unix como el Principio de KISS de "Keep it Simple, Stupid". Tambien proporciona una serie de reglas de diseño: 

  • Construir programas modulares.
  • Escribir programas legibles.
  • Usar composicion.
  • Mecanismos separados de la política.
  • Escribir programas simples.
  • Escribir programas pequeños.
  • Escribir programas transparentes.
  • Escribir programas robustos.
  • Hacer los datos complicados cuando sea necesario, no el programa.
  • Construir sobre el conocimiento esperado de los usuarios potenciales.
  • Evita salidas innecesarias.
  • Escribir programas que fallan de una manera fácil de diagnosticar.
  • Valorar el tiempo del desarrollador sobre el tiempo de la máquina.
  • Escribir programas abstractos que generen código en lugar de escribir código a mano.
  • Prototipo de software antes de pulirlo.
  • Escribir programas flexibles y abiertos.
  • Hacer el programa y los protocolos extensibles. 

 The Art of Unix Programming, Eric S. Raymond, Addison-Wesley, September 17, 2003 - Faq.org

 The Art of Unix Programming, Eric S. Raymond, Addison-Wesley, September 17, 2003 - University of Rhode Island


En resumen las características de UNIX que la hacen destacar sobre el resto de los sistemas operativos es una cierta consistencia, un modo de trabajo simple pero potente que se ha traducido en la filosofía UNIX.

“Aquellos que no pueden entender UNIX, estan condenados a reinventarlo, pobremente.”


LINKS SOBRE UNIX



OTROS LINKS INTERESANTES