He leído: The art of Unix programming de Eric S. Raymon

Comprálo en AmazonSupongo que lo primero que se preguntan los lectores de este blog al ver el título de este post es ¿qué hace un MVP leyendo cosas sobre Unix? o formulando la pregunta de una manera menos torticera ¿por qué un experto en entornos Microsoft está interesado en Unix?. La respuesta es compleja, pero las motivaciones que me han llevado a leer este libro son:

Unix es un gran sistema operativo, estaba seguro que aprendiendo más sobre Unix me iba a convertir en un desarrollador y arquitecto más valioso. Internet es Unix, Internet es omnipresente. Quieras o no a diario todos usamos sistemas Unix. Me gusta conocer lo que uso.

Conocer los puntos fuertes y débiles de otras plataformas de desarrollo y sistemas operativos te ayuda a detectar, prevenir y minimizar las debilidades de tus soluciones y del entorno en que te mueves, Windows y .Net en mi casos.

Es un libro enormemente citado. Casi todo el mundo que lo ha leído coincide en que es un gran libro que todo amante del desarrollo de software, por encima de afinidades a tal o cual sistema operativo, disfruta leyendo.

A pesar de lo que pueda parece por el título el libro no es un libro sobre programación. No te enseña a programar en Unix. Es un libro sobre historia, arquitectura y cultura informática en general. Es una lectura amena y llevadera, sobre todo si ya has tenido contacto con entornos Unix y te apetece saber por que las cosas son como son en esa plataforma.

La primera parte del libro, de aplicación universal, desgrana las grandes decisiones de arquitectura y circunstancias históricas que han llevado a los entornos Unix a ser como son. Muchísimas de estas decisiones de diseño, tomadas por gente de extraordinaria valía, pioneros de la computación e Internet, esconden extraordinarias lecciones prácticas de arquitectura y diseño de sistemas informáticos. Además se incluye una ‘comparativa’ entre sistemas operativos y las grandes decisiones de diseño que han marcado cada una de ellos que sin duda aporta una interesantísima cultura general sobre el tema que todo arquitecto debería tener. Lo que menos me ha gustado del libro, sin duda, es que no es del todo objetivo en su tratamiento de los sistemas operativos de Microsoft y que se nota que lleva un lustro escrito y no ha sido actualizado con los avances habidos en  esta plataforma. Por poner un simple ejemplo se critica la ausencia de una interfaz de línea de comandos potente, algo paliado ampliamente desde la aparición de PowerShell. En esta parte del libro me parecen especialmente destacables e interesantes las reglas que el autor desgrana sobre la filosofía de Unix, ¡son reglas aplicables a cualquier arquitectura!. No se puede discutir que si algo a demostrado Unix es su capacidad para adaptarse a las circunstancias, evolucionando durante cincuenta años para amoldarse y ser una plataforma puntera en todo cambio habido en la informática durante su historia. Sin duda esta capacidad de adaptación y permanencia se deriva de una excelente arquitectura, por eso conocer las reglas que han guiado esa arquitectura es sumamente valioso.

En la segunda parte del libro, se baja de nivel y pasamos de la arquitectura de Unix a su diseño, a detalles concretos de soluciones que se han tomado en el diseño de este sistema operativo y de aplicaciones significativas del mismo. Esta parte del libro es, para mí, la más interesante. Podemos extraer de los casos estudiados en el libro una gran cantidad de conocimiento práctico sobre el diseño de sistemas informáticos. Se tratan todos los temas clásicos del diseño arquitectónico: Encapsulación, ortogonalidad, capas, diseño de protocolos, transparencia, multiprocesamiento, lenguajes embebidos, generación de código, optimización, complejidad… Resumiendo, todo un tratado sobre los grandes temas del diseño de software, vistos no solo desde un punto de vista teórico sino repasando como se han aplicado en esta plataforma y en sus aplicaciones más relevantes.

El libro presenta además un repaso sumamente interesante, en su tercera parte, de las herramientas y lenguajes de programación que permiten llevar a la práctica la lecciones aprendidas sobre arquitectura y diseño. Aquí el libro se convierte en algo mucho más especifico de la plataforma Unix, y por lo tanto las lecciones que aprendemos en esta parte, aunque interesantes y valiosas, no son de universal aplicación.

La cuarta parte del libro está dedicada a la comunidad. No cabe duda que la cultura de comunidad ha sido mucho más rica y tiene una tradición mucho mayor en entornos Unix que en entornos Windows. Esto ha cambiado radicalmente en los últimos años, pero aun así hay lecciones importantes que podemos aprender y otras que aun estamos aprendiendo en el mundo Windows sobre como compartir código, trabajar en proyectos de manera abierta, documentar los proyectos que compartimos, etc… Conocer como el mundo ‘open source’ Unix lleva años haciendo esto, puede enriquecer el mundo ‘open source’ Windows, cada vez más potente y rico y sobre todo nos puede ayudar a evitar reinventar la rueda.

En resumen un libro excelente, más que recomendable, que merece la pena leer y comprar. Sin duda va a ocupar un lugar preeminente en mi biblioteca y con seguridad va a inspirar post en este blog.

¡Un saludo!

12 comentarios en “He leído: The art of Unix programming de Eric S. Raymon”

  1. Yo leí este libro hace tiempo. La verdad es que es excelente. Sin duda hay que leerlo por muy ‘windowsero’ o ‘.netero’ que se sea. No se puede ignorar que Unix/Linux existe y leer este libro es una manera excelente de adquirir el mínimo de cultura sobre este sistema que todo desarrollador debería tener.

    Yo ‘ojeé’ la versión online (http://www.catb.org/~esr/writings/taoup/html/)y tras un rato me fuí directo a conseguir un copia en papel… si duda es un compra que merece la pena.

    ¡Saludos!

  2. En realidad en estos tiempos hay mucho desconocimiento de como se cocinan las cosas por dentro de un sistema operativo, Java y .NET nos han abstraido de ese ese necesario conocimiento, bien dices, uno es mejor programador si conoce las cosas por dentro.

    Algun dia lo leere, en todo caso trato de paliar mi ignorancia con lo que recuerdo del libro de Tanembaum de Sistemas Operativos Modernos.

    Al final viene a ser cierto lo que decian en mi universidad, que un buen conocimiento de C y de Sistemas Operativos luego te permite aprender mejor lenguajes nuevos.

  3. Realmente me resulta increíble que estés de alguna forma justificándote de leer este tipo de libros.

    ¡Que no hombre! ¡Que haces muy bien leyendo e instruyéndote! A ver si ya acabamos de una vez con el “¿a quién quieres más a papá o a mamá?” (siendo papá Linux y mamá Windows (o viceversa)). Ya sólo te queda leer algo sobre Java y sobre servidores de aplicaciones en Java para que digas “¡lo que le queda aún por andar a ASP.NET!” 😉

  4. @Ernesto: Totalmente de acuerdo. Los desarrolladores vivimos en una continua ilusión de abstracción… los problemas vienen cuando las abstracciones comienzan a fugar y hay que bajar a las tripas… la gente se ha creido que la memoria no es importante, y que tenemos recursos infinitos y que los problelmas se solucionan poniendo trazas en lugar de sabiendo usar un depurador a fondo. A si nos va.

    @Jose Ignacio: ¡No me justifico! ¡Faltaría más! Siempre he querido a papa casi tanto como a mama, solo que cuando la productividad y la cercanía al usuario son factores importantes, mama es mucho más efectiva… Tengo una estación Silicon Graphics Indigo Impact con su Irix que puede atestiguar las horas de amor que le he dado a Unix… Ubuntu y OpenSolaris también reciben mis cariños, estoy reaprendiendo Python sobre estas plataformas y con Eclipse (como quiero a Visual Studio, a pesar de lo que le critico), aunque le dedico tiempo exporadicamente… es lo que tiene que me guste programar, me da igual el que. Lo bueno es que saber C/C++ me ha abierto las puertas de todos esos sistemas. Sobre Java, paso, sinceramente. Write once debug everywhere. No gracias… Siempre hay un compilador de C/C++ que cumple su cometido. Sobre lo que le queda por andar a Asp.net será en complejidad opcional añadida ¿no? por que por lo demás… Lo siento, ya sufrí bastante Java… 😉 Una cosa es querer a papa, mama, los tios y los primos y otra al vecino pederasta jejejeje… Aunque reconozco que es un cuestión de gustos más que una razón técnica lo que mueve mi desafecto hacia Java. Ya he dicho mil veces en este blog que grandes aplicaciones y casatñas se puede hacer en cualquier lenguaje y plataforma. Los lenguajes y los sistemas operativos son la parte menos relevante del desarrollo de software, simples commodities sin valor diferencial…

    ¡Un saludo y gracias por vuestros comentarios!

  5. Hola Rodrigo,

    Esto sí que me ha sorprendido! Parece que el espíritu Alt.NET se está introduciendo en tu vida profesional 🙂

    Respecto al libro, ¿crees que la primera y segunda parte del libro contienen más o menos lo que aprendes en la universidad en la correspodiente asignatura de sistemas operativos? Es simplemente para darle más prioridad o menos en mi pila de libros para leer.

    Gracias por el post.

  6. El título está basado en una de las obras más emblemáticas que existen en toda la historia de la computación: “The Art of Computer Programming”, de Donald Knuth, que ha visto ya más de 25 ediciones, y se ha traducido a no sé cuántos idiomas.

    Yo todavía conservo los 3 tomos (encuadernados en cartoné), con páginas marcadas dentro de capítulos que han pasado a la historia, como la “Prueba Espectral” que lleva su nombre, y que define las condiciones que debe tener un algoritmo generador de aletorios para que pueda ser considerado como tal.

    Ese tipo de obras deben estar siempre en una biblioteca que se precie…)) Fíjate, además, que resulta que hay títulos (como este) que dan origen a sagas. Este es un caso, pero “The C programming language” de Kernighan & Ritchie tambien ha servido para otros tantos títulos donde simplemente se cambiaba la “C” por el lenguaje que fuera, como es el caso de nuestro querido Hejlsberg y su “The C# programming language”.

    Es que el verano invita a “revisitar” estas cosas…)))

    Saludos
    Marino

  7. @Benjamin: Pues no se decirte. Yo no soy ingeniero informático así que no se si el contenido del libro se ajusta al contenido de la asignatura. Si te puedo decir que cuando contrato un desarrollador preferiría que hubiese leído este libro que algunos sesudos bodrios sobre teoria de sistemas operativos que en ocasiones he ojeado. Ponlo arriba de tu ‘backlog’ de lecturas, no te defraudará.

    @Marino: Cierto, que grande el Knuth. Hace poco en casa de mi copañero Yamil Hernandez y en manos de su padre, un profesional con más de treinta años de experiencia, pude ver una de las primerísimas ediciones de esa joya. Una maravilla, una de las pocas obras intemporales en este cambiante mundo de la informática. Como el mítico de K&R que tu citas también, otro incunable. Eso sí aquí va mi aportación, uno que a mi en particular me encanta: The Design and Evolution of C++ (http://www.amazon.com/gp/product/0201543303?ie=UTF8&tag=lamaselladlab-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0201543303), de Stroustrup. Vital para conocer como se gestaron muchas de las características OOP que los lenguajes modernos de la rama de C++ (C# y Java) presentan en la actualidad.

    ¡Gracias por los comentarios!

  8. ¿IRIX? ¿No había Silicon Graphics pasado a Linux ya? Recuerdo al IRIX de mis tiempos de doctorado cuando lanzaba simulaciones en C++ en esos pedazos de maquinones (esos fueron mis primeros pinitos en el mundo UNIX con IRIX y con Solaris).

    Había un Silicon Graphics con 8 procesadores que era destinado a profesores y un SUN destinado a alumnos. Lanzaba las simulaciones que dejaban fritos a 6 de los 8 procesadores de esas máquinas con la consiguiente llamada del administrador de sistemas. Demasiado comprensivo era teniendo en cuenta que estaba usando la mayor parte de la potencia de cálculo de la Universidad para mí solito.

    La verdad que entiendo lo que dices, Java apesta. Me tocó sufrir una migración de unos aplicativos que hicimos de un Netscape Application Server a un WebSphere. Fue todo un infierno. Aunque las aplicaciones funcionaban bien, pero el servidor de aplicaciones tenía un gran poblema de estabilidad. Las aplicaciones caían en cuando se les daba un poco de caña. Fue toda una odisea el dejar otra vez el servidor de aplicaciones estable.

    La verdad que tienes razón que Java no cumple lo que promete, pero en tema de aplicaciones Web está realmente a años luz de distancia de Microsoft (cosa que tampoco es extraordinaria, porque fue la primera que realmente se tomó en serio las aplicaciones Web y ya existían herramientas empresariales MUY serias cuando Microsoft aún estaba a por uvas en el tema Web con ISAPI y VBScript).

    El que las aplicaciones sean meras utilities, ahí te lo discuto (y este es el verdadero motivo por el que he escrito este comentario). Mira si no, este párrafo sacado de una nota interna de Microsoft el 21 de Febrero de 1997 dirigida a Bill Gates por el manager general de C++:

    “The Windows API is … so deeply embedded in the source code of many Windows apps that there is a huge switching cost to using a different operating system instead. … It is this switching cost that has given customers the patience to stick with Windows through all our mistakes, our buggy drivers, our high TCO, our lack of a sexy vision at times, and many other difficulties… Customers constantly evaluate other desktop platforms, [but] it would be so much work to move over that they hope we just improve Windows rather than force them to move. In short, without this exclusive franchise called the Windows API, we would have been dead a long time ago.”

    Como ves, aguien no quiere su sistema operativo sea una mera “comoditie”

  9. @José Ignacio:

    Cierto que Sgi abandono hace tiempo Irix y se paso a las estaciones basadas en Linux e Intel, hay comenzo su decadencia hasta su casi completa desaparición. Sus últimas estaciones con Irix fueron las Fuel, una autentica joya.

    Sobre lo de que MS estubo a por uvas mucho tiempo en lo relativo a la web, es cierto. Pero creo que ahora tiene una excelente plaforma que cubre todo el espectro: Asp.Net + MVC + Silverligth.

    Cierto que la guerra del API es clave. De hecho es la clave por la que los Unix comerciales han muerto a manos de Linux. No había casi coste de cambio entre Irix y Linux por decir un ejemplo. Sin embargo el API de Windows no tiene nada que ver con el de Linux y el subsistema POSIX nunca llego a funcionar (a MS no le interesaba lo más mínimo). Hay un artículo sumamente interesante de Jose Spolsky sobre este tema: How Microsoft Lost the API War(http://www.joelonsoftware.com/articles/APIWar.html).

    Pero yo no me refería a esto. Me refería a que una vez elegida una plaforma: Win o Unix y un lenguaje, estos no son los factores que marcan el fracaso o no de un proyecto nunca (salvo que la elección sea extraordinariamente inadecuada).

    ¡Un saludo!

  10. Entiendo lo que dices respecto a la falta de diferencia entre los APIs de UNIX y Linux. De hecho el único UNIX que ha sobrevivido es el Solaris y por más que nada es por el hardware de SUN. Pero vamos, que viendo el OpenSolaris creo que a Solaris le queda poco de vida.

    En cuanto a las tecnologías Web, Microsoft ha aprendido mucho, pero ni de lejos es una alternativa a Java en cuanto a escalabilidad y estabilidad.

    Java apesta y es porque no cumple lo que promete ni de lejos. Resulta muy complicado hacer una aplicación medio decente. Tienes que estar mirando decenas y decenas de documentos técnicos para enterarde símplemente de qué va una tecnología y tienes que estar constantemente pendiente de cualquier variación en la máquina virtual Java que haga que todo tu trabajo se venga abajo.

    Tienes que dedicar un montón de esfuerzos a hacer una aplicación Java y tienes que tener presentes muchas cosas, pero una vez una vez que tienes la aplicación en producción puedes por fin respirar tranquilo.

    La versatilidad que te da Java en un entorno de producción no te la ni de lejos Microsoft. Eso sí, en los entornos de desarrollo Microsoft gana a Java por goleada.

    Por eso los desarrolladores (incluído yo mismo) preferimos C# a Java, pero pensandolo fríamente, si el proyecto requiere una gran escalabilidad me tiro de cabeza a Java.

    En mi tierra hay un dicho que dice “lo que no va en lágrimas va en suspiros”, que en este caso es “el tiempo que no dediques en desarrollo a planificar cuidadosamente la aplicación, lo tendrás que echar en producción en arreglarla”.

    Es una buena noticia que Microsoft esté haciendo nuevas mejoras en cuanto al modelo vista/controlador (que en Java lleva ya AÑOS), Silverlight (que miedo me da porque ya llevamos 3 versiones en un año) y ASP.Net (que es una fantástica herramienta que uso asiduamente).

    Pero si te das cuenta, todos los avances de estas tecnologías van orientadas al desarrollo y ninguna a lo que es los entornos de producción. La separación entre el servidor Web y el servidor de aplicaciones que hace Java es una FANTASTICA idea de la que MS debería de aprender. Vale, Microsoft tiene el ISA Server, pero ni de lejos hace lo que puede hacer cualquier servidor de aplicaciones Java.

    También es una magnífica idea el poder tener desde Servlets (donde estás tocando prácticamente el servidor Web), JSPs donde tienes una interacción moderada o utilizar Frameworks encima de JSP (por ejemplo con Struts tienes el modelo vista-controlador).

    Sería genial poder disponer de los Enterprise JavaBeans (EJBs) donde tienes realmente control sobre las instancias de los objetos en el servidor de aplicaciones.

    Como ves, esas son las cosas por las que digo que Java supera a la plataforma .NET. Para alguien que esté empezando, verá a .NET como una chica bonita bien vestida y a Java como un mounstro feo y apestoso. Pero cuando intentas hacer cosas realmente serias, ver la que chica tiene una personalidad horrible y que le huelen los pies. Sin embargo el mounstro, aunque apestoso y feo se deja querer.

    Por cierto, genial el artículo que me has pasado sobre el API de Windows. De hecho me he sentido completamente identificado pues hemos hecho una aplicación para Windows (usando las DirectX 9) y nos encontramos con que dicha tecnlogía no está soportada por las DirectX 10… Estoy deseando de conocer a quién fue el genio que tomó esa decisión para darle una medalla…

  11. @José Ignacio:

    Pues a mí es precisamente el despliegue lo que me mata en Java. Configura el servidor, el contenedor EJB, Hibernate, Spring, Struts, el servidor de colas, Tomcat, Apache, etc… ufff que infierno de despliegue. En un entorno MS sabes que todo lo que necesitas para deplegar lo tienes en tu servidor Windows (el SO operativo ES el servidor de aplicaciones): ISS, COM+, MSMQ, .Net Fx, ¡todo!, de serie y listo en cualquier servidor en el que quieras desplegar… alucinante… Si eres un ISV, es imposible hacer nada para J2EE, hay tantos ecosistemas y entornos diferentes que soportar que es simplementa inviable: Websphere, Jboss, Weblogic… cada uno con su implementación de las especificaciones J2EE… para llorar…

    En .Net tienes un modelo de componentes, eventos, trasacciones, comnicaciones distribuidas, etc… todo lo que una aplicación empresarial necesita unificado, sin quebraderos de cabeza de despliegue… Luego tienes Asp.net o MVC para entornos web y Winforms para ventanas (Swing es para llorar, en eso todos estamos de acuerdo).

    Sobre la escalabilidad, antes podría ser, por que Java estaba en plataformas hiperpotentes pero ahora ya todo es x64, el host a perdido su sentido salvo casos contados, y el rendimiento de .Net barre al rendimiento de Java sobre la misma máquina. Nada mejor para la escalabilidad que no tener que escalar horizontalmente.

    Los costes de desarrollo y operación se disparan con Java… sin MOM, sin performance counters sin un modelo claro de operación de las aplicaciones… ufff…

    Lo dicho o C++ o .Net, de Java paso!!! 🙂

    ¡Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *