Estructura, legibilidad y eficiencia en el desarrollo de código

Un patrón de comportamiento común entre los científicos de datos es aprender a desarrollar en cuadernos Jupyter/Databricks (notebooks). Sin embargo, con el tiempo, los Notebook pueden llegar a ser largos y difíciles de manejar, con cientos de celdas que se ejecutan en un orden caótico, sin una estructura de código clara, y problemas de compatibilidad con las bibliotecas (especialmente si tus compañeros desarrolladores están utilizando diferentes versiones de las mismas bibliotecas).

Si has experimentado alguno de estos problemas, este artículo es para ti.

En Capitole tenemos presencia en diferentes industrias. Muchos de nosotros estamos en proyectos de tratamiento de datos, en puestos de Data Science/Desarrollo/Devops y trabajamos tanto en servidores físicos como en máquinas en la nube en AWS, Azure u otros servicios en la nube. Para nosotros es muy importante trabajar de manera eficiente y seguir buenas prácticas en el desarrollo, dejando una buena imagen de nuestra empresa allí donde vamos y un trabajo bien hecho, que facilite las cosas a los clientes finales del producto desarrollado.

En este artículo, compartiremos algunas de las reflexiones que hemos ido adquiriendo con el tiempo, a modo de tips para organizar el código. Son trucos sencillos que pueden ahorrar mucho tiempo y malentendidos en el día a día del equipo de desarrolladores.

De Jupyter/Databricks notebooks a scripts

La mayoría de nosotros empezamos a programar en cuadernos (Jupyter/Databricks…). Lo entiendo: es simple, se puede probar rápidamente un nuevo código, averiguar la sintaxis, visualizar rápidamente los gráficos, etc. Pero a medida que te vuelves más competente en Python deberías pasar a escribir scripts.

¿Por qué? Hay muchas buenas razones, pero la más importante es que te obliga a estructurar mejor tu código. En un script no hay celdas, todo el código se ejecuta secuencialmente, y si necesitas funciones extra puedes escribir otros scripts y usarlos como módulos (un módulo no es más que un archivo .py donde tienes funciones y clases para su uso posterior).

Entonces, ¿qué es un script?

Un script es simplemente un archivo .py que hace algo. Déjame mostrarte la estructura básica de un script con un ejemplo: analyze.py.

*De manera resumida, if __name__ == «__main__»: permite ejecutar código cuando el archivo se ejecuta como script, pero no cuando se importa como módulo. Para ejecutarlo como un script simplemente escribe python analyze.py en la terminal. Para usarlo como módulo, en un nuevo archivo .py, escribe import analyze, y tendrás acceso a las 3 funciones definidas sin ejecutar el código dentro de la sentencia if.

Código legible

Imagina que empiezo a escribir lo siguiente: «lasbuenas prácticasdecodi ficación SON

unaDElashabilidadeSSSs                           Más importAnTes QUE            desarrOllarás                                               como científicoDeDatos.»

Probablemente has entendido lo que quería decir, pero has tenido que hacer un esfuerzo para ello. La legibilidad es un concepto crítico. Tu código debe ser legible y fácil de entender para cualquiera, incluso para ti mismo dentro de seis meses. En mi opinión, este rasgo es lo que diferencia a un principiante de un profesional.

Nombres de variables

“Sólo hay dos cosas difíciles en Informática: invalidar la caché y nombrar las cosas.”

– Phil Karlton

Os facilito el siguiente vídeo para aprender a nombrar variables (estos conceptos también aplican a los nombres de las funciones).

Funciones

Asumo que sabes lo que es una función y su sintaxis en Python. Lo importante aquí es cómo usarlas con eficacia y nombrarlas correctamente. Las funciones deben usarse para estructurar tu código correctamente. Si tus funciones tienen más de 100 líneas de largo, probablemente hay algo mal. Divídelas en funciones más pequeñas que tengan sentido.

Consejos para nombrar tus funciones:

  1. Nombres descriptivos: El nombre debe describir lo que hace la función de forma clara y concisa.
  2. Verbos de acción: Los nombres de las funciones deben utilizar verbos para indicar lo que hace la función.
  3. Convención de nomenclatura snake_case.
  4. Evita las abreviaturas: Las abreviaturas pueden hacer que los nombres de las funciones sean difíciles de entender.

Indentación

Si necesitas más de 3 niveles de indentación, deberías arreglar tu programa. Puedes leer el estilo de codificación del núcleo Linux preferente y tomarlo como referencia. Este vídeo muestra la importancia de este punto.

Comentarios

En un mundo ideal, no necesitarías comentarios. Si los nombres de tus variables y funciones son concisos y autoexplicativos, y tu programa está diseñado de manera que se divide en funciones lógicas que son fáciles de seguir, tu código debería ser fácilmente legible, y no se necesitarían comentarios.

Sin embargo, vivimos en un mundo imperfecto donde las mejores decisiones no siempre son obvias, y donde a veces tenemos que sacrificar la legibilidad por el rendimiento. Por estas razones, recomiendo escribir comentarios. Sugiero dividir las funciones (o el código) en pequeños trozos, cada uno acompañado de un comentario en la parte superior explicando lo que estás haciendo y por qué.

Entornos virtuales

Si has estado involucrado en varios proyectos simultáneamente sin usar entornos virtuales, conoces la lucha. Cada vez que necesitas una biblioteca, simplemente escribes pip install <nueva_librería>, y si ahora ejecutas pip list, verás una lista enorme de librerías que ni siquiera recuerdas haber instalado. El dolor es aún mayor si trabajas en un equipo en el que nadie utiliza entornos virtuales o si estás involucrado en varios proyectos simultáneamente: encontrarte con bloqueos de código sin motivo aparente, dificultad para ejecutar el código para los nuevos miembros del equipo, etc.

La solución a estos problemas es un entorno virtual. Para Python, recomiendo virtualenv. Crea un entorno en el que puedes instalar bibliotecas completamente independientes del resto de tu sistema. Para instalarlo, simplemente ejecuta pip install virtualenv, y para aprender a usarlo, escribe tldr virtualenv. Para eliminar un entorno virtual, simplemente elimina la carpeta que creaste inicialmente. Ten en cuenta que el proceso de activación de un entorno virtual es ligeramente diferente para Windows y Linux.

Recuerda que puedes tener tantos entornos virtuales como quieras. No tengas miedo de crear y eliminar entornos según sea necesario.

Yo suelo crear dos para cada proyecto: uno para desarrollo y otro para producción.

Conclusión

En resumen, una buena estructura y prácticas de codificación no solo mejoran la eficiencia en el desarrollo, sino que también facilitan la colaboración y el mantenimiento del código a largo plazo. Migrar de notebooks a scripts bien organizados, escribir funciones claras y concisas, usar nombres descriptivos, y aprovechar herramientas como entornos virtuales son hábitos esenciales para cualquier equipo de desarrollo. La clave está en escribir código que sea fácilmente comprensible, reproducible y adaptable, lo que beneficiará tanto a ti como a tus compañeros de equipo y clientes. La eficiencia en el código es, en última instancia, eficiencia en los resultados.