¿Cómo ser buen desarrollador?

Ya sé desarrollar... ¿y ahora qué?


En el ámbito del desarrollo, es común centrarse exclusivamente en los resultados a corto plazo de la programación, debido muchas veces por desconocimiento o por la presión de cumplir tareas. Las metas que normalmente nos planteamos son las siguientes:

  • ✅ Nuestro código debe funcionar y cumplir su propósito sin errores
  • ✅ Nuestro código debe ser eficiente y hacerlo de forma rápida y óptima

Estas expectativas son indiscutibles. Generalmente, todos sabemos que el código debe cumplir con lo que se espera de él, y cuanto más eficiente sea, mejor.

Hay que entender que, cuando desarrollamos, lo importante es alcanzar el objetivo final. El tiempo es dinero y cuanto más tiempo tardemos en lograr nuestro objetivo, menos rentable será. Por eso, debemos cuidar e intentar reducir el tiempo que nos lleva desarrollar algo.

Puntos clave en el desarrollo

Aunque estos dos primeros puntos que hemos mencionado son muy importantes, en muchas ocasiones se olvidan otros puntos igual de importantes y factores clave en las etapas futuras del desarrollo:

  • Funcionalidad -> Debe cumplir el objetivo clave
  • Eficiencia -> Debe hacerlo lo más rápido y eficientemente posible
  • 🙈 Mantenibilidad -> Debe ser fácil de modificar y ampliar si se necesita
  • 🙈 Legibilidad -> Debe ser código fácil de leer y entender
  • 🙈 Modularización -> Debe estar separado y no depender de otras cosas
  • 🙈 Testabilidad -> Debe ser fácil de comprobar si funciona correctamente
  • 🙈 Usabilidad -> Debe ser fácil de utilizar por el usuario final
  • 🙈 Tiempo de desarrollo -> Debe crearse lo más rápido posible

Vamos a explicar cada uno de ellos y porque tienen un papel importante en el mundo del desarrollo y la programación.

Código legacy

Antes de comenzar a analizar estos puntos, veamos primero un concepto fundamental que hay que conocer: el código «legacy» (código heredado). Se conoce como código legacy al código que se ha desarrollado en un proyecto o empresa y que, aunque aún se utiliza y funciona correctamente, ha quedado obsoleto o anticuado en comparación con las tecnologías y prácticas actuales, perjudicando de forma directa o indirecta al proceso de desarrollo.

Hay que tener en cuenta que en la mayoría de las empresas, los desarrolladores no realizan desarrollos desde cero, sino que se enfrentan a código legacy desarrollado desde hace algún tiempo, el cuál debe mantenerse, modificarse, mejorarse y ampliarse sin introducir nuevos errores, sin perder funcionalidades e intentando conseguir mejores resultados.

Generalmente, el código legacy no usa tecnologías de última generación, ni sigue las mejores prácticas, lo que puede dificultar mucho trabajar con él. Sin embargo, tampoco se suele poder invertir tiempo en migrar a otra tecnología o prácticas, porque requeriría invertir mucho tiempo de desarrollo.

Mantenibilidad y escalabilidad

La mantenibilidad y la escalabilidad son algunos de los criterios más importantes a la hora de crear código, ya que cuando desarrollamos y escribimos código, normalmente lo hacemos con planes de que el código de ese proyecto siga funcionando a largo plazo.

  • Mantenibilidad: Por un lado, se busca crear código mantenible, es decir, seguir unos ciertos criterios para que el código sea fácil de modificar y pueda adaptarse a nuevas necesidades sin perder la funcionalidad actual.

  • Escalabilidad: Por otro lado, un código escalable es un código que es fácil de ampliar y extender, sin que se rompa el funcionamiento actual.

Al código difícil de mantener, mezclado y desordenado se le suele llamar código spaghetti, debido a la similitud de apariencia caótica con un plato de spaghettis.

Legibilidad y simplicidad

La legibilidad y simplicidad son criterios muy deseables en nuestro código, y en general en nuestros desarrollos. Cuando creamos código, lo primero que se busca es que funcione. Sin embargo, para conseguir una buena mantenibilidad y escalabilidad, suele ser necesario que el código sea fácil de leer para que los programadores no tarden tiempo en entenderlo o modificarlo.

En muchas ocasiones ocurre, que tras algunos días sin programar, si volvemos a examinar nuestro código, nos puede llevar un tiempo entenderlo (aunque lo hayamos hecho nosotros mismos). Esto es normal, y generalmente se basa en que no tenemos mucha experiencia en el desarrollo y/o que el código hace cosas muy complejas que se podrían simplificar.

Si el código es simple, mucho mejor. Nuestro código puede funcionar correctamente, sin embargo, existen múltiples formas de hacer tareas, por lo que siempre será preferible que sea más sencillo y claro, a que sea complejo y largo.

En general, intentaremos que nuestro código funcione primero, pero una vez se cumpla esta característica hay que intentar simplificarlo y hacerlo más sencillo de entender para los demás.

Modularizar y refactorizar

Cuando desarrollamos, muchas veces tendemos a mezclar el código de ciertas funcionalidades con el de otras. Lo ideal sería modularizar el código de forma que sea independiente. Piensa que al tener funcionalidades mezcladas con otras, va a ser más difícil modificarlas, reutilizarlas, o si tenemos que eliminar una de ellas, podamos hacerlo porque no depende de otra.

Existe un concepto denominado refactorizar que es el proceso de modificar el código para mejorar su estructura, legibilidad, eficiencia o mantenibilidad sin alterar ni romper su funcionalidad.

Otro concepto importante es el de las dependencias. Se le llama dependencia a librerías externas que nos ayudan a realizar tareas secundarias. En un mundo ideal nuestro desarrollo no tendría dependencias, sin embargo, las dependencias nos ayudan a terminar antes nuestro desarrollo. Hay que intentar mantener un equilibro entre no usar demasiadas dependencias y no tener que implementar funcionalidades donde no podemos aportar demasiado o vamos a tardar mucho.

Aunque usar dependencias nos facilita mucho el trabajo, por cada dependencia que utilicemos (como su propio nombre indica) nos acoplamos a esa librería: los cambios que hagan, problemas de seguridad que tengan o si la abandonan, nos afectará a nuestro desarrollo.

Testabilidad

Una característica interesante en nuestros desarrollos es que incorporen pruebas o tests. Estos tests son fragmento de código que se ejecutan para comprobar si ciertas partes de nuestro desarrollo funcionan correctamente.

De esta forma si realizamos cambios en nuestro desarrollo, podemos activar las pruebas para comprobar si tras los cambios sigue funcionando o han dejado de funcionar, con lo que sabríamos rápidamente si nos hemos equivocado al modificar el código.

Usabilidad

Al desarrollar nuestro código, no sólo debemos cuidar los aspectos técnicos del mismo. Por ejemplo, si estamos desarrollando una página web, esta página debe ser fácil de utilizar, intuitiva y satisfactoria de cara al usuario final.

Algunos ejemplos de mala usabilidad podrían ser:

  • 🔴 Un botón aceptar en rojo y cancelar en verde.
  • 🔎 Una caja de búsqueda en la parte inferior de la página.
  • 🔑 Un formulario que reinicia todos los campos si hay un error en uno solo.
  • 🎭 Campos de contraseña que no ocultan y dejan ver lo que escribes.
  • 🐌 Páginas que tardan en cargar sin medidor de progreso.
  • 🚪 Un enlace o botón de "Descartar cambios" muy cerca de "Guardar cambios".
  • 🔊 Un sitio web que reproduce música automáticamente y sin botón de pausar.

Otra característica relacionada es la accesibilidad, que es la cualidad de un sitio web que garantiza su uso por todas las personas, incluidas aquellas con discapacidades visuales como ceguera, daltonismo u otras diferentes.

Tiempo de desarrollo

Anteriormente comentamos que el tiempo que tardamos en desarrollar es un factor clave. Todos los puntos anteriores son importantes en el ámbito del desarrollo, pero un aspecto crítico es reducir lo máximo posible el tiempo de desarrollo. Sin embargo, no podemos reducir el tiempo sin sacrificar ciertas características, y justo ahí está la clave.

Un buen desarrollador con experiencia sabe (o intuye) que criterios puede sacrificar para reducir el tiempo de desarrollo, sin perjudicar la calidad final del desarrollo. Por ejemplo, en ciertas situaciones, quizás no es tan prioritario que el código sea muy eficiente y esté optimizado, y es prioritario que se termine cuanto antes.

Tener esa habilidad para equilibrar características lo da la experencia, pero para poder tenerla es necesario estar concienciado y saber porque es importante.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev