Objetivo 0: Mecánica de la asignatura + planteamiento de un proyecto para la misma

Motivación

Esta asignatura tiene una serie de mecanismos específicos para su evaluación y entrega; estos mecanismos son los mismos que se usan en las empresas de desarrollo de software. Con este objetivo se pretende que el estudiante aprenda a usar correctamente estos mecanismos, así cómo el proceso de aprendizaje guiado que se va a llevar en esta asignatura.

A la vez, el estudiante tendrá que describir un problema general que se irá resolviendo, a través de la asignatura, usando software. Este problema tendrá que incluir obligatoriamente un componente que se pueda desplegar en la nube. Este es el objetivo secundario: que el estudiante entienda el concepto de “problema”, de “cliente” y de “solución basada en la nube”.

En estos primeros compases de la asignatura es imprescindible la asistencia a clase. Como la metodología se basa en tratar de ayudar al estudiante a superar el objetivo, lo mejor es intentar el diálogo con el profesor u otros compañeros para probar diferentes ideas o enfoques, y para evitar malas prácticas que puedan retrasar la aceptación de los siguientes objetivos.

TL;DR

Pensar en un problema a resolver que tenga entidad suficiente para poder llevar a cabo su desarrollo durante el resto de la asignatura.

Hago énfasis en el resto de la asignatura. Realmente tendrás que intentar desarrollar un producto que resuelva parcialmente el problema que has planteado aquí. En el siguiente objetivo tendrás que plantear los hitos de desarrollo del proyecto y reflejar con más detalle qué problemas se van a resolver y para qué clientes y plasmar las necesidades del usuario, y en el segundo objetivo comenzar a modelizar el problema de forma que se pueda empezar a trabajar en él en los objetivos siguientes.

En este caso, no necesariamente trabajarás en tu problema, sino en otro de otro estudiante de la asignatura.

En resumen: vas a tener que vivir con este proyecto, trabajar con él, hacerlo avanzar y darle cuerpo y realidad el resto de la asignatura. Tenlo en cuenta a la hora de plantearlo. Por eso es muy importante que pienses en un proyecto con el cual te sientas cómodo, entiendas a las personas que quieren que se resuelva el problema y, en general, sientas cierto interés por que efectivamente se resuelva.

En general, vas a tener que aprender una serie de técnicas y metodologías que te serán útilesen tu carrera. No te preocupes, usándolas en la práctica se aprenden rápidamente y sin dolor (y no te haremos exámenes de ello).

Descripción

En este objetivo cero de la asignatura, y punto de partida del proyecto que se desarrollará en la misma, se trata de poner a punto las herramientas que se van a usar para mostrar el progreso del aprendizaje durante el resto del curso, a la vez que se busca que se interioricen una serie de buenas prácticas en desarrollo de software, que están siempre mediados por git en los entornos de trabajo actuales y que en general siguen el denominado manifiesto ágil.

Un factor esencial en el desarrollo ágil es la preocupación por la calidad. Una ingeniería debe ser capaz de proporcionar productos de calidad al cliente, y en esta asignatura se persigue que, en cada uno de los pasos, os preocupéis por la calidad de lo que entregáis. Por eso, se aconseja no os quedéis satisfechos con poner algo que parezca suficiente, sino que comprobéis que efectivamente muestra que habéis comprendido y puesto en práctica lo que se persigue que aprendáis en cada objetivo. En este caso concreto bastará con que repaséis de forma crítica con vosotros mismos la lista de comprobación; más adelante, además, habrá que pasar algunos tests, pero una vez pasados los tests para poder entregar el objetivo, la preocupación por la calidad os pide que efectivamente probéis manualmente que lo que se requiere en cada objetivo es efectivamente lo que estáis entregando. Eso os servirá para asimilar mejor las prácticas de cada objetivo, pero también para evitar trabajo por parte de quien corrige y también por vuestra parte, que tendréis que revisar el trabajo hasta que sea capaz de revisar el objetivo.

Para ello, se creará un repositorio que se usará durante el resto de la asignatura para mostrar el avance el proyecto en diferentes hitos en el desarrollo y despliegue de una aplicación. El repositorio contendrá inicialmente:

En cuanto a la idea o problema que se quiere resolver, debería ser preferiblemente un problema del cual tengas conocimiento personal. Cuanto más involucrado estés con el problema, o las personas que lo tienen, más interés vas a tener en hallar una solución al mismo y mejor entenderás qué sería lo que lo soluciona.

Otra cuestión es que ese problema tenga entidad suficiente para poder crear, eventualmente, algún tipo de servidor que se pueda desplegar en la nube, o sea válido para superar el resto de los objetivos de la asignatura.

En este objetivo sólo es necesario que la descripción del problema sea correcta, y efectivamente describa un problema o necesidad de un cliente concreto. Pero lo principal es que hay que trabajar con este problema el resto de la asignatura, y el profesor que apruebe el objetivo tiene que asegurarse de que efectivamente se pueda hacer así. Por eso, en caso de que no esté claro a partir de la descripción qué tipo de soluciones se tienen en mente, hay que describir la lógica de negocio, que es el código propio que resuelve el problema.

Propio quiere decir que toda la lógica de negocio tendrá que ser programada por el estudiante, principalmente en el objetivo 4, y de ahí en adelante. Es decir, en este punto tienes que tener al menos una idea vaga de cómo resolver el problema mediante código con tus propios medios.

Más adelante, el centrarnos en la lógica de negocio (extraer información del texto de una página web ya descargada, por ejemplo) en vez de en los aspectos mecánicos (cómo obtener el URL de la página y cómo descargársela) permite que tengamos el foco en lo esencial de nuestra aplicación, que es lo que añade valor al cliente (no el hecho de que uno se descargue una página, o extraiga información de un API o como sea).

En general, este tipo de problemas requieren, por parte de la solución informática, una parte considerable de “computación” o “procesamiento” o “generación”. Si la idea y la descripción del problema sólo incluye palabras como “almacenamiento” y “búsqueda”, mientras que puede ser una aplicación completa perfectamente válida (dotada de un interfaz de usuario adecuado), los diferentes pasos por los que pasará la resolución del problema en los siguientes objetivos no van a dar mucho de sí en esta asignatura. Es decir, si se trata simplemente de objetos con un ciclo CRUD (create, read, update y delete), descártala y piensa en otra que sí realice algún tipo de procesamiento.

De la misma forma, aplicaciones que tengan una dependencia externa fuerte (por ejemplo, que necesiten para cada interacción del usuario recoger datos de un API externo, que pidan una gran cantidad de datos al usuario o que simplemente integren una biblioteca externa para llevar a cabo una operación sobre datos también externos) tampoco van a ser buenos proyectos, porque sus pruebas van a ser complicadas y no van a incluir ningún tipo de modelo. Lo esencial siempre es que la aplicación incluya un valor añadido en forma de lógica de negocio, y que se describa correctamente el problema a solucionar de forma que haga falta tal lógica de negocio para solucionarlo.

Insistimos que en este objetivo no se pide que se especifique la solución al problema. El desarrollo ágil va evolucionando la solución al problema en pasos sucesivos, y hablar desde el principio de “la solución” impide que se avance paulatinamente hacia una solución (entre las posibles). Sin embargo, sí habrá que hacerlo más adelante y si se trata de un problema cuyas posibles soluciones no sean válidas para esta asignatura, se rechazará en este objetivo. Por eso hay que pensar en la solución al problema, y en caso de que no quede claro su entidad por la sola descripción del mismo, especificarlo. Y esta descripción (que tiene que incluir la lógica de negocio), sea explícitamente porque sea necesaria en este objetivo, o en objetivos siguientes, debe:

En ningún caso la inclusión de estas palabras implica automáticamente que la lógica de negocio sea rorrecta. El cálculo debe ser suficientemente complejo, por ejemplo; la generación debe seguir una serie de pasos no triviales. El filtrado si es sólo búsqueda tampoco será suficiente y deberá combinarse con alguna otra operación un poco más compleja.

La lógica de negocio será creada y testeada más adelante, a partir del objetivo 4. Por eso es esencial que sea no trivial, para que los tests efectivamente comprueben que se está resolviendo el problema correctamente. Así mismo, los tests deben servir para validar que se ha resuelto el problema a través del programa, por lo que el problema debe ser formulado de forma que efectivamente el procesamiento de la información que lleva a cabo el programa se pueda validar como una solución aceptable al problema.

Dónde buscar proyectos

En clase se hará un juego de rol para enfocar el problema, o poder hallar uno en caso de que se necesite ayuda.

En general, encontrar un proyecto que se pueda desarrollar en la asignatura es una cuestión personal, sobre todo porque es necesario que se trate de un proyecto donde uno tiene algún interés y conocimiento, y pueda identificar claramente cuales son los retos y qué es lo que funciona y aporta valor al cliente (que puede ser uno mismo). La metodología denominada design thinking te da una serie de pasos para poder entender posibles contextos en los cuales existe un problema, definirlo y proponer posibles soluciones.

En la primera sesión de clase se hará un juego de rol para poder abordar bien la fase de empatía de este proceso. Por tanto, se aconseja muy vivamente que se asista a esta primera clase y se participe en la actividad.

Incluso con interés, un problema adicional es encontrar proyectos en los cuales existan ya datos. No se va a ser suficientemente empático (como pide la metodología de design thinking) en un proyecto que requiera del usuario introducir gran cantidad de datos para obtener un resultado puntual. Por eso, y también porque las fuentes de datos públicos suelen coincidir con problemas y preocupaciones de la ciudadanía, pueden ser interesantes como base para un proyecto en esta asignatura. Por ejemplo, pueden ser interesantes estos portales:

Estos se pueden usar tanto para completar datos de una aplicación, como para crear un backend de la aplicación, siempre que se le añada valor suficiente en forma de una lógica de negocio.

Cuál es el destino final del proyecto

En los últimos objetivos, el proyecto será desplegado en la nube, tras la descripción de la infraestructura virtual que necesitará para ello. El problema que se plantee será tal que pueda ser resuelto de esa forma. No se requerirá que se resuelva el problema totalmente, pero la mejor solución tiene que estar en una infraestructura virtual en la nube.

Preguntas frecuentemente preguntadas

Considera esto aclaraciones a las posibles revisiones que se puedan hacer a lo enviado. Dado que se puede enviar este objetivo (y los demás) cuantas veces haga falta, en general este tipo de objeciones se harán por parte del profesor cuando lo entregues. Por supuesto, conviene tenerlas presentes antes de hacer el envío para cubrir este objetivo.

¿Por qué hay que tener familiaridad con el problema?

La ingeniería resuelve un problema para alguien, en nuestro caso por medios informáticos. Durante el curso se va a desarrollar esa solución, y hay que validar que efectivamente resuelva el problema. Si no lo entiendes o no te es cercano, no vas a poder validar la solución, ni entender qué es una posible solución al problema.

¿Qué tipo de problemas son los más adecuados?

Problemas en los que tengas todos los datos necesarios y se sepa más o menos bien qué algoritmo se va a usar, o conjunto de procesamiento no trivial, para hallar la solución. También unos en los cuales una vez obtenido el resultado se pueda comprobar de forma más o menos independiente.

¿Qué tipo de problemas no van a ser adecuados?

Todos los problemas que requieran entradas físicas; todos aquellos en los que el usuario o cliente tenga que introducir mucha información. En general, todo problema que no se entienda bien.

¿Tiene que haber algún negocio para que pueda llamarse lógica de negocio?

No. En inglés se usa a veces business para indicar la parte importante de algo, o la que hace el trabajo. Evidentemente, en una eventual publicación de la aplicación habría que basar un negocio en ella, porque es la que aporta valor al cliente; también con ello se destaca que el código que compone la lógica de negocio es el que aporta valor al cliente; pensando en cómo se puede aportar ese valor puede, a la vez, descubrir diferentes tipos de clientes que puedan estar interesados en la aplicación.

A la vez, se distingue entre clientes (son los que se benefician de alguna forma con la aplicación) y simples usuarios (que pueden beneficiarse o no, pero aportan información que pueda usarse para la lógica de negocio y por lo tanto el cliente).

¿Por es necesario que la lógica de negocio ser no trivial?

Porque el estudiante tiene que programar esa lógica de negocio en los tests de los objetivos a partir del cuatro. Si es trivial, ni siquiera requiere tests; si es de almacena y busca, ni siquiera es lógica de negocio.

¿Puede alguna lógica de negocio compleja ser inadecuada?

Si requiere un modelo complejo del problema, o un algoritmo complejo para trabajar con ella, puede ser un problema, porque, insisto, lo tiene que programar el estudiante. Si requiere predicción y por tanto un algoritmo de machine learning, doble problema, porque requiere conjunto de entrenamiento y programar el algoritmo. Se pueden usar, sin embargo, modelos ya entrenados siempre que se programe el intérprete de ese modelo.

¿Qué problemas serán adecuados para la nube?

Cualquiera que requiera muchos usuarios situados en muchos lugares diferentes, tendrán que desplegarse en la nube, siempre que los datos que necesite cada usuario estén en el servidor o bien proporcionados por el resto de usuarios. También los que usen datos agregados para generar información para otro cliente.

¿Cuáles serán inadecuados para una infraestructura virtual?

Las que estén dirigidas a un solo cliente, que tenga todos los datos necesarios para aplicar la lógica de negocio.

Prerrequisitos

  1. Haber rellenado en la hoja de cálculo compartida la equivalencia entre nombre real y nick en GitHub, así como nick en Telegram.

  2. En general, va a ser necesario que entiendas el mecanismo de la asignatura y sus contenidos. Por ello, consulta los objetivos impartidos en la primera sesión si no has podido asistir a clase.

Explicación

Primero, hay que configurar correctamente el entorno de desarrollo para este y otros proyectos, lo que incluye

Usar un repositorio de forma correcta no solo permite organizar el trabajo de desarrollo de forma más eficiente, sino que también contribuye a que sea más fácil colaborar través él y a la creación de buenos hábitos de trabajo colaborativo. Hay una serie de buenas prácticas, que incluyen, pero no se limitan, a

Material adicional

El proceso de design thinking para decidir sobre qué problema trabajar está descrito también en esta presentación o este tema.

El concepto de lógica de negocio se explica en este vídeo.

Entrega de la práctica

Cada proyecto tendrá su propio repositorio en GitHub. La documentación se incluirá en ficheros con el formato Markdown (en su sabor GitHub, en caso de que se desee). Esta descripción de la aplicación irá evolucionando con los diferentes objetivos.

En este objetivo, los ficheros solicitados se crearán, en general, simplemente respondiendo a las preguntas de creación del repositorio. Sin embargo, adicionalmente hay que incluir en el fichero README.md una descripción de un problema que se vaya a intentar solucionar a lo largo de la asignatura, en las entregas del proyecto que se van a hacer, un proyecto que se desplegará en la nube. A partir de ahora, en todos los objetivos se seguirá el siguiente procedimiento.

Para auxiliar al estudiante en estas labores se ha creado un plugin de git específico para la asignatura. Seguir las instrucciones en el mismo plugin para descargarlo e instalarlo.

  1. En este caso, tras crear el repositorio, se creará una rama específica para este objetivo (a partir de ahora, cada objetivo tendrá su propia rama). Con el plugin de git para IV instalado, esto se hará en este caso con git iv objetivo 0, que creará la rama y se trabajará en la misma.
  2. En esta rama se modificarán los ficheros necesarios para llevar a cabo todo lo requerido, que no se haya hecho en la creación del repo.
  3. Desde esa rama, se creará un pull request al propio repositorio indicando los cambios realizados. Este PR tendrá que ser aprobado por el profesor para que se considere el objetivo alcanzado. También se puede hacer con el plugin (en parte), escribiendo git iv sube-objetivo. El mismo git imprimirá instrucciones que se podrán seguir (pinchando en un enlace) para crear el pull request (de una rama en tu repositorio a la rama principal).
  4. Una vez creada esta rama, se debe copiar el URL de la misma, que será lo que se entregará.

Una vez hecho lo anterior, se añadirá al fichero de entrega del proyecto, en la fila correspondiente (que estará ya pre-rellena con tu nick de GitHub si lo has proporcionado), el nombre del proyecto, un enlace al PR que has creado desde una rama de tu repositorio y una versión, que seguirá el formato estándar vx.y.z, llamado versionado semántico. Entre estos números, x sería la versión major que habrá que mantener a 0 durante toda la asignatura. y se denomina minor, y la haremos corresponder a cada uno de los objetivos. El tercer grupo de dígitos, z se llama patchlevel, y será lo que hay que aumentar cada vez que se corrige el PR y se busca que se pasen de nuevo los tests en el repo de la asignatura.

No usar el formato correcto lanzará un error en el test que pasa el PR. En este objetivo tendremos, por tanto, que usar el formato v0.0.z.

Para enviar este PR crearás también una rama específica del repositorio de la asignatura, y harás un nuevo PR desde la misma.

Por si queda poco claro, son dos PRs en dos repositorios diferentes. Uno en tu repositorio, desde una rama creada específicamente para cada objetivo a la principal, otro en el de la asignatura, desde una rama también específica del objetivo a la principal.

El sistema de tests asegura la contención de cualquier tipo de cambio por parte del estudiante en el que se haga algo que pueda afectar al repositorio de la asignatura. Por lo tanto se aconseja al estudiante que pruebe y experimente con los envíos, siguiendo únicamente las condiciones que se indican en la propia plantilla de envíos:

Se aconseja al estudiante que trate de solucionar los problemas que aparezcan, bien en los tests o a través de los comentarios del profesor, de la forma más rápida posible.

El README.md del proyecto será, efectivamente, la descripción del proyecto en sí. Documentación adicional (por ejemplo, en la documentación de este objetivo mostrar que se han llevado a cabo las configuraciones que se han solicitado) se deben poner en un directorio aparte y enlazarse desde el README.md en un apartado específico (al final del mismo, por ejemplo). Por ejemplo, pantallazos u otro tipo de documentación que pruebe que se ha configurado correctamente git.

En general, el README.md sólo incluirá temas relativos al proyecto en sí. Lo necesario para valorar si se ha alcanzado el objetivo o no deberán ir en documentos aparte, para que se puedan corregir.

Cuando el profesor apruebe el PR en el repositorio del estudiante, se podrá fusionar ese contenido con su rama principal; en ese momento se estimará que se ha alcanzado el objetivo requerido. El profesor revisará, uno por uno, todos los envíos y hará preguntas (que habrá que aclarar generalmente investigando algún aspecto que no quede claro y cambiando el código) o sugerencias, que encaminarán al estudiante a entender mejor los objetivos correspondientes, y eventualmente a superar el objetivo.

Por esto, se puede entregar el objetivo todas las veces que necesites, mejorándolo siguiendo los consejos del profesor. No trates de poner lo que pide en la primera ocasión, ni en la segunda. Trata de entender qué es lo que tienes que aprender en cada objetivo, y transmítelo en lo que entregues. Lo importante siempre es lo que aprendas, no lo que pongas o escribas. Esto se aplica a este objetivo, y por supuesto al resto de la asignatura.

Por eso, no tienes que esperar a tenerlo perfecto para entregarlo; basta con que pase los requisitos mínimos, que se comprueban como tests. No se espera que esté perfecto con la entrega, se espera que con a ayuda del profesor y, a partir del objetivo siguiente, de los compañeros, se alcancen los objetivos de aprendizaje.

Por esto también es importante que asistas a clase, y no dejes el aula cuando terminen las explicaciones. La metodología de esta asignatura está centrada en el estudiante, y en ayudar al estudiante sobre la marcha, cuando se produzca el problema. De esta forma también podrás hacer el envío en clase y que se te corrija sobre la marcha, si es posible.

Importante: el título de este pull request tiene que incluir la cadena [IV-24-25] para que pueda filtrar fácilmente los mensajes recibidos.

El no hacerlo así lanzará también un error en el PR.

Cuando se hagan en el PR las mejoras como respuesta a la revisión del profesor, el estudiante deberá pedir explícitamente revisiones adicionales con un comentario en el mismo que diga “Listo para revisión”.

Lista de comprobación

Hazte estas preguntas cuando envíes el objetivo. Tendrá que ser positiva la respuesta a todas, si quieres tener posibilidades de superación del objetivo, pero que las marques como conseguidas no garantiza ni tiene relación alguna con la consecución del mismo. Así que marca solamente las que efectivamente hayas superado.

* [ ] ¿Se trata de un problema real del que se tenga conocimiento personal?
* [ ] ¿Se trata de un problema que para solucionar requiera el despliegue
   de una aplicación en la nube?
* [ ] ¿La solución requiere una cierta cantidad de lógica de negocio, en vez
    solucionarse sólo almacenando y buscando?
* [ ] ¿Se ha incluído la configuración del repositorio y se ha enlazado desde el
`README`?
* [ ] ¿Tienes todos los datos necesarios para poder resolver el problema, o vas
a requerir que el usuario los introduzca?
* [ ] ¿Estás marcando al buen tuntún todo?

Puedes pegar este texto al PR que hagas en tu propio repositorio, e ir marcando según vayas comprobando que la respuesta es afirmativa. Ayudará si pones alguna explicación de por qué lo es. El objetivo de esta lista de comprobación es que ayudar a prepararte para entregar el contenido del objetivo, no que pongas y marques absolutamente todo. Hacerlo así no contribuye en absoluto a la superación del objetivo, y sí aumenta la carga de trabajo de quien lo revisa, que tendrá que comprobar que efectivamente lo has hecho o indicarte en la revisión cuando has marcado algo que no has cumplido de ninguna de las maneras.

Valoración

El alcanzar este objetivo avanzará, aproximadamente, 5% de la parte correspondiente de la asignatura.

Plazo de entrega

Hay un plazo de entrega aconsejado de dos semanas a partir del comienzo de las clases. En cursos anteriores,

A partir de la entrega, si se tarda más de 17 días en superar el objetivo la probabilidad de aprobar la asignatura en convocatoria ordinaria desciende del 50%. Es conveniente, por lo tanto, que se realicen con celeridad las correcciones siguiendo las indicaciones del profesor.

A donde ir desde aquí

Una vez entregado, puedes comenzar por tu cuenta con el siguiente objetivo. Puedes tener todos los PRs que desees abiertos en tu repositorio.

Se aconseja en todo caso que se inicie el trabajo en ese objetivo inmediatamente en cuanto que se supere este objetivo, no es necesario esperar a que se explique en clase. Se puede solicitar al profesor que lo explique individualmente, si se está en clase, o simplemente leerlo y plantear las dudas que surjan en el grupo de Telegram de la asignatura; si hay suficientes que lo hayan superado y está lejos la siguiente clase se propondrá una tutoría grupal.