Una ventaja de ser expulsado de tu zona de confort —TurboGears, Genshi, SQLAlchemy— es que te obliga a estudiar y analizar bien cómo quieres que funcionen tus futuros desarrollos. ¿Quieres seguir usando Apache-WSGI? ¿Ya te cansaste de estar pendiente de las actualizaciones de los servidores? ¿Lidiar con dependencias descontinuadas?
Flask parecía la opción más obvia para sustituir a TurboGears, así que comenzamos a migrar algunos desarrollos. La curva de aprendizaje no parecía muy pronunciada. También aprovechamos la oportunidad para irnos hacia una arquitectura serverless, hospedando las aplicaciones en contenedores usando Docker. Ya teníamos experiencia con contenedores al desplegar los proyectos anteriores en TurboGears.
Los contenedores para Flask incluían Nginx, WSGI y el código fuente del proyecto. ~370MB parecían razonables y casi mágicos en ese entonces. Una de las muchas ventajas de Python es que puedes modificar el código mientras está corriendo en producción 🤓. Un error ortográfico, un hotfix, etc., se podían corregir en minutos: abrir una sesión de sh o bash dentro del contenedor, instalar vim, modificar el archivo en cuestión y listo. Después, la corrección se aplicaba al código base y el contenedor quedaba limpio en la siguiente actualización.
Durante la cuarentena de 2020, comencé a utilizar Go para desarrollar servicios. La sintaxis es muy simple, aunque a veces repetitiva. También me costó un poco al principio adaptarme a la falta de un mecanismo tradicional de manejo de excepciones. En Python, Java, JavaScript y otros lenguajes puedes envolver un segmento de código dentro de un try-catch. Siguiendo el principio "It is easier to ask for forgiveness than permission", puedes manejar la excepción cuando lo que crees que va a pasar no sucede.
En Go, tienes que pensarlo de una forma diferente.
Manejo de errores: Python vs. Go
Try-Catch en Python
En Python, el manejo de errores es sencillo con try-except
:
def dividir(a, b):
try:
return a / b
except ZeroDivisionError:
print("Error: No se puede dividir entre cero.")
return None
resultado = dividir(10, 0) # Esto imprimirá un mensaje de error
Manejo de errores en Go
Go no tiene un try-catch
convencional. En su lugar, el manejo de errores se realiza mediante valores de retorno:
package main
import (
"errors"
"fmt"
)
func dividir(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("no se puede dividir entre cero")
}
return a / b, nil
}
func main() {
resultado, err := dividir(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Resultado:", resultado)
}
}
A medida que avanzábamos en la adopción de Go, nos dimos cuenta de que la simplicidad y el rendimiento que ofrecía valían el esfuerzo de adaptación. Aunque al principio resultaba extraño no contar con un sistema de excepciones tradicional, el manejo explícito de errores nos obligó a escribir código más robusto y predecible. Con el tiempo, terminamos prefiriendo esta aproximación, ya que facilitaba la depuración y nos ayudó a construir servicios más eficientes y escalables. Así, lo que comenzó como una migración obligada, terminó transformándose en una mejora significativa en nuestra forma de desarrollar aplicaciones. 🚀
No hay comentarios.:
Publicar un comentario