Cómo llevar problemas a código
Es este artículo se listarán algunos consejos para resolver problemas utilizando código intentando resolver algunas de las dificultades más comunes.
Muchas personas que aprenden a programar tienen dificultades a la hora de llevar sus conocimientos técnicos a la vida real. Al presentarse un problema surge la duda ¿Cómo convierto esto en código?.
Esto es especialmente cierto para aquellos que aprenden programación en en un ambiente académico donde no se enfrentan con problemas reales sino con una serie de ejercicios diseñados para el aprendizaje de temas concretos.
La siguiente es una lista de consejos y sugerencias para facilitar este proceso:
1- Entender el problema
Puede ser tentador para alguien con amor por la programación comenzar con la codificación inmediatamente, pero primero sería más conveniente preguntarse: ¿Entiendo realmente el problema?
Para responder esta pregunta es necesario hacerse preguntas adicionales:
- ¿Qué es lo que se intenta resolver?
- ¿Qué elementos, entidades, variables y datos están involucrados?
- ¿Qué datos tendré al iniciar el problema? ¿En que formato?
- ¿Qué datos tengo que obtener para resolver el problema? ¿En que formato?
- ¿Cuáles son las fases o etapas que deben cumplirse para resolver el problema?
- ¿Cómo puedo saber si he resuelto el problema correctamente?
Todas estas preguntas pueden resolverse acudiendo a la fuente generadora del problema (consigna de un ejercicio, profesor, cliente, etc) pero nunca está de más consultarlo con nuestros pares. Intentar explicar a otros un problema es la mejor manera de comprender hasta que punto lo entendemos y si existe alguna duda o suposición.
2- Seleccionar las estructuras
Una vez comprendido el problema es importante determinar como será representado el conocimiento manejado dentro del código. Las opciones varían dependiendo del lenguaje de programación seleccionado pero entre las más comunes pueden nombrarse: variables, arreglos, clases y diccionarios.
Esto mismo debe realizarse para el conocimiento que tiene que almacenarse fuera del código y determinar si lo mejor es guardar este conocimiento en tablas de bases de datos, archivos de texto plano, variables de entorno, etc.
Esta decisión dependerá de la naturaleza del problema; aunque puede ser tentador utilizar aquellas tecnologías y estructuras con las que estamos familiarizados esto puede llevar a una representación incorrecta del problema lo que provocará un aumento de la dificultad de su resolución.
Para seleccionar la representación correcta deberíamos preguntarnos para cada porción de conocimiento:
- ¿Qué tipo de dato es?
- ¿Se relaciona con otros datos?¿De qué manera?
- ¿Que tipo de manipulaciones serán necesario realizarle?
- ¿Cómo debo poder acceder a este dato?
- ¿Cómo es necesario identificar este dato?
Para cada sección de conocimiento de nuestro problema deberemos seleccionar la estructura de representación más simple que permita la manipulación necesaria para la resolución del problema. Una estructura demasiado compleja puede entorpecer la resolución cuando sus características no son necesarias.
3- Dividir el problema en subproblemas
Una vez seleccionadas las estructuras a utilizar es recomendable separar el problema principal en subproblemas lo más sencillos posibles antes de iniciar la programación. Estos subproblemas se relacionarán entre si de manera secuencial o simultanea para generar la resolución del problema principal.
Esta técnica permite afrontar los subproblemas en cualquier orden a la vez que verificar nuestro entendimiento del problema y nuestra selección de las estructuras correctas. Para cada subproblema es necesario comprender:
- ¿Qué se quiere resolver?
- ¿Qué estructuras estarán involucradas?
- ¿Qué estructuras se crearán, eliminarán, modificarán o accederán?
- ¿Cómo puedo saber si resolví el subproblema?
4- Resolver con pseudocódigo
Es recomendable resolver cada subproblema generado con pseudocódigo antes de hacerlo con el lenguaje de programación seleccionado. Esto evita distracciones con respecto a la implementación final y las herramientas del lenguaje a utilizar y nos permite centrarnos en la lógica del problema.
Aunque existen algunos pseudocódigo con reglas especificas y una infinidad de editores donde realizarlos el objetivo en esta etapa es detallar la estructura del programa sin preocuparse por la sintaxis por lo que puede escribirse en un editor de texto o incluso en papel.
5- Convertir a código
En esta etapa de la resolución cuando los pasos lógicos a seguir ya han sido diseñados es posible seleccionar a partir de las opciones del lenguaje aquellas funciones o librerías que cumplan con el objetivo especificado en la instrucción del pseudocódigo de la manera más sencilla y eficiente.
Al tener separadas cada una de las instrucciones específicas en el pseudocódigo será más sencillo encontrar, utilizar y modificar código lo que agilizará el desarrollo.
6- Realizar Debug en el código
En lugar de programar la resolución completa del problema es preferible realizar pruebas sobre cada subproblema particular analizando las salidas y comparándolas con las esperadas. Es recomendable practicar el Test-driven development (TDD) o desarrollo guiado por pruebas donde se crean unidades de prueba en las que los requisitos son expresados en forma de pruebas que, al ser superadas por el código garantizan su correcto funcionamiento.
Espero que les sea de utilidad. Hasta la próxima!