Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD NACIONAL DEL CENTRO DE LA PROVINCIA DE BUENOS AIRES FACULTAD DE CIENCIAS EXACTAS TESIS DE GRADO - INGENIERÍA DE SISTEMAS Herramienta para aprender a programar con validación automática y representación gráfica de estructuras de datos Alumnos: Carretero Santiago y Covelli Tomas. Director: Dr. Javier Dottori Co-Directora: Mg. María Carmen Leonardi Índice CAPÍTULO 1 Introducción 6 1.1. Introducción 6 1.2. Motivación 7 1.3. Propuesta del Trabajo Final 8 1.4. Metodología de Desarrollo 9 1.5. Estructura de la tesis 10 CAPÍTULO 2 Marco teórico - Estado del arte 12 2.1. Introducción 12 2.2. Testing 12 2.2.1. ¿Qué es? 12 2.2.2. Las dos metodologías clásicas de testing 14 2.2.3. Suite de Test 15 2.3. Estilos de aprendizaje en la programación 16 2.3.1. Activo 16 2.3.2. Reflexivo 16 2.3.3. Teórico 17 2.3.4. Pragmático 17 2.3.5. Lógico (matemático) 17 2.3.6. Social (interpersonal) 17 2.3.7. Solitario (intrapersonal) 17 2.3.8. Visual 18 2.3.9. Aural o auditivo 18 2.3.10. Verbal (lectura y escritura) 18 2.3.11. Kinestésico 18 2.3.12. Multimodal 18 2.4. Entornos de enseñanza de programación ó aplicaciones educativas de enseñanza de la programación 19 2.4.1. Mumuki 19 2.4.2. Gobstones 19 2.4.3. Coderbyte 20 2.4.4. CodeWars 20 2.4.5. FreeCodeCamp 21 2.4.6. HackerEarth 21 2.4.7. Moodle UNICEN 22 2.5. Intérprete 22 2.5.1 Árbol de Sintaxis Abstracta 22 2.6. Marco Teórico Metodológico y Tecnológico 23 2.6.1. Vue 23 2.6.2. Firebase 25 Hosting 25 Autenticación 26 Realtime Database 26 2.7. Resumen 26 CAPÍTULO 3 Propuesta de la Herramienta VIDE 28 3.1. Características Herramienta 28 3.1.1 Lenguaje de Programación 30 3.2. Secciones Herramienta VIDE 30 3.2.1. Crear Ejercicio 30 3.2.2. Buscador 32 3.2.3. Consigna 32 3.2.4. Editor de Texto 33 3.2.5. Panel de Ejecución 34 3.2.6. Visualización de Estructuras 36 3.2.7. Banco de Test 37 3.2.8. Consola 38 3.2.9. Solución 39 3.2.10. Estadísticas 40 3.2.11. Descarga Código 41 3.3 Resumen 41 CAPÍTULO 4 43 Diseño, arquitectura e implementación 43 4.1. Introducción 43 4.2. Estructura del proyecto 43 4.2.1. Modelo de dos Capas 43 4.2.2. Base de Datos 45 4.2.3. Hosting y Deployment 46 4.3. Tecnologías utilizadas 46 4.3.1. Framework Desarrollo Frontend 47 4.4. Diseño de la aplicación 48 4.4.1 Diseño de la UI 49 4.5. Implementación 50 4.5.1 Comunicación Componentes Vue 50 4.5.2. Estilos Componentes Vue 53 4.5.3. Cuadrícula redimensionable 55 4.5.4. Editor y ejecución de código 56 4.5.5. Reconocimiento de variables y arreglos 57 4.5.6. Modos de ejecución 62 4.5.6.1. Ejecución clásica 63 4.5.6.2. Ejecución en modo lento 63 4.5.6.3. Ejecución en modo debug 64 4.5.6.4. Resaltado de código 65 4.5.7. Visualización de estructuras de datos 68 4.5.8. Suite de test 68 4.5.9. Estadísticas 69 CAPÍTULO 5 72 Pruebas en Usuarios 72 5.1. Introducción 72 5.2. Estadísticas 74 5.3. Encuesta 81 5.3.1. Encuesta Sección 1 81 5.3.2. Encuesta Sección 2 81 5.3.3. Encuesta Sección 3 82 5.4. Análisis Resultados 82 CAPÍTULO 6 87 Conclusiones y trabajos futuros 87 Anexo 89 Anexo 1: Ejercicios Pruebas de Usuarios 89 Eureka 89 Múltiplos 90 Par/Impar 90 Suma entre Números 91 Tablas de Multiplicación 93 Encontrar el Número Máximo 94 Cantidad y Distribución de Positivos 95 Promedio-Máximo-Mínimo 96 Calificaciones 98 Dados 100 Potencias 101 Múltiplos 102 Divisores 103 Sumar Dos Arreglos 105 Invertir Arreglo 106 Tipos de Números de Arreglo 107 Producto Escalar 108 Promedio escolar 110 Multiplicación 112 Jardín 115 Calcular Promedio 117 Anexo 2: Respuestas Encuesta Herramienta VIDE 118 ¿Sabías que era la programación antes de comenzar el curso? 118 Indicar el grado de dificultad para cada uno de los módulos prácticos. [Estructuras de Control] 119 Indicar el grado de dificultad para cada uno de los módulos prácticos. [Arreglos] 119 Indicar el grado de dificultad para cada uno de los módulos prácticos. [Estructuras de Datos y Métodos] 120 Indicar el grado de dificultad para cada uno de los módulos prácticos. [Ejercicios de Repaso] 120 Describe cuáles fueron las dificultades que se presentaron y cómo hiciste para suplirlas. 121 ¿Cuán difícil fue encontrar los errores en los ejercicios ? 122 Comentanos tu experiencia para encontrar errores en base a el grado de dificultad indicado. 123 Selecciona los ejercicios que recordás haber consultado a un compañero/profesor y/o buscaste la solución provista para terminar de resolverlos 124 ¿Utilizaste la herramienta VIDE para la resolución de ejercicios? 125 ¿Qué tan útil te resultó la visualización de estructuras? 125 Menciona brevemente en qué te ayudó/no te ayudo la visualización. 125 Que tan útil fue la validación de resultados a través de la suite de test? 126 Menciona brevemente en qué te ayudo/no te ayudo la suite de test. 126 Si utilizaste las pistas, que tan útiles fueron previas a la solución? 126 Comentanos que ejercicios pudiste resolver utilizando las pistas. 126 Miraste en algún ejercicio la solución propuesta antes de dar por terminada tu resolución? Describe brevemente por qué lo hiciste. 127 ¿Cuánto te ayudó la ejecución paso a paso para identificar errores en ejecución? 127 Menciona brevemente en qué te ayudó/no te ayudo la ejecución paso a paso. 127 Indicar cual de los modos de ejecución utilizaste más? 127 ¿Cuál es el motivo de tu selección? 128 ¿Cómo fue tu experiencia con la herramienta VIDE? 128 Dejanos tu comentario comparando VIDE y VSCode. 128 Al momento de resolver ejercicios, hiciste pruebas de tu código con diferentes escenarios (Pruebas de escritorio)? Las fuiste documentando de alguna manera? 129 ¿Seguiste tu código a mano para probarlo? 129 Referencias 130 CAPÍTULO 1 Introducción 1.1. Introducción Con el incremento significativo de las inscripciones a carreras orientadas a la programación (Sadosky, 2019), la incorporación de herramientas que permitan el seguimiento de programas desarrollados por estudiantes se volvió una necesidad. Así, es realmente importante la forma en que se introduce a la programación a los alumnos, donde si bien existen gran cantidad de métodos a la hora de enseñar programación computacional, muchas de estas metodologías no logran conectarse efectivamente con los alumnos, incluso con quienes tengan una experiencia previa en programación (Spigariol, 2015). En general, aunque se han creado lenguajes de programación cada vez más cercanos al lenguaje humano, la enseñanza de la programación no resulta ser una materia intuitiva, ni de fácil compresión y por lo tanto, con frecuencia tiene altas tasas de deserción en estas carreras. Esto llevó a distintos investigadores a analizar las causas de esta problemática desde distintos tipos de enfoques, donde se puede remarcar que una gran cantidad de estudios muestran que los entornos de aprendizaje basados en el contexto mejoran la participación de los estudiantes. Estos entornos son herramientas que permiten al estudiante escribir código y observar de inmediato la ejecución, fomentando que los mismos lleguen a aprender los conceptos abstractos de programación (Dávila, 2016). Cabe destacar que la gran mayoría de las personas que eligen esta orientación a la hora de estudiar carecen de un conocimiento básico de lógica y/o de programación. A pesar de que las Ciencias de la Computación comenzó a incluirse en algunas escuelas secundarias como auxiliar a la matemática y a la física en el año 1981 (Caraballo y Cicala, 2005), en ese momento predominó el enfoque técnico de la enseñanza de la computación con énfasis en los componentes y comandos (Levis, 2007). Al día de la fecha, la Ley de Educación Nacional dispone que las distintas jurisdicciones deben garantizar la revisión de la1 estructura curricular de la Educación Secundaria. Por lo tanto, el diseño curricular de cada provincia tiene carácter singular adoptando diferentes paradigmas para la selección de contenidos y asignando dispares posiciones a la computación en los planes de estudio, por lo cual no está ni totalmente ni homogéneamente implementado en lasescuelas. Esto presenta dificultades en la puesta en práctica de abstracción de problemas, la cual es sumamente importante para programar (López et al., 2017). De esta forma, la incorporación de una herramienta que permita a los alumnos entender y razonar conceptos relacionados a la programación a través de un seguimiento visual constante a nivel básico, reduciría el tiempo que los profesores tienen que dedicar junto al alumno realizando un seguimiento de la solución propuesta hasta encontrar la corrección; y permitiendo en consecuencia aumentar el tiempo en que 1 Ley Nacional. 26.206 - Ley de Educación Nacional. Disposiciones Generales, 2006. el profesor puede dedicar a corregir soluciones que si bien funcionan, no están desarrolladas de la forma adecuada o no aplican correctamente los conceptos que se quiere que el estudiante ponga en acción. Además, los alumnos que pasen los primeros cursos, tendrán una base más robusta y autónoma lo cual permitiría incorporar en un futuro ideas y conocimientos de manera más sencilla. 1.2. Motivación Una motivación fundamental de mejorar la metodología del aprendizaje en programación, es el constante y en aumento requerimiento de profesionales en TICS (Díaz et al. 2014), donde a nivel mundial y ya desde hace varios años se puede observar que la demanda de profesionales en TICS no es satisfecha. De esta forma se pueden mencionar innumerables artículos que validan estas afirmaciones. “España busca programadores: hay 300.000 (pero faltan muchos más)” (Hernandez, 2017) “Desarrolladores de software de aplicaciones, faltan personas con las habilidades y no hay suficientes graduados nuevos en la profesión” (Stahl, 2018) “Los profesionales de IT se ubican en el podio de los más buscados en el mercado laboral” (Pernas, 2019) La repercusión del conocimiento y desarrollo del “pensamiento computacional” como el proceso por el cual un individuo, a través de habilidades propias de la computación y del pensamiento crítico, del pensamiento lateral y otros más, logra hacerle frente a problemas de distinta índole (Wing, 2006), es posible de evidenciar en diversas disciplinas. Por ejemplo en la biología, no solo se refleja en la exploración de grandes secuencias de datos en búsqueda de patrones, sino también en la utilización de algoritmos y estructuras de datos para representar la organización y comportamiento de diversos agentes biológicos como las proteínas. Así, el “pensamiento computacional” puede verse como una capacidad fundamental que todo individuo, además de estudiantes y graduados en ciencias de la computación, debería desarrollar. (Rueda et al., 2014) Durante una primera introducción a la programación, se atraviesan las siguientes etapas como referencia (Cobo, 2018): ● Aprendizaje de conceptos y terminología básica: sistemas, sistemas de información, proceso de desarrollo de sistemas, análisis de requerimientos, diseño, implementación, prueba, mantenimiento, documentación, algoritmo, programa, proceso, datos. ● Reconocimiento de la estructura de un lenguaje de programación, identificando su sintaxis y aprendiendo a desarrollar programas sencillos utilizando estructuras de control básicas de la programación estructurada como secuencia, selección e iteración. ● Planificación de estrategias de resolución, donde se busca incorporar el hábito de leer y comprender el problema en primer lugar, reconociendo el estado inicial y final del programa. ● Introducción a conceptos específicos de programación como: procedimientos, parámetros, pasaje de parámetros, variables, alcance de variables, funciones, estructuras de datos, arreglos. Comúnmente se va presentando la información teórica correspondiente, y por otro lado la práctica se realiza mediante consignas específicas que reflejan distintos escenarios del tema teórico (Spigariol, 2015) usando lenguajes y/o herramientas para la resolución de dichas consignas prácticas. Con respecto a las herramienta y las facilidades que deberían proveer, las mismas se enfrentan a las siguientes problemáticas: 1. Dificultad para probar la validez de una solución: la ausencia de un banco de test puede llevar a considerar como correcta una solución representada con un lote de datos muy particular que no describe la variedad de situaciones a las que la solución debe dar respuesta adecuadamente (Aloi et al., 2015). 2. Ausencia de una representación gráfica de las estructuras de datos: en general los entornos de desarrollo profesionales no poseen una representación gráfica de las estructuras de datos que están siendo utilizadas, dificultando así la visualización y seguimiento de las mismas por un usuario principiante. 3. Carencia de una ejecución paso a paso del código desarrollado: a pesar de que los entornos de desarrollo profesionales ofrecen ejecutar programas paso a paso mediante herramientas de “debugging”, las mismas comprenden conceptos avanzados que no están orientados a desarrolladores principiantes. 4. Ausencia de la disponibilidad de acceder, conocer y comparar con la solución óptima de la consigna publicada dentro de la plataforma ya sea por otro usuario o autor de la consigna. 5. Disponibilidad de información estadística sobre el número de soluciones probadas, soluciones aceptadas, errores de compilación, errores de ejecución y soluciones rechazadas por consigna. 1.3. Propuesta del Trabajo Final En este trabajo final se desarrolla una herramienta llamada VIDE (Visual Integrated Development Environment), la cual provee las funcionalidades necesarias para diseñar y resolver incisos prácticos de programación básica, validando automáticamente cada solución propuesta sobre distintos casos de test definidos por el autor del inciso y exhibiendo modelos concretos visuales de las estructuras de datos utilizadas en las distintas soluciones propuestas. Además la misma cuenta también con una funcionalidad que permite observar la solución desarrollada de las siguientes formas: ● Ejecución en modo lento: donde se ejecuta cada instrucción con un intervalo de tiempo, posibilitando observar también las estructuras de datos que se van creando a medida que se ejecuta el código, de una forma más pausada y didáctica. ● Ejecución en modo debugger o depurador: en el que el usuario de la herramienta cuenta con la posibilidad de avanzar instrucción por instrucción con el objetivo de probar y depurar los errores cometidos durante el desarrollo de la solución provista. Esto último por lo tanto permite a los usuarios investigar los fallos en sus programas y encontrar no solo el lugar, sino también el instante en el que surge cada error, permitiendo solucionarlos de forma rápida y focalizada. 1.4. Metodología de Desarrollo Con el objetivo de cumplir los plazos propuestos en la sección 4. “Cronograma de Actividades” del Plan de Trabajo Final y establecer un ritmo de desarrollo, comenzamos con reuniones periódicas para la etapa de investigación. Dichas reuniones con los directores de tesis, permitian reflexionar sobre la exploración realizada, y determinar los objetivos a cumplir para la siguiente reunión. Una vez avanzada la etapa investigación y con el objetivo del desarrollo de la herramienta definido, se estableció incorporar un tablero kanban. Kanban es una metodología de gestión de tareas, que se basa en los principios del movimiento “Agile”. Podemos destacar cinco propiedades clave al momento de utilizar Kanban en un proceso de la organización (Cornejo Velázquez, Hernández Gutiérrez, 2015): ● Limitar el trabajo en curso. ● Visualizar el flujo de trabajo. ● Medir y optimizar el flujo de trabajo. ● Hacer procesos con reglas explícitas. ● Gestionar el trabajo cuantitativamente. De esta manera se creó un tablero de trabajo en la herramienta Trello , con tres columnas:2 ● Tareas para hacer ● En proceso ● Completadas 2 https://trello.com/ Figura 1.1. Captura del tablero de trabajo en Trello. Link tablero Proyecto-Final-Carretero-Covelli: https://trello.com/b/TvOCnHif/proyecto-final-carretero-covelliComo se muestra en la figura 1.1, cada tarea creada se identifica dada una numeración (VIDE-XX), un título a modo de resumen, una descripción del objetivo de la tarea y un responsable de dicha tarea. En caso de que la tarea implique desarrollo en código, dicha numeración se utiliza para el nombre de la rama en el repositorio de Github (Demo Proyecto Final Carretero Covelli ). Además durante el proceso y/o3 4 finalización de cada tarea, se añadían comentarios sobre el estado de avance y detalles de implementación relevantes. En un comienzo se crearon un conjunto inicial de tareas relacionadas a la estructuración inicial del proyecto, una prueba de concepto en React y luego las tareas correspondientes a la implementación de las5 funcionalidades esenciales. Luego dichas tareas fueron creadas a demanda, según los objetivos determinados en las reuniones periódicas mencionadas. 1.5. Estructura de la tesis En la presente sección se describe de manera detallada la estructura en la que se presenta el proyecto. Se resume brevemente la división de capítulos y se sintetiza el contenido de cada uno de ellos. Como primer punto, el capítulo 2 presenta el estado del arte, es decir, todo lo relacionado al marco teórico que resume los fundamentos teóricos utilizados en la tesis. Se describen cuestiones acordes a los 5 https://reactjs.org/ 4 https://github.com/Proyecto-Final-Carretero-Covelli/demo-proyecto-final-carretero-covelli 3 https://github.com/ estilos de aprendizaje de la programación, entornos de desarrollo y enseñanza de la programación, testing, intérprete de código y el marco de las tecnologías utilizadas. Una vez presentados los conceptos teóricos más importantes se procede en el capítulo 3 a explicar de una manera detallada el enfoque propuesto para cada característica de la herramienta desarrollada. Luego, una vez establecido el enfoque, en el capítulo número 4 se describe la implementación del proyecto mostrando el diseño y la arquitectura utilizada. En el capítulo 5 se presenta la prueba en usuarios y sus resultados estadísticos, así como también los resultados de la encuesta sobre dichos usuarios. Por último, el capítulo 6 muestra las conclusiones establecidas y trabajos futuros a realizar. CAPÍTULO 2 Marco teórico - Estado del arte 2.1. Introducción El presente capítulo se basa principalmente en el estado del arte del proyecto, es decir, el estudio del conocimiento acumulado sobre el marco teórico de las distintas áreas que se abordan en este informe. En este capítulo se mencionan detalladamente los conceptos básicos utilizados en el trabajo de tesis. Asimismo se presenta el marco metodológico y el tecnológico utilizado en el desarrollo del trabajo. 2.2. Testing 2.2.1. ¿Qué es? El testing es una actividad desarrollada para evaluar la calidad del producto, y para mejorarlo al identificar defectos y problemas. El testing de software consiste en la verificación dinámica del comportamiento de un programa sobre un conjunto finito de casos de prueba, apropiadamente seleccionados a partir del dominio de ejecución que usualmente es infinito, en relación con el comportamiento esperado. Las palabras resaltadas en el párrafo anterior corresponden a las características fundamentales del testing. Es una técnica dinámica en el sentido de que el programa se verifica poniéndolo en ejecución de la forma más parecida posible a cómo se ejecutará cuando esté en producción (esto se contrapone a las técnicas estáticas las cuales se basan en analizar el código fuente). El programa se prueba ejecutando solo unos pocos casos de prueba dado que por lo general es física, económica o técnicamente imposible ejecutarlo para todos los valores de entrada posibles. Si uno de los casos de prueba detecta un error el programa es incorrecto, pero si ninguno de los casos de prueba seleccionados encuentra un error no podemos decir que el programa es correcto (perfecto). De aquí surge la frase de Dijkstra (Dijkstra, E. W., 1972): “Program testing can be a very effective way to show the presence of bugs, but it is hopelessly inadequate for showing their absence.” Los casos de prueba mencionados previamente son elegidos siguiendo alguna regla o criterio de selección. Se determina si un caso de prueba ha detectado un error o no comparando la salida producida con la salida esperada para la entrada correspondiente (la salida esperada debería estar documentada en la especificación del programa). El testing se estructura en casos de prueba o casos de test; los casos de prueba se reúnen en conjuntos de prueba. Desde el punto de vista del testing se ve a un programa (o subrutina) como una función que va del producto cartesiano de sus entradas en el producto cartesiano de sus salidas. Es decir: 𝑃 : 𝐼𝐷 → 𝑂𝐷 donde ID se llama dominio de entrada del programa y OD es el dominio de salida. Normalmente los dominios de entrada y salida son conjuntos de tuplas tipadas cuyos campos identifican a cada una de las variables de entrada o salida del programa, es decir: 𝐼𝐷 ≡ [𝑥 1 : 𝑋 1 , ... , 𝑥 𝑛 : 𝑋 𝑛 ] 𝑂𝐷 ≡ [𝑦 1 : 𝑌 1 , ... , 𝑦 𝑛 : 𝑌 𝑛 ] De esta forma, un caso de prueba es un elemento x del dominio de entrada (es decir ) y𝑥 ϵ 𝐼𝐷 testear P con x es simplemente calcular P(x). En el mismo sentido, un conjunto de prueba, por ejemplo T, es un conjunto de casos de prueba definido por extensión y testear P con T es calcular P(x) para cada . Es𝑥 ϵ 𝑇 muy importante notar que x es un valor constante, no una variable. Es decir, si por ejemplo 𝐼𝐷 ≡ [𝑛𝑢𝑚 : ℵ] entonces un caso de prueba es 5, otro puede ser 1000, etc, pero no .𝑛 > 24 También es importante remarcar que son las entradas con que se programó el programa𝑥 1 , ... , 𝑥 𝑛 (esto incluye archivos, parámetros recibidos, datos leídos desde el entorno, etc) y no entradas abstractas o generales que no están representadas explícitamente en el código. De la misma forma, son las𝑦 1 , ... , 𝑦 𝑛 salidas explícitas o implícitas del programa (esto incluye salidas por cualquier dispositivo, parámetro o valor de retorno, e incluso errores). De acuerdo a la definición clásica de corrección, un programa es correcto si verifica su especificación. Entonces, al considerarse como técnica de verificación el testing, un programa es correcto si ninguno de los casos de prueba seleccionados detecta un error. Precisamente, la presencia de un error o defecto se demuestra cuando P(x) no satisface la especificación para algún x en ID. Una falla es el síntoma manifiesto de la presencia de un error. Es decir que un error permanecerá oculto hasta que ocurra una falla causada por aquel. Por ejemplo, si la condición de una sentencia if es cuando debería haber sido𝑥 > 0 , entonces hay un error en el programa, que se manifestará (falla) cuando se testee el programa con𝑥 > 1 x igual a 1 (si por fortuna este caso de prueba es seleccionado) porque en tal caso aparecerá cierto mensaje en la pantalla que para ese valor de x no debería haber aparecido. En este sentido el testing trata de incrementar la probabilidad de que los errores en un programa causen fallas, al seleccionar casos de prueba apropiados. Finalmente, una falta es un estado intermedio incorrecto al cual se llega durante la ejecución de un programa (por ejemplo se invoca a una subrutina cuando se debería haber invocado a otra, o se asigna un valor a una variable cuando se debería haber asignado otro). 2.2.2. Las dos metodologías clásicas de testing Tradicionalmente el testing de software se ha dividido en dos estrategias básicas que se supone son de aplicación universal. ● Testing estructural o de caja blanca: el testeo de un software siguiendo esta estrategia implica que se tiene en cuenta la estructura del código fuente del programa para seleccionar casos de prueba (es decir, como se observa en la figura 2.1 el testing está guiado fundamentalmente por la existencia de sentencias tipo if, case, while, etc). En muchas ocasionesse pone tanto énfasis en la estructura del código que se ignora la especificación del programa, convirtiendo al testing en una tarea un tanto desprolija e inconsistente. Como los casos de prueba se calculan de acuerdo a la estructura del código, no es posible generarlos sino hasta que el programa ha sido terminado. Peor aún, si debido a errores o cambios en las estructuras de datos o algoritmos (aun sin que haya cambiado la especificación), puede ser necesario volver a calcular todos los casos. Por estas razones es preferible la otra estrategia de testing detallada más abajo. Sin embargo es interesante remarcar la racionalidad detrás de esta estrategia: no se puede encontrar un error si no se ejecuta la línea de código donde se encuentra ese error. Por consiguiente es importante seleccionar casos de prueba que ejecuten al menos una vez todas las líneas del programa, lo cual se logra analizando la estructura del código. Se dice que el testing estructural prueba lo que el programa hace y no lo que se supone que debe hacer. Figura 2.1. Testing estructural o de caja blanca. ● Testing basado en modelos o de caja negra: el testeo de una pieza de software como una caja negra significa ejecutar el software sin considerar ningún detalle sobre cómo fue implementado. Esta estrategia se basa en seleccionar los casos de prueba analizando la especificación o modelo del programa, en lugar de su implementación. Algunos autores consideran que el testing basado en modelos (MBT) es la automatización del testing de caja negra. Para lograr esta automatización el MBT requiere que los modelos sean formales dado que esta es la única forma que permite realizar múltiples análisis mecánicos sobre el texto de los modelos. Por el contrario, el testing de caja negra tradicional calcula los casos de prueba partiendo del documento de requerimientos. Como en el MBT los casos de prueba se calculan partiendo del modelo, es posible comenzar a “testear” casi desde el comienzo del proyecto, en distintos tipos de pruebas destacados en la figura 2.2. Por otra parte, pero por la misma razón, los casos de prueba calculados con técnicas de MBT son mucho más resistentes a los cambios en la implementación que aquellos calculados con técnicas de testing estructural. Se dice que el testing basado en modelos prueba lo que el programa se supone que debe hacer, y no lo que el programa hace. Figura 2.2. Pruebas Funcionales. Es muy importante remarcar que estas estrategias no son opuestas sino complementarias. El testing debería estar guiado fundamentalmente por técnicas de MBT pero complementadas con herramientas de análisis de cubrimiento de sentencias de forma tal que los casos generados mediante MBT cubran al menos todas las líneas de código. 2.2.3. Suite de Test Los distintos escenarios a los que se somete una determinada solución conforman diferentes suite de tests, las cuales pueden describirse como contenedores que poseen una serie de casos de test y tienen como objetivo principal testear un programa de software para mostrar que existen determinados comportamientos específicos del mismo. Un caso de test es simplemente la especificación de las entradas, las condiciones de ejecución y las salidas esperadas para lograr un objetivo particular a la hora de validar cualquier solución. Ocasionalmente las suite de test son usadas para agrupar casos de test del mismo tipo, aunque esto último no es obligatorio. Es decir que por lo general existen suite de test que contienen casos de test estructurales, y por otro lado, otras que almacenan tests basados en modelos. De todas maneras, es solamente una forma de organizar el testing. 2.3. Estilos de aprendizaje en la programación En la programación especialmente, y por sobre todas las cosas al momento de aprenderla, saber si lo que el programador hace es correcto conlleva una gran dificultad, ya que comúnmente lo único que se observa de la solución es justamente el código desarrollado. Como quien está aprendiendo no cuenta con una determinada experiencia, y todo lo que hace es completamente nuevo, ver únicamente las sentencias del software solución se torna complicado para muchas personas, por lo que sería útil contar con herramientas que logran mostrar las soluciones de los usuarios exhibiendo modelos concretos visuales de las estructuras de datos utilizadas en las mismas. Todo esto está fuertemente relacionado con los estilos de aprendizaje. Los estilos de aprendizaje son las distintas formas en la que los estudiantes responden a los estímulos del entorno a la hora de aprender. En otras palabras, son las condiciones educativas bajo las cuales una persona incorpora información. Como se sabe existen diferentes formas de aprender. Hay personas a las que les resulta más fácil hacerlo observando, porque los colores o las fotografías simplifican muchos aspectos al momento de incorporar nuevos conocimientos, mientras otros aprenden mejor leyendo, o incluso otros prefieren escuchar audios o videos. Lo cierto es que no hay una forma de aprendizaje única, sino que cada individuo suele sentirse más cómodo con un estilo de aprendizaje u otro. Para Alonso, Gallego y Honey (Alonso, Gallego & Honey, 1995), autores del libro ‘Los estilos de aprendizaje procedimientos de aprendizaje y mejora’: “Es necesario saber saber más sobre los estilos de aprendizaje y cuál de éstos define nuestra forma predilecta de aprender. Esto es esencial, tanto para los aprendices como para los maestros”. Los autores afirman que existen 4 estilos de aprendizaje: activos, reflexivos, teóricos y pragmáticos. Pero esta clasificación, no es la única que existe, y nuevas investigaciones descubrieron que los estilos no son cuatro, sino doce. Los mismos se describen a continuación. 2.3.1. Activo Los estudiantes que prefieren el estilo de aprendizaje activo disfrutan de nuevas experiencias, no son escépticos y poseen una mente abierta. No les importa aprender una tarea nueva, ya que no evitan los retos a pesar de que eso pueda comprometer la idea que tienen de sí mismos y de sus capacidades. 2.3.2. Reflexivo Los individuos con preferencia por el estilo de aprendizaje reflexivo observan las experiencias desde distintos ángulos. También analizan datos, pero no sin antes haber reflexionado con determinación. Son prudentes y no se apresuran a la hora de extraer conclusiones de sus vivencias, por lo cual pueden llegar a parecer dubitativos. 2.3.3. Teórico Suelen tener una personalidad perfeccionista. También son analíticos, pero les gusta sintetizar y buscan integrar los hechos en teorías coherentes, sin dejar cabos sueltos y preguntas sin respuesta. Son racionales y procuran permanecer objetivos ante todo. 2.3.4. Pragmático Son más bien prácticos y necesitan comprobar sus ideas. Son realistas a la hora de tomar decisiones y resolver una cuestión, y orientan su aprendizaje hacia la necesidad de dar respuestas a problemas concretos. Para ellos, si es útil es válido. 2.3.5. Lógico (matemático) Los individuos con el estilo de aprendizaje lógico prefieren emplear la lógica y el razonamiento en lugar de contextualizar. Utilizan esquemas en los que se muestran las cosas relevantes. Asocian palabras aún sin encontrarles sentido. 2.3.6. Social (interpersonal) Este estilo de aprendizaje, también llamado grupal, es característico de aquellas personas que prefieren trabajar con los demás siempre que pueden. Estos individuos tratan de compartir sus conclusiones con otros, y ponen en práctica sus conclusiones en entornos grupales. El “juego de roles” es una técnica ideal para ellos. 2.3.7. Solitario (intrapersonal) Este estilo de aprendizaje, también llamado individual, es característico de aquellos que prefieren la soledad y la tranquilidad para estudiar. Son personas reflexivas y suelen centrarse en temas que sean de su interés. Dan mucho valor a la introspección y a los "experimentos mentales", aunque también pueden experimentar con la materia. 2.3.8. VisualEstos estudiantes no son buenos leyendo textos pero, en cambio, asimilan muy bien las imágenes, diagramas, gráficos y vídeos. Suele ser práctico para ellos el empleo de símbolos o crear una taquigrafía visual al tomar apuntes, ya que de ese modo memorizan mejor. 2.3.9. Aural o auditivo Estos estudiantes aprenden mejor cuando escuchan. Por ejemplo, en las discusiones, debates o simplemente con las explicaciones del profesor. Mientras otros estudiantes pueden aprender más al llegar a casa y abrir el manual de clase, éstos aprenden mucho en el aula, escuchando a los maestros. 2.3.10. Verbal (lectura y escritura) También conocido como aprendizaje lingüístico, los estudiantes con este estilo de aprendizaje estudian mejor leyendo o escribiendo. Para ellos, es mejor leer los apuntes o simplemente elaborarlos. El proceso de elaboración de estos apuntes es una buena herramienta para su aprendizaje. 2.3.11. Kinestésico Estas personas aprenden mejor con la práctica, es decir, haciendo más que leyendo u observando. Es en esta práctica donde llevan a cabo el análisis y la reflexión. Los maestros que quieran sacar el mayor rendimiento de estos estudiantes, deben involucrarse en la aplicación práctica de los conceptos que pretenden enseñar. 2.3.12. Multimodal Algunos individuos combinan varios de los estilos anteriores, por lo que no tienen una preferencia determinada. Su estilo de aprendizaje es flexible y le resulta cómodo aprender con varios estilos de aprendizaje. 2.4. Entornos de enseñanza de programación ó aplicaciones educativas de enseñanza de la programación Como se mencionó en el capítulo anterior , existe un abanico de aplicaciones educativas que encaran la misma problemática de este trabajo final, pero con una visión diferente. Entre ellas encontramos a: ● Mumuki ● Gobstones ● Coderbyte ● CodeWars ● FreeCodeCamp ● HackerEarth ● Moodle UNICEN A continuación se pasará a describir con más detalle cada una de estas plataformas, junto a sus características más importantes. 2.4.1. Mumuki6 Esta herramienta nació con el objetivo de promover la educación de la programación y el pensamiento computacional de manera inclusiva, entretenida y durable, utilizando software y contenido libre. La idea principal de Mumuki es contribuir en la democratización de la educación en informática y masificar el pensamiento computacional, para lograr una verdadera inclusión digital. Entre sus principales características podemos encontrar: ● Presenta una secuencia didáctica coherente para guiar el proceso de aprendizaje. ● Fomenta la práctica desde el minuto cero, integrada siempre con la teoría. ● Enseña conceptos fundamentales y durables, orientados a la formación del pensamiento crítico. ● Cuenta con un contenido y una plataforma libre. ● Contiene estadísticas detalladas de los usuarios que utilizan la plataforma. 2.4.2. Gobstones7 La misma cuenta con dos formas diferentes de enseñar a programar: 7https://gobstones.github.io/gobstones-web/#/code 6https://mumuki.io ● Con bloques: es posible a través de Gobstones JR, y permite que la tarea de escribir código sea tan simple como crear y mover bloques de un lugar hacia otro. ● Con texto: la programación con texto es proveída a través de Gobstones SR, permitiendo a los estudiantes aprender conceptos más avanzados de codificación utilizando un lenguaje formal. Gobstones también cuenta con una herramienta para los docentes llamada Gobstones Teacher, que faculta a los docentes crear guías de ejercicios y distribuirlos fácilmente. Esta aplicación web es de software libre y también tiene versiones de escritorio que pueden descargarse desde la página oficial de Gobstones. 2.4.3. Coderbyte8 Diseñada para mejorar el nivel de programación y la preparación técnica a la hora de realizar una entrevista. Esta herramienta se divide principalmente en tres secciones: ● Desafíos de programación: se presentan desafíos y también videos con la solución al problema, soluciones de otros usuarios e incluso una sección para discutir en caso que se generen dudas. ● Cursos de programación: para aprender distintos algoritmos o nuevas tecnologías. ● Preparación para entrevistas: en esta sección se abordan temas para ayudar a preparar a cualquier persona a una futura entrevista de software. En este caso se incluyen estructuras de datos, algoritmos, diseño de software, programación dinámica y más. 2.4.4. CodeWars9 Esta plataforma fue creada con el objetivo de mejorar el conocimiento del desarrollador sobre diferentes lenguajes de programación o incluso expandir el mismo animando a aprender una nueva tecnología. El método de CodeWars para lograr su fin es someter al usuario a distintos desafíos, y competir en los mismos con otros desarrolladores en tiempo real. CodeWars brinda la posibilidad de aprender o mejorar en entre otros, los siguientes lenguajes de programación: ● C ● C++ ● C# ● Go ● Groovy ● Java ● Javascript 9https://www.codewars.com/ 8https://www.coderbyte.com/challenges ● Kotlin ● PHP ● Python ● Ruby ● Rust ● Shell ● SQL ● Swift ● Typescript 2.4.5. FreeCodeCamp10 Esta herramienta busca capacitar a los desarrolladores para que puedan conocer los conceptos básicos a la hora de buscar un nuevo trabajo en el ámbito del software. De esta forma, cuenta con numerosos ejercicios de práctica sobre los siguientes temas: ● Diseño de software ● Algoritmos ● Estructuras de datos ● Testing ● Aprendizaje de máquinas ● Seguridad 2.4.6. HackerEarth11 HackerEarth es una aplicación web que permite no sólo adentrarse en la práctica de la programación, sino también prepararse para entrevistas y mejorar las capacidades de codificación con una amplia comunidad de desarrolladores. Entre otros temas, cuenta con ejercicios de: ● Programación básica ● Estructuras de datos ● Algoritmos ● Matemática ● Aprendizaje de máquina 11http://www.hackerearth.com/practice/ 10https://www.freecodecamp.org/learn/coding-interview-prep/algorithms 2.4.7. Moodle UNICEN12 Moodle es la plataforma más popular del mundo a la hora de buscar un sistema de gestión de aprendizaje. La misma permite crear tu propio sitio online de forma simple y rápida . Esta plataforma se utiliza en las materias de primer año de la carrera, para la enseñanza de programación. Para ello utiliza un plugin llamado Virtual Programming Lab (VPL) que permite a los13 alumnos la realización, compilación y ejecución de sus programas directamente sobre la web. Si bien Moodle posee la posibilidad de utilizar la funcionalidad de bancos de test, al día de la fecha la misma no está siendo usada. 2.5. Intérprete Un intérprete es un programa que procesa el código fuente de determinado software durante su tiempo de ejecución, es decir, mientras el software se está ejecutando, y actúa como una interfaz entre ese proyecto y el procesador. Un intérprete siempre procesa el código línea por línea, de modo que lee, analiza y prepara cada secuencia de forma consecutiva para el procesador. Este principio también se aplica a las secuencias recurrentes, que se ejecutan de nuevo cada vez que vuelven a aparecer en el código. Para procesar el código fuente del software, el intérprete recurre a sus propias bibliotecas internas: en cuanto una línea de código fuente se ha traducido a los correspondientes comandos legibles por máquina, esta se envía directamente al procesador. El proceso de conversión no finaliza hasta que se ha interpretado todo el código. Solo se interrumpe prematuramente si se produce un fallo durante el procesamiento, lo que simplifica mucho la resolución de los errores, ya que la línea de código problemática se detecta inmediatamente después de ocurrir el fallo. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripción en un lenguaje de programación al código de máquina del sistema, los primeros (los intérpretes) sólo realizan la traducción a medida que sea necesaria, típicamente, instrucciónpor instrucción, y normalmente no guardan el resultado de dicha traducción. 2.5.1 Árbol de Sintaxis Abstracta El árbol de sintaxis abstracta (AST) es un árbol estructurado formato del script de origen que contiene diferentes nodos, que representan diferentes construcciones del lenguaje y las referencias a las entradas de la tabla de símbolos. El proceso de la creación de AST implica interacciones con el Símbolo Administrador de tablas para crear tablas de símbolos y actualizar información en él. El intérprete de secuencias de comandos utiliza AST y la tabla de símbolos para realizar la evaluación. AST forma un resultado final del analizador después de la evaluación de la gramática normas (Patra, Pattanayak, & Puthal. 2013). 13 https://moodle.org/plugins/mod_vpl 12https://moodle.exa.unicen.edu.ar/ 2.6. Marco Teórico Metodológico y Tecnológico 2.6.1. Vue Vue.js : es un framework de javascript para construir interfaces de usuario. A diferencia de otros14 frameworks monolíticos, Vue está diseñado desde cero para ser adoptable gradualmente. La biblioteca principal se centra solo en la capa de vista y es fácil de recoger e integrar con otras bibliotecas o proyectos existentes. Componente: son piezas reutilizables de la aplicación con sus propios datos y vistas. Cada componente posee su propio ámbito para estilos y métodos, estando completamente aislado de otros componentes. MVVM: Model-View-ViewModel es un patrón, en el cual el modelo (Model) se vincula con la vista (View) a través del denominado “ViewModel”. El modelo contiene datos y cierta lógica de negocios, mientras que la vista es responsable de su representación (DOM). Como se puede observar en la figura 2.3, la instancia de Vue cumple el rol de “ViewModel” maneja en el enlace de datos, asegurándose que sí los datos del modelo cambian, la vista se vea inmediatamente afectada, y viceversa. Figura 2.3. Representación del enlace entre la vista y el modelo a través de la instancia de Vue. Data Binding: es el mecanismo de propagación de cambios desde los datos hacia la vista y viceversa. Componentes dentro de componentes: Bajo el concepto de reutilización de los componentes, se pueden definir componentes dentro de componentes, generando así una jerarquía de componentes padres e hijos. La comunicación desde componentes padres hacia componentes hijos se realiza mediante “props”. Dichas “props” forman un enlace unidireccional hacia abajo, por lo tanto si los datos del componente “padre” cambian, fluyen hacia los componentes “hijos”, pero no en sentido contrario. De esta manera se evita que los componentes “hijos” modifiquen accidentalmente los datos del “padre”, lo cual podría dificultar la comprensión del flujo de datos de la aplicación (Props - Vue.Js, 2021). Para la comunicación desde un componente “hijo” hacia su correspondiente “padre”, es necesario implementar “Custom Events”, los cuales requieren definir en la instancia del componente hijo 14 https://vuejs.org/v2/guide/ explícitamente que se está escuchando dicho nombre del evento y que acción se va a tomar. Luego en el componente hijo se debe realizar una “emisión” correspondiente para que el componente padre la escuche y reciba la información indicada (Custom Events - Vue.Js, 2021). Estado de la aplicación: es el estado global centralizado de la aplicación. Los datos del estado son inicializados cuando la aplicación se inicia. Estos datos pueden ser accedidos desde cualquier componente que integra la aplicación, sin embargo no puede ser fácilmente modificada, sino que cada elemento del estado de la aplicación, tiene una correspondiente mutación que puede ser despachada dado distintos eventos que ocurren en los componentes. La utilización de un estado global centralizado, permite simplificar la comunicación entre componentes que se encuentran distantes en la jerarquía de la aplicación. Evitando la incorporación de “props” y “Custom Events” en niveles intermedios de la jerarquía, donde los datos que fluyen pueden dar a confusión o no ser relevantes, conduce una implementación del flujo de datos fácil de comprender, mantener y modificar. Vuex: es una arquitectura para aplicaciones Vue, inspirada en la arquitectura Flux y Redux, la cual permite una administración simplificada del estado de la aplicación (Filipova, 2016). Figura 2.4. Flujo de datos entre componentes y el estado de la aplicación mediante Vuex. La “store” de Vuex, está compuesta por: estado y mutaciones. El estado es un objeto que representa el estado inicial de los datos de la aplicación. Las mutaciones también son objetos que contienen funciones de acción que modifican el estado. La “store” de Vuex, no es más que un archivo javascript que exporta dichos objetos y le indica a Vue que utilice Vuex. De está manera luego la “store” puede ser utilizada en cualquier componente. Es importante destacar, que la “store” de Vuex es reactiva, es decir que los componentes obtienen un estado de la misma, y actualizarán sus vistas cuando dicho estado cambie. Los componentes no son capaces de modificar directamente el estado de la “store”, en su lugar, estos despachan mutaciones declaradas en la “store”, permitiendo un seguimiento simple de los cambios. De está manera, como se muestra en la figura 2.4, la “store” de Vuex se convierte en una “única fuente de la verdad”. 2.6.2. Firebase15 Firebase es un conjunto de herramientas desarrolladas por Google, construidas a partir de tres pilares: Desarrollar, Crecer y Ganar. Dichas herramientas son: ● Cloud Firestore ● Kit de AA ● Cloud Functions ● Autenticación ● Hosting ● Cloud Storage ● Realtime Database ● Crashlytics ● Performance Monitoring ● Test Lab ● Analytics ● Predictions ● Firebase A/B Testing ● Cloud Messaging ● Remote Config ● Dynamic Links ● Indexación de Aplicaciones ● Invites Cada una de estas herramientas es independiente, y no es necesario utilizar todas juntas en nuestra aplicación o sitio web, sino que uno puede elegir cuales de ellas desea emplear. Muchas de ellas están disponibles sin costo alguno, o en caso contrario existe un nivel gratuito enfocado a realizar pruebas y con límites razonables para aplicaciones pequeñas (Moroney et al., 2017 ). A continuación describiremos el conjunto de herramientas utilizadas en el desarrollo de la aplicación: Hosting Firebase Hosting es un servicio de hosting de contenido web con nivel de producción orientado a desarrolladores. Entre su funciones principales podemos destacar: ● Permite entregar contenido mediante una conexión segura, ya que Firebase Hosting incluye SSL sin necesidad de configuración. 15 https://firebase.google.com/ ● Permite alojar contenido dinámico y estático, además de microservicios. Firebase Hosting admite todo tipo de contenido para hosting, desde los archivos CSS y HTML hasta las API o los microservicios de Express.js. ● Permite publicar contenido con rapidez, donde cada archivo subido se almacena en caché en discos SSD ubicados en los perímetro de la CDN en todo el mundo y se entrega en formato gzip o Brotli (Firebase Hosting, 2021). Autenticación La Autenticación de Firebase proporciona servicios de backend, SDK fáciles de usar y bibliotecas de IU ya elaboradas para autenticar usuarios, ya sea mediante contraseñas, números de teléfono y proveedores de identidad federada populares como Google, Facebook, Twitter y muchos más (Firebase Authentication, 2021). Realtime Database Firebase Realtime Database es una base de datos alojada en la nube. Los datos se almacenan en formato JSON y se sincronizan en tiempo real con cada cliente conectado. Todos los clientes comparten una instancia de Realtime Database y reciben actualizaciones automáticamente con los datos más recientes (Firebase Realtime Database, 2021). 2.7. Resumen A modo de repaso, se puede destacar que existen diferentes metodologías a la hora de aprender, incluso también en el ámbito de la programación. No todas las personas adquieren conocimientosde la misma forma, y es por ello que es muy valioso que exista la posibilidad de aprender a programar a través de distintos estilos de aprendizaje, y no únicamente escribiendo código, ejecutando el mismo y confirmando si la salida es la correcta o no. De esta forma, existen diferentes funcionalidades que facilitan el aprendizaje de distintos modos. Entre otras se pueden mencionar los depuradores de código y las vistas de las estructuras de datos de un determinado programa. Así ya no existe solo el aprendizaje verbal acompañado también del lógico, relacionado a la mera lectura y escritura de código junto con la relación de los conceptos a través de la lógica para comprender lo que un bloque de código está haciendo; sino también la incorporación del estilo visual que ahora proveen las estructuras de datos actualizadas de un programa, o el aprendizaje kinestésico, facilitado por el depurador de código, permitiendo reducir en gran medida el tiempo empleado en leer, observar y comprender determinado programa para adentrarse de lleno en la práctica continua. Sin embargo, así como es relevante que exista la posibilidad de aprender de distintas formas, también es necesario la verificación de cada solución para validar que lo que se hizo estaba bien, y la solución fue óptima. Para ello existen los tests, que evalúan la calidad del producto identificando defectos y problemas. Esto permite contemplar situaciones que tal vez no fueron pensadas y así generar un código mucho más robusto. Los tests a su vez suelen ser agrupados en suites de tests, conteniendo distintos casos de test que abarcan diferentes funcionalidades de una aplicación. Hoy en día conviven diferentes plataformas cuyo objetivo principal es enseñar a determinado usuario a aprender a programar, pero ninguna de ellas cuenta con todos los aspectos mencionados previamente. Algunas hacen énfasis en el testeo, por ejemplo, mientras que otras se orientan a detallar visualmente las soluciones desarrolladas. CAPÍTULO 3 Propuesta de la Herramienta VIDE 3.1. Características Herramienta Comparando las plataformas y herramientas analizadas en el capítulo 2.5 “Entornos de enseñanza de programación ó aplicaciones educativas de enseñanza de la programación”, podemos observar en la tabla 3.1 que ninguna de ellas presenta un conjunto completo de las características destacadas que ayudan a solucionar las problemáticas mencionadas en el capítulo 1.2 “Motivación”. Nombre Herramienta Mumuki Gobstones Coderbyte CodeWars FreeCodeCamp HackerEarth - Problemas de Práctica IDE Moodle Intro. Prog. I UNICEN16 Banco de Test ✖ ✖ ✖ ✔ ✔ ✖ ✖ Representación Gráfica ✔ ✔ ✖ ✖ ✖ ✖ ✖ Ejecución Paso a Paso ✖ ✔ ✖ ✖ ✖ ✖ ✖ Solución Disponible ✖ ✖ ✔ ✔ ✔ ✔ ✔ Estadísticas de alumnos ✔ ✖ ✖ ✖ ✖ ✔ ✔ Tabla 3.1: Comparación de plataformas y herramientas según sus características. Con el objetivo de suplir dicha ausencia, la herramienta desarrollada VIDE (Visual Integrated Development Environment) ofrece un entorno de desarrollo web para ejercicios prácticos que cumple con cada una de las características mencionadas, siendo así amigable para un usuario alumno que se está introduciendo y perfeccionando en la programación. Destacamos el detalle de cada característica: ● Banco de Test: se le habilita al usuario docente, desarrollador de la consigna del ejercicio la posibilidad de incluir un conjunto amplio de ejemplos sobre los cuales es posible validar la solución propuesta. 16 La característica “Banco de Test” se encuentra disponible en Moodle, pero no es utilizada por la cursada de Intro. Prog. I ● Representación Gráfica y Ejecución Paso a Paso: se habilita la visualización de la representación de los distintos estados de las estructuras de datos declaradas con sus valores, y cómo se van modificando paso a paso durante la ejecución del programa diseñado por el estudiante para resolver la consigna ● Solución Disponible: se habilita al usuario docente que crea la consigna indicar la solución óptima y ciertas “pistas fijas”, que se muestran previa a dicha solución, induciendo al alumno a una reflexión personal sobre lo desarrollado. Dicha metodología de pistas previas está inspirada en la implementación actual de los ejercicios prácticos de la herramienta Mumuki. ● Estadísticas de alumnos: permite mostrar las estadísticas del número de soluciones probadas, soluciones aceptadas, errores de sintaxis, errores de ejecución y soluciones rechazadas para cada consigna. En la Figura 3.1 se muestra un esquema de la disposición de secciones que componen la herramienta VIDE en su interfaz principal. Figura 3.1. Disposición de secciones de la herramienta VIDE. Para ingresar a VIDE es requerimiento para el usuario indicar su cuenta de Google con la cual desea registrarse. Esto permite reconocer las interacciones del usuario en forma individual. A continuación se puede observar en la figura 3.2, el mensaje de bienvenida presente en la vista inicial de VIDE, que invita al usuario a ingresar con su cuenta de Google. Figura 3.2. Mensaje de bienvenida a VIDE, la cual permite registrarse con una cuenta de Google. 3.1.1 Lenguaje de Programación El lenguaje de programación elegido para que la herramienta VIDE soporte es Javascript. Los motivos principales por los cuales se eligió Javascript son: ● Popularidad como lenguaje de programación. Posicionándose en el top 3 según el índice PYLP .17 ● Ejecución en el navegador en forma nativa, facilitando el desarrollo de la herramienta web. ● Utilizado como lenguaje de programación para front-end y back-end. 3.2. Secciones Herramienta VIDE La herramienta VIDE está disponible en https://vide-tool.web.app/ Detallamos a continuación cada una de las secciones que se mostró en la figura 3.1 3.2.1. Crear Ejercicio Está sección permite a los usuarios docentes crear y almacenar ejercicios en VIDE. Como se puede observar en la figura 3.3 a continuación, los campos carpeta, título y consigna son obligatorios para la creación del ejercicio. Sí el usuario no indica uno de estos, se le comunican los campos necesarios faltantes mediante una alerta en la esquina superior derecha. 17 https://www.stackscale.com/es/blog/lenguajes-programacion-populares-2021/ Figura 3.3. Formulario de creación de ejercicios. Las carpetas permiten agrupar ejercicios facilitando luego la búsqueda y selección de los mismos dentro de VIDE. Por debajo del campo de entrada de texto para la consigna se posicionan dos editores de código correspondientes al código inicial y código solución. El código inicial se visualiza en el editor de código del alumno al abrir el ejercicio, mientras que el código solución permite al creador del ejercicio disponibilizar la solución óptima del ejercicio. Además, dicho código solución es necesario para la suite de test, ya que el mismo será ejecutado para generar el resultado de cada test. Luego se posicionan los editores de texto y código para agregar las pistas 1 y 2 de la consigna. Y por último está el formulario que permite agregar test al ejercicio, donde cada test está conformado por un nombre identificatorio y el código correspondiente. 3.2.2. Buscador Como se puede observar en la figura 3.4 a continuación, está sección permite buscar y seleccionar ejercicios dentro de VIDE, filtrando por carpeta y nombre de los ejercicios. Figura 3.4. Explorador de ejercicios. 3.2.3. Consigna Al seleccionar un ejercicio, se despliega la consigna del ejercicio en el panel redimensionable destacado en la figura 3.5. Figura 3.5. Vista general de la herramienta VIDE, donde se destaca la consigna del ejercicio “Eureka” seleccionado por el usuario. 3.2.4. Editor de Texto El editor de texto destacado en la figura 3.6 está dividido en dos, donde el “superior” está orientado al “código entrada”, mientras que el inferior está orientado al “código solución/salida”. A pesar de esta división, el contenido de dichos editores es concatenado al momento de ejecutarse. Cuando el usuarioalumno selecciona un ejercicio desde el buscador, se coloca en el editor superior el código inicial del ejercicio y por debajo el código correspondiente al primer test de la suite de test en caso de que el ejercicio lo contenga. De está manera se le presenta al usuario alumno un escenario listo para comenzar a desarrollar el ejercicio. Figura 3.6. Vista principal de la herramienta VIDE, donde se destacan los editores de texto. 3.2.5. Panel de Ejecución El panel de ejecución destacado en la figura 3.7, presenta tres modos de ejecutar el código presente en el editor de texto. Estos modos le permiten al usuario alumno elegir el “ritmo de ejecución”. Figura 3.7. Panel de ejecución. El botón verde corresponde a la ejecución normal, a su derecha se posiciona el botón de ejecución lenta y por último el botón de ejecución paso a paso. La ejecución normal ejecuta el código en “tiempo real”. De esta forma el código se interpreta y se ejecuta al instante. No hay forma posible al ojo humano de identificar lo que va sucediendo en cada instrucción implementada. Lo único que se logra visualizar es la salida final del programa desarrollado por la alta velocidad a la que se ejecuta el código. La ejecución lenta, por otro lado, ejecuta el código con un lapso de espera de 1,2 segundos entre cada operación significativa, la cual es resaltada en el editor de texto, como se puede observar en la figura 3.8. Una operación significativa es aquella porción del código que representa una acción trascendental en la ejecución del programa. Las mismas son: declaraciones, asignaciones, operaciones aritméticas, condiciones, retornos, llamados a funciones e impresiones por consola. Figura 3.8. Ejecución lenta en curso, donde se resalta la línea de código “entradaTeclado = [1,2,3];” que está siendo ejecutada. Por último la ejecución “paso a paso'' o debugger, ejecuta cada operación significativa y “detiene” la ejecución hasta que el usuario alumno indica continuar con la siguiente. Al igual que la “ejecución lenta” se resalta en el editor de texto la última operación significativa ejecutada. Figura 3.9. Ejecución paso a paso, donde se resalta la última línea de código ejecutada “número=3;” y donde se encuentra detenida la ejecución. Como se puede observar en la figura 3.9, cuando el usuario alumno se encuentra en el modo de ejecución paso a paso, dentro del panel de ejecución se habilitan tres nuevos botones: ● El de resumir la ejecución en tiempo real. ● El de continuar con la siguiente instrucción. ● El de salir del modo debugger. Este último modo es utilizado en gran manera en muchos de los entornos que existen hoy en día y es de gran ayuda para testear todo tipo de programas. Su principal uso es el de correr programas bajo determinadas condiciones que permiten al programador el seguimiento y monitoreo de las operaciones en progreso, logrando una mayor facilidad a la hora de encontrar errores o funcionamientos erróneos en el código. 3.2.6. Visualización de Estructuras La pestaña de “Visualización de estructuras” se encuentra siempre habilitada y permite reflejar los diferentes estados de las estructuras de datos declaradas. Las estructuras de datos con sus correspondientes valores, aparecen y desaparecen según su estado durante la ejecución. Se realizaron representaciones visuales para variables de tipo simple y para arreglos, dado que estos son los tipos comúnmente utilizados en los primeros ejercicios de un curso introductorio de programación .18 18Programa meteria “Conceptos de Algoritmos, Datos y Programas” - UNLP https://www.info.unlp.edu.ar/wp-content/uploads/2022/04/COMB-CADP.pdf Las variables de tipo simple son elementos individuales, como cadenas de caracteres (string), números ó booleanos. Por otro lado, los “arreglos” (array) son una serie de elementos en un orden específico, los cuales se acceden utilizando un entero como índice para especificar el elemento que se requiere (Patel, 2018). Cada una de estas representaciones se visualizan junto con su nombre identificatorio con el cual fueron declaradas en el código fuente, y se ubican según el orden de declaración. Está representación se muestra en la figura 3.10 a continuación, en base al código de ejemplo presente en el editor de texto de la misma. Figura 3.10. Ejemplo de los estilos de visualización de estructuras arreglo y variables de tipo simple. El usuario alumno puede cambiar la ubicación de las estructuras dentro de la visualización mediante interacciones de arrastrar y soltar, como así también es posible realizar zoom sobre ellas. De esta manera el usuario alumno puede agrupar las estructuras que son de su interés y realizar un seguimiento de la ejecución más simple. 3.2.7. Banco de Test Una vez seleccionado un ejercicio, se habilita la pestaña “Suite de test” donde se listan los test disponibles. Cada test indica: ● Estado: el cual indica si el test “no fue ejecutado”, “ejecutado pero no pasado” o “ejecutado pasado correctamente”. ● Nombre del test: indicado por el usuario docente que creo que ejercicio. Al realizar un click sobre el mismo se permite visualizar en el editor superior el código correspondiente al test. ● Botón “Ejecutar”: el cual permite ejecutar en forma individual el test. Al final de la pestaña se coloca el botón “Ejecutar Todos”, el cual permite ejecutar el conjunto completo de test. Para que un test sea considerado “ejecutado pasado correctamente”, el contenido de la variable “resultado” luego de ejecutar el código presente en los editores, debe ser igual al obtenido ejecutando el código indicado como “solución” por el creador del ejercicio. El estado “no fue ejecutado”, “ejecutado pero no pasado” o “ejecutado pasado correctamente” correspondiente a cada test se ubica a izquierda dentro del listado, como se puede observar destacado en la figura 3.11. Figura 3.11. Suite de test, donde el “Test 1” es indicado como “ejecutado pasado correctamente”, el “Test 2” y “Test 3” es indicado como “ejecutado pero no pasado” y el “Test 4” es indicado como “no fue ejecutado”. 3.2.8. Consola Este panel redimensionable destacado en la figura 3.12, permite comunicar al usuario alumno los errores de sintaxis, los errores de ejecución y visualizar las “impresiones por pantalla” del programa. Figura 3.12. Visualización de la impresión por pantalla “Hello World!”. 3.2.9. Solución Esta sección permite al usuario alumno, conocer la solución óptima propuesta por el creador del ejercicio. Además, en caso de haber sido indicadas por este último, se visualizarán dos pistas, previas a la solución óptima. En las figuras 3.13 y 3.14 a continuación se observa la sección de pistas y solución óptima mencionadas. Figura 3.13. Panel solución del ejercicio seleccionado, donde se observa la “Pista 1”. Figura 3.14. Panel solución del ejercicio seleccionado, donde se observa el código solución. 3.2.10. Estadísticas Una vez seleccionado un ejercicio, es posible visualizar en la sección de estadísticas, un registro de: ● Cantidad de ejecuciones en la suite de test.. ● Cantidad de ejecuciones satisfactorias en la suite de test. ● Cantidad de ejecuciones rechazadas en la suite de test. ● Cantidad de ejecuciones con error de referencia (ReferenceError ), los cuales se registran19 cuando se hace referencia a una variable inexistente. ● Cantidad de ejecuciones con error de sintaxis (SyntaxError ), los cuales se registran20 cuando se trata de interpretar código que resulta ser inválido sintácticamente. ● Cantidad de ejecuciones con error de operación inválida (TypeError ), error cuando no se21 pudo realizar una operación, generalmente cuando un valor no es del tipo esperado. Las cantidades se representan gráficamente como se puede observar en la figura 3.15 a continuación. 21 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError 20 https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError 19 https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/ReferenceErrorFigura 3.15. Panel de estadísticas registradas de un ejercicio específico. 3.2.11. Descarga Código El usuario alumno puede descargar fácilmente el código desarrollado en VIDE en un archivo de texto, mediante el botón presente en la barra lateral izquierda. El archivo descargado está compuesto principalmente por el contenido de ambos editores de texto, y en caso de que el alumno se encuentre resolviendo un ejercicio, la consigna del mismo se adjunta como comentario al comienzo del archivo, así como también se agrega el nombre del ejercicio al nombre del archivo descargado. 3.3 Resumen A modo de resumen podemos destacar que VIDE, la herramienta propuesta y desarrollada, posee las siguientes características principales para la resolución de consignas prácticas en Javascript: ● Creación y distribución de consignas prácticas, con solución propuesta disponible. ● Banco de test. ● Representación gráfica de estructuras de datos y ejecución paso a paso. ● Estadísticas de alumnos. A diferencia de las diferentes herramientas analizadas en el capítulo 2.5 “Entornos de enseñanza de programación ó aplicaciones educativas de enseñanza de la programación”, la propuesta se posiciona como solución integral a las problemáticas mencionadas en el capítulo 1.2 “Motivación”. El desarrollo fue organizado incorporando un tablero kanban, donde cada tarea se identifica con numeración (VIDE-XX), un título a modo de resumen, una descripción del objetivo de la tarea y un responsable de dicha tarea. La primer etapa del desarrollo involucró la investigación e implementación de los siguientes objetivos: ● Establecer una disposición inicial del editor de texto, sección de consigna, vista interactiva de estructuras, y sección de suite de test. ● Implementar una vista funcional de estructuras de datos. ● Deployar la herramienta junto con una base de datos que permita almacenar información. ● Ejecutar código javascript en el cliente. Esta prueba de concepto estableció el enfoque y conceptos necesarios para la implementación final. La herramienta VIDE está disponible en https://vide-tool.web.app/ CAPÍTULO 4 Diseño, arquitectura e implementación 4.1. Introducción En el presente capítulo se desarrolla la explicación correspondiente a la materialización del sistema propuesto presentando los detalles del diseño e implementación de la herramienta VIDE. Además, se incluye la explicación de cómo cooperan los componentes del sistema, como así también la interacción con el usuario. 4.2. Estructura del proyecto En la estructura de este proyecto cada elemento tiene una función específica y una correlación con los demás elementos que la componen. Eso hace posible que el sistema sea eficaz en su propósito. Cada parte de dicha estructura fue estudiada y elegida para lograr el objetivo deseado de la manera más sencilla y performante posible. 4.2.1. Modelo de dos Capas Esta aplicación cuenta con una arquitectura cliente-servidor, es decir, una estructura que realiza su trabajo por medio de clientes, que son aquellos que realizan pedidos de servicios, y servidores, que proveen dichos servicios o recursos. Existen diferentes modelos cliente-servidor. En este caso se utiliza el modelo de dos capas. Las respectivas capas son las siguientes: 1. Nivel de aplicación (cliente): en este nivel se encuentra toda la interfaz del sistema y por el cual el usuario puede realizar su actividad con el sistema. En este caso, el cliente es considerado pesado o fat-client ya que la lógica de negocio está inmersa dentro de la aplicación que realiza la interfaz de usuario, en el lado del cliente. Es decir, que tanto la visualización de la información, como el procesamiento y el cálculo de la misma es realizada del lado del cliente. 2. Nivel de la base de datos (servidor): este nivel es en donde se almacena toda la información ingresada en el sistema y que se deposita en forma permanente. Su función principal es la de almacenar y retornar la información persistida del sistema. Puede contar con procesamiento de datos pero siempre a nivel de base de datos. Figura 4.1. Modelo de dos capas A diferencia del modelo de tres capas, como se muestra en la figura 4.1 el modelo de dos capas no cuenta con la capa servidor que contiene la lógica de negocios. En aplicaciones grandes esta capa es importante porque permite particionar el trabajo y delegar muchas de las operaciones entre las diferentes capas. De esta forma, dicha capa sirve de intermediario o puente entre el cliente y la capa de base de datos. El nivel de negocios proporciona servicios que completan las tareas de negocio tales como verificar, procesar y calcular el resultado correcto basado en los datos enviados por el cliente. En el caso de la presente herramienta, la lógica de negocio es sencilla y la inclusión de una nueva capa a nivel de servidor generaría una pérdida importante de la eficiencia, creando un nuevo eslabón por el que debe pasar la información, cuando la misma es poca. De esta forma, el modelo escogido aprovecha la capacidad de cómputo de las computadoras que lo ejecutan, generalmente infrautilizadas, y solo utiliza al servidor de base de datos para consultar por la información que necesita. Si bien existen diferentes limitaciones en este modelo (difícilmente escalable, alta carga de la red, flexibilidad es restringida y funcionalidad limitada) todos estos puntos se reducen a la aplicación que se desea diseñar. En el caso de una aplicación pequeña, que no requiere de grandes cantidades de información ni de procesamiento de la misma, un modelo dos capas es ideal. Y es por ello que se eligió dicho modelo. Un modelo de tres capas no se aprovecharía al máximo porque se contaría con una gran estructura para una lógica simple y reducida. Si bien en muchos casos el cliente de un modelo de dos capas se considera fat-client, en la presente aplicación el cliente no es pesado porque no es demasiada la lógica de negocio de la misma, permitiendo un incremento de velocidad de aplicación, desarrollo y mantenimiento. 4.2.2. Base de Datos Como se menciona anteriormente, la segunda capa del modelo de dos capas que utiliza la herramienta está conformada por la base de datos. La plataforma utilizada como base de datos fue Firebase Realtime Database . La misma es una22 base de datos no SQL alojada en la nube. Los datos se almacenan en formato JSON y se sincronizan en23 tiempo real con cada cliente conectado. Existen algunas ventajas importantes por los cuales la elección de esta herramienta diseñada por Google se adaptaba muy bien al presente proyecto; entre las cuales podemos mencionar; ● Firebase es gratuito para el Plan Spark. El mismo tiene un límite de 1GB para la base de datos, de los cuales con 22 usuarios registrados y 21 ejercicios almacenados actualmente solo están ocupados 50kb, representando el 0.005% del espacio disponible. ● Posee una sencilla creación y configuración de la base de datos mediante la consola web de Firebase. ● No requiere un servidor propio para su instalación y utilización. ● Permite la administración de la base de datos en forma colaborativa. ● Provee notificaciones de errores y problemas de seguridad. ● Facilita la implementación completa de autenticación de usuarios mediante el Firebase JavaScript SDK el cual es distribuido mediante npm y es fácilmente instalable en cualquier proyecto de24 25 desarrollo web. Además posee documentación detallada e instructivos paso a paso. De está manera evita el desarrollo de un backend y permite enfocar el desarrollo del proyecto en el frontend. ● Dado que Firebase Realtime Database almacena los datos en formato JSON, no requiere el diseño de una base de datos relacional, simplificando la administración y comunicación con la base de datos. Además el SDK mencionado provee métodos para modificar la base de datos en forma concurrente, simplificando de está manera el registro de las estadísticas por parte de la herramienta desarrollada, ya que es el SDK elque se encarga de persistir los datos de forma concurrente en forma segura. ● Es desarrollado por Google, haciéndolo una herramienta popular y generando una gran comunidad de desarrolladores que la utilizan, y que comparten información y conocimientos. ● Como se observa en la figura 4.2 la interfaz para la visualización y edición de la base de datos en tiempo real, es simple y amigable. 25 https://www.npmjs.com/ 24 https://github.com/firebase/firebase-js-sdk 23 https://www.json.org/json-en.html 22 https://firebase.google.com/products/realtime-database Figura 4.2. Pestaña de datos de la consola de Firebase Realtime Database. 4.2.3. Hosting y Deployment Finalmente, para que la plataforma pueda ser accedida por los usuarios finales se necesita del deploy de la misma a través de un determinado host. Para el hosting de la herramienta desarrollada fue utilizado Firebase Hosting. El mismo es un servicio de hosting de contenido web con nivel de producción orientado a desarrolladores. Las principales ventajas de Firebase Hosting por las cuales se eligió como plataforma son: ● El servicio es gratuito para Plan Spark utilizado, el cual tiene un límite de almacenamiento de 10 GB para los archivos hosteados y 360 MB por día para la transferencia de datos. Dichos límites son más que suficientes para los requerimientos de la herramienta desarrollada, la cual solo ocupa 62.9 MB (0,6%) de los 10 GB disponibles para hosting. ● El deploy de la herramienta desarrollada en Firebase Hosting es sencillo. El mismo se realiza mediante Firebase CLI (Interfaz de Línea de Comandos), la cual es distribuida mediante npm y26 permite administrar, implementar y visualizar en proyectos de Firebase. De esta manera con simples comandos se permite autentificarse como usuario de un proyecto de Firebase, y realizar mediante un comando el deploy de los archivos. De está manera Firebase Hosting permite la administración colaborativa dado que todos los usuarios que tengan acceso de administrador sobre un proyecto Firebase, pueden utilizar Firebase CLI para administrar, implementar y visualizar el proyecto. ● Firebase Hosting configura automáticamente un certificado SSL para cada sitio que hospeda, además de un dominio de acceso público. 4.3. Tecnologías utilizadas Durante la etapa de investigación y prueba de concepto sobre la ejecución de código en el cliente mencionado en la sección 3.3.1 “Prueba de Concepto”, se llegó a la conclusión que para el mismo era 26 https://firebase.google.com/docs/cli conveniente utilizar Vue como framework de desarrollo, ya que utiliza Javascript “puro”, en lugar de JSX como React. Además al evaluar alternativas de deploy, hosting y bases de datos, se tomó la decisión de utilizar Firebase, ya que la misma no solo provee al igual que Github Pages una solución rápida y sencilla para27 deploy y hosting de un proyecto web, sino que también incorpora una base de datos en tiempo real, organizada en forma de árbol JSON, denominada “Realtime Database”. Simplificando el almacenamiento de información. Por último también se puede destacar que Firebase provee “Firebase Auth”, el cual es un servicio que puede autenticar los usuarios utilizando únicamente código del lado del cliente, siendo este uno de los requerimientos de implementar para el entorno de desarrollo propuesto. 4.3.1. Framework Desarrollo Frontend Al momento de comparar y elegir un framework de frontend tomamos como punto de partida, los más populares: Angular , React, Vue.28 Comparando su curva de aprendizaje y rendimiento, podemos destacar que React y Vue son los dos que mejor se ajustan dadas las necesidades del proyecto. En cuanto a la curva de aprendizaje, Angular se considera el de mayor dificultad, ya que utiliza Typescript , lenguaje el cual se suma al aprendizaje en sí del framework. Por otro lado, entre Vue y React,29 se puede considerar que Vue posee una sintaxis más sencilla ya que utiliza “Javascript Vanilla”, mientras que React utiliza JSX. La arquitectura de los tres frameworks mencionados es similar, donde la aplicación desarrollada se puede conceptualizar como un árbol de componentes, el cual comienza desde un componente “raíz”, y se extiende en jerarquía de componentes hijos. Como excepción se puede mencionar que Angular, no solo divide la aplicación en componentes, sino también en módulos, los cuales contienen código que relaciona qué componentes pertenecen a cada módulo. El rendimiento de los frameworks analizados en aplicaciones de un tamaño pequeño, destaca a Vue como el óptimo, seguido por React y en último lugar Angular. Estas afirmaciones se pueden corroborar a partir de las tablas comparativas 4.1 y 4.2, donde a pesar de que Vue produce un proyecto compilado para producción de mayor tamaño comparado con React, es dos veces más rápido que este último y cinco veces más rápido que Angular. Vue 624 KB React 587 KB Angular 15.7 MB Tabla 4.1. Tamaño final de proyecto compilado para producción (Saks, 2019) 29 https://www.typescriptlang.org/ 28 https://angular.io/ 27 https://pages.github.com/ Vue React Angular Tiempo de carga de página 246 269 403 Tiempo al crear 1000 componentes fila 232 420 384 Tiempo al recrear 1000 componentes fila 117 190 331 Tiempo al agregar 1000 componentes fila 185 370 254 Tiempo al crear 10.000 componentes fila 1447 2866 6361 Tiempo al recrear 10.000 componentes fila 547 1176 7427 Tiempo al agregar 10.000 componentes fila 1436 3854 7623 Tiempo eliminar todos los componentes fila 505 607 2196 Tiempo total 4715 9752 24978 Multiplicador 1.00 2.07 5.30 Tabla 4.2. Tiempo en milisegundos para la completar la tarea (Saks, 2019) 4.4. Diseño de la aplicación Dado que el proyecto fue íntegramente desarrollado utilizando un framework de frontend, la estructura y arquitectura del mismo se basa en la visualización de la herramienta. Partiendo de la disposición de la vista propuesta para la herramienta, podemos destacar 3 componentes principales: ● Encabezado ● Barra Lateral ● Contenido Principal Dichos componentes principales están agrupados por el componente Main Container, y como se observa en la figura 4.3 a continuación, la localización de sus archivos correspondientes se encuentra bajo la ruta /src/views. Por otro lado los componentes secundarios que componen cada uno de estos componentes principales se ubican bajo la ruta /src/components agrupados por funcionalidad. Figura 4.3. Distribución de carpetas y archivos del código fuente de los componentes Vue de VIDE. 4.4.1 Diseño de la UI Con el objetivo de acercar al usuario a la interfaz de los entornos de desarrollo del mercado, tomamos como referencia la localización de los diferentes componentes más significativos de un entorno de desarrollo como el editor de texto, consola, barras de herramientas superiores y laterales. También analizamos el diseño de las plataformas educativas de programación mencionadas en el capítulo 2.5 “Entornos de enseñanza de programación ó aplicaciones educativas de enseñanza de la programación”, comparándolas con los entornos de desarrollo del mercado, identificando la disposición de elementos y sus similitudes. De está manera destacamos: ● El editor de texto tiene prioridad en tamaño con respecto al resto de secciones. Como se puede observar en la figura 4.5 el porcentaje del área del editor con respecto al área total, se respeta la proporción dentro del rango aproximado a 30% - 50%. Teniendo en cuenta ese rango se determinó que el editor de VIDE ocupe un 45% del área total. ● La barra de herramientas superior y lateral alojan el acceso a diferentes secciones de VIDE, así como también el panel de ejecución. Además como se puede apreciar en la figura 4.4 al posicionar el puntero sobre cada uno de los elementos, se muestra el título de la sección que permite acceder o la acción que realiza. Figura 4.4. Mensaje informativo al posicionar el puntero sobre un elemento de la barra de herramientas superior o lateral. ● Las plataformas
Compartir