# Herramientas y tecnologías
Aquí documentamos el razonamiento detrás de la elección de ciertas herramientas, tecnologías y procesos para Mojaloop. También hemos incluido los enlaces/versiones recomendados para cada una de estas herramientas.
ELECCIÓN DE HERRAMIENTAS
- Desarrollo de API
- **Open API 3.0 ** se utiliza para el desarrollo de API (antes Swagger 2.0).
- ** ISTIO** como API Gateway (WSO2 ya obsoleto a partir de Mojaloop v16.0.0 - Congo e IaC v5.0.0 en adelante) ofrece una plataforma empresarial para integrar API, aplicaciones y servicios web—de forma local y a través de Internet. También proporciona a Mojaloop una capa de seguridad y un portal de desarrollo.
- Circle-CI - Esta herramienta se utiliza para la compilación continua y el despliegue continuo. Necesitábamos un sistema en línea de compilación y pruebas continuas que pudiera funcionar con muchos proyectos pequeños y un equipo distribuido. Se consideró Jenkins, pero requiere alojar un servidor y mucha configuración. CircleCI permitió una solución sin alojamiento que se podía poner en marcha sin costo y con muy poca configuración. Pensamos que podríamos empezar con CircleCI y migrar más adelante si se nos quedaba pequeño, pero no ha hecho falta.
- Dactyl – Necesitamos poder imprimir la documentación en línea. Aunque es posible imprimir archivos markdown directamente uno por uno, nos gustaría reunir los archivos en un conjunto de documentos PDF finales, donde una página puede terminar en más de un manual final. Dactyl (opens new window) es una herramienta de conversión de código abierto con mantenimiento activo que convierte entre markdown y PDF. Originalmente probamos Pandoc, pero tenía errores al convertir tablas. Dactyl corrige eso y es mucho más flexible.
- DBeaver - DBeaver (opens new window) es una herramienta de bases de datos multiplataforma y gratuita para desarrolladores, programadores de SQL, administradores de bases de datos y analistas. Admite todas las bases de datos populares: MySQL, PostgreSQL, MariaDB, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Derby, etc.
- Docker - El motor de contenedores Docker crea y ejecuta el contenedor Docker a partir del archivo de imagen de Docker.
- Docker hub se utiliza para vincular, compilar, probar y publicar los repositorios de código de Mojaloop. Necesitábamos admitir la ejecución tanto local como en la nube. Tenemos muchos microservicios pequeños con configuraciones y requisitos específicos muy simples. La forma más fácil de garantizar que el servicio funcione igual en todos los entornos, desde el desarrollo local hasta la nube y la producción alojada, es poner cada microservicio en un contenedor Docker junto con todos los prerrequisitos que necesita para ejecutarse. El contenedor se convierte en una unidad segura, cerrada, preconfigurada y ejecutable.
- Draw.io – Necesitamos crear imágenes para nuestros documentos y diagramas de arquitectura con una herramienta (idealmente gratuita) afín al código abierto, que sea independiente de la plataforma, admita formatos vectoriales y de trama, permita dibujar en modo WYSIWYG, funcione con markdown y sea fácil de usar. Revisamos muchas herramientas, entre ellas: Visio, Mermaid, PlantUML, Sketchboard.io, LucidChart, Cacoo, Archi y Google Drawings. Draw.io obtuvo la mejor puntuación para nuestras necesidades. Es gratuita, tiene mantenimiento, es fácil de usar, produce nuestros formatos, se integra con DropBox y GitHub, y es independiente de la plataforma. Para guardar nuestros diagramas, tenemos que guardar dos copias: una en formato SVG (vector escalable) y la otra en PNG (trama). Usamos el formato PNG dentro de la documentación porque se puede ver directamente en GitHub. El SVG se usa como copia maestra porque es editable.
- ESLint - Dentro del código JavaScript, usamos ESLint (opens new window) como guía de estilo de código y herramienta para imponer el estilo.
- GitHub – GitHub (opens new window) es un servicio de repositorios de código fuente ampliamente utilizado, basado en git, el sistema estándar de control de versiones de código fuente para proyectos de código abierto. Por eso la decisión de usar GitHub fue sencilla. Creamos una historia cada vez que hay trabajo de integración. Creamos errores para cualquier problema. Nos aseguramos de que todas las historias se sigan a lo largo del pipeline para garantizar métricas fiables.
- Helm - El gestor de paquetes Helm para Kubernetes proporciona despliegues y configuraciones con plantillas, y permite gestionar la complejidad general.
- IaC - La infraestructura como código (IaC) es el conjunto de herramientas y scripts que se usan para desplegar una plataforma Mojaloop con el nivel de calidad deseado, desde desarrollo, qa o sandboxes hasta preproducción, o incluso ampliado a despliegues con calidad de producción. Usa las versiones de Mojaloop como núcleo y despliega todo el conjunto de herramientas de apoyo necesario para ejecutar la plataforma Mojaloop de un Switch de Mojaloop.
- Kafka - Esta tecnología se aprovecha para atender la demanda de Mojaloop de mensajería de datos de alta velocidad y alto volumen, manteniendo al mínimo nuestros requisitos de hardware.
- JavaScript - La aplicación de Mojaloop está escrita principalmente en JavaScript.
- Kubectl - Es una interfaz de línea de comandos para ejecutar comandos contra clústeres de Kubernetes.
- Kubernetes - Esta herramienta empresarial proporciona una capa de extracción, gestión de infraestructura y un sistema de orquestación de contenedores.
- Markdown – La documentación es un entregable de este proyecto, igual que el código, así que queremos tratarla como el código en cuanto a control de versiones, revisión, registro de cambios y seguimiento de cambios. También queremos que la documentación se pueda ver fácilmente en línea sin tener que abrir un visor constantemente. GitHub tiene un formato integrado llamado Markdown que resuelve bien esto. Los mismos archivos sirven para el wiki y para los documentos. Se pueden revisar junto con el registro de cambios usando las mismas herramientas y se ven directamente en GitHub. Consideramos Google Docs, Word y PDF, pero estos formatos binarios no permiten comparar diferencias con facilidad. Una desventaja es que markdown solo permite formato simple, nada de tablas complejas ni cambios de fuente, pero esto debería bastar cuando nuestro propósito principal es la claridad.
- Mojaloop Testing Toolkit (TTK) – Mojaloop Testing Toolkit (opens new window)) es una herramienta tipo navaja suiza para las actividades relacionadas con Mojaloop, utilizada principalmente para pruebas de extremo a extremo, demostraciones, simulación de API y en otros escenarios ampliados. Las colecciones de pruebas de Mojaloop usan el ML TTK y es la herramienta preferida para las pruebas de extremo a extremo, que también está integrada en los scripts de pruebas automatizadas (usando TTK CLI en IaC y otros entornos de dev/qa).
- MySQLWorkbench – MySQL Workbench (opens new window) es una herramienta visual unificada para arquitectos de bases de datos, desarrolladores y DBA. MySQL Workbench ofrece modelado de datos, desarrollo en SQL y herramientas de administración completas para la configuración del servidor, la administración de usuarios, las copias de seguridad y mucho más. MySQL Workbench está disponible en Windows, Linux y Mac OS X.
- NodeJS - Esta herramienta de desarrollo es un entorno de ejecución de JavaScript construido sobre el motor JavaScript V8 de Chrome que ejecuta Mojaloop. NodeJS está diseñado para crear microservicios simples y tiene un enorme conjunto de bibliotecas de código abierto disponibles. El rendimiento de Node es bueno y, aunque los componentes de Node no escalan verticalmente en gran medida, planeamos escalar horizontalmente, algo que sí hace bien. El código original de Interledger estaba escrito en NodeJS, al igual que el prototipo de nivel uno. La mayoría de los equipos ya usaba Node, así que tenía sentido como lenguaje. Dentro del código de NodeJS, usamos Standard (opens new window) como guía de estilo de código y para imponer el estilo del código.
- NPM - NPM es el gestor de paquetes de Mojaloop, ya que JavaScript es el lenguaje de programación predeterminado.
- Percona para MySQL - Estas herramientas se aprovechan como sistema de gestión de bases de datos relacionales para garantizar un alto rendimiento y una funcionalidad de nivel empresarial para el sistema Mojaloop. Necesitábamos un backend SQL afín al código abierto que pudiera escalar en un entorno de producción. Por eso elegimos MySQL, un sistema de gestión de bases de datos relacionales de código abierto.
- Postman es una aplicación de Google Chrome para interactuar con API HTTP. Presenta una interfaz gráfica amigable para construir solicitudes y leer respuestas.
- Rancher 2.0 - La gestión, el aprovisionamiento y la supervisión de la infraestructura los proporciona Rancher 2.0, una plataforma empresarial de Kubernetes que gestiona despliegues y clústeres de Kubernetes, en la nube y en local. Rancher facilita que los equipos de DevOps prueben, desplieguen y gestionen el sistema Mojaloop sin importar dónde se esté ejecutando.
- Slack – Slack se usa para la comunicación interna del equipo. Se eligió en gran medida porque varios equipos ya lo usaban y les gustaba como enfoque ligero en comparación con el correo electrónico.
- SonarCloud – Necesitamos un panel en línea de calidad del código (tamaño, complejidad, problemas y cobertura) que pueda agregar el código de todos los repositorios. SonarCloud es gratuito para Mojaloop, con algo de configuración. También ofrece comprobaciones de calidad en los pull requests y ofrece calificaciones basadas en las puertas de calidad aplicadas.
- SourceTree – Sourcetree (opens new window) simplifica la forma de interactuar con sus repositorios de Git para que pueda centrarse en programar. Visualice y gestione sus repositorios con la sencilla interfaz gráfica de Git de Sourcetree. Pero queda a criterio del desarrollador usar la herramienta que prefiera, siguiendo las recomendaciones generales de GitHub.
- Visual Studio Code - Visual Studio Code (opens new window) es un editor de código redefinido y optimizado para crear y depurar aplicaciones web y en la nube modernas. Visual Studio Code es gratuito y está disponible en su plataforma favorita: Linux, macOS y Windows.
- ZenHub – Necesitábamos una solución de gestión de proyectos muy ligera y basada en la nube para dar soporte a equipos distribuidos. Tenía que admitir épicas, historias y errores, y un tablero de proyecto básico. Se consideraron las ofertas en línea de VS y Jira. Para un equipo de desarrollo pequeño y distribuido, un servicio en línea era mejor. Para un proyecto de código abierto, no queríamos costos de mantenimiento continuo de un servidor. La integración directa y sólida con GitHub era importante. Resultó muy útil hacer el seguimiento del trabajo de cada microservicio junto con ese microservicio. Jira y VS tienen más sobrecarga de la necesaria para un proyecto de este tamaño y no se integran con GitHub tan limpiamente como querríamos. ZenHub nos permitió empezar a trabajar de inmediato. Una desventaja es la falta de compatibilidad con los diagramas de flujo acumulado y con el seguimiento del # de historias en lugar de puntos, así que hacemos esto manualmente con una hoja de cálculo que se actualiza a diario y los resultados se publican en el canal de Slack "Project Management".
ELECCIÓN DE TECNOLOGÍAS
- Desarrollo ágil - Esta metodología se usa para hacer el seguimiento y la ejecución del proyecto. Es necesario refinar los requisitos a medida que se desarrolla el proyecto, por eso elegimos el desarrollo ágil en lugar de cascada o lean.
- API - Para evitar la confusión que generan demasiados microservicios cambiantes, usamos API fuertemente definidas que se ajustan a nuestro patrón de diseño Pragmatic REST. Las API se definirán con OpenAPI. Los equipos documentan sus API con Swagger v2.0 o RAML v0.8 para poder probar, documentar y compartir su trabajo automáticamente. Se prefiere ligeramente Swagger porque hay herramientas gratuitas. Mule usará RAML 0.8. Swagger se puede convertir automáticamente a RAML v0.8, o manualmente a RAML v1.0 si se desea mayor legibilidad.
- Pruebas automatizadas - En su mayor parte, la mayoría de las pruebas se automatizarán para permitir pruebas de regresión sencillas. Consulte la estrategia de pruebas automatizadas y las métricas de calidad del código para conocer los estándares.
- Alojamiento - Mojaloop se ha diseñado para ser independiente de la infraestructura y, como tal, es compatible con AWS, Azure e instalaciones locales.
- Interledger – Mojaloop necesitaba un protocolo de transporte de fondos ligero, abierto y seguro. Interledger.org (opens new window) proporciona todo eso. También ofrece la capacidad de conectarse a otros sistemas. También consideramos sistemas de blockchain, pero los sistemas de blockchain envían mensajes muy grandes cuya entrega será más difícil de garantizar en la infraestructura del tercer mundo. Además, aunque los sistemas de blockchain proporcionan un buen anonimato, ese no es un objetivo del proyecto. Para permitir la detección del fraude, las autoridades regulatorias necesitan poder solicitar registros de transferencias por cuenta y por persona.
- Código abierto - Todo el proyecto se ha publicado como código abierto de acuerdo con los principios del Level One Project (opens new window). Todas las herramientas y procesos deben ser afines al código abierto y admitir proyectos que usen una licencia Apache 2.0 sin requisitos de licencias restrictivas para los desarrolladores.
- Sistema operativo – Microsoft Windows se usa mucho en muchos países objetivo, pero necesitamos un sistema operativo libre de tarifas de licencia y compatible con el código abierto. Estamos usando Linux. No dependemos de una distribución concreta, sino que usamos el Amazon Linux básico. En los contenedores Docker se usa Alpine Linux (opens new window).
- Microservicios - Como la arquitectura necesita desplegarse y escalar con facilidad, y que sus componentes se puedan reemplazar o actualizar fácilmente, se construirá como un conjunto de microservicios.
- Scaled Agile Framework - Había cuatro equipos de desarrollo iniciales separados geográficamente. Para mantener en marcha la fase inicial del proyecto, se eligió el scaled agile framework (SAFe) (opens new window). Esto significa que el trabajo se divide en incrementos de programa (PI) que suelen durar cuatro sprints de 2 semanas. Al igual que los sprints, el PI tiene objetivos demostrables definidos en cada reunión de PI.
- Servicios - Los microservicios se agrupan y se despliegan en unos pocos servicios, como el DFSP, el Central Directory, etc. Cada uno de ellos tendrá interfaces simples definidas, scripts de configuración, pruebas y documentación.
- Modelado de amenazas, modelado de resiliencia y modelado de estado - Como el código de Mojaloop necesita intercambiar dinero en un entorno con una infraestructura muy inestable, debe tener buena seguridad, resiliencia, informar fácilmente de su estado de salud e intentar volver a él automáticamente.
- USSD - Los teléfonos inteligentes son solo el 25% del mercado objetivo y actualmente la mayoría de los servicios de transferencia de dinero no los admite, así que necesitamos un protocolo que funcione en teléfonos básicos. Como M-Pesa, usamos USSD entre el teléfono y el proveedor de servicios financieros digitales (DFSP).
