lunes, 2 de febrero de 2009

Filosofía UniX: conoce las ideas que lo han hecho uno de los mejores sistemas operativos de todos los tiempos


Remontándonos uno poco en la historia

la filosofia unix ha sido aplicada no solo en UNIX, Sistema operativo desarrollado por Ken Thompson en los laboratorios Bell en 1969 sino en todos los Sistemas Operativos derivados de éste ( Solaris, Linux, entre otros).


La Filosofía UNIX nación de una de las metas de UNIX: crear un sistema operativo lo mas eficaz y sencillo posible. Es un sistema bastante modularidar, a diferencia de los sistemas monolitos o no modulares (como los sistemas Windows de Microsoft). La modularidad, como se explicara mas adelante, consiste en separar los componentes en módulos o paquetes individuales los cuales pueden interactuar entre si.



A pesar de sus grandes prestaciones, en la Era Windows empezó a decaer el uso de UNIX (aunque existen hoy en día muchos Sistemas Operativos inspirados en Unix con creciente auge, algunos privativos y otros de caracter libre, tal es el caso de SunOS, FreeBSD, NetBSD originarios de las investigaciones sobre el código fuente de Unix de la Universidad de Berkley y otras universidades autorizadas por los laboratorios Bell de AT & T, y el famoso LINUX).


En cuanto a la filosofía.....

Hay dos descripciones: según Doug Mcllroy y según Mike Gancarz

según Doug Mcllroy la filosofía UNIX puede resumirse en lo siguiente:

"Escribir programas que hacen una cosa y hacerlo bien"

Me ha pasado que, al querer desinstalar programas y aplicaciones en programas no Unix (o sea Microsoft) o bien quedan alterados registros del sistema, o bien hay configuraciones del propio sistema operativo que no quedan igual que antes, ya que Windows no es configurable. En UNIX tal problema no existe. Al decir "Escribir programas que hacen una cosa y hacerlo bien" no significa solamente que hagan una actividad en el momento en el que existen sino en que al ya no existir, el sistema sigue funcionando igual porque solamente hacía lo que tenía que hacer tanto al instalarse como ejecutarse y desinstalarse y no toca ni reajusta nada mas del sistema, en eso los sistemas UNIX resuelven la mitad del problema con su concepto de modularidad, con la cual un programa no interfiere en el desarrollo ni del sistema ni de otras aplicaciones: Linux, por ejemplo tiene infinidad de archivos de configuración y está diseñado para que les hagan modificaciones para tareas específicas con lo cual los sistemas son muy pero muy independientes unos de otros, a excepción de los que utilizan otros paquetes de base (Los programas de Audio, por ejemplo que utilizan el paquete Alsa Player)
. Esta particularidad hace el Sistema más robusto y ayuda mucho en cuanto a simplicidad de programación y funcionalidad.

"Escribir programas para trabajar juntos"

Puesto que los programas son modulares esto redunda en crear aplicaciones muy atómicas, es decir, que solo hacen una tarea determinada independiente de otras y a la hora de crear entornos y aplicaciones pesadas y complejas o paquetes es necesario una buena coordinación entre unas y otras aplicaciones, por ejemplo, la mayoria de aplicaciones de linux utilizan el sistema de ventanas X, que provee el servicio de ventanas, se necesita un enlace a la hora de crear código y compilar y para ese entendimiento, aquí es clave el lenguaje C. Muchos de los programas que se crean y utilizan otras apliaciones base son creados o compilados mediante librerías. C es el lenguaje estandar para UNIX. Recuerdo hace algún tiempo que me tocó hacer un programa que hiciera funcionalidades tipo consola que utilizaran sistemas de archivos, tuve que compilar mi código con las librerías de ext2, que era el sistema de archivos a utilizar y que tenía ya las funcionalidades para accesarlo. En resumen, para este nuevo concepto es clave la utlización de un lenguaje común, la compilación y los paquetes o librerías para tareas especificas, con lo cual las aplicaciones tienen mucha integridad respecto al aspecto del sistema (para cada tarea se utiliza un paquete que ya la hace) lo que promueve una tremenda reutilización de código.

"Escribir programas para manejar flujos de texto(text streams), ya que es una interfaz universal"

Creo que este concepto es complemento del anterior. En algún curso de la Universidad oí mencionar de los flujos o Streams (del cual ahora no recuerdo el nombre de quien hizo el concepto), son como imaginarse una tubería de agua, por donde pasan "flujos" de agua o en nuestro caso, información, simplemente flujo de datos. Un Stream es un concepto muy general, puede ser un apuntador a un archivo, un conjunto de caracteres en memoria, texto de archivo, etc. Nuevamente influye en este caso, C. Los sistemas Unix manejan mucho este concepto, en UNIX todo es texto y archivos de configuración, o casi todo, por lo cual es muy , MUY importante que un programa para UNIX pueda comunicarse de una forma universal y acorde a lo que el sistema pide y le proporcionará.


La filosofía segun Mike Gancarz dice en 1995 su libro La filosofía de UNIX:

"Lo pequeño es hermoso"

pequeño en cuanto tiempo y espacio en instalación, consumo de recursos del sistema, en cuanto a los requerimientos de hardware y software, pequeño en que sea simple y no complejo, pequeño en costos bajos de portabilidad y mantenimiento, es decir todo pequeño, eso sí que es hermoso (es un ideal no siempre alcanzable pero los sistemas Unix ofrecen muchas prestaciones y herramientas para lograrlo)

"Haz que cada programa haga una cosa bien"

Que sea eficaz, que haga la actividad para lo que fue hecho y no redunde en hacer de más o en divagar en muchos lugares sin contretar la solución para lo cual fue creado. Mientras mas vuele y canse en recursos significa más recursos invertidos en una sola tarea, lo cual no es deseable, por eso es importante enfocarse en una sola cosa y que la haga correctamente

"Construye un prototipo lo antes posible"

Al hablar de prototipos nos estamos refiriendo a un modelo programado inicial, una versión -1.1 o 0.1 por decirlo de algún modo. Los prototipos no es más que una emulación o simulación de una aplicación evaluada en escenarios y con datos que posiblemente tendría que manejar en la vida real, sin ser funcional del todo para que se haga rápido. Así es más fácil y rápido corregir y prevenir errores o hacer cambios sin tener que hacer una versión completa

"Elige portabilidad sobre eficiencia"

sumamente importante en un sistema operativo que aspira a crecer y a ser perfeccionado por mentes brillantes y colaboradoras de programadores alrededor del mundo. Si un programa es modificado para una versión de un Unix pero no es portable a otras prácticamente no puede servir, es como no hacer nada, de ahí que es más importante que sea portable, es decir que funcione tanto en tu máquina como en la mía a pesar que lo haya creado en la de fulano; de ahí que sea más importante que haga las cosas ineficientemente en todas las máquinas a que funcione eficientemente solo en la mía y en las demás no.

"Guarda los datos en archivos planos"

Este concepto sigue siendo muy ligado al anterior, los archivos planos ayudan a que un programa pueda comunicarse con el sistema y otras aplicaciones, facilitando enormentente su modularidad y portabilidad, la programación y depuración, Unix es casi como tener un enorme programa donde cada aplicación es una especie de subfunción con todas las facilidades para que sea compatible con lo demás programado, una gran ventaja al analizar este sistema operativo a nivel programación y funcionamiento

"Aprovecha funcionalidades del software"

Referido especialmente a usar técnicas de estructuras de datos, recursividad, manejo de punteros o memoria dinámica, uso de abstracción y herencia, polimorfismo o refactorización de código(reutilización del mismo), buenas prácticas a la hora de usar la memoria y crear variables y objetos, todo con el fin de hacer los componentes menos pesados y más pequeños, veloces y óptimos.

"Usa scripts de shell para aumentar la funcionalidad y portabilidad"

Los scripts de Unix tienen, entre muchas otras funcionalidades, la de hacer altamente configurable el sistema, así como los programas que dependen del el. Asi, por ejemplo, en Linux vez de llamar centenas o miles de aplicaciones para compilar un paquete, solo con llamar los scripts standard ./configure o make install se llaman a todos los programas además que se adapta al sistema en sus configuraciones de scripts para que acepte los paquetes. También permite la reutilización de comandos y aplicaciones ya existentes con lo cual la Shell misma podría verse como un programa vivo el cual usa varias funciones ( programas y aplicaciones) para complementarse y funcionar juntas.

"Evita interfaces de usuario captivas"

Lo captivo se refiere a algo que queda cautivo, al decir evitar usar interfaces captivas se refiere a evitar interfaces de usuario (o paquetes) que hagan que prácticamente escondan o mantengan cautivo el código que lo generó

"Haz de cada programa un filtro"

Que sean capaz de ser un filtro de errores y problemas de todo tipo, es decir, que capturen y filtren todo tipo de errores, de manera de evitar errores de excepción o programación e inclusive posibles errores de otros programas en paralelo, del mismo sistema o del hardware, que ese filtro signifique considerar todos esos pormenores que podrían hacer perder robustez al programa.

Fuentes:
http://www.manzanamecanica.org/2008/02/la_filosofia_unix.html
BSD


16 comentarios:

  1. Esta bastante completa la informacion, interesante! Sobre todo la parte de la filosofia unix segun Gancarz, creo q es algo q nosotros como diseñadores de software debemos aplicar a nuestras creaciones: pequeño, eficiente, portable, funcional, etc..

    ResponderEliminar
  2. Creo que cuando empezó a decaer Unix ante la penetración del producto de Microsoft en el mercado informático, fue cuando se marco un punto de inflexión en la filosofía de Unix. Es cuando adopta su criterio de código abierto, y a través de esto nace Linux. Considero que esta filosofía debería ser el pilar en el que basamos nuestro criterio de programación todos los estudiantes de sistema, ya que de eso depende un buen trabajo. Les recomiendo ver este documental: http://video.google.com/videosearch?q=Linux&hl=es&emb=0&aq=f#q=Documental+Linux&hl=es&emb=0 , está compuesto de dos partes (9 minutos cada una) creo que vale la pena verlo, puede servir de inspiración para los restantes años de programadores que nos quedan jaja....

    ResponderEliminar
  3. Me parece muy interesante y sobre todo completa la información que tenes en el post, en especial el usar anécdotas personales le da un toque bastante singular y preciso al contenido.

    Lo que no me gusto (por así decirlo) es lo que mencionas del software libre y el propietario, ya que aunque la información esta bien, no tiene mucho que ver con la filosofía Unix como tal.

    ResponderEliminar
  4. Me parece muy completo el contenido sobre la filosofía Unix, la verdad no tengo ninguna duda sobre la información que colocaste incluso las historietas le dio un toque llamativo. Pero como dice Peter al mesclar lo de SW libre y propietario como que te desviaste un poco del contenido.

    ResponderEliminar
  5. Al principio el post pareció mas que ser un documento educativo e informativo un documento en contra de la filosofía de software propietario. Ya después se estabilizó un poco en el tema principal. La información que está aquí esta muy detallada y te felicito por poner la referencia, no muchas personas hoy en día lo hacen. Pero sin desviarnos del tema, algo que no me gustó del post fué esta parte:

    "puesto que el software nació para beneficiar a todos y no para hacer dinero o fines empresariales."

    Si realmente esto fuera cierto, entonces nuestra carrera sería mas un hobbie que una opción para superarnos económicamente.

    ResponderEliminar
  6. Al leer tu post, me di cuenta que ponias a Unix y el software propietario, y aunque difiero del comentario anterior por que debido a desarrolladores libres(entiendase por: no tienen beneficio economico) tenemos incluso mejor software propietario(y no es por decir que sea mejor). pero regresando al tema de tu blog, yo veo mas el metodo que utilizaba unix en sus principios como una metodologia de desarrollo, en el cual su filosofia acopla ideales de desarrollo, completamente exitosos

    ResponderEliminar
  7. Me parecio muy bueno que definieras con tus propias palabras cada punto a tomar, como ciertamente dice drummer, al inicio esto parecia mas un documental totalmente en contra del software propietario, pero con los puntos a llenar estubo todo muy bien.

    ResponderEliminar
  8. Me parece muy bueno que pongas ejemplos propios para describir cada uno de los puntos, todo lo que pusiste esta muy informativo e interesante. La parte que mas me llama la atencion es la de "Guardar los datos en archivos planos", ya que eso hace los programas multiplataforma, algo que es muy util hoy en dia ya que tanto el software libre como el propietario tienen su demanda.

    ResponderEliminar
  9. en realidad hay que tomar mucho en cuenta, la diferencia que tiene cada tipo de software, puesto que uno puede confundirse con facilidad y como dice la filosofia, es preferible la protabilidad que la eficiencia, como muchos sistemas operativos los cuales son muy bonitos, pero solo en condiciones perfectas funcionan

    ResponderEliminar
  10. Que tal Alex, tu post es uno de los mas completos que encontre en comparacion a los otros 4, solo como retroalimentacion, yo agregaria ventajas y desventajas, diferencias con otros sistemas operativos, etc...
    Esto ya lo escribi en otro post pero considero necesario volverlo a colocar en tu blog
    Ventajas:
    - Completamente multitarea con proteccion de la memoria. Aqui multiples usuarios pueden correr multiples programas al mismo tiempo, sin que el sistema se quiebre.
    - Alto grado de eficiencia de la memoria virtual.
    - Control de acceso y seguridad
    - Riqueza de pequeños comandos y utilidades que realizan tareas especificas.
    - Poderoso sistema unificado de archivos.
    - Disponible en una gran variedad de maquinas. Es el unico sistema realmente portable.
    y asi puedo seguir enumerando otra buena cantidad de ventajas, pero mejor voy a mencionar algunas desventajas...
    Desventajas:
    - La linea de comandos tradicional es un tanto hostil, mas bien diseñada para programadores que para usuarios tradicionales.
    - Los comandos tienen nombres encriptados, y las respuestas que proveen no son muy significativas, es decir no indican especificamente que fue lo que se realizo.
    - Para poder utilizar unix a perfeccion es necesario comprender antes algunas carateristicas principales.

    ResponderEliminar
  11. Me pareció un post bastante completo, la explicación que le das a la filosofía me parece muy apropiada, solamente con eso de mencionar software libre y propietario, tengo duda de porque al mencionar el software propietario mencionas solo a windows, pero creo que ahi se desvió un poco el tema del post.

    ResponderEliminar
  12. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  13. Excelente Post. Ya no necesito ver los demas porque aqui esta todo claro y preciso. Es interesante saber que todo se guarda en archivos de texto inclusive teniendo grandes cantidades de informacion y me imagino que no necesita un DBMS.

    ResponderEliminar
  14. El contenido del mismo es muy completo pero te recomiendo que al momento de describir cada una de las filosofías hubieras puesto una pequeña descripción del mismo, a pesar de ello solo tengo una pegunta, tengo entendido que no solo windows existe de SO, aparte de Windows y GNU/Linux que otro SO posee alguna relación con estas filosofías?.

    ResponderEliminar
  15. Yo etoy muy de acuerdo a que los programas deben de ser compactos y funcionales en un 100% aunque esto signifique que el usuaio no siempre este de a cuerdo con la interfaz... pero lo importante es que funcione correctamente.

    ResponderEliminar
  16. El punto de los filtros es importante , dado que siempre el ususario se va equivocar y eso debe ser una esencia en la programacion de todo sistema o software, en el caso de unix se vuelve una filosofia aunque en sus derivados no siempre se puede hacer dado que la usabilidad es un tanto complicada de cierta forma he de ahi el porque no se ha ganado al usuario comun y corriente. buen post.

    ResponderEliminar