
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