Bienvenidos a nuestro primer módulo del curso: "Descubriendo el mundo de la programación". En este módulo aprenderemos algunos conceptos básicos de resolución de problemas e introduciremos el proceso que utilizaremos todo el tiempo, que es el análisis del problema, el diseño de la solución y la implementación y prueba de dicha solución. Esto lo haremos introduciendo dos conceptos fundamentales en Python que son las variables y las funciones, y una técnica que esperamos sea muy útil que conocemos como dividir y conquistar. Por último, también introduciremos nuestro ambiente de trabajo. Recordemos que nuestra meta en este curso es programar un computador para resolver problemas interesantes, y teniendo esto en mente hagamos algunos acuerdos claves. Siempre que hablemos de solucionar un problema, nos estaremos refiriendo a construir un programa. Y como programadores contamos con unas herramientas para construir esa solución a lo largo de un proceso, el que ya mencionamos y que ahora vamos a abordar con más detalle; describiendo el objetivo de cada una de las etapas y las herramientas con las que contamos en cada una. Recordemos que las etapas son: análisis del problema, diseño de la solución, y construcción y prueba de la solución. Programar no es que sea una actividad difícil, pero si es una actividad compleja porque involucra a varios elementos y habilidades complementarias. La habilidad más importante, sin duda, es la de resolver problemas y esta es una combinación de otras habilidades, como la comprensión de lectura, la abstracción, la descomposición, el razonamiento abstracto y la creatividad. Noten que ser capaces de resolver problemas, entonces, es independiente de que haya computadores involucrados. Por ejemplo, la comprensión de lectura y la abstracción son protagonistas en la primera etapa, también conocida como análisis del problema. Les aseguro que es casi imposible construir una buena solución si no se han leído con cuidado las condiciones de lo que se está pidiendo y las restricciones que se deben tener en cuenta para la solución. Entender el problema es fundamental. Mi recomendación es: nunca empiecen a programar, en nuestro caso a escribir Python, sin antes entender lo que se les está preguntando y una vez entendido el problema, ahí sí lo debemos especificar. Eso significa que debemos tener claridad sobre de qué se quiere resolver, de dónde partimos y a dónde queremos llegar. Por lo tanto, como resultado de esta etapa, tendremos la especificación del problema en términos de entradas, salidas y restricción. Ahora bien, la descomposición y la creatividad son claves en la segunda etapa conocida como diseño de la solución. Aquí aparece una de las técnicas que esperamos sea muy útil para resolver problemas: dividir y conquistar. La idea central de esta técnica es descomponer el problema en problemas más pequeños o simples, buscar solución para cada uno y luego componer adecuadamente estas soluciones para resolver el problema original. En esta etapa aparece otro componente muy importante de programar y es el pensamiento algorítmico, que es la habilidad para describir cómo se llega a la solución de un problema siguiendo una serie de instrucciones. Con seguridad, cada uno de nosotros resuelve muchos problemas en un día, bañarse o ir a un lugar específico, pero como es una actividad tan usual, asumimos muchas cosas y damos instrucciones muy complejas. Ahí está la clave. Para programar, debemos ser capaces de explicarle a alguien, o más bien, darle órdenes al computador con suficiente detalle. Por ejemplo, en lugar de decirle a alguien, frita un huevo, le vamos a tener que decir: prende el fogón de la estufa, pon una cacerola con mantequilla, espera a que se derrita la mantequilla, etcétera. Y como resultado de esta etapa habremos definido una estrategia de solución y unos algoritmos que describen cómo llegaremos a dicha solución. La tercera etapa es la construcción de la solución, en donde vamos a implementar la estrategia de solución diseñada, traduciendo nuestros algoritmos a un lenguaje que entienda el computador. Noten que solo en este punto es que requerimos un lenguaje de programación como Python. Y para ser honesta, casi con seguridad, esta es la parte más sencilla, pero se confunde con la parte central de aprender a programar. Así que muchas veces me van a escuchar diciendo que aprender a programar no es lo mismo que aprender un lenguaje de programación, y por lo mismo, muchos conceptos de este curso podrían aplicarse a cualquier otro lenguaje de programación. Otra parte fundamental en esta etapa es probar que nuestra solución funciona. En este curso no aprenderemos un proceso formal para realizar pruebas. Sin embargo, es importante que tengamos presente que debemos diseñar casos, así sean básicos, para mostrar que nuestro programa se comporta como es de esperar, y con la práctica empezaremos a identificar qué casos son más interesantes para incluir en nuestras pruebas. Después de este proceso; como resultado, en nuestro caso; tendremos un programa en Python que resuelve el problema originalmente planteado. Antes de introducir nuestro ambiente de trabajo, quisiera hablar un poco más sobre los algoritmos, dado que son la manera como expresaremos las soluciones a los problemas que nos planteen. Ya sabemos que un algoritmo es una secuencia de pasos e instrucciones para resolver un problema. Es muy importante tener claro que podemos expresar un algoritmo en español o en cualquier otro idioma. Es decir, que los algoritmos son independientes del lenguaje de programación, y por lo tanto, un algoritmo podría ser ejecutado a mano, con papel y lápiz o con la ayuda de una calculadora, o podría ser implementado en un lenguaje de programación como Python. Los invito a que hagan un ejercicio con su mamá, o su novio, o una amiga. Pídanle que haga un dibujo simple, pero en serio simple, y que no se los muestre; pero en cambio, escriba las instrucciones para que ustedes lo puedan reproducir. Sigan las instrucciones y al final comparen los dibujos. Honestamente, ¿qué tan parecidos son? Aprovechemos este momento para una pregunta. Ahora que tenemos una idea más clara de que es un algoritmo, hablaremos sobre cómo estos algoritmos se convierten en programas de computador. Como mencionamos, un algoritmo puede estar expresado en español o en pseudocódigo, que es la manera como le llamamos a una descripción informal de un algoritmo, en el sentido de que no está escrita en un lenguaje que entienda el computador. Una vez nosotros como programadores, traducimos ese pseudocódigo a un lenguaje que entienda el computador como lo es Python, tenemos el código fuente de un programa. Pero en realidad el computador no entiende Python. Lo que sucede es que existen intérpretes o compiladores que traducen el código fuente a lenguaje de máquina, unos y ceros, y entonces es cuando tenemos un programa de computador. Para que este proceso sea más sencillo podemos apoyarnos en herramientas, como por ejemplo el entorno de desarrollo o el Ambiente Integrado de Desarrollo, IDE por su nombre en inglés. En nuestro caso, el IDE que vamos a utilizar es Spyder, donde podremos escribir nuestro código, ejecutarlo y visualizar el resultado de una manera sencilla. Espero, entonces, que quede clara la diferencia entre el lenguaje de programación y la herramienta que utilizamos para facilitar la escritura de programas. Aquí vemos como se ve Spyder, cuyo elemento más importante es el editor enriquecido, que nos muestra errores de sintaxis y que utiliza colores, entre otras ayudas, para facilitar la comprensión del código y desde donde podemos ejecutar expresiones como las de los ejemplos aquí mostrados. Y aquí vemos la línea de comandos de un sistema operativo Windows. Por supuesto, también hay uno en Mac, conocida como Terminal y es un ambiente no gráfico, interactivo, que permite ejecutar comandos directamente sobre el sistema operativo y por lo tanto también podemos adoptar las mismas expresiones. Pero no se preocupen que a continuación justamente tenemos una actividad para que exploren nuestros ambientes de trabajo.