Inicio / Algoritmia y Lógica de Programación / Diagramas de Flujo y Ordinogramas: Diseña antes de Programar

Diagramas de Flujo y Ordinogramas: Diseña antes de Programar

En el mundo de la arquitectura y la construcción, a nadie en su sano juicio se le ocurriría comprar cien mil ladrillos, contratar a un equipo de albañiles y decirles: «Empezad a poner ladrillos por ahí, ya iremos viendo sobre la marcha cuántas habitaciones tiene la casa». Es una receta garantizada para el desastre, el colapso estructural y la bancarrota. Toda casa comienza con un plano detallado, dibujado pacientemente por un arquitecto antes de mover un solo gramo de tierra.

Paradójicamente, en el desarrollo de software, el «Síndrome del Vaquero» (Cowboy Coding) es una epidemia. Muchos programadores júnior se sientan frente al ordenador, abren su entorno de desarrollo y empiezan a teclear código fuente inmediatamente después de leer el enunciado de un problema. Al carecer de un plano estructural, su código se llena de parches, las funciones se entrelazan de forma caótica y, a las pocas horas, se ven obligados a borrarlo todo y empezar de cero.

Para evitar este despilfarro de tiempo y energía, la ingeniería de software utiliza los Ordinogramas o Diagramas de Flujo. Estas herramientas gráficas son los planos arquitectónicos de nuestros programas. En este artículo, aprenderemos a leer este abecedario visual, descubriremos por qué es el idioma universal entre negocio y desarrollo, y diseñaremos nuestro propio diagrama paso a paso.

¿Qué es un Diagrama de Flujo (Ordinograma)?

Un diagrama de flujo es la representación gráfica y visual de un algoritmo. En el artículo anterior vimos cómo el pseudocódigo utiliza texto y lenguaje natural para estructurar los pasos de un problema. El ordinograma lleva esta abstracción un paso más allá, eliminando el texto denso y sustituyéndolo por formas geométricas interconectadas por flechas.

El poder de un diagrama de flujo reside en su agnosticismo tecnológico. Si dibujas un diagrama detallado de cómo debe funcionar el inicio de sesión de tu aplicación, se lo puedes entregar a un programador de Python, a uno de Java y a uno de C#, y los tres escribirán un código que hará exactamente lo mismo. Más importante aún: puedes poner ese mismo diagrama sobre la mesa en una reunión con el cliente, el director de marketing o el gerente (personas que no saben leer código), y entenderán perfectamente qué va a hacer el programa.

El Abecedario Visual: Simbología Estándar (ISO)

Para que un diagrama sea universal, no podemos inventarnos las formas. Existen estándares internacionales (como los de la ANSI y la ISO) que dictan qué significa cada figura geométrica. Estas son las piezas fundamentales que todo desarrollador debe grabar en su memoria:

1. El Óvalo (Terminal: Inicio / Fin)

Todo programa, función o proceso tiene un principio y un final absolutos. El óvalo se utiliza exclusivamente para marcar estos dos puntos. Todo diagrama debe empezar con un óvalo que diga «INICIO» y terminar con uno o varios óvalos que digan «FIN». Si un diagrama no tiene un punto de fin claro, el programa entrará en un bucle infinito y colapsará la memoria del ordenador.

2. El Paralelogramo (Entrada / Salida de Datos)

Los programas necesitan interactuar con el mundo exterior. Cuando el sistema tiene que pedirle un dato al usuario (por ejemplo: «Introduce tu edad») o tiene que mostrarle información por pantalla (por ejemplo: «Bienvenido al sistema»), utilizamos un paralelogramo inclinado. Representa la lectura (Input) o la impresión (Output) de información.

3. El Rectángulo (Proceso / Acción)

Es el bloque de trabajo pesado. Cualquier cálculo matemático, asignación de variables o transformación de datos ocurre aquí. Por ejemplo, calcular el IVA de un producto (precioFinal = precioBase * 1.21) o sumar un intento fallido a un contador (intentos = intentos + 1). En un rectángulo no hay decisiones, solo órdenes directas e incondicionales.

4. El Rombo (Decisión / Condicional)

Esta es la pieza más importante del diseño algorítmico, el momento en el que el programa adquiere «inteligencia». El rombo representa una bifurcación en el camino, una pregunta que solo puede responderse con SÍ (Verdadero) o NO (Falso). El flujo llega por la parte superior del rombo, el programa evalúa la pregunta (ej. «¿Es la contraseña correcta?»), y salen dos flechas distintas por los laterales. Dependiendo de la respuesta, el programa tomará una ruta u otra, alterando completamente el destino de la ejecución.

5. El Cilindro (Base de Datos / Almacenamiento)

Cuando el diagrama representa arquitecturas backend complejas, se suele introducir el cilindro. Representa el momento exacto en el que el código hace una pausa para guardar un registro en una base de datos MySQL o PostgreSQL, o para consultar si un usuario existe en los registros permanentes.

Diseñando un Algoritmo Real: El Cajero Automático

Para visualizar cómo estas piezas encajan entre sí, vamos a diseñar la lógica de un proceso cotidiano: sacar dinero de un cajero automático.

Si te lanzas a programar esto sin pensar, probablemente solo escribirías el «camino feliz»: el cliente pide dinero y se lo das. Pero un diseño visual en un diagrama de flujo te obliga a afrontar todas las decisiones (rombos) y excepciones.

El Flujo del Cajero (Visualización mental):

  1. [ÓVALO] INICIO.
  2. [PARALELOGRAMO] El cajero pide: «Introduzca su PIN».
  3. [ROMBO] Decisión: «¿Es el PIN correcto consultando al banco?»
    • Si es NO: [RECTÁNGULO] Sumar 1 al contador de errores. -> [ROMBO] «¿Errores = 3?» -> Si es SÍ: [PARALELOGRAMO] «Tarjeta Bloqueada» -> [ÓVALO] FIN.
    • Si es SÍ: El flujo continúa hacia abajo.
  4. [PARALELOGRAMO] Pide: «¿Cuánto dinero desea retirar?».
  5. [ROMBO] Decisión: «¿Es el saldo de la cuenta mayor o igual al dinero solicitado?»
    • Si es NO: [PARALELOGRAMO] Muestra: «Saldo insuficiente». -> Vuelve al paso 4 para pedir otra cantidad (esto crea visualmente un bucle).
    • Si es SÍ: El flujo continúa.
  6. [ROMBO] Decisión: «¿Tiene el cajero suficientes billetes físicos en la máquina?»
    • Si es NO: [PARALELOGRAMO] Muestra: «Cajero sin efectivo». -> [ÓVALO] FIN.
    • Si es SÍ: [RECTÁNGULO] Restar el dinero del saldo de la cuenta.
  7. [PARALELOGRAMO] Entregar los billetes físicos por la ranura.
  8. [ÓVALO] FIN.

Al dibujar este mapa de flechas y decisiones, hemos cubierto bloqueos de seguridad, validación de saldos y problemas de hardware (falta de billetes). Si traduces este mapa a código Java o Python bloque por bloque, es matemáticamente imposible que te pierdas y tu software será robusto desde el minuto uno.

Herramientas Modernas para Desarrolladores

En el pasado, estos diagramas se dibujaban a mano o utilizando software ofimático lento y frustrante. Hoy en día, la industria del software cuenta con herramientas profesionales para el diseño de arquitecturas:

  1. Draw.io (diagrams.net): Es la herramienta gratuita por excelencia. Funciona en el navegador, se integra con Google Drive y GitHub, y tiene todas las formas ISO estándar preconfiguradas.
  2. Lucidchart / Miro: Herramientas de pago orientadas a equipos empresariales. Permiten que varios desarrolladores colaboren en tiempo real moviendo cajas y flechas en una pizarra virtual infinita durante las reuniones de Sprint Planning.
  3. Mermaid.js (El enfoque «Docs as Code»): Esta es la herramienta favorita de los desarrolladores modernos. Mermaid te permite generar diagramas visuales escribiendo simples líneas de texto (estilo Markdown).

La ventaja de Mermaid.js es espectacular: como el diagrama se define mediante texto plano, puedes guardar el diseño junto a tu código fuente en Git. Si en el futuro cambia la lógica, modificas dos líneas de texto y el diagrama se redibuja automáticamente, evitando el problema clásico de que la documentación gráfica se quede obsoleta respecto al código real.

Conclusión: La Regla 1:10:100 del Software

El diseño previo mediante diagramas de flujo no es una burocracia inútil inventada por las universidades para aburrir a los estudiantes; es un mecanismo crítico de ahorro financiero. En la ingeniería de calidad existe un principio conocido como La regla del 1:10:100.

Esta regla dicta que descubrir y corregir un error lógico durante la fase de Diseño (viendo que una flecha del diagrama lleva al lugar equivocado) te cuesta 1 unidad de tiempo/dinero. Si no haces diagramas y descubres ese error mientras estás Programando, reescribir las funciones y clases te costará 10 veces más. Y si el error logra colarse en el código final y estalla en los servidores de Producción frente a los clientes, el coste de apagar el servidor, arreglar el daño, parchear la base de datos y lanzar una actualización de emergencia será 100 veces mayor.

Los mejores desarrolladores de software no son aquellos que escriben mil líneas de código por hora. Son aquellos que pasan el 70% de su tiempo analizando el problema, dibujando la lógica en pizarras y diagramas de flujo, asegurándose de que cada condicional y cada bucle tiene una salida segura. Cuando el plano es perfecto, escribir el código final se convierte en la tarea más fácil, rápida y aburrida de todo el proceso. Diseña primero, programa después.

Deje un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *