Pensamiento crítico, energía extra para tus neuronas

Pensamiento crítico, energía extra para tus neuronas
Facebook Twitter Flipboard E-mail

Cuando leo y pienso sobre personas como Descartes o Euler, no puedo menos que describirlos como "auténticos monstruos". Las capacidades de estas personas no parecen terrestres, la facilidad con la que resolvían problemas ha sorprendido y sigue sorprendiendo a los mayores expertos. Podían resolver problemas sin disponer de las teorías que hoy se consideran indispensables para abordarlos y con sus soluciones, abrían fructíferos caminos en multitud de áreas.

Comparado con ellos, los demás mortales tenemos la capacidad de síntesis de una amoeba. Si como a mí, en lugar de inteligencia la Naturaleza te ha dotado de cabezonería, puedes convertir tu tozudez en "algo" parecido a la inteligencia. (Si posees ambas cualidades pues ya ni hablamos).

Descartes vs Euler

Como Euler hay unos cuantos ejemplos a lo largo de la historia. Era capaz de intuir, casi instantáneamente, soluciones exactas a problemas matemáticos complejos. Su cerebro era, por no extendernos, una auténtica máquina de demostrar teoremas. Sus resultados (afortunadamente) los disfrutamos diariamente, sin embargo, la forma en la que él trabajaba, está completamente fuera de nuestro alcance.

Por el contrario, de Descartes quiero destacar, su formalización extrema de los mecanismos mediante los cuales, según él, cualquier persona podía obtener la solución a cualquier problema. Su "método" (como diría Mr. Poirot) no es la piedra filosofal (a él le funcionaba muy bien, pero es que debía ser muy inteligente), pero nos hará aumentar la calidad y cantidad de nuestro trabajo.

Pensamiento crítico

Podéis leer la exposición que Wikipedia hace del Pensamiento crítico, sin embargo, yo quiero centrarme en un aspecto que, a la vez, te puede servir de introducción: "el pensamiento crítico consiste, en no engañarse a uno mismo".

Energía extra para tus neuronas

No es lo mismo "equivocarse", que "engañarse". Por ejemplo, si detecto un error en mi código e intuyo cómo podría arreglarlo y lo modifico, estoy actuando "a lo Euler", pero como no somos él, la mayoría de las veces fallaremos. En realidad, nos hemos engañado pensando que haciendo un cambio no meditado solucionaríamos el problema. Reconócelo ¡lo has hecho montones de veces!.

Aplicando un pensamiento crítico (actuando "a lo Descartes"), antes de actuar, nos aseguraremos que entendemos (controlamos) todos los elementos necesarios para tomar una decisión. ¿Y si algo no lo controlamos?, en tal caso, tenemos un nuevo problema, ¡al que aplicamos el pensamiento cartesiano recursivamente!.

El camino es duro, sobre todo al principio, porque es muy tentador actuar "a lo Euler", pensar que nuestro mágico cerebro es capaz de generar instantáneamente la solución, literalmente, sin pensar. Pero con práctica (¡es fantástico, se mejora con la práctica!) la velocidad a la que evaluaremos la veracidad de cada hipótesis que emitamos, aumentará y no será "a lo Euler" pero sí bastante rápido y fiable.

Valoración subjetiva

Desafortunadamente, el "método" tiene un punto débil: si creemos haberlo entendido todo ¿cómo podemos estar seguros de poder subir de nivel? (volver atrás en la recursión). Hasta donde yo se, no se puede. Para aliviarlo, tengo una regla, que yo suelo llamar "nivel subjetivo de certidumbre". Si te equivocas (que no engañar) con frecuencia, tu confianza en que tus hipótesis están confirmadas debe diminuir (debes aprender a dudar más). Por el contrario, si te equivocas muy pocas veces, tu confianza en que tus hipótesis sean ciertas debe aumentar (estás perdiendo el tiempo en algo ¡que casi seguro es cierto!).

Puesta en práctica

La regla de oro es no avanzar al siguiente paso hasta tener atado y bien atado el paso actual.

Si crees que ya lo haces, probablemente te estés engañando (a no ser que sigas el "método", claro).

Por ejemplo, en Solveet, propusieron el siguiente problema: "Dado un número X, obtener dos números Y y Z, tales que, por un lado, cumplan que Y + Z = X, y por otro lado, el número de bits a 1 (representación en binario, se entiende) de Y más los de Z sea máximo (no haya otros Y y Z con más bits a 1)".

Una de las soluciones fue (básicamente) "Poner todos los bits de Y a 1 (tal que Y <= X) y obtener Z = X - Y". Pero ¿cómo saber si esa solución es correcta?, por ejemplo, si tenemos X = 111(2) = 7(10), el algoritmo anterior arroja como solución Y = X, Z = 0 que tiene 3 bits a 1, sin embargo, si hacemos Y = Z = 11(2) = 3(10) tenemos en total 4 bits a 1 y todavía es Y + Z < X (por lo que hay margen a mover los bits), ¿como podemos estar seguros que el algoritmo es correcto?.

Esto me da pie al siguiente punto.

Pensar vs pruebas unitarias

Las pruebas unitarias están muy bien, pero hay que saber como y cuando aplicarlas. Para mí son como un cortafuegos, lo pones por si algo falla, pero antes, tomas medidas para que no se prenda el bosque.

En el problema que he puesto antes, ¡no valen las pruebas unitarias!. Si un test unitario confirma que en la base de datos se ha escrito correctamente el importe 123,45 € parece razonable pensar que funcionará igualmente si escribo 123,46 €. Pero que un test diga que el algoritmo mencionado funciona para X = 12345, no dice nada sobre si funcionaría con X = 12346. (Ojo, aun así, yo no he dicho que no haya que hacer pruebas unitarias [que sí hace falta], únicamente que no demuestran nada).

Aplicar el "método" en este caso, significa aceptar que el algoritmo propuesto no es válido, en tanto en cuanto, se den razones para pensar lo contrario.

Conclusión

Programar no es practicar tiro con arco: una coma mal puesta, una caída en un servidor remoto, un fallo de CRC en un archivo, una actualización "malsana" del sistema, etc... a diario como programadores nos encontramos con situaciones inesperadas. Un pensamiento crítico, una evaluación minuciosa de la situación, un "método" que nos de confianza en que, cada paso que damos es en firme, supone ahorrar montones de horas.

¿Quien no ha oído la frase? "no te vas a creer la chorrada que era...".

Y bueno, si tienes un "método" propio ¡compártelo!.

¡Ah! por cierto, la solución propuesta sí es válida ¿sabrías demostrarlo? (no se si está en Internet, pero si googleas no la pongas, que pierde la gracia).

En Genbeta Dev| Solveet, mejora como desarrollador. Made in Spain.
Imágenes e información| René Descartes, Leonhard Euler, Pensamiento crítico.
El método: Discurso del método ¡cuidado, escrito en 1.637!

Comentarios cerrados
Inicio