Prefacio al arte de la programación UNIX
Unix no es tanto un sistema operativo como una historia oral.
Unix no es tanto un sistema operativo como una historia oral.
——Neal Stephenson
Existe una enorme diferencia entre conocimiento y experiencia. Con conocimiento, puedes deducir qué hacer, mientras que la experiencia te permite hacer cosas de manera reflexiva, incluso sin querer. hazlo.
Este libro trata sobre "conocimiento", pero se centra más en la "experiencia". Aprenderá cosas sobre el desarrollo de Unix que los expertos de Unix ni siquiera saben que conocen. Menos técnica, más cultura compartida: obvia y sutil, intuitiva y subyacente: ésta es la diferencia entre este libro y la mayoría de los libros de Unix: no se trata solo de métodos, sino más bien de conceptos.
Las ideas contribuyen en gran medida a la practicidad, y hay demasiado software mal diseñado: inflado, difícil de mantener, portar y ampliar: todos ellos síntomas de un mal diseño. Esperamos que los lectores de este libro obtengan una idea de lo que Unix enseña sobre el buen diseño.
Este libro se divide en cuatro partes: escenarios, diseño, herramientas y comunidad. La primera parte (escenario) trata sobre filosofía e historia, preparando el escenario para lo que sigue. La Parte II (Diseño) desglosa los principios de la filosofía Unix en recomendaciones más especializadas para el diseño y la implementación. La Parte III (Herramientas) analiza las herramientas proporcionadas por Unix para ayudarle a resolver sus problemas. La cuarta parte (comunidad) habla de los asuntos y acuerdos entre personas, y esta es la razón por la que la cultura Unix tiene una alta eficiencia.
Este libro trata sobre la cultura compartida y nunca imaginé escribirlo solo. Descubrirá que la serie incluye apariciones especiales de varios veteranos de Unix que han dado forma a las costumbres de Unix. Este libro pasó por un proceso de revisión pública a gran escala, durante el cual invité a estas celebridades a revisar e investigar el manuscrito. Estas opiniones no se perdieron en la versión final de este libro, y puedes escuchar sus voces reales en el libro: ya sea que aplauden este libro o sacuden la cabeza en contra de él.
Cuando uso el término "nosotros" en este libro, no estoy mintiendo, sino simplemente afirmando que este es un hecho que está claro para toda la comunidad.
Debido a que este libro se centra en transmitir cultura, incluye mucha historia y folclore no oficiales, lo cual es poco común en los libros técnicos. Espero que les guste, estas cosas son en realidad la educación de los programadores de Unix. Sumeru no es pesado, las semillas de mostaza no son livianas. Esperamos contar mejor la historia de esta manera. Comprender el origen y los cambios de Unix desarrollará su intuición para el estilo Unix.
Nuevamente, por esta razón, no pretendemos adoptar un tono retrospectivo. Descubrirá que este libro se basa en mucha información actual. No queremos darle la ilusión de que todo lo que hay en el libro es la verdad eterna y última. La práctica de referirse a la información actual también recuerda a los lectores que dentro de treinta años en el este de Hedong y dentro de treinta años en el oeste de Hexi, lo que ven frente a ellos pronto puede quedar obsoleto y necesitar ser reexaminado.
Además, este libro no es un tutorial de C, un manual de comandos y API de Unix, una referencia del lenguaje para sed/yacc/Perl/Python, ni una introducción a la programación de redes, ni es una descripción detallada. y libro desconcertante. Este libro no pretende llevarle a realizar un recorrido por los sistemas y componentes internos de Unix. Hay muchos otros buenos libros que cubren estas áreas, y este libro le dirá cuáles leer a su debido tiempo.
Además de estos detalles técnicos, la cultura Unix tiene una tradición artesanal que no ha sido escrita a partir de las consideraciones de trabajadores cualificados, sino que ha sido desarrollada por millones de personas. Este libro se basa en la creencia de que al comprender esta tradición y aplicar sus técnicas de diseño, usted se convertirá en un mejor programador y diseñador.
La cultura está formada por personas. Durante mucho tiempo, la forma de aprender sobre la cultura ha sido a través del boca a boca y de influencias sutiles. Este libro no pretende reemplazar la comunicación cultural interpersonal, pero puede facilitar este proceso y permitirle escuchar las voces de los demás.
Quién debería leer este libro
Si es un veterano de la programación Unix, suele enseñar a principiantes o no puede explicar los beneficios de usar soluciones Unix cuando discute con otros sobre sistemas operativos. , puedes leer este libro.
Si eres programador en C, C o Java con experiencia en el desarrollo de otros sistemas operativos, y ahora te toca iniciar un proyecto Unix, puedes leer este libro.
Si es un usuario junior o intermedio de Unix pero tiene poca experiencia en desarrollo y desea aprender a diseñar software de manera eficiente en Unix, puede leer este libro.
Si no estás programando bajo Unix pero encuentras que la tradición de Unix te trae algo de inspiración, entonces tienes razón. La filosofía Unix es aplicable a otros sistemas operativos. Por lo tanto, dedicaremos más espacio que otros libros de Unix centrándonos en entornos que no son Unix (especialmente los sistemas operativos de Microsoft, cuando las herramientas o ejemplos utilizados se puedan aplicar a otros sistemas operativos, te lo diremos);
Si es un arquitecto de sistemas que está preparando soluciones de plataforma o estrategias de implementación para mercados generales o aplicaciones verticales, puede leer este libro. Este libro le ayudará a comprender las poderosas funciones de Unix como plataforma de desarrollo y los métodos de desarrollo generados por la tradición de código abierto de Unix.
Si desea aprender los detalles de la programación en C o desea saber cómo utilizar la API del kernel de Unix, es posible que este libro no sea adecuado para usted. Programación avanzada en el entorno Unix [Stevens92] es un libro clásico que explora la API de Unix; La práctica de la programación [Kernighan-Pike99] es una lectura obligada para todo programador de C (los programadores de cualquier lenguaje deben leer este libro).
Cómo utilizar este libro
Este libro es práctico y filosófico; contiene máximas de precaución y no olvida revisar casos especiales en el desarrollo de Unix. Antes y después de cada aforismo, hay ejemplos vívidos para ilustrar su origen. Estos ejemplos no provienen de programas de muestra para niños, sino de código en ejecución que puede ver en el mundo real.
Intentamos evitar saturarlo con grandes cantidades de código o documentos de especificaciones, aunque hacerlo habría hecho que el libro fuera mucho más fácil de escribir (y quizás más fácil de leer en algunos lugares). La mayoría de los libros de programación simplemente te enseñan a pescar, pero este libro evita este enfoque y se esfuerza por cultivar el sentido del lector de "explorar por qué las cosas son como son".
Por esta razón, este libro a menudo le pedirá que lea el código y los documentos de especificaciones. Una pequeña cantidad de ellos se adjuntará al libro y le indicaremos cómo obtener el resto de Internet. con ejemplos.
Aprender de estos ejemplos te ayudará a digerir los principios que aprendas y convertirlos en técnicas efectivas. Sería ideal si pudiera leer con un navegador web que se ejecutara en un sistema Unix. Cualquier sistema Unix es adecuado, pero la mayoría de los casos que estudiaremos estarán preinstalados o estarán disponibles en sistemas Linux. El libro le pedirá que los explore o los experimente personalmente. Las indicaciones suelen ser paso a paso y huir por un tiempo no interrumpe el flujo de la narrativa.
Nota: Aunque hacemos todo lo posible, no podemos garantizar que las URL que citamos sean estables y estén disponibles. Si descubre que el enlace de una cita no está actualizado, utilice el sentido común y realice una búsqueda de frases utilizando su motor de búsqueda favorito. Siempre que sea posible, brindamos consejos sobre cómo buscar cerca de las URL a las que se hace referencia.
La mayoría de abreviaturas van acompañadas de su nombre completo la primera vez que aparecen. Para su comodidad, proporcionamos un glosario de términos en el apéndice.
Las referencias cruzadas suelen utilizar el nombre del autor como palabra inicial. Las notas a pie de página numeradas son aquellas que pueden distraerlo de la lectura del texto principal, o son URL volátiles que también pueden citar historias de guerra o chistes;
Para que este libro no sea demasiado difícil de leer para personas sin conocimientos técnicos, invitamos a algunos no programadores a probarlo y señalar algún vocabulario oscuro pero útil.
También incluimos explicaciones de términos que los programadores experimentados pueden no necesitar en notas a pie de página.
Citas relacionadas
Algunos artículos y libros famosos de los primeros pioneros de Unix, como "The Unix Programming Environment" [Kernighan-Pike84] de Kernighan y Pike, se encuentran entre los mejores y son Conocido por el mundo. Ahora parece que este libro es bastante antiguo. No menciona Internet, la World Wide Web ni los recién llegados a los lenguajes interpretados como Perl, Tcl y Python.
Nos basamos en "La filosofía Unix" [Gancarz] de Mike Gancarz a la mitad de la escritura de este libro. El libro es excelente por lo que cubre, pero sentimos que se necesitaba más para brindar una imagen completa de la historia completa. A pesar de esto, todavía estamos agradecidos al autor de este libro. Nos ha hecho comprender que el método de diseño Unix más simple es el más duradero.
"The Pragmatic Programmer" [Hunt-Thomas] es un libro sobre el buen diseño. El estilo de escritura es ingenioso y humorístico. En comparación con este libro, tiende a otro aspecto de la artesanía del diseño de software (más énfasis en). codificación y menos enfoque en la división de problemas de alto nivel). La filosofía del autor es el resultado de su arduo trabajo en el campo Unix y es un excelente complemento al contenido de este libro.
"La práctica de la programación" [Kernighan-Pike99] contiene contenido común con "El programador pragmático", pero profundiza en la tradición de Unix.
Por último (a sabiendas de irritarte), te recomendamos Zen Flesh, Zen Bones [Reps-Senzaki], una importante colección de raíces budistas zen. Las referencias al Zen se encuentran dispersas a lo largo del libro. Incluimos estos títulos porque Zen proporciona un rico vocabulario para expresar ideas que son difíciles de dominar de memoria en el diseño de software. Lectores que creen en la religión, no consideren el Zen como una religión. Es una especie de sopa de pollo para el alma, pura y sin interferencia de los dioses: esto es el Zen.
Convenciones de este libro
El término "UNIX" es técnica y legalmente una marca registrada de The Open Group, y debe limitarse a aquellos que han pasado la estricta "Conformidad" de The Open Group. Sistema operativo certificado Standard”. En este libro utilizamos su definición más vaga, que es lo que la mayoría de los programadores entienden por descendiente o rama del código Unix de Bell Labs. En este sentido, Linux (del que se han tomado la mayoría de ejemplos) también es un tipo de Unix.
Este libro también utiliza la tradición de las páginas del manual de Unix de etiquetar las instalaciones de Unix con números de sección del manual entre paréntesis. Generalmente se usa para enfatizar la primera aparición de un comando de Unix. Por ejemplo, "munger(1)" se puede interpretar como "El programa munger existe en su sistema y su documentación se encuentra en la Sección 1 de la página de manual de Unix". La Sección 2 son las llamadas al sistema C, la Sección 3 son las llamadas a funciones de la biblioteca C, la Sección 5 son los formatos y protocolos de archivos y la Sección 8 son las herramientas de administración del sistema. En este libro no se utilizan otros números de sección y sus definiciones varían en varios sistemas Unix. Escriba man 1 man en el indicador de shell de Unix (los sistemas System VUnix más antiguos pueden requerir man -s 1 man) para obtener más información.
En ocasiones nos referiremos a un programa Unix (como Emacs) sin número de sección manual y con la primera letra en mayúscula. Esto significa que el nombre representa una familia de programas Unix que tienen la misma funcionalidad básica y cuyas características comunes discutiremos. Por ejemplo, Emacs incluye xemacs.
En muchos lugares de este libro, ofrecemos soluciones tanto de la vieja escuela como de la nueva escuela.
La nueva escuela, como la música rap, comenzó alrededor de 1990. En este sentido, tendemos a asociarlo con lenguajes de scripting, interfaces gráficas de usuario, Unix de código abierto y la World Wide Web. La vieja escuela se refiere al mundo anterior a 1990 (especialmente antes de 1985): costosas computadoras personales, Unix propietario, scripts de shell y el ubicuo C. Vale la pena señalar estas diferencias. Las máquinas son cada vez más baratas y hay más memoria disponible, lo cual es una corriente subyacente que está afectando gradualmente el estilo de programación Unix.
Ejemplos de casos
Muchos libros de programación crean específicamente un ejemplo para demostrar un punto determinado, pero este libro que tienes en la mano no hace eso. Nuestros casos de estudio provienen todos del mundo real y hemos trabajado en entornos de producción durante mucho tiempo. Aquí hay algunos ejemplos principales:
cdrtools/xcdroast
Estos dos proyectos separados a menudo se usan juntos. cdrtools es un conjunto de herramientas de grabación de discos (se puede encontrar en línea usando la palabra clave "cdrtools"). xcdroast es la interfaz gráfica de cdrtools y el sitio web de su proyecto.
fetchmail
fetchmail se utiliza para recibir correo desde un servidor de correo remoto y admite protocolos de buzón de correo POP3 e IMAP. Su página de inicio es la que también se puede encontrar online utilizando la palabra clave "fetchmail".
GIMP
GIMP (Programa de manipulación de imágenes GNU, Programa de procesamiento de imágenes GNU) es un programa de procesamiento de imágenes y pintura con todas las funciones que puede realizar procesamientos complejos en una variedad de formatos de imágenes. El código fuente se puede obtener en la página de inicio de GIMP (también se puede buscar en línea mediante la palabra clave "GIMP").
mutt
El cliente de correo mutt es actualmente el líder entre varios programas de clientes de correo basados en texto y brinda soporte para MIME (Extensiones multipropósito de correo de Internet) y programas auxiliares de privacidad personal, como Excellent. soporte para funciones como PGP (Pretty Good Privacy) y GPG (GNU Privacy Guard). Su código fuente y sus archivos ejecutables binarios se pueden obtener en la página de inicio del proyecto Mutt.
xmlto
xmlto puede representar y generar documentos DocBook y otros documentos XML en una variedad de formatos, incluidos HTML, texto sin formato y PostScript. Su código fuente y documentación están disponibles en la página de inicio de xmlto.
Para minimizar la cantidad de código que los lectores necesitan leer para comprender los ejemplos de este libro, intentamos seleccionar casos que sean reutilizables y reflejen una variedad de principios y prácticas de diseño diferentes. Por la misma razón, muchos de los ejemplos provienen de proyectos propios. No quiero decir que estos ejemplos sean los más apropiados, sólo que los encuentro útiles para ilustrar mi punto.
Agradecimientos de los autores
Colaboradores invitados (Ken Arnold, Steven M. Bellovin, Stuart Feldman, Jim Gettys, Steve Johnson, Brian Kernighan, David Korn, Mike Lesk, Doug McIlroy, Marshall Kirk McKusick, Keith Packard, Henry Spencer y Ken Thompson) aportan un gran valor a este libro. Doug McIlroy, en particular, no sólo dio a este libro un comentario responsable y penetrante, sino que también demostró su dedicación e integridad cuando dirigió el grupo de investigación original de Unix hace 30 años.
Me gustaría expresar un agradecimiento especial a Rob Landley y mi esposa, Catherine Raymond, quienes se tomaron la molestia de revisar este manuscrito línea por línea.
Los comentarios perspicaces y detallados de Rob me inspiraron a incluir un capítulo completo en el borrador final, y él contribuyó en gran medida a la organización y el alcance del libro. Si sus sugerencias de mejora se pusieran por escrito, sería digno de ser coautor de este libro. Cathy representa el grupo de lectores no técnicos. Si a los lectores no programadores no les resulta difícil leer este libro, es todo culpa suya.
En los cinco años transcurridos desde que fue escrito, este libro se ha beneficiado mucho de las discusiones y opiniones de muchas personas. Mark M. Miller me dio una comprensión más profunda de los hilos. John Cowan me enseñó muchos métodos de diseño de interfaces y redactó casos de aprendizaje para Wily y VM/CMS. Jef Raskin me contó el origen de la regla de la mínima sorpresa. La retroalimentación brindada por el Grupo de Arquitectura de Sistemas de UIUC sobre los capítulos anteriores es extremadamente valiosa, y las dos secciones Lo que Unix se equivoca y Flexibilidad en profundidad son el resultado de su estimulación directa. Russell J. Nelson proporcionó el material para el encadenamiento de Bernstein. La mayor parte del material para los casos de aprendizaje de MVS del Capítulo 3 proviene de Jay Maynard. Les Hatton dio muchas sugerencias útiles sobre el capítulo sobre lenguaje, lo que me impulsó a escribir la sección Tamaño óptimo del módulo en el Capítulo 4. David A. Wheeler contribuyó con muchas críticas que invitan a la reflexión, así como con algunos ejemplos de material de aprendizaje (especialmente en la sección de diseño). Russ Cox me ayudó a realizar la encuesta del Plan 9. Dennis Ritchie corrigió algunos de mis conceptos erróneos sobre la historia de C.
Cientos de programadores de Unix, demasiados para nombrarlos aquí, me dieron sugerencias y comentarios durante el proceso de revisión pública de enero a junio de 2003. El proceso de revisión abierta por pares es apasionante y gratificante para mí. Por supuesto, cualquier error restante en el manuscrito final es mi propia responsabilidad.
El estilo de "contarlo todo", entre otras consideraciones, fue influenciado por el "movimiento de patrones de diseño"; para ser honesto, no estoy muy impresionado con la tendencia de acumular patrones de diseño de Unix en todas partes. No estoy de acuerdo con el dogma central del movimiento y no veo la necesidad de implementar estrictamente patrones de diseño en la práctica, ni quiero cargar con el bagaje de este pensamiento. No obstante, mi enfoque todavía está influenciado por el trabajo de Christopher Alexander (especialmente "Timeless Way of Building" y "A Pattern Language"). La Banda de los Cuatro y sus seguidores me mostraron cómo utilizar las ideas de Alexander para hablar sobre el diseño de software a un nivel superior, dejando atrás las vagas y vacías conversaciones sobre los principios generales del diseño. Los lectores interesados en los patrones de diseño pueden leer el libro "Patrones de diseño: elementos de software orientado a objetos reutilizables [GangOfFour]".
El título de este libro está sin duda tomado del título de "El arte de la programación informática" de Donald Knuth. Knuth tiene poca conexión con la cultura tradicional Unix, pero influyó en cada uno de nosotros.
No hay muchos editores con visión de futuro y rica imaginación. Afortunadamente, Mark Taub es uno de ellos. Encontró los puntos brillantes en los proyectos que no eran prometedores y promovió hábilmente el desarrollo de este libro. Entre los correctores, hay incluso menos que sean buenos escribiendo y puedan ayudar a otros a mejorar su escritura. Afortunadamente, Mary Lou Nohr es una de ellos. El diseño de portada de Jerry Votta entendió mi intención y lo hizo aún más bellamente de lo que podría haber imaginado.
Los editores de Addison-Wesley hicieron que el proceso de revisión y publicación ya no fuera aburrido. Naturalmente, tengo miedo de que me administren, pero aún así cooperaron conmigo para que el trabajo de redacción, diseño, imágenes y marketing alcanzara un nivel muy alto.