Prefacio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

El famoso ingeniero de software y empresario Marc Andreesen declaró que "el software se está comiendo el mundo". Esto fue en 2011, y con el tiempo se ha hecho más cierto. Los sistemas de software siguen creciendo en complejidad y pueden encontrarse en todas las facetas de la vida moderna. En medio de esta bestia voraz se encuentra el lenguaje Python. Los programadores suelen citar Python como lenguaje favorito, y se puede encontrar en todas partes: desde aplicaciones web, hasta aprendizaje automático, herramientas para desarrolladores y mucho más.

Pero no es oro todo lo que reluce. A medida que nuestros sistemas de software se hacen más complejos, resulta más difícil comprender cómo nuestros modelos mentales se corresponden con el mundo real. Si no se controlan, los sistemas de software se hinchan y se vuelven frágiles, ganándose el aterrador apodo de "código heredado". Estas bases de código suelen venir acompañadas de advertencias como: "No toques estos archivos; no sabemos por qué, pero se rompen cuando lo haces" y "Oh, sólo Fulano conoce ese código, y se marchó a un trabajo muy bien pagado en Silicon Valley hace dos años". El desarrollo de software es un campo joven, pero este tipo de afirmaciones deberían aterrorizar tanto a los desarrolladores como a los empresarios.

La verdad es que, para escribir sistemas que duren, tienes que ser deliberado en las decisiones que tomas. Como afirman Titus Winters, Tom Manshreck y Hyrum Wright, "la ingeniería de software es programación integrada en el tiempo".1 Tu código puede durar mucho tiempo: he participado en proyectos cuyo código se escribió cuando yo estaba en la escuela primaria. ¿Cuánto durará tu código? ¿Durará más que tu permanencia en tu trabajo actual (o cuando termines de mantener ese proyecto)? ¿Cómo quieres que se reciba tu código dentro de unos años, cuando alguien esté construyendo componentes básicos a partir de él? ¿Quieres que tus sucesores te den las gracias por tu previsión, o que maldigan tu nombre por las complejidades que has traído a este mundo?

Python es un lenguaje maravilloso, pero a veces hace que construir para el futuro sea complicado. Algunos defensores de otros lenguajes de programación han tachado a Python de "no apto para producción" o "útil sólo para prototipos", pero lo cierto es que muchos desarrolladores sólo rascan la superficie, en lugar de aprender todas las herramientas y trucos para escribir Python robusto. A lo largo de este libro, aprenderás a hacerlo mejor. Recorrerás numerosas formas de hacer que Python sea limpio y mantenible. Tus futuros mantenedores disfrutarán trabajando con tu código, ya que fue diseñado desde el principio para facilitar las cosas. Así que ve, lee este libro, mira hacia el futuro y construye un software impresionante que perdure.

Quién debería leer este libro

Este libro es para cualquier desarrollador de Python que quiera hacer crecer el código en el que trabaja de forma sostenible y mantenible. Este no pretende ser tu primer texto sobre Python; espero que ya hayas escrito Python antes. Deberías sentirte cómodo con el flujo de control de Python y haber trabajado antes con clases. Si buscas un texto más introductorio, te sugiero que leas primero Learning Python de Mark Lutz (O'Reilly).

Aunque trataré muchos temas avanzados de Python, el objetivo de este libro no es explicar cómo utilizar todas las funciones de Python. En su lugar, las funciones son el telón de fondo de una conversación más amplia sobre la robustez y el impacto de tus decisiones en la mantenibilidad. A veces hablaré de estrategias que raramente deberías utilizar, si es que lo haces. Esto se debe a que quiero ilustrar los primeros principios de la robustez; el viaje de comprender por qué y cómo tomamos decisiones en el código es más importante que saber qué herramientas utilizar en un escenario óptimo. En la práctica, el escenario óptimo es poco frecuente. Utiliza los principios de este libro para sacar tus propias conclusiones de tu código base.

Este libro no es un libro de consulta. Podrías llamarlo un libro de debate. Cada capítulo debería ser un punto de partida para que los desarrolladores de tu organización discutan, juntos, la mejor forma de aplicar estos principios. Crea un club de lectura, un grupo de debate o un almuerzo y aprende para fomentar la comunicación. He propuesto temas de debate en cada capítulo para iniciar la conversación. Cuando te encuentres con estos temas, te animo a que te pares a reflexionar sobre tu actual base de código. Habla entre tus compañeros y utiliza estos temas como trampolín para discutir el estado de tu código, procesos y flujos de trabajo. Si te interesa un libro de referencia sobre el lenguaje Python, te recomiendo encarecidamente Fluent Python, de Luciano Ramalho (O'Reilly; a finales de 2021 se publicará una segunda edición).

Un sistema puede ser robusto de muchas formas distintas. Puede ser reforzado en seguridad, escalable, tolerante a fallos o menos propenso a introducir nuevos errores. Cada una de estas facetas de la robustez merece un libro completo; este libro se centra en evitar que los desarrolladores que hereden tu código creen nuevos fallos en tu sistema. Te mostraré cómo comunicarlo a los futuros desarrolladores, cómo facilitarles la vida mediante patrones arquitectónicos y cómo detectar errores en tu código base antes de que lleguen a producción. Este libro se centra en la robustez de tu código Python, no en la robustez de tu sistema en su conjunto.

Abarcaré una gran cantidad de información, de muchas áreas diferentes del software, como la ingeniería de software, la informática, las pruebas, la programación funcional y la programación orientada a objetos (POO). No espero que tengas experiencia en estos campos. Hay secciones en las que explico cosas a un nivel de principiante; a menudo es para deconstruir cómo pensamos sobre los fundamentos básicos del lenguaje. Se trata, en su mayor parte, de un texto de nivel intermedio.

Los lectores ideales son:

  • Desarrolladores que trabajan actualmente en una gran base de código y buscan mejores formas de comunicarse con sus colegas

  • Mantenedores principales de la base de código, buscando formas de ayudar a disminuir la carga de los futuros mantenedores

  • Desarrolladores autodidactas que pueden escribir Python realmente bien pero necesitan comprender mejor por qué hacemos las cosas que hacemos

  • Licenciados en ingeniería de software que necesitan un recordatorio de consejos prácticos para el desarrollo

  • Desarrolladores senior que buscan una forma de vincular sus fundamentos de diseño a los primeros principios de robustez

Este libro se centra en la escritura de software a lo largo del tiempo. Si gran parte de tu código es un prototipo, de usar y tirar, o desechable de cualquier otra forma, los consejos de este libro acabarán creando más trabajo del necesario para tu proyecto. Lo mismo ocurre si tu proyecto es pequeño -digamos, menos de cien líneas de Python. Hacer que el código sea mantenible añade complejidad; de eso no hay duda. Sin embargo, te guiaré para minimizar esa complejidad. Si tu código vive más de unas pocas semanas o crece hasta alcanzar un tamaño considerable, debes considerar la sostenibilidad de tu base de código.

Acerca de este libro

Este libro abarca una amplia gama de conocimientos, a lo largo de muchos capítulos. Está dividido en cuatro partes:

Parte I, "Anotar tu código con tipos"

Empezaremos con los tipos en Python. Los tipos son fundamentales para el lenguaje, pero no suelen examinarse con mucho detalle. Los tipos que elijas importan, ya que transmiten una intención muy específica. Examinaremos las anotaciones de tipos y lo que comunican al desarrollador. También repasaremos los verificadores de tipos y cómo ayudan a detectar errores con antelación.

Parte II, "Definir tus propios tipos"

Después de cubrir cómo pensar en los tipos de Python, nos centraremos en cómo crear tus propios tipos. Profundizaremos en las enumeraciones, las clases de datos y las clases. Exploraremos cómo determinadas elecciones de diseño al diseñar un tipo pueden aumentar o disminuir la robustez de tu código.

Parte III, "Python extensible"

Después de aprender a expresar mejor tus intenciones, nos centraremos en cómo permitir que los desarrolladores cambien tu código sin esfuerzo, construyendo con confianza sobre tus sólidos cimientos. Trataremos la extensibilidad, las dependencias y los patrones arquitectónicos que te permiten modificar tu sistema con un impacto mínimo.

Parte IV, "Construir una red de seguridad"

Por último, exploraremos cómo construir una red de seguridad, para que puedas atrapar suavemente a tus futuros colaboradores cuando caigan. Su confianza aumentará, sabiendo que tienen un sistema fuerte y robusto que pueden adaptar sin miedo a su caso de uso. Por último, cubriremos una variedad de herramientas de análisis estático y pruebas que te ayudarán a detectar comportamientos deshonestos.

Cada capítulo es en su mayor parte autocontenido, con referencias a otros capítulos cuando procede. Puedes leer este libro de principio a fin, o saltar a los capítulos que te convengan. Los capítulos agrupados en cada parte estarán relacionados entre sí, pero habrá menos relaciones entre las partes del libro.

Todos los ejemplos de código se ejecutaron utilizando Python 3.9.0, e intentaré avisar cuando se necesite una versión específica de Python o posterior para ejecutar los ejemplos (como Python 3.7 para el uso de clases de datos).

A lo largo de este libro, realizaré la mayor parte de mi trabajo en la línea de comandos. He ejecutado todos estos comandos desde un sistema operativo Ubuntu, pero la mayoría de las herramientas deberían funcionar igual de bien en sistemas Mac o Windows. En algunos casos, mostraré cómo interactúan determinadas herramientas con entornos de desarrollo integrados (IDE), como Visual Studio Code (VS Code). La mayoría de los IDE utilizan las opciones de la línea de comandos bajo el capó; la mayor parte de lo que aprendas en la línea de comandos se trasladará directamente a las opciones del IDE.

Este libro presentará muchas técnicas diferentes que pueden mejorar la robustez de tu código. Sin embargo, no hay balas de plata en el desarrollo de software. Las concesiones mutuas son el núcleo de una ingeniería sólida, y los métodos que presento no son una excepción. Seré transparente sobre las ventajas y los inconvenientes al tratar estos temas. Tú sabrás más sobre tus sistemas que yo, y eres el más indicado para elegir qué herramienta es la adecuada para cada trabajo. Lo único que hago es abastecer tu caja de herramientas.

Convenciones utilizadas en este libro

En este libro se utilizan las siguientes convenciones tipográficas:

Cursiva

Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo y extensiones de archivo.

Constant width

Se utiliza en los listados de programas, así como dentro de los párrafos para referirse a elementos del programa como nombres de variables o funciones, bases de datos, tipos de datos, variables de entorno, sentencias y palabras clave.

Constant width bold

Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.

Constant width italic

Muestra el texto que debe sustituirse por valores proporcionados por el usuario o por valores determinados por el contexto.

Consejo

Este elemento significa un consejo o sugerencia.

Nota

Este elemento significa una nota general.

Advertencia

Este elemento indica una advertencia o precaución.

Utilizar ejemplos de código

El material complementario (ejemplos de código, ejercicios, etc.) se puede descargar en https://github.com/pviafore/RobustPython.

Si tienes una pregunta técnica o un problema al utilizar los ejemplos de código, envía un correo electrónico a

Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requiere permiso.

Agradecemos la atribución, pero en general no la exigimos. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo: "Robust Python por Patrick Viafore (O'Reilly). Copyright 2021 Kudzera, LLC, 978-1-098-10066-7".

Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en

Aprendizaje en línea O'Reilly

Nota

Durante más de 40 años, O'Reilly Media ha proporcionado formación tecnológica y empresarial, conocimientos y perspectivas para ayudar a las empresas a alcanzar el éxito.

Nuestra red única de expertos e innovadores comparte sus conocimientos y experiencia a través de libros, artículos y nuestra plataforma de aprendizaje online. La plataforma de aprendizaje en línea de O'Reilly te ofrece acceso bajo demanda a cursos de formación en directo, rutas de aprendizaje en profundidad, entornos de codificación interactivos y una amplia colección de textos y vídeos de O'Reilly y de más de doscientas editoriales. Para más información, visita http://oreilly.com.

Cómo contactar con nosotros

Dirige tus comentarios y preguntas sobre este libro a la editorial:

  • O'Reilly Media, Inc.
  • 1005 Gravenstein Highway Norte
  • Sebastopol, CA 95472
  • 800-998-9938 (en Estados Unidos o Canadá)
  • 707-829-0515 (internacional o local)
  • 707-829-0104 (fax)

Tenemos una página web para este libro, donde se enumeran erratas, ejemplos y cualquier información adicional. Puedes acceder a esta página en https://oreil.ly/robust-python.

Envía un correo electrónico para comentar o hacer preguntas técnicas sobre este libro.

Para obtener noticias e información sobre nuestros libros y cursos, visita http://oreilly.com.

Encuéntranos en Facebook: http://facebook.com/oreilly

Síguenos en Twitter: http://twitter.com/oreillymedia

Míranos en YouTube: http://youtube.com/oreillymedia

Agradecimientos

Me gustaría dar las gracias a mi increíble esposa, Kendall. Ella es mi apoyo y mi caja de resonancia, y le agradezco todo lo que hizo para que yo tuviera el tiempo y el espacio necesarios para escribir este libro.

Ningún libro se escribe de forma aislada, y éste no es una excepción. Me apoyo en los hombros de gigantes de la industria del software, y aprecio a todos los que me precedieron.

También quiero dar las gracias a todos los que han participado en la revisión de este libro para asegurarse de que mi mensaje era coherente y de que mis ejemplos eran claros. Gracias a Bruce G., David K., David P. y Don P. por proporcionarme sus primeros comentarios y ayudarme a decidir la dirección de este libro. Gracias a mis revisores técnicos Charles Givre, Drew Winstel, Jennifer Wilcox, Jordan Goldmeier, Nathan Stocks y Jess Males por sus valiosos comentarios, especialmente cuando las cosas sólo tenían sentido en mi cabeza, pero no sobre el papel. Por último, gracias a todos los que leyeron el borrador de la versión preliminar y tuvieron la amabilidad de enviarme por correo electrónico sus opiniones, especialmente a Daniel C. y Francesco.

Me gustaría dar las gracias a todos los que me ayudaron a transformar mi borrador final en algo digno de producción. Gracias a Justin Billing por profundizar como corrector y ayudarme a perfeccionar la presentación de mis ideas. Gracias a Shannon Turlington por corregir; el libro está mucho más pulido gracias a ti. Muchas gracias a Ellen Troutman-Zaig, que elaboró un índice fantástico que me dejó boquiabierta.

Por último, no podría hacerlo sin el fabuloso equipo de O'Reilly. Gracias a Amanda Quinn por ayudarme en el proceso de la propuesta y por ayudarme a desarrollar el enfoque del libro. Gracias a Kristen Brown por facilitarme increíblemente la fase de producción. Gracias a Kate Dullea, que convirtió mis bocetos de calidad MS Paint en ilustraciones limpias y nítidas. También quiero dar las gracias a mi editora de desarrollo, Sarah Grey. Esperaba con impaciencia nuestras reuniones semanales, y fue fantástica ayudándome a elaborar un libro para un público amplio, al tiempo que me permitía profundizar en los detalles técnicos.

1 Titus Winters, Tom Manshreck y Hyrum Wright. Ingeniería de software en Google: Lecciones aprendidas de la programación a lo largo del tiempo. Sebastopol, CA: O'Reilly Media, Inc., 2020.

Get Python robusto now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.