Reflexiones de 6 meses de trabajo con Django

Hace unos 6 meses comencé a trabajar en un proyecto Python/Django. Si bien yo ya tenía cierta familiaridad con Python, nunca había trabajando con Django, la mayoría de las cosas que había hecho a nivel profesional tenían que ver con scripts para automatizar tareas de deployment.

Para ser justo, me parece que antes de compartir mis reflexiones debo explicar algunas cuestiones de contexto que pueden tener cierta influencia en mis percepciones.

  • El primer punto es importante: no estuve trabajando en un proyecto nuevo, sino en una aplicación existente. Más concretamente una aplicación creada hace ya varios años con Python 2.7 y Django 1.4.
  • La aplicación tiene una cantidad no despreciable de código JavaScript, no React, no Angular, JavaScript puro, «vanilla JavaScript» condimentado apenas con jQuery. Esto es un punto no menor, porque parte del tiempo lo he pasado trabajando con código JavaScript en lugar de Python.
  • La aplicación cuenta con unos 1000 test automatizados del código python y también tiene tests automatizadas de parte del código JavaScript.
  • Esta aplicación Django es la parte central de un ecosistemas de aplicaciones, la mayoría de ellas también construidas con Python pero no necesariamente con Django.
  • Finalmente el último detalle contextual es que las funcionalidades en las que estuve trabajando tuvieron que ver con cuestiones «algorítmicas/lógica de negocio», o sea, no tuve que modificar el modelo de datos.

Aclarado el contexto ahora sí mis percepciones. Definitivamente Django es a Python lo que Rails es Ruby con todo lo bueno y lo malo que eso pueda implicar. Django es un framework orientado a la creación de sistemas de información (CRUD) y como tal ofrece muchas facilidades para con relativamente poco código resolver muchas de las cuestiones planteadas por este tipo de aplicaciones: validaciones, persistencia de datos, envío de mails, autenticación, manejo de usuarios, sistema de backoffice/admin, etc. Todo esto complementado con una funcionalidad de scaffolding que genera una porción importante de nuestro código.

Todas estas facilidades que provee Django no son «gratis», tienen un costo asociado el cual implica que la aplicación tiene cierta estructura que en ocasiones puede ser un dolor de cabeza. En este sentido un punto que me resulta particularmente molesto es el grado de acoplamiento con la base de datos que dificulta la escritura de pruebas unitarias ya que al momento de escribir pruebas que utilicen las entidades de negocio (lo que Django llama models) es necesario tener una conexión con la base de datos. Otra cuestión que me resulta muy molesta es la convención de utilizar «pocos archivos pero muy grandes», ejemplo: en vez de tener un archivo por cada clase, un archivo por cada controller, etc, la propuesta es tener un archivo models con todas las clases de entidades, un archivo views con todos los controllers, etc, etc.

Por otro lado hay dos cuestiones que me resultan fantásticas: el debugger de línea de comando (que en realidad es un funcionalidad de Python, no de Django) y el Django shell, que al igual que el Rails console, nos permite manipular de forma interactiva los objetos de nuestra aplicación.

Otra cuestión, en este tipo de frameworks, es el manejo de la persistencia. Al igual que Rails, la persistencia está implementada al estilo ActiveRecord. Esto es que cada entidad/model hereda de una clase base provista por el framework la cual nos provee todo un conjunto de métodos para «llevar y traer» objetos de la base de datos y de esta forma no tenemos que lidiar con la escritura de SQL.

Finalmente el último punto que quiero mencionar es la sensación (y resalto que es una sensación) de que Django «nos lleva a hacer aplicaciones grandes» en contraposición con las tendencias actuales de micro-servicios. Ojo, no digo que el frameworks nos obligue a hacer aplicaciones grandes, sino que algunas de las funcionalidades que provee (como la posibilidad de tener varias aplicaciones dentro de un mismo proyecto) resulta muy tentador para seguir trabajando dentro del mismo proyecto/artefacto en lugar de crear un nuevo proyecto independiente.

En fin, si bien hay cuestiones que no me gustan nada, hay algunas otras que están muy bien.

Búsqueda laboral Python

Hace unos dos meses me sumé de forma permanente al equipo de radiocut.fm y ahora estamos necesitando ampliar el equipo.

Estamos buscando un desarrollad@r Python/Django. Apuntamos a una persona con al menos 3 años de experiencia con esta tecnología. Somos una empresa con una producto de software estable, tanto en términos técnicos como comerciales. Queremos ampliar el equipo para realizar mejoras en nuestro producto que nos habiliten a poder probar rápida y fácilmente hipótesis de negocio.

Dado que somos un equipo chico tendrás la oportunidad de participar de algunas decisiones de negocio y del roadmap del producto. Asimismo trabajarás con otras tecnologías más allá de Python: Android, JavaScript, Docker y Kubernetes entre otras (no hace falta tengas experiencia en estas tecnologías pero sí que estes dispuesto a aprenderlas).

Trabajamos en iteraciones semanales, con mucha atención a las prácticas técnicas: automatización de pruebas, propiedad compartida, integración continua, despliegues automatizados, etc.

Nuestra dinámica de trabajo es 100% remota aunque tenemos una oficina en el Distrito Tecnológico de la Ciudad de Buenos Aires (Parque Patricios).

Si te interesa postularte puedes contactarme aquí.

Introducción a Pytest

Desde hace ya unos cuantos años cada vez que me prepongo aprender seriamente una nuevo lenguaje de programación empiezo por escribir algunos tests en lugar del clásico (y poco útil) «hola mundo». Es por esto que para quienes pretenden acercarse al mundo Python les traigo un video de introductocción a Pytest, uno de los frameworks de testing más populares del mundo Python.

Serie de videos: Python a la XP

A partir del curso que mencioné en el post anterior, empecé a hacer una serie de videos para utilizar como parte del contenido del curso y también para ir entrenando yo mismo. Estos videos los voy a ir publicando en esta lista de YouTube que titulé Python a la XP.

Por el momento solo hay publicado un video que muestra la resolución de un ejercicio y que pone el foco en el proceso de desarrollo en términos de TDD y diseño incremental.

Aviso: no soy experto en Python, de hecho mi uso de Python es bastante básico, lo he utilizado principalmente para cuestiones de scripting junto con Ansible. Es por esto que seguramente encuentren en el video fragmentos de código que sean muy mejorables.

Curso de Introducción al Desarrollo de Software, usando Python y a la XP

La historía es así: una ONG dicta un curso de ~2 meses de introducción a la programación para jóvenes que rondan los 20 años de cara a iniciarlos en la temática y dar un primer paso de una potencial carrera en el sector. Luego la ONG hace un acuerdo con una empresa para continuar la formación de los jóvenes. La empresa tiene la intención de complementar la formación de los recién iniciados en la programación de cara a que puedan sumarse a un equipo de desarrollo. Es ahí donde entro yo para implementar esta formación. Todo esto en modalidad 100% virtual debido a situación de pandemia.

Con muchísimos detalles de implementación de por medio, hoy por hoy estoy dictando este curso de ~3 meses que además de programación con Python/web incluye algunas cuestiones básicas de desarrollo al estilo XP como versionado, unit testing, tdd, integración continua, revisiones de código, pair-programming, orientación a objetos, etc.

Esto me llevó a acercarme mucho más al mundo Python que hasta el momento yo venía utilizando principalmente para cuestiones de scripting. Así que ahora estoy cotidianamente trabajando con Pytest, Pylint, flake8, etc, etc. Personalmente estoy muy motivado con como viene fluyendo el curso. En futuros posts compartiré algunos detalles más.

Curso: Aprendiendo a programar con Python

Durante el segundo cuatrimestre de este año voy estar dictando este curso de introducción a la programación. El mismo surge de una iniciativa conjunta del FIUBA y el programa EmplearTec.

Tanto la currícula como en enfoque de enseñanza del curso están basados en el curso de Algoritmos y Programación 1 (FIUBA) de Rosita Wachenchauzer, del cual fui parte hace algunos años. Esto implica que quienes tomen el curso deberán asistir a dos clases semanales de 3 horas cada una y deberán dedicar otras tantas horas para estudio extra clase.

Los interesados pueden encontrar más información y detalles de la inscripción en la página de FIUBA.