Content uploaded by Rafael Herrero-Álvarez
Author content
All content in this area was uploaded by Rafael Herrero-Álvarez on Jan 23, 2023
Content may be subject to copyright.
Propuesta de actividades y guías de evaluación para
estudiar paradigmas de programación
Rafael Herrero-Álvarez, Coromoto León, Israel López-Plata, Luz Marina
Moreno
Departamento de Ingeniería Informática y de Sistemas, Universidad de La
Laguna, Avenida Astrofísico Francisco Sánchez, s/n. Facultad de
Ciencias. Sección de Matemáticas. Apartado 456. Código postal 38200.
San Cristóbal de La Laguna. S/C de Tenerife, rherrero@ull.edu.es,
cleon@ull.edu.es, ilopezpl@ull.edu.es, lmmoreno@ull.edu.es
Proposal of activities and evaluation guides to study
programming paradigms
RESUMEN
En este trabajo se presenta una colección de actividades, junto con sus guías
de evaluación, para una asignatura en la que se estudian paradigmas de
programación. Se utiliza el lenguaje de programación multi-paradigma Ruby
para plantear ejercicios de programación procedimental, orientada a objetos y
funcional. Se trata de 11 actividades prácticas orientadas a que los estudiantes
desarrollen aplicaciones de código abierto, divididas en tres bloques: las
primeras centradas en programación imperativa y estructurada trabajando las
sentencias de asignación, condicionales y estructuras de control. El segundo
introduce conceptos de abstracción y encapsulamiento de la programación
orientada a objetos, trabajando con clases, objetos y polimorfismo. El tercer
bloque está dedicado a la programación funcional adaptando los bloques de
Ruby para convertirlos en clausuras y dar soporte a las funciones de orden
superior. Se incluyen también los resultados de la evaluación y calificación en
el presente curso académico con 164 estudiantes.
Palabras clave: lenguajes de programación, paradigmas de programación,
Ruby, evaluación.
ABSTRACT
This paper presents a collection of activities, together with their evaluation
guides, for a subject in which programming paradigms are studied. The multi-
paradigm programming language Ruby is used to pose procedural, object-
oriented and functional programming exercises. It is 11 practical activities aimed
at students developing open source applications divided into three blocks: the
first focused on imperative and structured programming, working on assignment
statements, conditionals and control structures. The second introduces
EXPERIENCIAS INNOVADORAS EN EDUCACIÓN ACTAS DE ATIDES 2022
ISBN 978-84-19647-14-6 · PP. 237-252
238 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
concepts of abstraction and encapsulation of object-oriented programming,
working with classes, objects and polymorphism. The third block is dedicated to
functional programming by adapting Ruby blocks to become closures and
support higher-order functions. The results of the evaluation and qualification in
the current academic year with 164 students are also included.
Keywords: programming languages, programming paradigms, Ruby,
evaluation.
INTRODUCCIÓN
En la informática existen diferentes maneras en las que es posible abordar la
programación, lo que se conoce como paradigmas de programación (Roy &
Haridi, 2004). En el caso de España, este tipo de contenidos se imparten en
todos los grados en Ingeniería Informática, sin embargo, algunos planes de
estudio, como el de la Universidade da Coruña, lo reflejan en la asignatura de
Paradigmas de Programación (Coruña, 2021), o el de la Universitat de València
en Lenguajes de Programación (València, 2021). Esta variedad en la
denominación de las asignaturas hace que no sea posible realizar un estudio
en mayor profundidad, puesto que no se sigue el mismo esquema en la
distribución de competencias y contenidos, existiendo algunos casos en los que
se divide en varias asignaturas. La manera en la que los lenguajes y sistemas
informáticos son utilizados como materia de enseñanza y aprendizaje es algo
que genera debate por las diferentes maneras de abordarlo (León, 2021).
La asignatura de Lenguajes y Paradigmas de Programación (LPP) forma parte
del Plan de Estudios del Grado en Ingeniería Informática en la Universidad de
La Laguna (ULL), concretamente en el tercer curso. Esta se imparte en el
primer cuatrimestre y tiene un total de 6 créditos, con clases teóricas, prácticas
en el aula y prácticas específicas. En esta asignatura se estudian los
principales conceptos de diferentes lenguajes y modelos de programación, y se
espera que los estudiantes adquieran la siguiente competencia: “Capacidad
para analizar, diseñar, construir y mantener aplicaciones de forma robusta,
segura y eficiente, eligiendo el paradigma y los lenguajes de programación más
adecuados”. La asignatura se ha estructurado en cuatro temas para el curso
académico 2021/2022, concretamente en:
1. Introducción: modelos de programación.
2. Programación imperativa.
3. Programación orientada a objetos.
4. Programación funcional.
El objetivo de este trabajo es el de presentar los recursos docentes elaborados
para el curso 2021/2022 en las prácticas de laboratorio de LPP, así como las
rúbricas de evaluación que se han seguido. Este trabajo es una actualización
de la propuesta presentada en (Rodríguez-León, León-Hernández, Miranda-
239ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
Valladares, Segredo-González, & Segura-González, 2013). Los ejercicios que
se proponen se dividen en tutorizados o guiados y autónomos. Los primeros de
ellos no conllevan una calificación, ya que se busca facilitar la adaptación del
alumnado a las diferentes herramientas que utilizarán para realizar las
prácticas de la asignatura, mientras que para los autónomos sí se dispone de
una calificación. Para ambos tipos se han diseñado guías de evaluación
detalladas, teniendo en cuenta los conceptos específicos en los que se quiere
profundizar en cada práctica. Con estas prácticas se busca que los estudiantes
sean capaces de desarrollar aplicaciones de código abierto, por lo que se
utilizan herramientas y aplicaciones que emplean los desarrolladores en estos
casos en un entorno profesional.
El resto de trabajo se organiza de la siguiente manera: la presentación de la
metodología docente seguida y las herramientas aplicadas se describen en la
sección 2, las actividades prácticas de laboratorio diseñadas se relacionan en
la sección 3 y las guías de evaluación y los resultados obtenidos en el curso
académico 2021/2022 se presentan en la sección 4. Finalmente, se exponen
las conclusiones.
METODOLOGÍA
El objetivo de la asignatura de Lenguajes y Paradigmas de Programación es el
de estudiar los conceptos de los lenguajes de programación y de los diferentes
modelos de programación existentes. Debido a la gran cantidad de lenguajes
existentes hoy en día, se ha optado por utilizar un lenguaje de programación
multi-paradigma como Ruby (Flanagan & Matsumoto, 2008; Matsumoto, The
Ruby Programming Language, 2000; Matsumoto, Ruby in a Nutshell: A
Desktop Quick Reference, 2001), puesto que resulta muy flexible, se usa en
aplicaciones muy diversas, es multi-plataforma y su curva de aprendizaje es
bastante rápida. Así pues, usando este lenguaje se analizan las características
de los paradigmas imperativo y declarativo. Los estudiantes no tienen
conocimiento previo sobre este lenguaje, por lo que, teniendo en cuenta la
facilidad a la hora de aprenderlo, supone la mejor alternativa para el estudio de
estos paradigmas.
La metodología seguida para el desarrollo de la parte práctica de la asignatura
está basada en el desarrollo de un proyecto, utilizando herramientas como Git
(Spinellis, 2012), siguiendo la propuesta de Chacon (Chacon & Straub, 2014),
como sistema de control de versiones y GitHub Classroom (GitHub I. , 2022)
para hospedar y configurar los repositorios de los estudiantes. Los estudiantes
ya han utilizado Git como sistema de control de versiones en el primer y
segundo curso del grado, ya que supone una herramienta indispensable para el
desarrollo software hoy en día.
Existen numerosas versiones de intérpretes de Ruby, cada una con sus
peculiaridades, por lo que se hace uso de un gestor de intérpretes,
240 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
concretamente RVM (Seguin, Papis, & Kuczynski, 2022). Además de estas
herramientas, con el fin de proporcionar un entorno de desarrollo completo de
software, también se ha trabajado con algunas gemas como Bundler (Bundler,
2022) para gestionar dependencias, Rake (Weirich, 2022) para automatizar
tareas, Test::Unit (Sutou & Yoshihara, 2022) para poder desarrollar software
siguiendo un esquema de pruebas unitarias, RSpec (Baker, Astels, Hellesøy, &
Chelimsky, 2022) que permite seguir una metodología de desarrollo dirigido por
pruebas, Guard (Guillaume-Gentil, 2022) para ejecutar una comprobación
continua del desarrollo del código y Rdoc (Dave Thomas, Portions, & Hodel,
2022) o Yard (Segal, 2022), los cuales permiten generación automática de
documentación de código.
ACTIVIDADES PRÁCTICAS
Se hace una propuesta de un total de once actividades agrupadas en tres
categorías: guiadas, metodológicas y de desarrollo, realizadas semanalmente.
Guiadas
En las prácticas guiadas o tutorizadas se les ofrece a los estudiantes de
manera detallada el conjunto de pasos a seguir para realizar el ejercicio, en
concreto, para configurar el entorno de desarrollo. Estas prácticas se evalúan
siguiendo una guía, pero no se califican, es decir, no se tienen en cuenta en el
cómputo de la calificación final de prácticas de los estudiantes. Estas prácticas
se deben realizar en el laboratorio, en la hora de prácticas correspondiente
para cada uno, junto con un cuestionario disponible en el aula virtual de la
asignatura. A continuación, se describen las prácticas llevadas a cabo:
Práctica #1. Sistemas de control de versiones e infraestructura como
servicio. En esta práctica se plantea la conversión de un directorio, con
unos ficheros de prueba, en un repositorio bajo control de versiones
usando git. Además, los estudiantes tendrán que crearse una cuenta en
GitHub (GitHub I. , 2022) para alojar el repositorio. También se dan las
instrucciones para hacer uso del servicio IaaS (Infraestructure as a
Service) que proporciona de manera institucional la Universidad de La
Laguna (Comunicaciones, 2015), en el que se pone a disposición de
cada estudiante una máquina virtual con el sistema operativo Linux
(Ubuntu) instalado y donde deberán realizar todas las prácticas. En ella
se han de ejecutar los comandos para personalizar la configuración de
git, para clonar un repositorio, para introducir nuevas confirmaciones y
para almacenar estos cambios en el repositorio remoto de GitHub.
Práctica #2. Ramas en Git y colaboración en GitHub. Compilación vs.
Interpretación. En esta práctica se plantea un guion colaborativo, por lo
que los estudiantes deben crear parejas donde uno será coordinador y el
otro colaborador. El primer paso es unirse a un equipo de GitHub
Classroom, creados previamente por el profesorado de la asignatura, y a
𝑐 𝑐
𝐴𝑟𝑟𝑎𝑦 𝑛𝑒𝑤 𝑖 ∗ 𝑖
241ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
continuación crear un repositorio, descargarse un fichero comprimido,
disponible en el aula virtual de la asignatura, que contiene programas
que muestran por pantalla la frase “Hello World” en el lenguaje C, C++,
Bash, Python y Java, y tras esto empujar los cambios al repositorio
online de GitHub. En este punto, la otra persona de la pareja, el
colaborador, tiene que clonar el repositorio y crear dos ramas en él:
desarrollo y documentación. En la primera se dejará todo el código de
los programas “Hello World” y en documentación se creará un fichero
donde se irá respondiendo a diferentes preguntas como “¿Cuál es la
diferencia entre compilación e interpretación?”. Una vez contestadas las
preguntas, se trabajan con diferentes comandos de git como log, show o
diff-tree y a continuación se fusiona la rama desarrollo con la maestra y
se elimina. Por último, el coordinador recupera los cambios y fusiona la
rama documentación con la maestra y empuja los cambios.
Práctica #3. Reorganización de ramas con Git. Gestores de intérpretes
de Ruby. En esta práctica se plantea trabajar con diferentes ramas en un
repositorio, ampliando los conocimientos de la práctica anterior. Para
ello se tiene que crear un directorio, inicializarlo con git, crear varias
ramas y reorganizarlas. A continuación, se instala la herramienta de
gestión de versiones de Ruby, RVM y se plantean unos ejercicios
usando el intérprete irb (IRB, 2022) y la gema PRY (Mair & Silin, 2022),
los cuales se deben contestar en un fichero alojado en el repositorio.
Práctica #4. Primeros pasos con Ruby. En esta práctica se espera que
los estudiantes adquieran conocimientos básicos sobre Ruby, como su
sintaxis o el uso de operadores. Para ello es necesario crear un
repositorio git e ir contestando a treinta preguntas cortas en un fichero.
Estas preguntas plantean cuestiones como la diferencia entre “%w[\t \n]”
y “%W[\t \n]” o el resultado que quedaría en la variable 𝑐 al ejecutar 𝑐=
𝐴𝑟𝑟𝑎𝑦.𝑛𝑒𝑤(3) {|𝑖| 2 ∗ 𝑖}.
Metodológicas
Estas prácticas se realizan para ejercitar varias metodologías de desarrollo de
software, en concreto: pruebas unitarias y desarrollo dirigido por pruebas. Estas
prácticas, a diferencia de las guiadas, sí se califican con una puntuación del 0
al 10 siguiendo la guía de evaluación de la sección de Evaluación y calificación.
Además, al comienzo de cada práctica deben realizar un Informe de la práctica,
respondiendo a un conjunto de preguntas sobre la práctica que han
desarrollado calificado con una puntuación entre 0 y 10. La calificación final de
la práctica se realiza como la media ponderada entre ambas.
Las prácticas deberán realizarse como trabajo autónomo, es decir, que en las
horas de prácticas en el laboratorio solo se aplicará la guía de evaluación sobre
el desarrollo llevado a cabo, no se utilizará esta hora para realizar la práctica
como sí ocurría con las guiadas. A continuación, se presentan las diferentes
prácticas que se han planteado:
242 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
Práctica #5. Pruebas unitarias. En esta práctica el estudiante tiene que
aceptar una tarea en GitHub Classroom y enlazar un repositorio local
con este remoto. El objetivo es la creación de una clase Ruby para
representar expresiones regulares, sin que se tengan que evaluar, y
definiendo como mínimo tres operaciones, por ejemplo, la
concatenación, la alternativa o el cierre de Kleen. Se tiene que seguir el
paradigma de Programación Orientada a Objetos y utilizando el método
de pruebas unitarias, donde se escribe una parte de código y luego una
prueba, de forma que esta se tenga que superar para continuar el
desarrollo. Si no es el caso, se va modificando el código hasta que se
supera la prueba. Se hace uso de la biblioteca Test::Unit.
Práctica #6. Desarrollo Dirigido por Pruebas. En esta práctica el
estudiante tiene que aceptar una tarea en GitHub Classroom y enlazar
un repositorio local con este remoto. El objetivo es el desarrollo de una
clase Ruby que sirva para representar matrices, definiendo como
mínimo tres operaciones, por ejemplo, la suma, el producto por un
escalar y la traspuesta. Se tiene que seguir el paradigma de
Programación Orientada a Objetos y la metodología de desarrollo
dirigido por pruebas (Test Driven Development - TDD) (Kent, 2002;
Shull, y otros, 2011), utilizando la gema RSpec, de manera que primero
se define una prueba y luego se escribe el código para que se supere la
prueba.
Desarrollo
En estas prácticas se les plantea a los estudiantes una serie de ejercicios que
deben realizar de manera autónoma y en el que deben desarrollar una gema
para la gestión de granjas de animales. La evaluación y calificación de estas
prácticas se lleva a cabo de la misma manera que las metodológicas.
La agricultura de precisión (Groeneveld, Tekinerdogan, Garousi, & Catal, 2021)
es un concepto de gestión agrícola que aplica las tecnologías de la información
para aumentar la producción y los beneficios económicos, a menudo con la
intención de reducir el impacto sobre el medio ambiente. La ingeniería del
software es un pilar que permite poner en práctica la agricultura de precisión. El
software define la inteligencia que se necesita para respaldar el proceso de
toma de decisiones. Para ayudar en los problemas de decisión agrícola, es
necesario adoptar un ‘lenguaje de programación’ que proporcione las
sentencias adecuadas al sistema de manera que se satisfagan las
preocupaciones de las partes interesadas. Los lenguajes de programación de
propósito general, que son independientes de un dominio en particular, se
pueden utilizar para desarrollar programas para la agricultura. Sin embargo, a
menudo no logran expresar las preocupaciones específicas del dominio
agrícola, tienen una curva de aprendizaje pronunciada y, por lo tanto, son
difíciles de dominar en poco tiempo. Los lenguajes de dominio específico
(Domain Specific Languages - DSL) (Deursen, Klint, & Visser, 2000) se han
243ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
desarrollado en varios campos científicos para facilitar la construcción de
modelos a un nivel más cercano al modelo conceptual, lo que hace que la
implementación del modelo sea más accesible para los expertos del dominio y
declarativa, en lugar de imperativa.
A diferencia de un lenguaje de propósito general, un DSL se basa en
abstracciones estrechamente alineadas con el dominio para el que se
construye el lenguaje. Por lo tanto, un DSL está optimizado para una clase de
problemas dada en un dominio de aplicación particular. Debido al enfoque en
un dominio específico, los DSL suelen ser lenguajes pequeños. Por ejemplo, un
matemático que trabaja con matrices no piensa en bucles, iteradores o arrays,
sino que piensa en términos de vectores, productos y transformaciones. El uso
de un lenguaje de propósito general, como Ruby, con sólo arrays e iteradores
requeriría que el matemático practicara gimnasia mental para traducir
mentalmente entre el dominio de su problema y el del lenguaje con el que
escribe el código (Ruby). El uso de un DSL diseñado para las operaciones que
le interesan eliminaría esta traducción mental y proporcionaría un código más
conciso.
Los DSL tienen dos formas: externos e internos. Los DSL externos existen
independientemente de cualquier otro lenguaje. Los DSL internos están
alojados dentro de otro lenguaje de programación. Por ejemplo, Rails (Rails,
2022) es un DSL interno que se aloja en el lenguaje de programación Ruby. El
conjunto de prácticas de este bloque persigue el diseño de un DSL que permita
la definición de granjas y su gestión de una forma natural. A continuación, se
relacionan las mismas:
Práctica #7. Programación Orientada a Objetos. Creación de una Gema.
En esta práctica el estudiante tiene que aceptar una tarea en GitHub
Classroom y enlazar un repositorio local con este remoto. Sobre este
repositorio que seguirá trabajando hasta finalizar las prácticas. Antes del
desarrollo de la práctica, se tiene que crear la estructura del directorio de
trabajo haciendo uso de la gema Bundler, además de configurar Guard
para la comprobación continua de nuestro código, ejecutando las
pruebas definidas con RSpec}.
Se debe desarrollar una gema Ruby para representar una granja,
contando con dos clases, una para representar las funcionalidades de
gestión y otra para representar los datos de la granja. La clase de las
funcionalidades tiene que contar con varios atributos para almacenar las
condiciones de vida de los animales, los cuidados que reciben y la
reproducción de estos. La clase de los datos tiene que almacenar un
identificador de la granja, su nombre, el tipo (pequeña y mediana
empresa o gran empresa) y una breve descripción. También se debe
documentar el código utilizando la gema Rdoc o Yard.
Práctica #8. Programación Orientada a Objetos. Herencia. Siguiendo
con la definición de las clases propuestas en la práctica anterior, se
deben añadir una nueva jerarquía con dos nuevas clases, quedando
definidas como se puede ver en la Figura 1: ‘Animal’ que tiene que
244 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
contar con atributos para identificar al animal, edad, sexo y peso del
animal, y ‘Ave’, la cual hereda de `Animal' y tiene que contar con varios
atributos para representar el tipo de pico, de patas y de su movilidad.
También debe tener un contador de objetos instanciados de la clase
‘Animal’ y los animales deben ser comparables según su peso y las aves
según su edad. Para esto último se debe hacer uso del módulo
Enumerable (Britt & Neurogami, 2022). Respecto a las clases
desarrolladas en la última práctica, ahora funcionalidades tendrá que ser
un módulo, y no una clase, y tiene que contar con dos métodos: uno
para establecer los cuidados de los animales y otro para establecer la
reproducción de estos. Al contar en la asignatura con varios grupos de
prácticas, también se ha definido una práctica diferente, donde, en vez
de desarrollar la clase ‘Ave’, se tendrá que definir la clase ‘Ganado’, y se
deberá tener en cuenta la raza, el tipo de aprovechamiento que se hará
de ese animal y el tipo de alimentación.
Figura 1. Jerarquía de herencia de una granja
Práctica #9. Programación Orientada a Objetos. Polimorfismo. Siguiendo
con la práctica anterior, en esta se pide que se desarrolle una clase
‘Avícola’ para representar aves de corral, que hereda de la clase ‘Datos’.
Los objetos de esta clase deben poder clasificarse según el tipo de ave
(pollos, pavos, patos o gansos) y contar con otros atributos para el
destino de los animales (reproducción o sacrificio), la cantidad de aves
de la granja, el precio unitario de compra de los animales, el precio de
venta unitario de los animales y el conjunto de aves de la granja.
También se deben implementar en el módulo de funcionalidades los
métodos para cuidados y reproducción, que serán polimórficos. Con el
primero tiene que ser posible administrar una cantidad de antibiótico a
todos los animales de la granja haciendo, por ejemplo, que el peso de
granja = Granja::Datos.new(1234) do
datos "Pollos muertos",
:descripcion => "PyME",
:tipo => :pollos
ejemplar "1234-00000001",
:edad => 365,
245ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
estos aumente según la cantidad dada. En el caso de reproducción,
tiene que ser posible seleccionar aquellos que superen los 24 meses.
En esta práctica también se ha planteado una opción diferente para otro
grupo, en la que se pide representar granjas ganaderas, en la clase
‘Ganadera’, según tengan vacas, cabras, ovejas o cerdos.
Práctica #10. Programación funcional. Bloques. En esta práctica se
deben implementar los diferentes métodos utilizando programación
funcional. Para esto, se pide que se desarrolle una funcionalidad que
calcule el bienestar animal, según la media de la ratio del peso y la edad
de los animales, teniendo en cuenta que, si las condiciones de vida son
en campo abierto, este tomará el valor máximo de las ratios, mientras
que en otro caso se divide por la mitad.
También se debe desarrollar una funcionalidad para calcular el beneficio
neto, donde, si el destino de los animales de la granja es el sacrificio, se
calcula en función de la media del peso de estos y el precio de venta,
mientras que en otro caso se utiliza la media de edad y el precio de
venta. Además, es necesario desarrollar una tercera para calcular un
indicador de productividad que tomará el valor 1 (aceptable), 2 (bueno) o
3 (excelente) en función de los valores que se obtengan en los métodos
de bienestar y beneficio.
Con estos métodos será necesario calcular para una cooperativa
(conjunto de granjas), cual tiene máximo indicador de productividad.
También se han de generar pruebas para incrementar el precio de venta
de las granjas de una cooperativa de manera proporcional al de la granja
que tenga máximo indicador de productividad.
Práctica #11. Programación funcional. Lenguaje de dominio específico.
En esta última práctica de la asignatura se plantea, siguiendo el
paradigma de programación funcional y haciendo uso de los bloques en
Ruby, se diseñe e implemente un DSL que permita la gestión de las
granjas como la que se muestra en la Figura 2. El lenguaje de dominio
específico que se diseñe ha de permitir establecer los datos y la gestión
de una granja de forma natural.
Las clases que se implementen deben utilizar la jerarquía de clases
desarrollada en las prácticas anteriores. Además, se espera que una de
las clases pueda almacenar los datos, además de contar con dos
métodos, uno para los datos de la granja y el otro para los ejemplares
que la conforman. La segunda clase para implementar tiene que poder
almacenar las funcionalidades de la granja y contar con tres métodos
que permitan calcular el beneficio, bienestar y la productividad de la
granja. Además, se debe generar una presentación formateada de las
granjas y sus funcionalidades.
granja = Granja::Datos.new(1234) do
datos "Pollos muertos",
:descripcion => "PyME",
:tipo => :pollos
ejemplar "1234-00000001",
:edad => 365,
246 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
:peso => 700.2,
:precio_compra => 4.25,
:precio_venta => 4.75
ejemplar "1234-00000002",
:edad => 465,
:peso => 1200.2,
:precio_compra => 1.25,
:precio_venta => 2.75
end
funcionalidad = Granja::Funcion.new(1234) do
beneficio granja
bienestar granja,
:condiciones=>:campo
productividad granja,
:condiciones=>:campo
end
Figura 2. DSL para la representación de una granja
EVALUACIÓN Y CALIFICACIÓN
En la sección anterior se ha descrito una propuesta de once actividades
agrupadas en tres categorías: guiadas, metodológicas y de desarrollo. Para
cada actividad se ha elaborado una guía de evaluación que permite
retroalimentar al alumnado sobre el nivel de conocimiento adquirido de los
conceptos estudiados y al profesorado establecer un marco de referencia.
Además, el disponer de dichas guías de evaluación permite al alumnado el
desarrollo de las actividades hasta el nivel deseado, al igual que disponen de
las calificaciones en el aula virtual la siguiente semana de realizar la práctica.
Las cuatro actividades guiadas no son puntuables, mientras que las siete
restantes contribuyen por igual a la calificación final. Las cuestiones concretas
que contemplan las guías de evaluación para las prácticas guiadas incluyen las
siguientes:
Práctica #1. Sistemas de control de versiones e infraestructura como
servicio. Se contempla la correcta configuración de git en la máquina
local y en la máquina virtual del IaaS, así como, el establecimiento de
ramas remotas.
Práctica #2. Ramas en Git y colaboración en GitHub. Compilación vs.
Interpretación. Al tratarse de una práctica cooperativa, se tiene en
cuenta el trabajo asignado al coordinador y al colaborador. Se evalúa
que el coordinador haya inicializado correctamente el repositorio y lo
haya enlazado al gestor remoto. El colaborador tiene que clonar el
repositorio y compilar e interpretar el programa “Hello World!” en
diferentes lenguajes de programación: C, Prolog y Scheme.
Práctica #3. Reorganización de ramas con Git. Gestores de intérpretes
247ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
:peso => 700.2,
:precio_compra => 4.25,
:precio_venta => 4.75
ejemplar "1234-00000002",
:edad => 465,
:peso => 1200.2,
:precio_compra => 1.25,
:precio_venta => 2.75
end
funcionalidad = Granja::Funcion.new(1234) do
beneficio granja
bienestar granja,
:condiciones=>:campo
productividad granja,
:condiciones=>:campo
end
de Ruby. Se evalúa la creación de ramas con git y la habilidad para
instalar Ruby, rvm y pry.
Práctica #4. Primeros pasos con Ruby. Se evalúan los conceptos de
programación imperativa: secuencias, condicionales y bucles.
En la Tabla 1 se encuentran recogidos todos los criterios generales utilizados
en las guías de evaluación de las siete prácticas puntuables que incluyen las
metodológicas y las de desarrollo. La calificación utilizando guías de evaluación
permite la evaluación de los conceptos específicos en los que se desea
profundizar en cada práctica. Debido a ello, el alumnado puede desde la
primera práctica tener claros los objetivos de esta, por lo que la evaluación no
se verá afectada por desconocimiento de los criterios de evaluación.
Tabla 1. Principales aspectos en la evaluación de las prácticas.
Criterio
Descripción
Estructura de directorios
Los proyectos creados deben tener la estructura de
directorios adecuada para la creación de una gema en
Ruby.
Uso de control de
versiones
Ficheros bajo seguimiento, confirmaciones, fusión,
reorganización, ramas locales, ramas remotas.
Documentación
Los proyectos deben poseer la documentación adecuada,
ya sea a nivel de código como de repositorio abierto.
Uso de gemas de ayuda
a la programación
Se debe conocer el funcionamiento de diferentes gemas
Ruby, en concreto: Rake, Bundler, Guard, Rdoc o Yard.
Uso adecuado de la
metodología de
desarrollo
Se trabaja con pruebas unitarias y o desarrollo dirigido por
el comportamiento
Creación de pruebas
Para toda funcionalidad implementada se debe crear un
conjunto de pruebas para comprobar su correcto
funcionamiento en todos los casos posibles.
Creación de clases
Las clases creadas para las diferentes prácticas deben
seguir la jerarquía de herencia solicitada.
Uso adecuado de la
herencia
Se debe saber manejar la herencia en las diferentes clases
del proyecto, así como la creación adecuada de módulos.
Uso adecuado del
polimorfismo
Se valora positivamente el saber cuándo y cómo utilizar el
polimorfismo en las clases implementadas.
Uso adecuado de los
bloques
Se deben utilizar de forma adecuada la estructura de
bloques.
Uso adecuado de
clausuras
Se deben utilizar de forma adecuada las clausuras.
248 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
La Figura 3 muestra para cada una de las prácticas de trabajo autónomo,
metodológicas y de desarrollo, la calificación media, la moda y la mediana
obtenida por todos los estudiantes, de un total de 170 que se encontraban
matriculados. Como se puede observar, la nota media de todas las prácticas se
encuentra en un rango de máximo 1,5 puntos, lo que indica notas similares en
todos los casos. Esto refuerza la utilización de una guía de evaluación
específica para cada una de las prácticas, donde el alumnado sepa desde el
inicio los puntos a evaluar y pueda adaptarse en consecuencia, implicando una
mejora clara en los resultados de aprendizaje.
Figura 3. Media, moda y mediana de las calificaciones de las prácticas
En la Figura 4 se recoge el porcentaje de estudiantes que se han presentado a
las prácticas y la proporción de los que las han superado, obteniendo una nota
en la práctica superior o igual a 5. Se puede observar un ligero descenso según
se avanza en las prácticas, tanto de presentados como aptos, obteniendo una
media de 73,68% de estudiantes aprobados sobre los que se han presentado.
Para aprobar la asignatura es necesario contar con una nota media en las
prácticas igual o mayor que 5. Esto podría explicar el descenso en el número
de alumnos que se presentan a las prácticas, especialmente en la última. En
caso de no superarlo, después de finalizar las clases del semestre el estudiante
dispondrá de un examen en el que se valoren todos los resultados de
aprendizaje de la asignatura, incluidos los prácticos.
249ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
Figura 4. Porcentajes de alumnos presentados y de aptos/presentados
CONCLUSIONES
En este trabajo se presenta una colección de actividades prácticas, junto con
sus guías de evaluación, para una asignatura en la que se estudian los
paradigmas de programación. Se utiliza el lenguaje de programación multi-
paradigma Ruby para plantear ejercicios de programación procedimental,
orientada a objetos y funcional. Se hace una propuesta que resulta completa
desde el ámbito del desarrollo software utilizando metodologías ágiles y
presentes en el día a día de un programador, como son los sistemas de control
de versiones, el desarrollo dirigido por pruebas, la comprobación continua del
código o la elaboración de documentación sobre este, herramientas y
tecnologías que se demandan actualmente en el mercado laboral.
Se han diseñado una serie de ejercicios que siguen un esquema guiado y que
no conllevan evaluación, y otros que son de desarrollo autónomo y que sí se
evalúan. Para ello se ha planteado el uso de una serie de herramientas, con
Ruby como lenguaje de programación, como RVM para gestionar las versiones
del intérprete de Ruby, Bundler para controlar las dependencias, Guard para la
comprobación continua o Test::Unit y Rspec para las pruebas unitarias y el
desarrollo dirigido por pruebas.
Los ejercicios que no se evalúan se plantean como un modo de presentación
de herramientas para los estudiantes, ya que se trata de una gran cantidad de
tecnologías que deben incorporar durante el desarrollo de las prácticas, y
muchas relacionadas con Ruby, un lenguaje que no trabajan en asignaturas en
cursos previos. El planteamiento de un proyecto y el uso de estas herramientas
permite a los alumnos trabajar una manera de desarrollar software bastante
completa y cercana a la realidad de los programadores.
250 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
Los resultados de la evaluación y calificación en el presente curso académico
resultan satisfactorios y ello hace que se siga planteando el uso de las guías de
evaluación en el futuro, así como el disponer de prácticas que no resulten
evaluables y otras que sí, además de dividirlas según los conceptos trabajados.
AGRADECIMIENTOS
Trabajo financiado por el Gobierno de Canarias a través de la Agencia Canaria
de Investigación, Innovación y Sociedad de la Información - ACIISI - con el
contrato con número TESIS2021010058.
REFERENCIAS
Baker, S., Astels, D., Hellesøy, A., & Chelimsky, D. (2022, Junio). RSpec:
Behaviour Driven Development for Ruby. Retrieved from
https://rspec.info/
Britt, J., & Neurogami. (2022, Junio). Module: Enumerable (Ruby 3.1.2).
Retrieved from https://ruby-doc.org/core-3.1.2/Enumerable.html
Bundler. (2022, Junio). Bundler: The best way to manage a Ruby application's
gems. Retrieved from https://bundler.io/es/
Chacon, S., & Straub, B. (2014). Pro Git. Apress.
Comunicaciones, U. d. (2015, Octubre). Nuevo servicio IaaS. Retrieved from
https://www.ull.es/servicios/stic/2015/10/27/nuevo-servicio-iaas/
Coruña, U. d. (2021). Guia docente 2021/22. Facultad de Informática.
Paradigmas de Programación. Retrieved from
https://guiadocente.udc.es/guia_docent/assignatures/pdf/pdf.php?enseny
ament=614G01&assignatura=614G01014&any_academic=2021_22&idio
ma=cast&idioma_assig=cast&any_academic=2021_22
Dave Thomas, T. P., Portions, & Hodel, E. (2022, Junio). ruby/rdoc: RDoc
produces HTML and online documentation for Ruby projects. Retrieved
from https://github.com/ruby/rdoc
Deursen, A., Klint, P., & Visser, J. (2000). Domain-Specific Languages. ACM
SIGPLAN Notices, 26-36. doi:10.1145/352029.352035
Flanagan, D., & Matsumoto, Y. (2008). The Ruby Programming Language.
O'Reilly Media.
GitHub, I. (2022, Junio). GitHub Classroom. Retrieved from
https://classroom.github.com/
251ACTAS DEL CONGRESO VIRTUAL: AVANCES EN TECNOLOGíAS, INNOVACIÓN Y DESAFíOS DE LA EDUC. SUP.
GitHub, I. (2022, Junio). GitHub: Where the world builds software · GitHub.
Retrieved from https://github.com/
Groeneveld, D., Tekinerdogan, B., Garousi, V., & Catal, C. (2021). A domain-
specific language framework for farm management information systems
in precision agriculture. Precision Agriculture, 22, 1-40.
doi:10.1007/s11119-020-09770-y
Guillaume-Gentil, T. (2022, Junio). guard/guard: Guard is a command line tool
to easily handle events on file system modifications. Retrieved from
https://github.com/guard/guard
IRB. (2022, Junio). ruby/irb: interactive Ruby. Retrieved from
https://github.com/ruby/irb
Kent, B. (2002). Test Driven Development: By Example. Addison Wesley.
León, C. (2021). Fundamentos para la enseñanza y el aprendizaje de
herramientas, algoritmos y lenguajes informáticos. In A. Guarro Pallás,
M. Area Moreira, J. Marrero Acosta, & J. J. Sosa Alonso, La
transformación digital de la universidad: XI CIDU Congreso
Iberoamericano de Docencia Universitaria (pp. 305-378). San Cristóbal
de La Laguna: Universidad de La Laguna.
Mair, J., & Silin, K. (2022, Junio). pry/pry: A runtime developer console and IRB
alternative with powerful introspection capabilities. Retrieved from
https://github.com/pry/pry
Matsumoto, Y. (2000). The Ruby Programming Language. informIT.
Matsumoto, Y. (2001). Ruby in a Nutshell: A Desktop Quick Reference. O'Reilly
Media.
Rails. (2022, Junio). Ruby on Rails — A web-app framework that includes
everything needed to create database-backed web applications
according to the Model-View-Controller (MVC) pattern. Retrieved from
https://rubyonrails.org/
Rodríguez-León, C., León-Hernández, C., Miranda-Valladares, G., Segredo-
González, E., & Segura-González, C. (2013). Prácticas de Laboratorio
en Ruby para ‘Lenguajes y Paradigmas de Programación’. In nnovación
docente en la educación superior: una recopilación de experiencias
prácticas aplicadas (pp. 548-579). San Cristóbal de La Laguna:
Vicerrectorado de Calidad Institucional e Innovación Educativa.
Universidad de La Laguna.
Roy, P. V., & Haridi, S. (2004). Concepts, Techniques, and Models of Computer
Programming. London: The MIT Press.
252 EXPERIENCIAS INNOVADORAS EN EDUCACIÓN
Segal, L. (2022, Junio). YARD - A Ruby Documentation Tool. Retrieved from
https://yardoc.org/
Seguin, W. E., Papis, M., & Kuczynski, P. (2022, Junio). RVM: Ruby Version
Manager. Retrieved from https://rvm.io/
Shull, F., Melnik, G., Turhan, B., Layman, L., Diep, M., & Erdogmus, H. (2011).
What Do We Know about Test-Driven Development? IEEE Software, 27,
16 - 19. doi:10.1109/MS.2010.152
Spinellis, D. (2012). Git. IEEE Software, 29(3), 100-101.
doi:10.1109/MS.2012.61
Sutou, K., & Yoshihara, H. (2022, Junio). test-unit - a Unit Testing Framework
for Ruby. Retrieved from https://test-unit.github.io/
València, U. d. (2021). Grado en Ingeniería Informática. Lenguajes de
programación. Retrieved from
https://webges.uv.es/uvGuiaDocenteWeb/guia?APP=uvGuiaDocenteWe
b&ACTION=MOSTRARGUIA.M&MODULO=34672&CURSOACAD=2022
&IDIOMA=C
Weirich, J. (2022, Junio). ruby/rake: A make-like build utility for Ruby. Retrieved
from https://github.com/ruby/rake