Pensando en programar

Cuando hacemos cualquier tarea, como programadores o en la vida en general, es importante mantener el ritmo adecuado. Hemos visto cómo no debemos lanzarnos directamente a intentar resolver un problema sin antes haberlo comprendido bien. Pero también he intentado hacer ver que esta fase de comprensión no necesita que delimitemos todos y cada uno de los detalles del problema, porque tampoco conviene quedarnos estancados y no avanzar hacia la solución.

Antes de empezar a resolver

Podríamos pensar que, ahora que ya tenemos un buen conocimiento del problema, el siguiente paso es lógicamente empezar a plantearnos cómo resolverlo, empezar a pensar en nuestra solución. Sin embargo, existe otro paso antes. Un paso pequeño pero importante. En algunos casos diría que es incluso de una importancia vital.

Antes de plantear cómo resolver un problema, asegúrate de que realmente debes resolverlo. Yo mismo, ahora.

Oh, sí. Seguro que ya alguien ha dicho una frase parecida antes que yo. No pretendo dármelas de original, pero es que no consigo encontrar ahora mismo la cita dicha por otra persona; lo siento.

Sé que puede parecer algo evidente. Sin embargo, me he encontrado demasiadas veces con esto como para poder asegurar que es muy frecuente encontrarse programadores que se saltan este paso tan evidente y terminan literalmente haciendo lo que no deben. Y lo cierto es que existen bastantes motivos diferentes que pueden sugerir que ciertamente no deberíamos resolver un cierto problema.

Voy a repasar unos cuantos de estos motivos. Existen, sin duda, otros varios.

El problema no existe

Esto puede parecer sorprendente en un primer momento. ¿Cómo puede ser que hayamos analizado y comprendido algo que en realidad no exista? Veamos un caso práctico y real.

En la última empresa en la que estuve trabajando, una de las cosas que hacíamos era gestionar una serie de fotografías y vídeos. Era un portal de anuncios, y estos podían incluir estas fotos. A lo largo de los años, la mejora de las redes de Internet y su capacidad, ha hecho que se intenten servir imágenes y videos cada vez con mejor calidad. También la mejora de los codecs y formatos de video ha ayudado. Pero esto significa que cuando quieres por ejemplo actualizar toda una serie de videos e imágenes (y hablamos no de unas decenas si no de unos cuantos millones), las cosas pueden volverse algo complicadas. Así que, a veces, y este era el caso, se elige conservar, por ejemplo, los videos antiguos en el formato antiguo que ya tienes, y solo usar el formato nuevo para los más nuevos. O también, porque tienes que soportar diferentes navegadores y sistemas, decides que con un único formato no sirve y que necesitas por lo menos dos (o a veces tres).

La situación se complica y así llegamos a tener anuncios con vídeos en formatos viejos, anuncios con vídeos en formatos nuevos y anuncios con vídeos en todos los formatos.

Un día cualquiera me llegó una tarea. Como teníamos estas posibilidades y a priori no era fácil consultar qué formatos de vídeo tenía un anuncio en concreto, debía implementar un sistema en JavaScript que intentara, con el anuncio ya cargado en el navegador, ir probando a pedir cada uno de los formatos de vídeo. Si uno no estaba disponible, pedir el siguiente, y así hasta encontrar uno apropiado que por una parte existiera y por otra tu navegador pudiera reproducir correctamente.

Comprender esta situación no lleva demasiado tiempo o esfuerzo pero sí requiere que te lo cuenten o que te expliquen por qué esta necesidad y demás detalles. Una vez comprendido el problema mi decisión fue clara: Este problema no necesito resolverlo porque no existe.

Quien había solicitado la tarea desconocía que es algo que el navegador ya puede hacer por sí mismo. La etiqueta <video> de HTML5 tiene asociada una etiqueta <source> que funciona exactamente como describía la tarea que necesitábamos. Simplemente pones cada uno de los posibles nombres de los vídeos que puede que sirvan y el propio navegador irá pidiéndolos por orden uno a uno hasta que encuentre uno que exista y pueda reproducir. No necesitaba desarrollar nada.

No es este un caso anecdótico, aunque pueda parecerlo. Es algo que me he encontrado en diversas ocasiones. Nos dejamos llevar por la idea de que necesitamos resolver un problema y no nos damos cuenta de que el problema ya está resuelto, que la plataforma, el sistema, el lenguaje, que usamos ya incluye en sí mismo una solución a esto.

Parecida aunque no totalmente igual, es la situación de un problema que ya ha sido resuelto. No es totalmente igual, porque es posible que encontremos motivos para, por ejemplo, buscar una solución diferente a las existentes. O porque consideremos que resolverlo nosotros mismos nos va a proporcionar otros beneficios, más allá de la resolución del problema (por ejemplo, porque estamos buscando aprender). En cualquier caso, también conviene prestar atención a si tenemos motivos para resolver el problema de nuevo o si es un esfuerzo innecesario y es más conveniente usar la solución que ya han proporcionado otros antes.

El problema no debe ser resuelto

Esta es delicada. De lo que se trata aquí es de tener una visión que alcance más allá de la pura tecnología. Se trata en cierta medida de tener una ética profesional y personal.

Como avisaba en la introducción, yo tengo mis propias creencias y valores sobre lo que es correcto y lo que no. Por eso mismo, yo personalmente evito trabajar en empleos y tareas que creo que aportan un balance negativo a la sociedad y al mundo en general. No aceptaría trabajar en negocios, tareas y trabajos que me parezcan deshonestos o que intentan dañar o manipular a las personas para obtener un beneficio personal.

Pero, y esto también creo que es importante, estas son mis creencias personales. Y por eso no pretendo intentar de ninguna manera que tú, o que nadie, tenga que compartir estas mismas ideas. Lo que sí creo que debo recomendarte es que tú tengas algunas creencias personales, las tuyas. Idealmente, desde luego, preferiría que esas creencias estuvieran encaminadas a buscar objetivos nobles y con un efecto positivo en el mundo. Aún así ni siquiera te pido eso.

Lo que te pido es que consideres que tienes unos valores y una ética como persona y que no debes dejarlos a un lado solo porque técnicamente puedas hacerlo. Creo que puedo afirmar que, a largo plazo, si dejas de lado tu ética personal en tu trabajo, terminarás muy probablemente, por abandonar esa ética también en tu vida personal. Y no creo que nadie deba hacer eso.

De nuevo insisto en que no tienes por qué estar de acuerdo conmigo en esto. Pero incluso aunque no lo estés, me gustaría que consideraras, al menos por un instante, antes de ponerte a hacer un desarrollo, si realmente crees que debes hacerlo. No pido más; con esto me basta.

El problema no merece la pena

Ojo. Esto es sustancialmente diferente de lo anterior. No hablamos ya de que no sea un “buen problema” -por llamarlo de alguna forma- o que no deba ofrecerse algún tipo de solución. Pero hay ocasiones en que resolver un cierto problema puede o bien resultar mucho más costoso que seguir “sufriendo” el problema o bien producir otros efectos negativos que generen otros problemas peores.

Para evitar estos casos conviene preguntarnos cuánto nos va a costar resolverlo y cuáles van a ser las consecuencias de resolverlo. Hacemos balance, contemplamos las diferentes opciones y, entonces, concluiremos si merece la pena o no.

Este tipo de situación parece más sencillo verlo cuando consideramos la programación como una ocupación profesional. En ese caso, es más claro hablar de costes o de consecuencias y sacrificios. Es relativamente fácil imaginar que, por ejemplo, dedicar un gran presupuesto a un determinado problema puede suponer reducir el presupuesto dedicado a otros. O que insertar cierto cambio en nuestros procesos, puede implicar tener que llevar a cabo otros trabajos adicionales en otras áreas.

Pero esto no es algo exclusivo de esa circunstancia. También cuando pensamos en la programación como algo más personal, como un interés personal o una afición, o como algo que hacemos por entretenimiento, por diversión, o por aprendizaje, puede que nos encontremos en situaciones similares. Nuestro “presupuesto” de tiempo tampoco es ilimitado, de modo que tendremos que evaluar si realmente queremos, por decir algo, pasar los próximos 3 meses resolviendo un cierto problema cuando es algo que sabemos que no nos va a proporcionar el resultado que buscamos. Por ejemplo, podemos imaginar que si estamos estudiando y aprendiendo, resolver problemas que son demasiado parecidos no nos aporta nuevo aprendizaje1). Entonces, analizamos un problema y nos encontramos que, oh, es prácticamente igual que el que resolvimos hace un mes. ¿Merece la pena entonces o aprovecharíamos mejor nuestro tiempo resolviendo un problema distinto?

No hay una respuesta cerrada a esto, por supuesto. Pero sí es algo que debemos preguntarnos en cada caso. Y en cada caso habrá una respuesta que nos diga si merece la pena o no.


Como sugería antes, seguramente existen más situaciones que nos puedan llevar a concluir, una vez que conocemos el problema, que el siguiente paso correcto sea no resolverlo. Y, por supuesto, existen muchas situaciones que nos llevarán a concluir que que debemos continuar. En ese caso, el siguiente paso será empezar a plantear nuestra solución.

1)
Esto es muy discutible, lo sé. Habrá casos en los que sí que nos aporte y otros en los que no, pero justo ahí está la clave del asunto

Discusión

Escribe el comentario. Se permite la sintaxis wiki: