Dicen que programar es fácil, es como andar en bicicleta. Pero en realidad, programar es como una motocicleta, una motocicleta muy potente y rápida. Al programar, al igual que al andar en bicicleta, hay que ser responsable y consciente para mantenerse en el sillín y duplicar eso para ser un ganador. De hecho, los motociclistas y los programadores comparten los mismos errores de novatos: los neófitos suelen centrarse en herramientas rápidas y potentes y trucos innovadores, creyendo que eso por sí solo define a un verdadero maestro. Esta mentalidad se debe en parte al "efecto Dunning-Kruger", según el cual los novatos no logran comprender la complejidad y la importancia de su profesión. Afortunadamente, con la experiencia, incluso el principiante más ferviente se da cuenta de que el arte de programar implica mucho más que simplemente seleccionar el algoritmo óptimo. En este artículo, quiero compartir mis pensamientos sobre lo que realmente importa para un programador y lo que tanto los desarrolladores nuevos como los experimentados deben recordar al crear software y escribir código.
¿Con qué empiezan los motociclistas novatos? Números y artilugios. Potencia, par motor, piezas de rendimiento para ganar milisegundos teóricos en un cuarto de milla... Como si estuvieran a punto de llegar a la parrilla de salida de MotoGP. Mientras tanto, su tarea principal es simplemente aprender a conducir de forma segura. De manera similar, los desarrolladores principiantes a menudo se obsesionan con el rendimiento del código cuando no es necesario. Los artículos que debaten si `dict()` o `{}` son más eficientes en Python, o los pros y contras de usar frameworks a pesar de su potencial para reducir el rendimiento, alimentan esta obsesión. Si bien comprender las complejidades de su lenguaje de programación es beneficioso y, a veces, crucial, como en el software para aviones, robots de negociación de acciones o dispositivos médicos, no siempre es fundamental para la mayoría de los programas que creamos a diario. Incluso si está trabajando en software crítico para el rendimiento, es esencial saber qué partes del código requieren un alto rendimiento y cuáles no.
Sin embargo, lo que siempre importa es la legibilidad del código. Numerosos estudios y encuestas confirman que los desarrolladores pasan más tiempo leyendo y entendiendo el código que escribiéndolo. Por ejemplo, el estudio
En la mayoría de los casos, nuestro objetivo es crear un producto que se pueda mantener y que no requiera un soporte complejo y que prospere en un entorno competitivo. Esto no significa que podamos ignorar por completo el rendimiento; debemos encontrar un equilibrio en el que la capacidad de mantenimiento y el rendimiento coexistan. Si se necesita un código de alto rendimiento, podemos optimizar las secciones lentas después del lanzamiento del proyecto.
También hay que tener en cuenta que los compiladores e intérpretes evolucionan, pero el código sigue siendo el mismo. Un fragmento de código mágico, superoptimizado y escrito para una versión del compilador puede resultar irrelevante para otra. Además, los desarrolladores futuros (o incluso usted) necesitarán trabajar con ese código. Entonces, ¿cuándo debemos sacrificar la legibilidad por el rendimiento?
Para identificar cuándo priorizar el rendimiento por sobre la legibilidad es necesario identificar los cuellos de botella en la aplicación:
Creación de perfiles de la aplicación : si la creación de perfiles revela que secciones de código críticas específicas afectan significativamente el rendimiento, optimizar estos fragmentos podría justificar una legibilidad reducida.
Pruebas de carga : simular cargas elevadas puede ayudar a identificar cuellos de botella en el rendimiento antes de que se conviertan en problemas del mundo real.
Análisis de comentarios de los usuarios : recopilar comentarios de los usuarios puede resaltar áreas con bajo rendimiento.
Registro y supervisión : el análisis de los registros y las métricas de ejecución puede identificar áreas problemáticas durante el funcionamiento real de la aplicación. Esta etapa puede revelar problemas inesperados, como un uso inadecuado de la API que provoque problemas de rendimiento.
Herramientas de análisis de código estático : algunas herramientas pueden sugerir mejoras de rendimiento durante las revisiones de código. Ejecutar estas herramientas automáticamente durante las revisiones de tareas es una buena práctica.
Estos consejos pueden ayudar a identificar los puntos débiles de su aplicación, lo que le permitirá centrarse en las optimizaciones necesarias. Según mi experiencia personal, es menos probable que estas optimizaciones involucren construcciones de lenguajes exóticos y es más probable que involucren la optimización de interacciones con bases de datos o el uso de API externas.
En la carretera, una de las habilidades de seguridad cruciales es ser predecible y, asimismo, leer las intenciones de los demás. En la codificación, al igual que en la conducción, no se puede leer directamente las mentes de otras personas. Sobre dos ruedas, hay que notar movimientos sutiles y predecir lo que harán los demás al segundo siguiente. Los programadores poseen (pero no siempre emplean) una herramienta poderosa para reemplazar la telepatía: el papeleo. La mayoría de los desarrolladores coinciden en que la documentación es crucial para un proyecto, como lo demuestran encuestas como la
La documentación puede adoptar muchas formas, desde descripciones detalladas de proyectos en sistemas como Confluence hasta comentarios de código y sitios web de descripción de proyectos generados de forma automática o semiautomática. Incluso puede ser tan simple como un archivo README en el directorio raíz del proyecto. Independientemente del formato, el proceso de creación de documentación va mucho más allá de simplemente transmitir información sobre cómo funciona el producto. Este proceso nos hace repensar lo que hemos hecho , lo que a menudo puede conducir a mejoras en la API y la arquitectura general. A menudo me he dado cuenta, mientras documentaba la funcionalidad que había creado, de que podría resultar difícil trabajar con ella, y he encontrado formas de solucionarlo.
Es importante recordar que mantener la documentación siempre requiere un esfuerzo significativo, especialmente si el proyecto se encuentra en una etapa en la que cambia con frecuencia. En tales casos, debe sopesar todos los riesgos y considerar cuidadosamente qué lógica documentar. Si su proyecto ha alcanzado una etapa madura, una buena documentación traerá más beneficios que desafíos: los nuevos desarrolladores pueden incorporarse y ganar impulso más rápido, mientras que los empleados con más tiempo pueden descubrir rápidamente cómo funcionan ciertas características. Además, la documentación con una buena función de búsqueda en un proyecto grande con muchos equipos puede evitar la duplicación de funciones.
El uso de las luces de giro es la forma más básica de ser un conductor predecible. De manera similar, comentar el código es probablemente la forma más fácil y directa de decirles a los demás lo que estás haciendo. Y, al igual que con el uso de las luces intermitentes, no te hace menos genial. Sé que existe la creencia común de que los comentarios son innecesarios porque el código debería explicarse por sí solo. Pero no, no estoy completamente de acuerdo con eso. El código de calidad a menudo se puede entender intuitivamente gracias a una buena denominación de variables y funciones, una estructura clara y el cumplimiento de los principios del código limpio. Sin embargo, incluso en esos casos, los comentarios bien pensados pueden proporcionar información invaluable.
Los comentarios desempeñan un papel crucial cuando se trata de algoritmos complejos o soluciones que requieren un contexto adicional para comprenderse. Pueden explicar el "por qué" de un enfoque, que no siempre es obvio a partir del código en sí. Esto es particularmente importante cuando el código está optimizado para el rendimiento, pero sus intenciones y lógica no son inmediatamente claras. Los comentarios también pueden ayudar a reconsiderar si el algoritmo elegido avanza en la dirección correcta.
Los comentarios son una gran ayuda en casos de lógica empresarial compleja o requisitos específicos de un proyecto que pueden no ser obvios para los nuevos miembros del equipo o en el caso de un soporte de proyecto a largo plazo. Ayudan a retener el conocimiento dentro del equipo y facilitan la transferencia de proyectos entre desarrolladores.
Por supuesto, es esencial evitar comentarios excesivos que digan cosas obvias o que resulten obsoletos y engañosos. Su propósito es garantizar la claridad y facilitar la comprensión del código, no atiborrarlo de información innecesaria.
Bien, ahora imaginemos que finalmente aprendimos a andar en bicicleta y ahora queremos probar suerte en una pista de carreras real. Bien, pronto descubriremos que las carreras reales no se tratan solo de poder "acelerar a fondo". Implican entrenamiento, pruebas y ajustes finos de la máquina para que se adapte a nuestros hábitos y condiciones de carrera. Lo mismo se aplica al código: debe probarse, probarse y corregirse a fondo si es necesario antes de que pueda lanzarse a dar una vuelta de verdad. Por lo tanto, es crucial abordar las pruebas de código con la máxima responsabilidad. Las pruebas a menudo se consideran simplemente una herramienta para detectar errores, pero su función es más amplia:
La realización de pruebas eficaces es fundamental para producir código de alta calidad, fiable y comprensible. Sin embargo, al igual que la documentación, las pruebas pueden requerir muchos recursos, en particular en las primeras etapas del proyecto. Es esencial encontrar un equilibrio entre la necesidad de realizar pruebas y las limitaciones de tiempo y recursos.
También es obvio que la cobertura de pruebas absoluta para códigos complejos es simplemente inalcanzable. Por lo tanto, los desarrolladores deben priorizar las pruebas de funciones clave y secciones críticas del código, y saber cuándo detenerse para evitar un ciclo de pruebas interminable.
Por último, ninguna motocicleta puede ser fiable sin un mantenimiento adecuado. Hay bastantes personas que descuidan este aspecto de la conducción, pero se inventan historias (que van desde lo divertido a lo aterrador o lo triste) de las que definitivamente no queremos ser parte. En el mundo de la programación, al igual que en el motociclismo, el mantenimiento del código no es solo una recomendación sino una necesidad, especialmente para proyectos a largo plazo. La falta de mantenimiento y actualizaciones conduce a la obsolescencia del producto y a vulnerabilidades de seguridad.
Cuando el código no se actualiza para que sea compatible con los últimos compiladores e intérpretes, actualizarlo puede volverse cada vez más difícil (y de hecho lo será). Si está desarrollando una aplicación de escritorio o móvil, su producto podría dejar de funcionar con las nuevas versiones del sistema operativo. En el caso de un sitio web, podría dejar de funcionar debido a herramientas y tecnologías obsoletas. El problema más simple podría ser un certificado de seguridad vencido o un software desactualizado para su renovación.
Las actualizaciones y refactorizaciones periódicas también son fundamentales para mantener la legibilidad del código. Esto permite que el proyecto sea manejable y simplifica los cambios y las incorporaciones de funciones futuras.
En resumen, ama tu código y dedícale tiempo, pero no en exceso, o acabarás como el protagonista de “El teorema cero”. ¡Buena suerte!