Programar no consiste en machacar el teclado y escribir lo más rápido posible. No se trata de memorizar religiosamente los atajos de teclado y, en última instancia, dejar obsoleto el ratón. No se trata de aprender todos los lenguajes de programación que existen, si es que eso es posible. Un buen programador no se define por la marca, el precio, el rendimiento y el sistema operativo de su ordenador, ni por su preferencia de editores de código e IDEs -VS Code, Atom, IntelliJ IDEA, Vim, Notepad++ o cualquier otro-. Contrariamente a la creencia popular gracias a muchas películas de Hollywood, la programación no es definitivamente equivalente a la piratería informática.
Además, va más allá de memorizar la sintaxis y las funcionalidades incorporadas de un lenguaje de programación. La lógica, las condiciones, las sentencias if
y los algoritmos -sobre todo los de ordenación- no pintan una imagen completa de lo que es realmente la programación. Las matemáticas, la recursividad, la informática y los patrones de diseño tampoco le hacen justicia. Aunque son una gran parte de lo que es la programación, son sólo una pieza del rompecabezas.
Diseño y planificación
Antes de escribir una sola línea de código, el diseño y la arquitectura de un proyecto se planifica a fondo para asegurar o al menos aumentar la probabilidad de tener un ciclo de desarrollo sin problemas. Aquí es donde entra en juego el diseño del software. Las cadenas de herramientas, los conductos, las capas de abstracción para las API públicas e internas, la modularización, las relaciones entre los objetos y la estructuración de la base de datos se planifican durante esta etapa de desarrollo.
Somos depuradores vivos, que respiran
El arte de la programación requiere que pensemos fuera de la caja y resolvamos los problemas con las soluciones más pragmáticas, eficaces y factibles. Probablemente por eso somos el «informático» o el «servicio de atención al cliente» de la casa. Prácticamente nuestro trabajo es arreglar lo que está roto. Es como si «programar» fuera una forma glorificada de decir «resolver problemas».
En otras palabras, somos depuradores vivos, que respiran dentro y fuera de nuestros ordenadores, y debido a esto, es importante que sepamos leer y escribir documentación. La documentación adecuada-que viene en forma de páginas reales de documentación detallada, o tan simple como espolvorear comentarios que valen la pena a la base de código-sirve como una de las líneas de vida más importantes de un programador. Sin ella, estamos perdidos en la oscuridad, incapaces de cumplir con nuestros deberes como depuradores. Se puede avanzar poco o nada porque la mayor parte de nuestro tiempo se dedicaría a experimentar e investigar cómo funciona un framework o una base de código heredada. En general, resultaría en una experiencia terrible para el desarrollador.
Considerar todos los escenarios posibles
La depuración ya es lo suficientemente difícil. Para empeorar las cosas, la ejecución del código no suele ser lineal. Los proyectos grandes conllevan múltiples «ramas» de posibles caminos de ejecución debido a la lógica del programa con la declaración if
. Tenemos que tener en cuenta cada uno de los posibles escenarios y errores, especialmente si implica la entrada del usuario. La carga cognitiva requerida para hacer un seguimiento de cada posible ruta de ejecución hace que la programación sea aún más difícil.
Experiencia del usuario
Saliendo del mundo del desarrollo, nos ponemos en la piel de un usuario medio. Además de proporcionar funcionalidad, añadir nuevas características, corregir errores y documentar nuestra base de código, también nos centramos en cómo un usuario medio interactúa con nuestra app o software. Tenemos en cuenta múltiples factores que conducen a una gran experiencia de usuario, tales como (pero no limitado a) la accesibilidad, la usabilidad, la facilidad de uso y -descubrimiento, el diseño de la interfaz de usuario, los temas de color, las animaciones funcionales, y el rendimiento.
Rendimiento y Optimización
Hablando de eso, el rendimiento es una enorme faceta de la programación en sí misma. Nosotros, especialmente los que tenemos formación en informática, nos esforzamos por utilizar y escribir los algoritmos más eficientes en tiempo y espacio. Nos obsesionamos con la insondable escala de tiempo de los microsegundos para exprimir al máximo nuestra memoria, CPU y GPU disponibles.
En el contexto del desarrollo web, la optimización de la red es un concepto importante que hay que entender. Pasamos por el aro para minificar y comprimir nuestro HTML, CSS y JavaScript sólo para minimizar la carga útil de una respuesta del servidor. Las imágenes y otros recursos diversos también se comprimen y se cargan de forma perezosa para minimizar la cantidad de datos que el usuario tiene que descargar antes de que una página tenga sentido y sea utilizable.
Sin embargo, hay veces que nos obsesionamos demasiado con el rendimiento. La optimización prematura se convierte en un problema cuando nos preocupamos innecesariamente por optimizar ciertas partes de una base de código en lugar de centrarnos en lo que hay que hacer para el progreso y la productividad reales. En ese caso, debemos tener la sabiduría para juzgar qué partes de la base de código realmente necesitan optimización.
Seguridad
Más allá de la interfaz de usuario y la lógica de nuestro software, como programadores, somos responsables de la seguridad de nuestros usuarios. En nuestra época, en la que los datos son muy codiciados y muy monetizados, es más importante que nunca asegurarse de que la información personal de nuestros usuarios está a salvo. Tomamos medidas adicionales para proteger los datos privados porque nuestros usuarios confían en nuestro software. Si no cumplimos con esa responsabilidad, no somos verdaderos programadores, ni por asomo.
Nunca se puede estar demasiado seguro cuando se aborda la seguridad. Como regla general, «nunca confiar en la entrada del usuario». Incluso se puede considerar una «mejor práctica» hacer todo lo posible para sanear los datos y las entradas de los usuarios. No sólo ponemos nuestro software e infraestructura en gran riesgo si no tenemos cuidado con ellos, sino que también corremos el riesgo de comprometer los datos sensibles de los usuarios, los mismos datos que prometemos proteger como programadores.
Sin embargo, la seguridad no es exclusiva de los datos y entradas de los usuarios. Los virus, los gusanos, los troyanos, el adware, los registradores de claves, el ransomware y otras formas de malware informático siguen propagándose y asolando millones y millones de ordenadores y dispositivos en todo el mundo. Incluso después de décadas de mejoras tecnológicas en hardware y software, no existe un sistema invulnerable. La seguridad es simplemente un arte que se perfecciona continuamente, pero nunca se perfeccionará porque siempre habrá unos pocos curiosos que investigan y buscan todas las formas posibles de «hackear» un sistema.
Por esa razón, independientemente del caso de uso y de la base de usuarios, diseñamos nuestro software teniendo en cuenta la seguridad como una de las principales prioridades, si no la principal. Hacemos esto para proteger a nuestros usuarios de las amenazas antes mencionadas que pueden causar inconvenientes tales como la pérdida de datos, la corrupción de archivos y las caídas del sistema, por nombrar algunas.
El trabajo en equipo hace que el sueño funcione
Incluso si no se relaciona necesariamente con la programación, el trabajo en equipo juega un papel extremadamente integral en el desarrollo de software. Con toda la complejidad y las partes móviles de cualquier proyecto de gran envergadura, es imposible que una sola persona desarrolle un software de calidad al ritmo enérgico de la iteración periódica o bajo los estrictos plazos y limitaciones de tiempo de un cliente o de cualquier entidad supervisora.
Por eso hay varios equipos de personas que se especializan en una de las muchas facetas de la programación. Una sola persona nunca tendrá todas las habilidades y conocimientos necesarios para pegar todas las facetas de manera efectiva y cohesiva. Un equipo puede encargarse del diseño de la interfaz de usuario y la accesibilidad, mientras que otro puede trabajar en la funcionalidad del propio software. Si se combinan todas las competencias de los distintos equipos especializados, el software resultante tendrá la mejor funcionalidad, experiencia de usuario, rendimiento y seguridad que pueda tener dentro de las limitaciones financieras y prácticas.
Para la gestión del tiempo y el cumplimiento de los plazos, la organización y automatización del flujo de trabajo son de suma importancia. Nos tomamos el tiempo necesario para configurar adecuadamente nuestras herramientas de compilación y pipelines porque hacerlo nos ahorrará mucho tiempo en el futuro. En general, el retorno de la inversión aumenta a medida que pasa el tiempo.
Trabajar bien con los demás
Para exponer la idea del trabajo en equipo y la cooperación, establecemos relaciones sanas con nuestros compañeros porque, al final, el éxito de un proyecto depende en gran medida del éxito del equipo que lo respalda. Nos esforzamos por fomentar un entorno de trabajo de apoyo, en el que los veteranos con experiencia guían con amabilidad a los recién llegados.
Dado que desarrollamos software en equipo, tenemos que ser conscientes de que los demás leen nuestro código. Para que el ciclo de desarrollo sea sostenible a largo plazo, la legibilidad y el mantenimiento se consideran tan importantes como la lógica y la funcionalidad de un proyecto. Escribimos consistentemente un código bueno y legible a la vez que proporcionamos mensajes de confirmación y documentación informativa porque esto definitivamente nos ayudará a nosotros y a los demás a entender mejor nuestro código.
Hablando de que los demás lean nuestro código, una revisión de código es una gran oportunidad para aprender más sobre las mejores prácticas de programación. También es otra forma de familiarizarnos con una base de código y su diseño y arquitectura subyacentes. Aunque la crítica constructiva es desagradable y difícil de manejar en el extremo receptor, es importante tomarla como un consejo sólido para que podamos mejorar como programadores.
La programación es dura
La programación abarca muchos aspectos más allá de la funcionalidad, como la experiencia del usuario, el rendimiento, la seguridad y el trabajo en equipo. No basta con centrarse estrictamente en un solo aspecto y omitir los demás. Para proyectos de notable tamaño e importancia, no es tan sencillo como teclear unas cuantas líneas de código. Se requiere mucha planificación cuidadosa, diseño, consideración y cooperación en equipo para tener éxito. De hecho, se pasa más tiempo pensando que escribiendo cuando se programa, especialmente durante las largas sesiones de depuración.
Al final, la programación consiste realmente en un aprendizaje continuo y sin parar. La adaptabilidad y el aprendizaje constante son las claves para sobrevivir en esta industria. No podemos esperar seguir siendo relevantes si no ponemos de nuestra parte para seguir aprendiendo. En una industria tan volátil y de mejora tecnológica exponencial, tenemos que seguir su rápido ritmo para no acabar en el polvo.
Quiero concluir este artículo reconociendo el duro trabajo de todos los desarrolladores del mundo. Para escribir este artículo, he tenido que reflexionar sobre el flujo de trabajo diario de un equipo de desarrolladores. Tuve que examinar los numerosos aspectos de la programación y el desarrollo de software que suelen pasar desapercibidos. Desde entonces, tengo un mayor aprecio por todo el software instalado en mi ordenador. Por ello, animo a todo el mundo a dar las gracias hoy a un programador, independientemente de su experiencia. ¿Dónde estaríamos sin ellos?
Nunca des por sentado su duro trabajo.