Cuál es la forma adecuada para resolver problemas en Programación?

Cuando nos proponemos resolver problemas en programación siempre pasamos directamente al computador y empezamos a escribir código sin antes haber analizado en lo más mínimo el problema, o bueno lo vamos analizando y directamente vamos escribiendo el código y pues en algunos casos esta práctica funciona, claro está, cuando los problemas son sencillos o cuando eres un programador experimentado, no así con problemas más complejos y más aún cuando estas empezando a programar.

A veces pensamos que con hacer las cosas directamente vamos a ganar más tiempo, pero en realidad no es así, muchas de las veces el tiempo que se lleva programando un problema directamente sin haber hecho un análisis previo, es el doble o triple que si hubiésemos hecho previamente un análisis, por lo general se cometen muchos errores, que a la larga perdemos tiempo.

Un buen hábito y como buenos programadores es la de llevar una metodología para solucionar un problema por más mínimo que este sea. Es por eso que esta vez vamos a ver algunos pasos que debemos seguir para resolver un problema en programación y básicamente la idea es convertirlo en un hábito cada vez que vayamos a programar.

1. Análisis previo del problema

entender-el-problema

En esta etapa se debe definir y tener claro lo que el programa tiene que hacer junto con las tareas que debe realizar para llevar a cabo la solución, qué datos necesito para realizar la tareas, que formato deben tener los datos de entrada, de donde provienen los datos de entrada, como se obtienen esos datos, cómo interactúan los datos entre sí para obtener el resultado, muy importante tener claro cuál será el resultado que se desea obtener, tampoco dejar de lado las restricciones que puede haber al momento de procesar los datos..

De igual forma se debe analizar todos los escenarios que pueden darse ya que un cambio de escenario puede variar el resultado final del programa, siempre vale la pena cuestionarse y hacer la pregunta: y si pasa esto o aquello? qué comportamiento tomaría el programa.

Para clarificar dudas se debe pedir formatos (formas de presentación de los datos o de donde se obtienen los datos cuando se hacen de forma manual), fórmulas, realizar ejemplos y verificar los resultados.

Básicamente en este punto o fase se debe recoger todos los requerimientos y especificaciones del problema.

Este punto debe ser uno de los más importantes y críticos de la resolución de problemas ya que un mal análisis lleva a un mal diseño y posterior a un mal resultado.

En lo personal no importa el tiempo que demores en esta etapa, la idea es que quede bien claro todo, la primera vez puede que te demores un montón pero a medida que lo practicas vas cogiendo experiencia y si lo tomas como hábito en las próximas veces lo harás aún más rápido.

2. Diseño del Algoritmo

diseno-algoritmo

Una vez que tenemos claro el problema, después de haber definido todas la entradas y salidas que va tener el programa, también las tareas a realizar, es hora de diseñar el algoritmo y que irá de acuerdo a todas las especificaciones anteriores y posteriormente será implementado en un lenguaje de programación para ser ejecutado por la computadora.

El algoritmo se lo puede hacer de cualquier forma: Pseudocódigo o Diagrama de Flujo, la idea principal es que sea entendible, y no solo por el que lo diseñó si no por cualquier persona.

En conclusión en la etapa anterior se define qué es lo que hará el programa, en esta fase, se define como lo hará.

Algo importante de este diseño es que sea entendible para el programador que lo va implementar.

3. Configuración del entorno de desarrollo y codificación

codificacion

Esta etapa consiste en transcribir o adaptar el algoritmo a un lenguaje de programación, se tendrá que adaptar todos los pasos diseñados en el algoritmo con sentencias y sintaxis propias del lenguaje.

Verificar errores, organizar el código y comentarlo, son buenas prácticas que hacen programas más legibles y facilitan la depuración.

Previamente a la codificación se debe tener configurado el entorno de trabajo: IDEs, librerías, Frameworks (aunque este último no lo recomiendo si estas empezando a programar, es mejor aprender las cosas más básicas los fundamentos, todo a mano primero y luego los frameworks) y luego pasar el algoritmo al lenguaje de programación.

4. Compilación y pruebas

compilar-probar

La fase de compilación permitirá detectar errores en tiempo de compilación, ejecución y lógicos, y en el caso de Java se generará uno o varios archivos bytecode que serán ejecutados por la computadora.
En esta fase también es necesario realizar pruebas con una gran cantidad de datos para encontrar posibles errores y corregirlos.

5. Documentación y mantenimiento

documentacion

Por últimos se debe tener una documentación de todos los pasos hasta llegar a la solución del problema, a veces es un poco tedioso esta fase pero también es muy importante ya que muchas veces suceden modificaciones con el pasar del tiempo y estas se hace en algunos casos por otros programadores diferentes a los que lo crearon (que incluso cuando uno mismo va ha modificar no se acuerda que rayos hacia ese código, me ha pasado), y cuando un programa es pobre en documentación este proceso de modificación es totalmente complejo.

Vamos al grano, resolvamos un problema aplicando los pasos anteriores

1. Análisis previo del problema: Definir qué es lo que debe hacer el programa

Para este ejemplo he tomado un requerimiento sencillo y real, es un pequeño problema de una entidad bancaria, el gerente de negocios de esta entidad necesita un reporte (obviamente el reporte debe estar el sistema bancario) en el cual se muestre el porcentaje de morosidad (o índice de morosidad) por cada una de las agencia con las que cuenta la entidad.

Existen varias líneas de crédito que brinda la entidad, por ejemplo: Consumo, Microcréditos, Comerciales e Inmobiliarios, para considerar un crédito vencido se tiene en cuenta el número de días tope para cada línea, pasado este número de días el crédito se considera vencido.

Tener en cuenta que para cada línea de crédito tiene diferente número de días tope antes de considerar el crédito como vencido.

La finalidad de este reporte le permitirá al Gerente de Negocios evaluar la morosidad y tomar decisiones respecto a los créditos que brinda la entidad bancaria

Nota: Para tener una idea de lo que es la morosidad, bueno la morosidad o mora está ligada a todos los créditos en los cuales los clientes no están al día en el pago de sus cuotas, mientras más clientes estén atrasados en el pago de sus cuotas habrá un porcentaje de morosidad más alto.

Obtenemos el requerimiento detallado:

  • Calcular el índice de morosidad por agencia y consolidado de todas las agencias

DATOS PARA ENTENDER EL PROBLEMA:

Índice o porcentaje de morosidad es el cociente del total de saldos de créditos vencidos y el total de saldos de créditos.

Para el cálculo del índice de morosidad se considera la siguiente fórmula:

% MOROSIDAD = Cartera Vencida / Cartera total

CARTERA VENCIDA = Cartera Vencida de Consumo + Cartera Vencida de Microcrédito + Cartera Vencida de Crédito Comercial + Cartera Vencida de Crédito Inmobiliario

CARTERA TOTAL = Saldo de Deuda de Crédito de Consumo + Saldo de Deuda de Microcrédito + Saldo de Deuda de Crédito Comercial + Saldo de Deuda de Crédito Inmobiliario

A continuación se muestra las líneas de crédito y los días tope para cada una.

CARTERA VENCIDA DE CRÉDITOS DE CONSUMO

  • Para el cálculo de la cartera vencida de crédito de consumo, se considera el saldo de deuda de todas las operaciones vencidas superiores a 15 días (ello es desde el día 16 en adelante)

CARTERA VENCIDA DE MICROCRÉDITOS

  • Para el cálculo de la cartera vencida de microcrédito, se considera el saldo de deuda de todas las operaciones vencidas superiores a 15 días (ello es desde el día 16 en adelante)

CARTERA VENCIDA DE CRÉDITOS COMERCIALES

  • Para el cálculo de la cartera vencida de crédito comercial, se considera el saldo de deuda de todas las operaciones vencidas superiores a 30 días (ello es desde el día 31 en adelante)

CARTERA VENCIDA CRÉDITOS INMOBILIARIOS

  • Para el cálculo de la cartera vencida de crédito inmobiliario, se considera el saldo de deuda de todas las operaciones vencidas superiores a 60 días (ello es desde el día 61 en adelante)

Cómo podemos ver en esta fase nos empapamos del problema y de lo que quiere el usuario, para esto recogemos fórmulas utilizadas, buscamos el significado de términos utilizados y que suenen desconocidos, restricciones, hacer ejemplos manuales también permite entender que es lo que hará el programa.

2. Diseño del Algoritmo

Hasta ahora hemos definido el problema y tenemos la información que se necesita para resolverlo, ahora nos falta realizar las acciones necesarias para resolverlo, estas acciones que siguen una secuencia de pasos se llama algoritmo, en esta fase podemos encontrar varias formas de cómo resolver el problema, trataremos de usar la forma más eficiente, esta fase no tiene un formato establecido ya que depende mucho de la lógica de cada desarrollador, al mismo problema varios programadores pueden dar distintas soluciones.

En un principio podríamos utilizar cualquier solución, ya que la finalidad es obtener el resultado, pero a medida que tenemos experiencia vale la pena buscar la solución más eficiente.

Un consejo para diseñar un algoritmo complejo, es tratar de descomponer el problema en pequeños subproblemas y estos fraccionarlos aún en más pequeños hasta llegar a un nivel en que sea más fácil de solucionar. Este método se lo conoce técnicamente como diseño descendente (top-down) o modular.

Como mencioné, el diseño del algoritmo no es único y podríamos intentar hacerlo de diferentes formas.

De manera general, una solución podría ser la siguiente:

  1. Obtener los datos por agencia, línea de crédito y luego por los créditos vencidos de acuerdo a los días tope (Consumo y Microcrédito > a 15 dias, Comercial > 30 días, Inmobiliario > a 60 días) para cada línea de crédito.
  2. Almacenar el saldo de la cartera vencida para esa linea de crédito(Resultado paso 1).
  3. Repetir paso 1 y 2 para todas las líneas de crédito (Consumo, Microcréditos, Comercial, Inmobiliario) para la misma agencia.
  4. Sumar los saldos de todas las líneas de crédito obtenidas.
  5. Sumar los saldos de todos los créditos por agencia para obtener la cartera total.
  6. Obtener el índice de morosidad por agencia con los resultados obtenidos en los puntos 4 y 5, de acuerdo a la fórmula: % MOROSIDAD = Cartera Vencida / Cartera total
  7. Presentar en un reporte el nombre de la agencia, la cartera total, la cartera vencida y el índice de morosidad.
  8. Repetir los paso de 1 a 7 para cada agencia.
  9. Para obtener el índice de morosidad consolidado sumaremos la cartera vencida por cada agencia y lo mismo con la cartera total, y utilizamos la fórmula del punto 6

Hasta aquí tenemos resuelto el problema, aunque podríamos refinar el algoritmo por ejemplo asignar los resultados a variables, utilizar estructuras de control en lenguaje algorítmico, pero la idea es hacerlo sencillo y claro para cualquier programador de manera que sea fácil de implementar y dejar que él se encargue de variables y sentencias de control en el siguiente paso

Como mencioné no hay un estándar para el diseño y pueda que en otros casos se necesite hacer diagramas o hacer pseudocodigo, eso irá de acuerdo a la complejidad del problema, pero en fin lo importante no es hacer más diagramas o más pseudocódigo, lo importante es que el algoritmo quede claro para su implementación

Una técnica para diseñar algoritmos cuando se esta empezando y no se tiene mucha experiencia, es primero hacer los pasos de forma general y a partir de ahí refinarlo o pulirlo hasta llegar a la versión optima, la perfección y la eficiencia se la consigue con la práctica, es por eso que la única forma de mejorar en esta fase es practicar y practicar. 

Me olvidaba de algo, pueda que en este punto también se diseñen prototipos de pantallas con las que va interactuar el usuario.

3. Configuración del entorno de desarrollo para la codificación, compilación y pruebas

Lo siguiente es configurar el IDE cargar las librerías necesarias, reutilizar código que tal vez se tenga de otros proyectos, configurar algún Framework, dado sea el caso que se utilice.

Y posteriormente pasar el diseño del algoritmo al lenguaje de programación, también en este caso se implementan las pantallas, se verifica la sintaxis, se hace pruebas en la codificación por parte del programador y se depura el programa.

4. Documentación

Finalmente tenemos que generar la documentación de cómo funciona la aplicación para que el usuario la pueda manejar, esto se conoce como manual de usuario, manual técnico, la idea es que el usuario no tenga problemas al utilizar el software y los programadores en hacer modificaciones.

Bueno como puedes ver, hay algunas cosas que he omitido como por ejemplo la codificación y manuales, me hubiese gustado también mostrar más formatos, así mismo el algoritmo se pudo refinar más, pero bueno un poco por motivos de tiempo no fue posible, pero en si la idea es que aprendas lo esencial de ahí tu con tus propios problemas los puedes ir puliendo más.

Por último recalcar que esta es una buena práctica para empezar a programar como para tener un buen hábito, pero recuerda que ya para hacerlo de forma profesional y en equipos de programación y con proyectos se suele utilizar metodologías de desarrollo de software que también será otro tema que abordaremos en tutoriales más adelante.

Te sirvió de ayuda este tutorial?, tienes problemas con algún paso de los que hemos visto, tienes otra forma resolver problemas? o quieres añadir algún aporte, experiencia?. Si es así, no dudes en dejar un comentario será bienvenido.

Si este tutorial te sirvió de ayuda, comenta y comparte esta publicación. Además si quieres recibir tutoriales o artículos sobre programación Java o Java Web? SUSCRÍBETE al blog y recibirás un correo cada vez que hayan nuevas publicaciones.

Opt In Image
Programación Web Full Stack
Suscríbete ahora y recibe los mejores contenidos sobre Programación Web en tu correo.

Tus datos estarán protegidos y 100% libre de Spam

Full Stack Developer, JavaScript, PHP, Java, Spring, Laravel, Vuejs, Blogger, aprendiendo y compartiendo conocimientos. Cursos de Programación Web en: https://programacionfullstack.com/

Artículos Recomendados

Dejar un Comentario