1. Introducción a la Computación
Las computadoras han revolucionado la humanidad en las últimas décadas, transformando nuestra vida diaria e impulsando avances en todas las disciplinas. Hoy en día, los teléfonos inteligentes superan en potencia a las supercomputadoras de hace 20 años. Estamos entrando en la era del “internet de las cosas”, donde todos los dispositivos estarán conectados.
Sin embargo, las computadoras no son inteligentes por sí solas; solo ejecutan instrucciones humanas. La esencia de la computación es la resolución de problemas, pero sigue siendo el usuario quien debe analizar y desarrollar soluciones. Las computadoras solo automatizan esas soluciones.
La computación es fundamental en múltiples áreas: desde la detección de exoplanetas en astronomía, simulaciones de reacciones químicas, análisis de textos históricos, hasta la predicción del clima. Además, la tecnología ha transformado campañas políticas, marketing y redes sociales. En el futuro, el pensamiento computacional será una habilidad básica en casi todas las disciplinas y empleos.
La computación no es solo programación ; esto es solo el punto de partida.
1.1. Historia de la computación: desde las máquinas mecánicas hasta la era digital.
La historia de la computación es un viaje fascinante que abarca desde máquinas mecánicas rudimentarias hasta los sistemas digitales avanzados que impulsan nuestra sociedad actual. Este recorrido no solo refleja el progreso tecnológico, sino también su profundo impacto en la sociedad, la ética y el medio ambiente.
De las Máquinas Mecánicas a la Era Digital
El origen de la computación se remonta a dispositivos mecánicos como el Ábaco (utilizado desde la antigüedad) y el Mecanismo de Antikythera , una calculadora analógica griega del siglo II a.C. Estos inventos sentaron las bases para el desarrollo de herramientas más complejas. En el siglo XIX, Charles Babbage diseñó la “Máquina Analítica”, considerada el precursor de las computadoras modernas, mientras que Ada Lovelace escribió lo que muchos consideran el primer algoritmo destinado a ser ejecutado por una máquina.
La Revolución Industrial marcó un punto de inflexión, donde la automatización comenzó a transformar la producción y la economía global. Sin embargo, fue en la mitad del siglo XX cuando emergió la verdadera era digital con la creación de las primeras computadoras electrónicas, como el ENIAC (1945), y el desarrollo de lenguajes de programación como Fortran y COBOL. Estos avances permitieron resolver problemas matemáticos complejos y gestionar grandes volúmenes de datos, revolucionando sectores como la ciencia, la medicina y los negocios.
En la década de 1980, la introducción de computadoras personales (PCs) democratizó el acceso a la tecnología, seguida por la explosión de Internet en los años 90, que conectó al mundo de maneras inimaginables. Hoy, vivimos en la era de la inteligencia artificial (IA) , donde sistemas autónomos y modelos generativos están redefiniendo industrias enteras, desde la atención médica hasta el transporte.
Impacto Social de la Evolución Tecnológica
Cada etapa de la evolución de la computación ha tenido un impacto significativo en la sociedad. Durante la Revolución Industrial, las máquinas mecánicas aumentaron la productividad pero también desplazaron trabajadores, creando tensiones sociales. De manera similar, la era digital ha generado oportunidades sin precedentes, pero también nuevos desafíos. Por ejemplo:
- Automatización y empleo : La IA está transformando el mercado laboral, eliminando algunos empleos mientras crea otros. Esto plantea preguntas sobre cómo preparar a la fuerza laboral para este cambio.
- Acceso a la información : Internet ha democratizado el acceso al conocimiento, pero también ha exacerbado las desigualdades digitales, dejando a comunidades marginadas sin acceso a tecnologías esenciales.
- Privacidad y vigilancia : Las plataformas digitales han mejorado la comunicación, pero también han incrementado preocupaciones sobre la privacidad y el uso indebido de datos personales.
Sostenibilidad: El Costo Ambiental de la Tecnología
Los avances tecnológicos han traído consigo un costo ambiental significativo. Según estimaciones recientes, las actividades relacionadas con la computación, como el uso de centros de datos, la minería de criptomonedas y el entrenamiento de modelos de IA, consumen entre el 3% y el 5% de la electricidad mundial. Este consumo energético contribuye al calentamiento global y pone en peligro los recursos naturales.
Además, la rápida obsolescencia de dispositivos electrónicos ha generado enormes cantidades de residuos electrónicos (e-waste). Solo en 2022, se produjeron más de 50 millones de toneladas de e-waste, gran parte de los cuales no se recicla adecuadamente. Este problema subraya la necesidad de adoptar prácticas sostenibles en el diseño y uso de tecnologías (SEP-Sustainability).
Por ejemplo, el desarrollo de hardware modular y software eficiente puede reducir el consumo de energía y prolongar la vida útil de los dispositivos. Además, iniciativas como la economía circular y el derecho a reparar buscan minimizar el impacto ambiental de la tecnología. Estas soluciones no solo benefician al planeta, sino que también promueven una sociedad más equitativa al hacer que la tecnología sea más accesible y duradera.
1.2. Pilares Fundamentales de la Computación
La computación se sustenta en tres pilares fundamentales: hardware , software y factor humano . Estos elementos no solo forman la base técnica de cualquier sistema informático, sino que también tienen un impacto significativo en la sociedad, la ética y el medio ambiente.
Hardware: La Base Material de la Computación
El hardware engloba los componentes físicos y tangibles de un sistema informático, como la CPU (unidad central de procesamiento), la memoria RAM, el disco duro, los periféricos (teclado, mouse, monitor) y dispositivos de almacenamiento. Sin él, no existiría una base material para ejecutar procesos computacionales. Sin embargo, detrás de la fabricación de hardware hay importantes consideraciones éticas y ambientales.
- Impacto Ambiental y Sostenibilidad :
- La producción de hardware depende de la extracción de minerales raros como el coltán, el litio y el cobalto, que son esenciales para fabricar componentes electrónicos. Este proceso tiene graves consecuencias ambientales, como la deforestación, la contaminación del agua y la pérdida de biodiversidad en las regiones donde se extraen estos recursos.
- Desde una perspectiva ética, es crucial reflexionar sobre cómo diseñamos y utilizamos dispositivos electrónicos. Por ejemplo, fomentar la creación de hardware modular que facilite su reparación y reutilización puede reducir el desperdicio electrónico (e-waste). También es importante promover políticas que regulen la extracción responsable de minerales y alienten prácticas sostenibles en la industria tecnológica.
Software: Las Instrucciones que Dan Vida al Hardware
El software se refiere a los programas y aplicaciones intangibles que dan instrucciones al hardware para realizar tareas específicas. Incluye desde sistemas operativos hasta aplicaciones de usuario final, como navegadores web, procesadores de texto o videojuegos. El software se divide en dos categorías principales:
- Software de sistema : Gestiona el hardware y proporciona una plataforma para ejecutar otras aplicaciones (por ejemplo, sistemas operativos).
- Software de aplicación : Diseñado para satisfacer necesidades concretas del usuario, como editores de imágenes o herramientas de productividad.
Sin embargo, el desarrollo y distribución de software plantea importantes cuestiones éticas relacionadas con la propiedad intelectual y las licencias de software .
- Propiedad Intelectual y Licencias de Software :
- El software está protegido por leyes de propiedad intelectual, como derechos de autor, patentes y licencias. Existen diferentes modelos de licenciamiento, como el software propietario (ej., Microsoft Windows) y el software de código abierto (ej., Linux). Mientras que el software propietario restringe el acceso al código fuente y su modificación, el software de código abierto fomenta la colaboración y la transparencia, permitiendo a los usuarios estudiar, modificar y redistribuir el código.
- Desde una perspectiva ética, es fundamental preguntarse: ¿quién controla el software que usamos diariamente? ¿Cómo afecta esto nuestra privacidad y libertad? Por ejemplo, el uso de software propietario puede limitar la capacidad de los usuarios para auditar la seguridad del sistema o personalizarlo según sus necesidades. En contraste, el movimiento de software libre aboga por la democratización del acceso a la tecnología, promoviendo valores como la equidad y la inclusión.
Factor Humano: El Elemento Impulsor de la Tecnología
El factor humano es un componente esencial en el ámbito de la computación. Este se refiere a las personas que interactúan con el hardware y el software, desempeñando roles clave como usuarios, desarrolladores o administradores. Sin el recurso humano que opera, programa y mantiene estos sistemas, las tecnologías informáticas carecerían de propósito y utilidad.
1.3. Programación y sus Aplicaciones
La programación es el proceso de diseñar, escribir, probar y mantener un conjunto de instrucciones o código en un lenguaje de programación que una computadora puede interpretar y ejecutar para realizar tareas específicas. Involucra la resolución de problemas, el diseño de algoritmos y la implementación de soluciones lógicas para automatizar procesos, procesar datos o crear aplicaciones y sistemas informáticos.
Es el lenguaje invisible que impulsa gran parte de nuestra vida diaria. Desde el momento en que desbloqueamos un smartphone hasta que interactuamos con dispositivos inteligentes, su influencia es omnipresente. Aquí algunos ejemplos clave:
Aplicaciones móviles (apps)
Las aplicaciones móviles han revolucionado cómo nos comunicamos, trabajamos y nos entretenemos. Plataformas como WhatsApp, Instagram o aplicaciones bancarias simplifican tareas cotidianas, mientras herramientas como Google Maps o Spotify dependen de algoritmos complejos para ofrecer rutas optimizadas o recomendaciones personalizadas.
- Privacidad y recolección de datos : Aunque estas apps facilitan la vida, también plantean importantes dilemas éticos relacionados con la privacidad. Muchas aplicaciones recopilan grandes cantidades de datos personales, desde ubicaciones hasta hábitos de consumo. Esto puede llevar a problemas como la vigilancia masiva, la creación de perfiles detallados sin consentimiento informado o incluso la exposición de datos sensibles a terceros. Por ejemplo, ¿es ético que una app de salud comparta datos médicos con empresas publicitarias sin el conocimiento del usuario? La transparencia en las políticas de privacidad y el consentimiento explícito son aspectos fundamentales que los desarrolladores deben priorizar para proteger los derechos civiles de los usuarios.
Videojuegos
Los videojuegos combinan arte, narrativa y tecnología avanzada, gracias a motores gráficos y físicos programados para crear mundos inmersivos. Los juegos como Fortnite o Minecraft no solo entretienen, sino que emplean redes multijugador en tiempo real y sistemas de inteligencia artificial para adaptarse a los usuarios.
Inteligencia Artificial (IA)
Desde asistentes virtuales como Siri y Alexa hasta diagnósticos médicos avanzados, la IA transforma sectores clave. Los algoritmos de aprendizaje automático permiten desde recomendaciones en Netflix hasta vehículos autónomos que procesan datos en milisegundos para tomar decisiones seguras.
- Sesgos algorítmicos y responsabilidad profesional : A pesar de su potencial, la IA no está exenta de riesgos éticos. Un problema común es la presencia de sesgos algorítmicos, que pueden resultar en discriminación involuntaria. Por ejemplo, sistemas de reconocimiento facial han demostrado tener tasas de error significativamente más altas para personas de piel oscura, lo que refleja desequilibrios en los conjuntos de datos utilizados para entrenar estos modelos. Además, surge la pregunta de quién es responsable cuando un sistema de IA toma una decisión incorrecta o dañina. ¿Es el desarrollador, la empresa o el usuario final? Los profesionales de la programación tienen la responsabilidad de diseñar sistemas éticos, transparentes y justos.
Automatización y dispositivos inteligentes
Termostatos como Nest, sistemas de seguridad doméstica o electrodomésticos conectados a Internet ( IoT ) funcionan mediante código que integra sensores, conexiones en red y respuestas adaptativas. Estos dispositivos mejoran la eficiencia energética y la comodidad en el hogar.
- Sostenibilidad y acceso equitativo : Aunque la automatización ofrece numerosos beneficios, también plantea desafíos éticos relacionados con la sostenibilidad y la equidad. Por un lado, la fabricación de dispositivos IoT consume recursos naturales escasos, como minerales raros, y genera residuos electrónicos difíciles de reciclar.Los desarrolladores deben considerar cómo diseñar productos que sean accesibles para todos, promoviendo un futuro tecnológico más justo y sostenible.
Educación y trabajo remoto
Plataformas como Zoom o Google Classroom dependen de programación robusta para gestionar videollamadas, compartir recursos y garantizar seguridad digital, facilitando el acceso global al conocimiento.
- Accesibilidad y seguridad : Si bien estas herramientas han democratizado el acceso a la educación y el trabajo remoto, también presentan desafíos éticos. Por ejemplo, muchas plataformas no están diseñadas para ser accesibles para personas con discapacidades visuales o auditivas, excluyendo a quienes más necesitan estas oportunidades. Además, la seguridad de las videollamadas ha sido cuestionada debido a incidentes de “zoombombing” o fugas de datos confidenciales. Los desarrolladores deben priorizar la accesibilidad universal y la protección de la privacidad para garantizar que estas herramientas sean verdaderamente inclusivas y seguras.
2. Solución de problemas y pensamiento computacional
La computación aborda problemas mediante procesos estructurados y algorítmicos. Su núcleo es el diseño de soluciones eficientes, replicables y escalables, usando herramientas como la abstracción y la descomposición.
2.1 Identificación del problema
La identificación del problema es el primer paso crítico en el proceso de solución de problemas y pensamiento computacional. Un problema bien definido no solo facilita la búsqueda de soluciones efectivas, sino que también garantiza que las soluciones aborden las necesidades reales de los usuarios o sistemas involucrados.
Antes de diseñar cualquier solución, es esencial comprender el problema en su totalidad . Esto implica identificar:
- Qué se necesita resolver : Definir claramente las entradas (datos iniciales), las salidas (resultados esperados) y las restricciones (límites del sistema).
- Por qué es importante : Determinar el impacto de resolverlo (ej: automatizar tareas repetitivas, optimizar recursos).
- Cuáles son los obstáculos : Reconocer posibles desafíos técnicos o de lógica.
Ejemplo aplicado :
Calcular el promedio de 3 notas .
- Entradas : Tres números (ej: 80, 90, 70).
- Salida : Un solo número (ej: 80).
- Detalles irrelevantes : Quién es el estudiante, el nombre de las materias, o cómo se ingresaron las notas.
Persistencia y Meticulosidad
Resolver problemas complejos requiere más que habilidades técnicas; también demanda disposiciones profesionales clave como la persistencia y la meticulosidad .
- Persistencia : La identificación de un problema no siempre es inmediata ni evidente. A menudo, los problemas están ocultos detrás de síntomas superficiales o están entrelazados con otros desafíos. Aquí es donde la persistencia se convierte en una virtud indispensable. Los estudiantes deben aprender a no rendirse ante la primera dificultad , sino a iterar continuamente en su comprensión del problema hasta que logren una definición clara y precisa. Por ejemplo, al desarrollar un software para optimizar rutas de entrega, puede ser necesario revisar múltiples veces los datos de tráfico y las restricciones logísticas antes de identificar el verdadero problema subyacente.
- Meticulosidad : La meticulosidad es igualmente crucial, ya que los errores en la definición del problema pueden propagarse a lo largo de todo el proceso de solución. Un pequeño error en la interpretación de los requisitos o en la selección de datos puede resultar en soluciones ineficaces o incluso dañinas . Por ejemplo, al diseñar un sistema de monitoreo de salud, un malentendido sobre las unidades de medida de los sensores podría llevar a conclusiones incorrectas y poner en riesgo la seguridad del paciente. Ser meticuloso significa prestar atención a los detalles, verificar suposiciones y asegurarse de que cada aspecto del problema esté correctamente documentado y comprendido.
2.2 Diseño de una solución (algoritmo)
El diseño de una solución algorítmica es un proceso creativo y estructurado que permite resolver problemas de manera eficiente y sistemática. Este paso es fundamental en el pensamiento computacional, ya que transforma un problema identificado en una serie de pasos lógicos que una computadora puede ejecutar. Sin embargo, el diseño de un algoritmo no solo implica habilidades técnicas; también exige considerar aspectos éticos, sociales y prácticos para garantizar que las soluciones sean viables, justas y responsables.
El diseño de algoritmos no debe limitarse al entorno académico. Es crucial que el estudiante autodidacta desarrolle la capacidad de buscar soluciones autodirigidas, explorando recursos externos y aplicando sus conocimientos a problemas reales. Aquí algunas estrategias para fomentar esta disposición:
- Exploración de Recursos Externos : Utilizar foros técnicos, documentación oficial de lenguajes de programación y plataformas como GitHub para resolver problemas específicos.
- Proyectos del Mundo Real : Proponer proyectos que involucren problemas locales o globales, como optimizar el uso de energía en una comunidad o desarrollar una aplicación para gestionar donaciones en eventos de emergencia.
- Aprendizaje Basado en Problemas (ABP) : Implementar metodologías donde los estudiantes identifiquen un problema en su entorno, investiguen posibles soluciones y diseñen un algoritmo para abordarlo.
2.2.1 Descomposición
La descomposición es la técnica de dividir un problema complejo en partes más pequeñas y manejables. Este enfoque no solo simplifica el proceso de resolución, sino que también facilita la colaboración en equipos y la reutilización de código.
- Ingresar y validar las notas.
- Sumar todos los valores válidos.
- Dividir la suma por la cantidad de notas.
- Mostrar el resultado.
Ventaja : Cada subtarea puede resolverse y probarse por separado, simplificando el proceso.
2.2.2 Reconocimiento de patrones
El reconocimiento de patrones implica identificar regularidades o similitudes en los datos o problemas que pueden ser aprovechadas para simplificar soluciones. Esta habilidad es especialmente relevante en áreas como la inteligencia artificial y el análisis de grandes conjuntos de datos.
- El cálculo del promedio es similar a encontrar la media aritmética, un patrón matemático estándar.
2.2.3 Abstracción
La abstracción consiste en enfocarse en los aspectos esenciales de un problema mientras se ocultan los detalles innecesarios. Sin embargo, es importante tener en cuenta que una mala implementación de la abstracción puede perpetuar sesgos o errores si no se consideran adecuadamente los factores éticos.
- Detalle relevante : Las notas deben ser números.
- Detalle irrelevante : Si las notas se ingresaron manualmente o se leyeron de un archivo.
2.2.4 Diseño de algoritmos
El diseño del algoritmo es la etapa final donde se combinan las técnicas anteriores para crear una solución completa y eficiente. Aquí es donde se aplican conceptos básicos de eficiencia algorítmica para garantizar que la solución sea óptima.
Inicio
nota1 = 80
nota2 = 90
nota3 = 70
suma = nota1 + nota2 + nota3
promedio = suma / 3
Escribir "El promedio es: ", promedio
Fin
Conceptos básicos de eficiencia
Un buen algoritmo no solo debe funcionar correctamente, sino también hacerlo de manera eficiente. Algunos conceptos clave:
- Tiempo de ejecución : Medir cuánto tiempo tarda un algoritmo en completar una tarea. Por ejemplo, un algoritmo de ordenamiento como QuickSort es generalmente más rápido que BubbleSort para grandes conjuntos de datos.
- Uso de memoria : Evaluar cuánta memoria utiliza un algoritmo. Un algoritmo que consume menos memoria es preferible en sistemas con recursos limitados.
- Escalabilidad : Asegurarse de que el algoritmo funcione bien incluso cuando el tamaño de los datos aumenta.
2.3 Implementación de la solución (código)
La implementación de una solución en forma de código es el paso crucial donde las ideas y diseños algorítmicos se traducen en instrucciones que una computadora puede ejecutar. Este proceso no solo requiere habilidades técnicas, sino también un enfoque estructurado para garantizar que el código sea claro, eficiente y fácil de mantener. Es importante el uso de pseudocódigo antes de pasar a la implementación real es una práctica pedagógica valiosa que ayuda a los estudiantes a desarrollar habilidades clave como explicar y aplicar .
- Explicar : Al escribir pseudocódigo, como estudiantes deben desglosar sus ideas en pasos claros y lógicos, lo que les ayuda a comprender y comunicar cómo funciona su solución.
- Aplicar : El pseudocódigo también ayuda al estudiantes a aplicar conceptos fundamentales de programación, como el uso de bucles, condicionales y funciones, sin preocuparse inicialmente por la sintaxis específica de un lenguaje.
nota1 = 80
nota2 = 90
nota3 = 70
suma = nota1 + nota2 + nota3
promedio = suma / 3
print("El promedio es:", promedio)
Este código asume que las notas siempre son números válidos, lo que lo hace simple pero poco flexible (solo funciona para 3 notas fijas).
- Selección del Lenguaje Apropiado : Dependiendo del problema, algunos lenguajes pueden ser más adecuados que otros. Por ejemplo, Python es ideal para prototipos rápidos debido a su sintaxis clara, mientras que C++ podría ser preferible para aplicaciones que requieren un alto rendimiento.
- Uso de Estructuras de Datos Incorporadas : Muchos lenguajes modernos ofrecen estructuras de datos incorporadas (como listas, diccionarios o conjuntos) que simplifican la implementación. Como estudiante es importante que aprendas a elegir una estructura de datos adecuada para resolver los problemas.
- Manejo de Errores y Excepciones : La implementación debe incluir mecanismos para manejar errores, como la validación de entradas o el manejo de excepciones. Esto refuerza la importancia de escribir código robusto y seguro.
- Documentación y Comentarios : Documentar el código es esencial para mejorar su legibilidad y mantenibilidad. Los comentarios deben explicar qué hace el código y por qué se toman ciertas decisiones, pero no cómo lo hace (ya que eso debería ser evidente del propio código).
2.4 Pruebas y depuración
Antes de implementar una solución en un entorno real, es crucial verificar que el código cumple con los requisitos esperados y maneja adecuadamente diferentes escenarios. Las pruebas permiten identificar errores lógicos, fallos en la funcionalidad o comportamientos inesperados, mientras que la depuración implica localizar y corregir esos errores de manera sistemática. Este proceso requiere atención al detalle y un enfoque paciente, ya que los errores pueden ser sutiles y difíciles de detectar.
Las pruebas deben incluir estrategias como el diseño de casos de prueba, el uso de herramientas modernas de depuración y la aplicación de buenas prácticas para mejorar la legibilidad del código. Además los profesionales tienen la responsabilidad ética de garantizar que su software sea confiable, seguro y funcional, lo que subraya la importancia de estas etapas.
Verificar que la solución funcione con diferentes valores:
-
Caso 1 :
- Entradas: 80, 90, 70
- Suma: 240
- Promedio: 240 / 3 = 80 → Correcto.
-
Caso 2 :
- Entradas: 100, 100, 100
- Suma: 300
- Promedio: 100 → Correcto.
Error común : Si se usan 2 notas en lugar de 3 (ej: 80, 90), el código falla porque está diseñado solo para 3 notas. Esto muestra la importancia de definir bien el problema desde el inicio.
La depuración requiere un alto grado de meticulosidad , ya que incluso pequeños errores pueden causar fallos significativos. Por ejemplo, un punto y coma mal colocado o una condición incorrecta en un bucle puede hacer que un programa no funcione como se espera. Es fundamental revisar su código línea por línea y a documentar cada paso del proceso de depuración.
Además, la paciencia es clave, ya que resolver problemas complejos puede llevar tiempo y múltiples iteraciones. Como estudiantes debemos aprender a abordar los errores de manera metódica, dividiendo el problema en partes más pequeñas y probando cada parte individualmente. Esta práctica no solo mejora sus habilidades técnicas, sino que también refuerza disposiciones profesionales como la persistencia y la autodirección .
2.5 Colaboración y Comunicación en la Resolución de Problemas
En un mundo donde los proyectos tecnológicos suelen ser desarrollados por equipos multidisciplinarios, es fundamental que los estudiantes aprendan a trabajar juntos de manera efectiva y a comunicar sus ideas técnicas de forma clara y precisa.
Desde las primeras etapas del aprendizaje, es crucial que los estudiantes desarrollen habilidades para comunicar conceptos técnicos de manera efectiva. Esto incluye no solo escribir código funcional, sino también documentarlo y explicarlo de manera comprensible para otros. La documentación y la comunicación técnica son fundamentales para garantizar la calidad y mantenibilidad del software.
- Documentación de Algoritmos : Los estudiantes deben aprender a documentar sus algoritmos de manera clara y estructurada. Esto implica escribir comentarios dentro del código que expliquen su propósito, así como redactar descripciones generales del funcionamiento del algoritmo en lenguaje natural. Por ejemplo:
# Función para calcular el promedio de una lista de números
# Entrada: Una lista de números
# Salida: El promedio de los números
def calcular_promedio(lista):
suma = sum(lista)
promedio = suma / len(lista)
return promedio
Este tipo de documentación no solo ayuda a otros a entender el código, sino que también facilita su mantenimiento y mejora en el futuro.
- Explicación de Soluciones a otros : Otra práctica clave es animar a los estudiantes a explicar sus soluciones a otros estudiantes. Esto puede hacerse en discuciones por alguna red social o Github, donde cada estudiante debe describir cómo abordó un problema, qué decisiones tomó y por qué eligió ciertas estrategias. Esta actividad no solo mejora la capacidad de comunicación, sino que también refuerza el aprendizaje al obligar a los estudiantes a reflexionar sobre su propio proceso de pensamiento.