Algoritmos, Diagramas de Flujo y el Arte de Programar

0
1585
Aún recuerdo los días en los cuales visualizaba mi futuro como programador. Mi interés principal era estudiar Ingeniería En Sistemas Computacionales en la Universidad Tecnológica de Panamá, o al menos algo relacionado al desarrollo de software. Afortunadamente, eso no sucedió y me decidí por Ingeniería Electomecánica, donde además de adquirir  conocimientos de Ingeniería Eléctrica, electrónica y mecánica, también he podido adquirir conocimientos sobre programación. No fue necesario invertir 5 años de mi vida en aprender algo que con mucho esfuerzo cualquiera de nosotros puede aprender. ¿Mi opinión personal sobre la programación? Arte. Programar es un arte, algo que no se forma, ni se enseña, ni se aprende sino aquello con lo que se nace, un talento.

Para programar no es necesario conocer un lenguaje de programación. De hecho cada día de nuestras vidas utilizamos algoritmos. ¿Cuál es la definición de algoritmo? Según la RAE:

Conjunto ordenado y finito de operaciones que permite hallar la solución de un problema.

Una definición de diccionario. Buscando un poco más en Internet encontré una definición un poco más convincente:

Se trata de una serie de instrucciones o reglas establecidas que, por medio de una sucesión de pasos, permiten arribar a un resultado o solución.

Mi definición personal:

Un algoritmo no es más que la serie de pasos a seguir para resolver un problema

Como mencioné hace un rato, cada día de nuestras vidas estamos aplicando algoritmos, aún sin darnos cuenta. Todos y cada uno de nosotros(as) hemos definido una forma para resolver nuestros problemas y vivir nuestras vidas. Quizás el declarar que un algoritmo nos lleva a resolver problemas puede hacernos pensar exclusivamente en situaciones en las cuales tenemos algún inconveniente. Los algoritmos van mucho más allá. Están constituidos por aquellas metodologías que empleamos para obtener resultados, al realizar procesos o cualquier tipo de tarea.

Veamos un ejemplo. Pensemos en un adolescente (lo llamaremos Nick) que vive en una casa junto a sus padres y hermanos, asiste al colegio, los sábados va a practicar fútbol y los domingos practica natación. Este chico va al colegio en su bicicleta, a menos que esté lloviendo. En dicho caso, viaja utilizando el servicio de transporte público. Los sábados viaja junto a su padre, quien lo deja en el campo de fútbol de camino al trabajo, siempre y cuando se levante temprano. Las veces que no se levanta temprano le toca tomar un taxi.

Este chico tiene un algoritmo bien definido que le permite realizar sus actividades. Nosotros podemos representar este algoritmo utilizando diagramas de flujo. Los diagramas de flujo son una representación gráfica de un algoritmo. Utilizan símbolos ya definidos para representar cada paso dentro del algoritmo.

programar

En el gráfico mostrado se pueden apreciar algunos aspectos que procedo a describir:

  • Todo diagrama de flujo debe ser finito, es decir, poseer un principio y un final.
  • Siempre debe haber un camino que lleve desde el principio del flujo hasta el final de este, asegurando que el proceso sea finito.
  • El símbolo utilizado para el inicio del flujo es el mismo que para el final.
  • Los procesos, que es donde ejecutamos acciones, los representamos por un rectángulo.
  • Las flechas que unen los bloques son las que indican la dirección que lleva el flujo.

Si consideramos el ejemplo  de Nick. Crearemos un diagrama de flujo que represente el algoritmo que el utiliza para manejar su vida, dependiendo del día y la situación en la que se encuentre.

programar

Aquí tenemos la primera parte del diagrama de flujo de la vida de Nick. Al iniciar el día, se debe tomar una decisión, la cual es representada por un rombo. Esta decisión depende de si es un día de semana o no. Si es un día de semana, se ejecuta un proceso (Prepararse para ir al colegio). En caso de que no sea un fin de semana, entonces se debe tomar otra decisión. Si es un sábado, se ejecuta otro proceso (Prepararse para ir a jugar fútbol). En caso de que el día en cuestión no sea sábado, entonces por lógica sabemos que es domingo, ya que inicialmente descartamos que fuese un día se semana durante la primera decisión. En caso de ser un día domingo, Nick debe prepararse para ir a la piscina.

Veamos que sigue en el diagrama de flujo de la vida de Nick.

Diagrama-de-Flujo-3

Ahora vemos el diagrama de flujo expandido. Podemos seguir expandiendo este diagrama hasta incluir todos y cada uno de los procesos y decisiones que Nick debe tomar durante el día. Sin embargo, esto requeriría de mucho espacio. El gráfico sería enorme tan sólo para un día. Nuestro diagrama necesitamos finalizarlo, ya que hasta ahora no posee un final.

Diagrama-de-Flujo-2

Como vemos, todos los caminos se unen y se conectan a un solo proceso (Actividades del resto del día) el cual puede incluir múltiples acciones y la toma de una o varias decisiones. Luego de este proceso, se llega al final del flujo que es el Fin del día.

A través de los diagramas de flujo podemos representar cualquier tipo de algoritmo. Podemos considerar, por ejemplo, que una vez que Nick llega a la piscina el día domingo, este se propone la tarea de dar 10 vueltas nadando de un extremo a otro de la piscina. Para ello, Nick debe iniciar un ciclo que se repita durante 10 veces para luego llegar al final del proceso. Esto lo podemos representar de la siguiente manera:

Diagrama de Flujo

Una vez se ejecutan los procesos estándar al llegar Nick a la piscina, este inicia un ciclo repetitivo que lo llevará a repetir una instrucción cada vez que complete una vuelta nadando a la piscina. Cuando la cantidad de vueltas iguala el número 10, entonces se ejecuta la secuencia final donde Nick sale del agua, se cambia de ropa y se va de la piscina.

Como vemos, los diagramas de flujo son excelentes para representar procesos, comportamientos, pasos a seguir, es decir, algoritmos. Pero, ¿no tenían los algoritmos algo que ver con la programación? ¿qué tiene que ver la vida de Nick con un programa de computadoras?

Programar es el arte y la esencia de transformar algoritmos a un lenguaje de programación. Los lenguajes de programación son estructuras bien definidas basadas en símbolos y en palabras derivadas del idioma inglés (sentencias). La combinación de símbolos y sentencias le permite a las computadoras recibir y ejecutar instrucciones dadas por el usuario. Dentro del mundo de las computadoras, el programador es un Dios donde cada instrucción es ejecutada al pie de la letra por el ordenador. El problema es que las computadoras son “tontas”. No son capaz de tomar decisiones por sí mismas y necesitan que el usuario contemple cada una de las situaciones que se pueden presentar.

Por ejemplo, a pesar de que Nick posee un algoritmo bien definido para cuando va a la piscina, es posible que algún día Nick vaya a nadar y ésta se encuentre cerrada, por lo que Nick tendrá que tomar una decisión. Al tratarse de un ser humano, Nick puede razonar y tomar la mejor decisión en base a la situación que se le presente. Si fuese una computadora y no Nick quien ejecuta el algoritmo cuyo diagrama de flujo ya mostramos, la computadora no tiene una instrucción definida en caso de que la piscina este cerrada. Ella no podrá seguir ejecutando el algoritmo ya que no le hemos dado instrucciones sobre cómo actuar ante una situación dada.

Aquí es donde entramos en el dilema de la inteligencia artificial. El ser humano como especie habita en el Planeta Tierra, donde se dan toda clase de situaciones a diario, tantas que no somos capaces de predecir lo que va a suceder. Vivimos en un sistema caótico.

La definición de Teoría del Caos, según la Wikipedia, dice:

La teoría del caos es la denominación popular de la rama de las matemáticas, la física y otras ciencias (biología, meteorología, economía, etc.) que trata ciertos tipos de sistemas complejos y sistemas dinámicos muy sensibles a las variaciones en las condiciones iniciales. Pequeñas variaciones en dichas condiciones iniciales pueden implicar grandes diferencias en el comportamiento futuro, imposibilitando la predicción a largo plazo. Esto sucede aunque estos sistemas son en rigor determinísticos, es decir; su comportamiento puede ser completamente determinado conociendo sus condiciones iniciales.

La inteligencia artificial implica que una computadora pueda estar preparada para afrontar cualquier tipo de situación que se le presente, lo cual es virtualmente imposible dentro de un sistema caótico como el nuestro. Un ser humano (o grupo de seres humanos) necesitaría muchos años para poder programar en una computadora todas las instrucciones a seguir en un momento dado. Simplemente no podemos prever que pasará, de acuerdo a la definición de la Teoría del Caos, donde hasta los cambios más pequeños a las condiciones del sistema son capaces de lograr cambios enormes en el resultado final.

Si por ejemplo Nick se levanta temprano y viaja con su papá para ir a la piscina, el resultado sería completamente diferente si Nick se levanta 10 minutos tarde y le toca viajar en taxi, viajar en bicicleta o caminar. Quizás esos 10 minutos que tardó en levantarse puedan impedirle que conozca al amor de su vida, quien se fue de la piscina 5 minutos antes de que Nick llegara.  Si va en bicicleta podría tener un accidente o quizás conocer a un nuevo amigo con el que algún día se hará socio y fundará una compañía multimillonaria. Este es el principio de la película “El Efecto Mariposa”, donde el actor principal tiene la capacidad de causar pequeñas modificaciones a su vida en momentos específicos, lo cual causa cambios enormes en su forma y estilo de vida.

A medida que avanzamos en el tiempo empezamos a buscar y encontrar nuevas formas de llegar a la Inteligencia Artificial. Hablamos de redes neuronales y estrategias para enseñar a las computadoras a aprender. En lo personal pienso que algún día se logrará este propósito y las computadoras simplemente tomarán la decisión de eliminar a la humanidad, tal como vimos en Terminator, en la trilogía de Matrix o en la película The Avengers: Age of Ultron.

programar

No todo tiene que ser malo. Quizás algún día se logre la inteligencia artificial para beneficio de la humanidad. Somos la única especie en la cual tratamos de destruirnos nosotros mismos después de todo. Esto no es una actitud inteligente y es probable que las computadoras posean en su momento un nivel de entendimiento superior al nuestro, siendo capaces de “vivir” en armonía junto los seres humanos. La Inteligencia Artificial se logrará algún día y espero seguir viviendo (o no debería?) para poder verlo.

Mientras ese día llega, aquellos a quienes nos interesa la programación seguiremos haciendo nuestros programas, sea en computadoras o para microcontroladores. No necesitamos tomar en cuenta cientos de miles de situaciones, ya que las pequeñas tareas que nos proponemos casi siempre están basadas en algoritmos finitos donde apenas necesitamos considerar unas cuantas condiciones. Desarrollar inteligencia artificial es un reto en el que se ha estado trabajando por décadas; los programas que hagamos en Arduino, Java, Raspberry o Fischertechnik no necesitan pensar por sí mismos sino seguir las órdenes que les demos como sus programadores. Esto, sin duda, no nos llevará a ser secuestrados o exterminados por nuestros proyectos de electrónica.

Para concluir me gustaría definir algunos conceptos en base a lo que hemos escrito en este artículo:

  • Un algoritmo es la serie de pasos a seguir para resolver un problema
  • Un diagrama de flujo es la representación gráfica de un algoritmo
  • Programar es transformar algoritmos a instrucciones, utilizando un lenguaje de programación. Estas instrucciones serán interpretadas y ejecutadas por la computadora que hayamos programado.
  • Ser un programador no es sinónimo de ser un genio o un científico loco. Ser un programador no es más que ser una persona que es capaz de utilizar un lenguaje de programación (basado en símbolos y palabras en inglés) para darle instrucciones a una computadora y lograr que ésta haga lo que necesitamos que haga por nosotros.

Conceptos básicos del mundo de la programación. Programar es un arte, algo que no se forma, ni se enseña, ni se aprende sino aquello con lo que se nace, un talento.

 

 

 

Compartir
Ingeniero Electromecánico, graduado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.