Técnicas y herramientas¶
Metodologías¶
Scrum¶
Scrum es un marco de trabajo para el desarrollo de software que se engloba dentro de las metodologías ágiles. Aplica una estrategia de trabajo iterativa e incremental a través de iteraciones (sprints) y revisiones.
Test-Driven Development (TDD)¶
Es una práctica de desarrollo de software que se basa en la repetición de un ciclo corto de desarrollo: transformar requerimientos a test, desarrollar el código necesario para pasar los test y posteriormente refactorizar el código. Esta práctica obliga a los desarrolladores a analizar cuidadosamente las especificaciones antes de empezar a escribir código, fomenta la escritura de test y la simplicidad de código y aumenta la productividad. Como resultado se obtiene software más seguro y de mayor calidad.
Gitflow¶
Gitflow es un flujo de trabajo con Git que define un modelo estricto de ramas diseñado en torno a los lanzamientos de proyecto. En la rama main se hospeda la última versión estable del proyecto. La rama develop contiene los últimos desarrollos realizados para el siguiente lanzamiento. Por cada característica que se vaya a implementar se crea una feature branch. La preparación del siguiente lanzamiento se realiza en una release branch. Si aparece un fallo en producción, este se soluciona en una hotfix branch.
Patrones de diseño¶
Model-View-Presenter (MVP)¶
MVP es un patrón de arquitectura derivado del Model–View–Controller (MVC). Permite separar los datos internos del modelo de una vista pasiva y enlazarlos mediante el presenter que maneja toda la lógica de la aplicación. Posee tres capas:
- Model: almacena y proporciona los datos internos.
- View: maneja la visualización de los datos (del modelo). Propaga las acciones de usuario al presenter.
- Presenter: enlaza las dos capas anteriores. Sincroniza los datos mostrados en la vista con los almacenados en el modelo y actúa ante los eventos de usuario propagados por la vista.
Patrón repositorio¶
El patrón repositorio proporciona una abstracción de la implementación del acceso a datos con el objetivo de que este sea transparente a la lógica de negocio de la aplicación. Por ejemplo, las fuentes de datos pueden ser una base de datos, un web service, etc. El repositorio media entre la capa de acceso a datos y la lógica de negocio de tal forma que no existe ninguna dependencia entre ellas. Consiguiendo desacoplar, mantener y testear más fácilmente el código y permitiendo la reutilización del acceso a datos desde cualquier cliente.
Control de versiones¶
- Herramientas consideradas: Git y Subversion.
- Herramienta elegida: Git.
Git es un sistema de control de versiones distribuido. A día de hoy, es el sistema con mayor número de usuarios. La principal diferencia con Subversion es su carácter descentralizado, que permite a cada desarrollador tener una copia en local del repositorio completo. Git está licenciado bajo la licencia de software libre GNU LGPL v2.1.
Hosting del repositorio¶
GitHub es la plataforma web de hospedaje de repositorios por excelencia. Ofrece todas las funcionalidades de Git, revisión de código, documentación, bug tracking, gestión de tareas, wikis, red social... y numerosas integraciones con otros servicios. Es gratuita para proyectos open source.
Utilizamos GitHub como plataforma principal donde hospedamos el código del proyecto, la gestión de proyecto (gracias a ZenHub) y la documentación. Además, el repositorio está integrado con varios servicios de integración continua.
Gestión del proyecto¶
- Herramientas consideradas: ZenHub, Trello, Waffle, VersionOne, XP-Dev y GitHub Projects.
- Herramienta elegida: ZenHub.
ZenHub es una herramienta de gestión de proyectos totalmente integrada en GitHub. Proporciona un tablero canvas en donde cada tarea representada se corresponde con un issue nativo de GitHub. Cada tarea se puede priorizar dependiendo de su posición en la lista, se le puede asignar una estimación, uno o varios responsables y el sprint al que pertenece. ZenHub también permite visualizar el gráfico burndown de cada sprint. Es gratuita para proyectos pequeños (máx. 5 colaboradores) o proyectos open source.
Comunicación¶
Slack es una herramienta de colaboración de equipos que ofrece salas de chat, mensajes directos y llamadas VoIP. Posee un buscador que permite encontrar todo el contenido generado dentro de Slack. Además, ofrece un gran número de integraciones con otros servicios. En nuestro proyecto vamos a utilizar la integración con GitHub para crear un canal que sirva de log de todas las acciones realizadas en GitHub. Slack ofrece una versión gratuita que provee las características principales.
Entorno de desarrollo integrado (IDE)¶
Java¶
- Herramientas consideradas: IntelliJ IDEA y Eclipse.
- Herramienta elegida: IntelliJ IDEA.
IntelliJ IDEA es un IDE para Java desarrollado por JetBrains. Posee un gran número de herramientas para facilitar el proceso de escritura, revisión y factorización del código. Además, permite la integración de diferentes herramientas y posee un ecosistema de plugins para ampliar su funcionalidad. Su versión community está disponible bajo la licencia Apache 2. Aunque también es posible adquirir la versión Ultimate gratuitamente si se es estudiante.
Android¶
- Herramientas consideradas: Android Studio y Eclipse.
- Herramienta elegida: Android Studio.
Android Studio es el IDE oficial para el desarrollo de aplicaciones Android. Está basado en IntelliJ IDEA de JetBrains. Proporciona soporte para Gradle, emulador, editor de layouts, refactorizaciones específicas de Android, herramientas Lint para detectar problemas de rendimiento, uso, compatibilidad de versión, etc. Se distribuye bajo la licencia Apache 2.
Markdown¶
Haroopad es un editor de documentos Markdown. Soporta Github Flavored Markdown y Mathematics Expression, además de contar con un gran número de extensiones. Se distribuye bajo licencia GNU GPL v3.0.
LaTeX¶
- Herramientas consideradas: ShareLaTeX y Texmaker.
- Herramienta elegida: Texmaker.
Texmaker es un editor gratuito y multiplataforma para LaTeX. Integra la mayoría de herramientas necesarias para la escritura de documentos en LaTeX (PdfLaTeX , BibTeX, makeindex, etx). Además, incluye corrector ortográfico, auto-completado, resaltado de sintaxis, visor de PDFs integrado, etc. Está licenciado bajo GNU GPL v2.
Documentación¶
- Herramientas consideradas: Microsoft Word, LibreOffice, LaTeX, Markdown, GitHub Wikis.
- Herramienta elegida: Markdown + LaTeX.
La documentación se ha desarrollado en Markdown para integrarla con el servicio de documentación continua Read the Docs. Una vez terminada, se ha exportado a LaTeX utilizando el conversor Pandoc.
Markdown es un lenguaje de marcado ligero en texto plano que puede ser exportado a numerosos formatos como HTML o PDF. Su filosofía es que el lenguaje de marcado sea fácil de escribir y leer. Markdown es ampliamente utilizado para la escritura de archivos README, en foros como StackOverflow o en herramientas de comunicación como Slack.
LaTeX es un sistema de composición de textos que genera documentos con una alta calidad tipográfica. Es ampliamente utilizado para la generación de artículos y libros científicos, principalmente por su potencia a la hora de representar expresiones matemáticas.
Servicios de integración continua¶
Compilación y testeo¶
Travis es una plataforma de integración continua en la nube para proyectos alojados en GitHub. Permite realizar una build del proyecto y testearla automáticamente cada vez que se realiza un commit, devolviendo un informe con los resultados. Es gratuita para proyectos open source.
Cobertura de código¶
Codecov es una herramienta que permite medir el porcentaje de código que está cubierto por un test. Además, realiza representaciones visuales de la cobertura y gráficos de su evolución. Posee una extensión de navegador para GitHub que permite visualizar por cada archivo de código que líneas están cubiertas por un test y cuáles no. Es gratuita para proyectos open source.
Calidad del código¶
- Herramientas consideradas: Codeclimate, SonarQube y Codacy.
- Herramientas elegidas: Codeclimate y SonarQube.
Codeclimate es una herramienta que realiza revisiones de código automáticamente. Es gratuita para proyectos open source. En nuestro proyecto hemos activado los siguientes motores de chequeo: checkstyle, fixme, markdownlint y pmd.
SonarQube es una plataforma de código abierto para la revisión continua de la calidad de código. Permite detectar código duplicado, violaciones de estándares, cobertura de tests unitarios, bugs potenciales, etc.
Revisión de dependencias¶
- Herramientas consideradas: VersionEye.
- Herramienta elegida: VersionEye.
VersionEye es una herramienta que monitoriza las dependencias del proyecto y envía notificaciones cuando alguna de estas está desactualizada, es vulnerable o viola la licencia del proyecto. Posee una versión gratuita con ciertas limitaciones.
Documentación¶
- Herramientas consideradas: Read the Docs.
- Herramienta elegida: Read the Docs.
Read the Docs es un servicio de documentación continua que permite crear y hospedar una página web generada a partir de los distintos ficheros Markdown o reStructuredText de la documentación. Cada vez que se realiza un commit en el repositorio se actualiza la versión hospedada. La página web posee un buscador, da soporte para diferentes versiones del proyecto y soporta internacionalización. Además, permite exportar la documentación en varios formatos (pdf, epub, html, etc.). El servicio es totalmente gratuito, sostenido por donaciones y subscripciones Gold.
Sistemas de construcción automática del software¶
Librerías¶
Android Support Library¶
La librería de soporte de Android facilita algunas características que no se incluyen en el framework oficial. Proporciona compatibilidad a versiones antiguas con las últimas características, incluye elementos para la interfaz adicionales y utilidades extra.
Espresso¶
Espresso es un framework de testing para Android incluido en la librería de soporte para testing en Android. Provee una API para escribir UI test que simulen las interacciones de usuario con la app.
Google Guava¶
Google Guava agrupa un conjunto de librerías comunes para Java. Proporciona utilidades básicas para tareas cotidianas, una extensión del Java collections framework (JCF) y otras extensiones como programación funcional, almacenamiento en caché, objetos de rango o hashing.
Google Play Services¶
Google Play Services es una librería que permite a las aplicaciones de terceros utilizar características de aplicaciones de Google como Maps, Google+, etc. En nuestro caso se ha hecho uso de su servicio de localización, que utiliza varias fuentes de datos (GPS, red y wifi) para ubicar el dispositivo rápidamente.
Material Design¶
Material Design es una guía de estilos enfocada a la plataforma Android, pero aplicable a cualquier otra plataforma. Fue presentada en el Google I/O 2014 y se adoptó en Android a partir de la versión 5.0 (Lollipop). Se basa en objetos materiales, piezas colocadas en un espacio (lugar) y con un tiempo (movimiento) determinado.
Mockito¶
Mockito es un framework de mocking que permite crear objetos mock fácilmente. Estos objetos simulan parte del comportamiento de una clase. Mockito está basado en EasyMock, mejorando su sintaxis haciendo los test más simples y fáciles de leer y con mensajes de error descriptivos.
MPAndroidChart¶
MPAndroidChart es una librería para la creación de gráficos en Android.
OpenCV¶
OpenCV es un paquete Open Source de visión artificial que contiene más de 2500 librerías de procesamiento de imágenes y visión artificial, escritas en C/C++ a bajo/medio nivel. Se distribuye gratuitamente bajo una licencia BSD desde hace más de una década. Posee una comunidad de más de 50.000 usuarios alrededor de todo el mundo y se ha descargado más de 8 millones de veces.
Aunque OpenCV está escrito en C/C++ posee wrappers para varias plataformas, entre ellas Android, en donde da soporte a las principales arquitecturas de CPU. Desde hace unos años, también soporta CUDA para el desarrollo en GPU tanto en escritorio como en móvil, aunque en esta última el soporte es todavía reducido.
OpenWeatherMaps¶
OpenWeatherMap es un servicio online que proporciona información meteorológica. Está inspirado en OpenStreetMap y su filosofía de hacer accesible la información a la gente de forma gratuita. Utiliza distintas fuentes de datos desde estaciones meteorológicas oficiales, de aeropuertos, radares e incentiva a los propietarios de estaciones meteorológicas a conectarlas a su red. Proporciona una API que permite realizar hasta 60 llamadas por segundo de forma gratuita.
Página web¶
GitHub Pages¶
GitHub Pages es un servicio de hosting estático que permite hospedar la página del proyecto en su propio repositorio de GitHub. Permite utilizar Jekyll, un generador de sitios estáticos. No soporta tecnologías del lado de servidor como PHP, Ruby, Python, etc.