Cómo Resolver Problemas - Estrategias y Técnicas

Dominar un lenguaje de programación, un IDE, un framework, o conocer la teoría básica para la creación de programas no es suficiente. La capacidad de resolver problemas mediante lógica algorítmica es una habilidad que puede desarrollarse mediante el uso de estrategias y técnicas que nos darán la experiencia necesaria para irnos convertiendo gradualmente en verdaderos programadores.

A continuación te dejo algunas de las que me ayudaron en mi proceso de crecimiento como programador de computadoras.

Divide y Vencerás
Dividir un problema en subproblemas ayuda a reducir el grado de dificultad inicial del plantemiento original. Al ir resolviendo los subproblemas y conectando los resultados obtenidos se llega a la solución global. Al simplificar un problema en pasos o fases se encuentra su solución de forma más sencilla y directa.

Usa el enfoque E-P-S (Entrada-Proceso-Salida)
Este enfoque es el mismo utilizado por los Diagramas de Flujo de Datos (DFD) que aprendiste al empezar a programar. Si necesitas un software y videotutoriales para refrescar tus conocimientos o aprender a hacer DFD, te dejo este post sobre PseInt.

El enfoque E-P-S posee tres fases:

  • Entrada: Son los datos que recibirá el programa y que requiere procesar. Pueden ser digitados manualmente, leídos de un dispositivo o recibidos de otro programa.
  • Proceso: Son los procedimientos que operarán sobre los datos de entrada para obtener la solución al problema planteado. Transforma los datos en información.
  • Salida: Es el resultado de la fase de Proceso. Generalmente representa la solución al problema.

Replantea el problema
En algunos casos un problema en apariencia difícil puede volverse fácil si lo abordamos desde una perspectiva diferente. Al replantear el problema es posible que se vea distinto a como se pensaba al inicio, y es más probable que se llegue a su solución.

Incluso si al reformular el problema no conduce a una comprensión inmediata, puede ayudar de otras maneras. Por ejemplo, puedes comentar el nuevo enfoque a quien te planteó el problema para saber si lo has comprendido bien, y si tu potencial solución se aproxima al resultado esperado.

Eric S. Raymond, en su obra La Catedral y el Bazar, en su regla No. 12 dice: "Frecuentemente, las soluciones más innovadoras y espectaculares provienen de comprender que la concepción del problema era errónea". Quizá estás enfocando mal el problema, y encuentres la solución deseada reiniciando tu proceso de análisis. Y quizá también ésta sea muy buena.

Dibuja el problema
Esta estrategia va de la mano con las 2 anteriores. Maqueta tu solución en un pedazo de papel, una pizarra, una ventana de vidrio o usando un software especializado. No tienen que ser gráficos perfectos, ni siquiera bien dibujados. Incluso pueden ser solo esbozos y rayas. Lo importante es plasmar visualmente tu idea, de tal forma que la puedas "ver" y "tocar" para completar los detalles, someterla a revisión de terceros y perfeccionarla.

Cuéntale tu solución a alguien
Tanto para comprender un problema como para validar tu solución, explícaselo a alguien más. Puede ser un colega, un compañero de clases, tu jefe o la persona que te dio el problema. A medida que lo expliques, tu otro yo, tu subconciente, te irá advertiendo de "huecos" en tu racionalización del problema o en la lógica de tu solución, permitiéndote rellenarlos, aclarar tu comprensión, y lo mejor, recibirás valioso feedback.

Esta técnica es como jugar al frontón, ese juego en el que golpeas una pelota enviándola contra la pared y ésta regresa rápidamente a ti para un nuevo golpe. Sólo asegúrate que tu interlocutor "juegue" legítimamente contigo, poniéndote atención y esforzándose por comprender tu idea. O sea, que no sea una mala pared. Créeme. Antes que termines de hablar ya habrás detectado, conciente o inconcientemente, algún detalle nuevo del dominio del problema que no habías considerado o algún elemento por mejorar en tu solución.

Usa el método de la línea recta
Diseña la solución a cada problema con el flujo básico y mínimo para que funcione. No te preocupes al inicio de los casos especiales, las validaciones de datos y los posibles cursos de acción basados en condiciones que puedan o no ocurrir durante la ejecución de tu solución. Haz que tu prototipo inicial funcione primero. Luego podrás irle añadiendo todas esas capas de complejidad, una a la vez, sobre una base de tu programa 100% funcional.

Replantea tu solución
A veces nuestra solución está sobretrabajada, está tardando más de lo planeado en ser implementada o nos está costando mucho construirla, ya sea por razones tecnológicas, falta de conocimiento o habilidades técnicas. En estos casos, conviene considerar otra posible solución, más simple, más directa o con menos funcionalidades que la actual.

Eric S. Raymond, citando el Capítulo 11 del clásico libro The Mythical Man-Month (El Mítico Hombre-Mes) de Fred Brooks, en La Catedral y el Bazar, en su regla No. 3 dice: "Contemple desecharlo; de todos modos tendrá que hacerlo... Diciéndolo de otro modo: no se entiende cabalmente un problema hasta que se implementa la primera solución. La siguiente vez quizás uno ya sepa lo suficiente para solucionarlo. Así que si quieres resolverlo, disponte a empezar de nuevo al menos una vez...

No hay que vacilar en desechar alguna característica superflua si puede hacerlo sin pérdida de efectividad. Antôine de Saint-Exupery (un aviador y diseñador de aviones, cuando no se dedicaba a escribir libros clásicos para niños) afirmó que:

13.- 'La perfección (en diseño) se alcanza no cuando ya no hay nada que agregar, sino cuando ya no hay algo que quitar'.

Cuando el código va mejorando y se va simplificando, es cuando sabe que está en lo correcto."

Raymond también incluye en su documento esta interesante regla: 2.-"Los buenos programadores saben qué escribir. Los mejores, qué reescribir (y reutilizar)". Es probable que parte de tu código pueda ser reutilizado, adaptándolo a una nueva estrategia de solución, así que la experiencia obtenida (y el código escrito) son ya de hecho una ganancia.

Toma un descanso
Cuando estés atorado por no comprender un planteamiento, no sepas cómo estructurar un algoritmo, no domines una herramienta, o estés física o mentalmente cansado, lo mejor es que te des un break. Tómate un descanso lejos de tu lugar de trabajo, sal a caminar, juega con tu mascota, ve a la tienda, haz algún trabajo manual o doméstico, o ve a tener algo de interacción social real conversando con amigos, parientes o vecinos. En resumen, aléjate de la pantalla, cambia de contexto, deja que tu subconsciente trabaje por ti. Verás que al volver con la mente despejada encontrarás fácilmente la solución, o al menos avazarás en la dirección correcta para solucionar el problema que intentas resolver.

Para finalizar, algunos recursos muy interesantes:

El siguiente vídeo, Estrategias para resolver problemas, está basado en el proceso del matemático húngaro George Pólya para resolver problemas:

Te dejo la transcripción de ese vídeo...

  1. Entiende el problema. Lee y analiza cuidadosamente. Lee una vez más. Ahora pregúntate: “¿qué debo encontrar?”
  2. Diseña un plan. Haz un diagrama, o resuelve un problema similar pero más sencillo. Si una fórmula o solución es aplicable, úsala. Ve de atrás hacia adelante. Usa el sentido común.
  3. Pon en marcha el plan. Si surgen obstáculos, se persistente. Si fuera fácil no sería un problema.
  4. Revisa y comprueba. Pregúntate: “¿he resuelto todas las cuestiones implicadas en el problema?”

...y la imagen del sitio naps.com.mx:


Te dejo también el vídeo, George Pólya - Estrategias de Resolución de Problemas, que explica con más detalle los 4 pasos propuestos por él para resolver problemas:


Espero que estos recursos te ayuden mucho en tu formación y crecimiento como programador como me ha ayudado a mí. Si sabes de otros vídeotutoriales que valga la pena incluir en este blog, házmelo saber. No olvides dejar tu comentario y compartir el post con quienes consideres que pueda serle útil. Si encuentras algún link roto o vídeo que no aparece, por favor avísame para corregirlo.

Comentarios