7 consejos para mejorar tu código
Anteriormente en miramar.dev escribimos sobre la importancia del código limpio y como afecta al equipo técnico. El día de hoy me gustaría compartirte 7 consejos prácticos para mejorar tu código.
Antes de empezar me gustaría decir que estos consejos son adaptables a cualquier lenguaje. Sin embargo los ejemplos estarán escritos en Python. Si no conoces este lenguaje, te invitamos a que pases por aquí y que conozcas porque cada vez más desarrolladores lo usan en su día a día.
Usa nombres con sentido
Los nombres están en todo el software; desde variables, métodos y funciones a las clases e interfaces. Nombrar correctamente el código de las herramientas que creamos es indispensable. De hecho, tener buenos nombres nos ayuda a identificar correctamente el dominio de negocio, ayuda para que nuevos desarrolladores se adecuen al software y logren hacer mantenimiento (o nuevos desarrollos) de manera rápida.
Por ejemplo, si viéramos este trozo de código, a golpe de vista no sabríamos de que trata.
hoursdate = get_time(item)
Imaginemos que estamos en un software de logística de transporte, y somos nuevos en el tema, ¿Qué es hoursdate?, ¿Qué es item?, ¿para que sirve esa variable? Sin embargo, si modificamos un poco el código, nos daría un poco más de sentido.
estimated_arrival_time = get_estimated_time_of_arrival(truck)
Ahora podríamos intuir que estamos hablando de una hora estimada de llegada para algún tractocamión. Lo mismo pasa con utilizar formatos estilo Notación Húngara:
truck_list = get_trucks()
for item in truck_list:
print(item)
Que si bien es cierto, Python es interpretado, no es necesario que agreguemos el tipo de dato o colección como parte del nombre de la variable. Y en lenguajes no interpretados como java y c#, es lo mismo. Vayamos un poco más, ¿qué pasaría si el método get_trucks regresa una tupla? Este tipo de nombramiento ofrece más problemas que beneficios. Lo correcto podría ser:
trucks = get_all_trucks()
for truck in trucks:
print(truck)
Crea métodos/funciones agradables de leer
Siguiendo el consejo anterior. El nombramiento de los métodos también es importante. Un buen acercamiento sería que los nombres deberían de incluir verbos, como en el ejemplo anterior, que servía para traer todos los tractocamiones. Aunado a los nombres que usamos para la función, las variables internas deberían de estar bien nombradas.
Otra cosa importante, es el tamaño de las funciones:
def send_email(param1, param2, param3, param4):
# 250 líneas después
return true
Normalmente las funciones muy grandes y con muchos parámetros hacen muchas cosas. Lo ideal sería que las funciones se limiten a hacer una sola cosa, recibir como máximo 3 parámetros y tener como máximo 100 líneas de cuerpo.
Los comentarios deben explicar, no generar más dudas
Veamos un ejemplo nuevamente:
# Mal
# Valida si el empleado es elegible para un nuevo viaje
if employee.get_last_trip() == TripStatus.CLOSED):
pass
# Correcto
if employee.is_elegible_for_new_trip():
pass
Tratemos de usar el código para auto documentarse. Esto no significa que todo debe ser así, ya que hay comentarios que son necesarios. Por ejemplo los comentarios legales o de clarificación de algún código difícil de leer.
Otros códigos que no necesariamente están mal son los TODO y podemos usarlos para clarificar porque hay una implementación "extraña" y cuales son los pasos a futuro. También sirven para recordarte cuales son los códigos que ya no sirven y deben de ser eliminados.
El manejo de errores es indispensable
Si algo malo puede pasar, pasará y nuestro programa debe ser lo suficientemente robusto para identificar que está pasando y actuar en consecuencia. Algo importante a notar es que si nuestro manejo de errores obstruye la legibilidad de nuestro código, nuestro manejo está mal.
Otra cosa importante es que normalmente hacemos código con try-catch, solo por que "es lo correcto" y no debe ser así, sobre todo porque tendamos a atrapar todas las excepciones y no le damos la oportunidad al programa de saber que está pasando y solucionarlo por si mismo:
try:
get_trucks_with_error()
except Exception as e:
raise e
Algo que podría funcionar es lo siguiente:
try:
get_trucks_with_error()
except TruckError:
# código para tratar el error
except Exception as e:
raise e
Además, muchos lenguajes nos ofrecen la oportunidad de crear nuestras propias excepciones y esta es una práctica fantástica, ya que nuestros errores de negocio deberían de ser atajados y tratados como tal.
Da visibilidad de la ejecución de tu código
Una de las herramientas más útiles del desarrollador de software es el uso del logging. Sobre todo porque ayuda a mejorar el entendimiento del flujo del código y descubrir escenarios que probablemente no se pensaron a la hora de programar. Además, si los logs están en lugares correctos, podemos usarlos para analizar mejoras de rendimiento.
Casi todos los lenguajes tienen este tipo de herramientas, por nombrar algunas serilog para dotnet y logback para java. En el caso de python, la herramienta se encuentra como parte de su librería estándar.
Ejemplo:
import logging
from datetime import datetime
def get_available_trucks():
try:
logging.debug('El método get_available_trucks se inicio')
logging.info(f'get_available_trucks | empezó a las {str(datetime.now())}')
# Código de proceso
logging.debug('El método get_available_trucks terminó')
except TruckError as e:
logging.critical('Esto es crítico')
# Código de resturación
Usa guías de estilo
Como desarrolladores pasamos más tiempo leyendo código que escribiéndolo, por lo que tener una estructura consistente en los códigos en los que trabajamos, ayuda mucho para que nuestro enfoque esté en el contenido y no en como está estructurado. No solo eso, las guías ayudan a que podamos leer y entender el código más rápido y nos facilitan la modificación y mantenimiento del mismo.
De hecho, son tantas las cosas buenas que nos brindan las guías de estilo que todos los lenguajes las tienen. Entre otras cosas, las guías para cada lenguaje nos ofrecen:
- Convención para nombrar el código
- Estructura del código
- Convenciones en la creación de comentarios
- Usos específicos del lenguaje, (como castear tipos de datos, uso correcto de los mecanismos y sintaxis, etc)
Adopta una cultura de mejora continua
Me gustaría aclarar que la mejora continua también viene del aprendizaje constante. Algo que hacía un líder técnico con el que trabajé, era ofrecernos bibliografía técnica y no técnica para mejorar el software y nuestra interacción como equipo, además de darnos constantes sesiones de entrenamiento.
Este tipo de actividades mejoran el ambiente laboral, por lo tanto es más fácil de proponer y aceptar que se tengan días del Sprint para refactorizar código, identificar code smells o pagar deuda técnica adoptando programación en pares, lo que hace que aumente la calidad del código que se escribe en el equipo técnico y aumente el valor del producto.
Conclusiones
Usando alguno de estos consejos el código que estás generando dentro del equipo técnico será mucho mejor y esto tiene muchos beneficios en el equipo: disminuirá frustraciones, dolores de cabeza y podrá ofrecer más valor al negocio y/o el producto.
No olvides visitar otros artículos sobre liderazgo técnico y desarrollo de software.