DORA Metrics : utiliser la technologie pour piloter la valeur du business

La promesse est simple : comment utiliser la technologie pour piloter la valeur du business ?

Pour qui ?

Avant d’attaquer le sujet concrètement, commençons par définir la cible de ces métriques.

Contre toute attente, elles sont transverses. Moyennant une bonne application, les métriques peuvent être consultées par la DSI , le CTO ou le management top level mais elles sont belles et bien pilotées par les équipes techniques.

Pourquoi ?

Assez simplement ce sont des métriques, des KPI, des nombres qui portent plus ou moins de contexte et permettent de quantifier la performance des équipes techniques (software team). Bien souvent, la littérature retient 4 métriques au total bien qu’il en existe une 5ème qu’on évoquera rapidement mais qu’on exclura par la suite.

  • DF (Deployment Frequency)

Il s’agit de la fréquence à laquelle du code est déployé en production sur une période de temps. Précisions tout de même que le code doit être déployé avec succès. S’il faut rollback chaque déploiement ça compte pas.

C’est également un indicateur de fréquence à laquelle les ingénieurs délivrent de la valeur aux utilisateurs finaux.

Plus elle est élevée et plus les utilisateurs profitent vite des incréments de code.

A titre indicatif, une valeur moyenne est de 1 déploiement par semaine.

  • MLTC (Mean Lead Time for Changes)

Il s’agit du temps moyen entre le premier commit et le déploiement en production.

Souvent les développeurs doivent repasser plusieurs fois sur le code produit initialement suite notamment à la re-lecture par d’autre développeurs ou pour apporter des corrections demandées par le product owner.

Dans un autre domaine, cette métrique correspond au temps d’immobilisation (stock).

A titre indicatif, une valeur moyenne est de 1 semaine.

  • CFR (Change Failure Rate)

Il s’agit du pourcentage de déploiements en production qui causent un problème.

On le calcule en divisant le nombre d’incident par le nombre de déploiements.

A titre indicatif, une valeur moyenne se situe entre 16 et 30%.

  • MTTR (Mean Time To Recovery)

Il s’agit du temps moyen nécessaire pour réparer un problème et remettre le système dans un état stable.

A titre indicatif, une valeur moyenne se situe à moins d’un jour.

  • Reliability

Cinquième métrique du panel, souvent oubliée. Elle est plus orienté DevOps/SRE et reprend des objectifs existants plus opérationnels/contractuels (SLA) qui peuvent être atteints voire excédés.

Comment fait-on ?

Il existe plusieurs approches pour mettre en places ces métriques. La plus simple reste de s’appuyer sur un outil qui les intègre déjà, comme LinearB.

Source: LinearB https://linearb.helpdocs.io/article/7ck7fu67am-metrics-dashboards-dora-metrics

Qu’importe le flacon l’outil, pourvu que vous commenciez à mesurer.

Et si cela ne marche pas dans mon cas  ?

“Oui mais moi ma feature est complexe, il me faut plusieurs semaines pour terminer, je vais biaiser la moyenne gneu gneu gneu …”

  • Découpe ta feature et utilise des feature flags pour délivrer de façon incrémentale.

"Oui mais c’est long de tout tester à chaque fois gneu gneu gneu …"

  • Sois flemmard et écris des tests pour automatiser ton job.

TL;DR

Les métriques DORA sont des indicateurs de la production de valeur produit/business.

Elles sont applicables aux DevOps comme aux développeurs et intéressent toute la software team. Pour être pertinentes, les développeurs doivent être acteurs du pilotage de ces métriques car aucun manager ne pourra les forcer à cela.

Une observation macro est que les DORA poussent naturellement à réduire les incréments de code. En effet, en envoyant moins de code à chaque déploiement, on mitige le risque et les déploiements sont naturellement plus rapide.

Notons aussi que les DORA ne se suffisent pas à elle même, elles appellent à d’autre bonnes pratiques que sont le respect du manifeste agile https://agilemanifesto.org/, l’ajout de tests ou encore les principes LEAN de Toyota.

Enfin, avis aux néophytes avides de tableau Excel, si les DORA permettent de quantifier un problème, une lame de fond, elles ne le qualifie pas pour autant. Le sujet central reste un sujet humain, on parle d’équipes d’homme et de femme qui ont leur code, leur cohésion, leur problématique propre. Piloter uniquement les DORA pour présenter un Excel “tout au vert” serait naïf et pourrait compromettre l’équipe ciblée.

Et Yield Studio là dedans ?

Selon la classification mentionnée en annexe Yield Studio se situe en “high performer” et s’améliore en continu pour atteindre prochainement le grade “elite”. Et vous, vous vous situez où dans ce tableau ? Aujourd'hui les DORA Metrics nous permettent de garantir une réelle qualité auprès de nos clients dans les projets qu'ils nous confient.

Source

Valeurs indicatives pour chaque DORA metric

Source: Google Cloud https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance?hl=en

Sommaire
Nos autres catégories
Notre newsletter tous les mois :
Je m'abonne
Merci ! C'est dans la boîte :)
Oops! Something went wrong while submitting the form.
Partager sur :
Nos autres catégories
Notre newsletter tous les mois :
Je m'abonne
Merci ! C'est dans la boîte :)
Oops! Something went wrong while submitting the form.
Partager sur :

Nos experts vous parlent
Le décodeur

Chat application mobile : Intercom, Crisp, Brevo
1/1/2021

Dans le monde numérique moderne, l'intégration d'un chat dans les applications mobiles joue un rôle crucial pour renforcer l'engagement et la satisfaction des utilisateurs.

Avec des solutions comme Intercom, Crisp, et Brevo, offrir un support client en temps réel et faciliter la communication devient non seulement possible, mais aussi efficace. 

Que vous soyez un développeur chevronné ou simplement curieux de comprendre comment ces systèmes s'intègrent dans les applications mobiles, cet article vous guidera à travers les avantages, les techniques d'intégration, et les meilleures pratiques pour utiliser le chat mobile. 

En mettant l'accent sur des applications de messagerie adaptées aux besoins des utilisateurs et des entreprises, nous explorons comment ces outils transforment l'interaction numérique, rendant chaque conversation plus significative.

Pourquoi intégrer un chat dans votre application mobile ?

L'intégration d'un système de chat dans une application mobile n'est pas seulement une fonctionnalité supplémentaire ; c'est une stratégie essentielle pour améliorer l'interaction utilisateur et offrir un support client sans précédent. Voici pourquoi l'ajout d'un chat à votre application mobile peut être un véritable atout pour votre entreprise.

Amélioration de l'expérience utilisateur

Le chat en direct dans les applications mobiles crée une ligne de communication instantanée entre les utilisateurs et votre entreprise. Cela signifie que les questions, préoccupations et commentaires peuvent être adressés rapidement, améliorant ainsi l'expérience utilisateur (UX). Une réponse rapide peut transformer une expérience utilisateur médiocre en une expérience positive, augmentant la satisfaction et la fidélité des clients.

Support client en temps réel

Avec l'intégration de solutions de chat telles qu'Intercom, Crisp ou Brevo, vous offrez un support client en temps réel directement depuis l'application. Cela élimine le besoin pour les utilisateurs de quitter l'application pour obtenir de l'aide. Un accès facile au support client non seulement résout les problèmes plus rapidement mais renforce également la confiance dans votre marque.

Engagement accru (h3)

Les systèmes de chat permettent une communication bidirectionnelle qui peut être utilisée pour engager les utilisateurs. Que ce soit par des notifications push personnalisées, des offres spéciales ou des sondages, le chat peut servir de puissant outil d'engagement. En maintenant les utilisateurs engagés, vous augmentez les chances qu'ils utilisent votre application plus fréquemment et pour de plus longues périodes.

Collecte de retours utilisateurs

Le chat offre une plateforme pour recueillir des commentaires précieux des utilisateurs en temps réel. Ces retours peuvent être utilisés pour améliorer l'application, corriger des bugs, et développer de nouvelles fonctionnalités qui répondent mieux aux besoins des utilisateurs. Une meilleure compréhension des désirs des utilisateurs conduit à une meilleure prise de décision et à des mises à jour de l'application plus pertinentes.

Avantage concurrentiel

Dans un marché saturé, offrir un chat intégré dans votre application peut vous démarquer de la concurrence. Cela montre que vous êtes engagé à fournir un excellent service client et à faciliter la communication. Une telle fonctionnalité peut être un facteur décisif pour les utilisateurs lorsqu'ils choisissent entre votre application et celle d'un concurrent.

En intégrant un chat dans votre application mobile, vous ne faites pas que suivre une tendance ; vous investissez dans une meilleure expérience utilisateur, un support client amélioré, et une stratégie d'engagement plus forte. Ces éléments sont cruciaux pour le succès à long terme de toute application mobile.

Solutions de chat pour applications mobiles : vue d'ensemble

L'adoption de solutions de chat pour applications mobiles est une étape cruciale vers l'amélioration de la communication et de l'engagement des utilisateurs. Ces solutions, telles qu'Intercom, Crisp, et Brevo, offrent une variété de fonctionnalités conçues pour répondre aux besoins des entreprises et de leurs utilisateurs. Voici une vue d'ensemble de ce que ces solutions de chat peuvent offrir et comment elles se comparent.

Intercom

Intercom est largement reconnu pour sa plateforme de communication client intégrée, qui facilite le chat en direct, l'engagement des utilisateurs, et le support client. Son intégration dans les applications mobiles permet une communication fluide entre les utilisateurs et les représentants du service client, avec des fonctionnalités telles que les réponses automatisées et la segmentation des utilisateurs. Intercom se distingue par sa capacité à offrir des interactions personnalisées à grande échelle.

Crisp

Crisp propose une solution de chat multicanal qui supporte non seulement le chat en direct mais aussi le courrier électronique, les SMS, et les réseaux sociaux. Ce qui le rend particulièrement attractif pour les applications mobiles, c'est sa simplicité d'utilisation et sa capacité à unifier toutes les communications client en un seul lieu. Crisp est idéal pour les entreprises cherchant à offrir une expérience utilisateur cohérente à travers différents canaux.

Brevo

Brevo est une solution de chat mobile axée sur l'automatisation et l'intelligence artificielle. Elle permet aux entreprises de créer des bots de chat qui peuvent gérer des conversations de base, orienter les utilisateurs vers les ressources appropriées, et même effectuer des tâches simples. L'intégration de Brevo dans une application mobile peut considérablement réduire la charge de travail du service client tout en maintenant les utilisateurs engagés.

Comparaison avec les applications de chat gratuites

Bien que les applications de chat gratuites comme WhatsApp ou Facebook Messenger offrent des moyens de communication efficaces, elles ne sont pas toujours idéales pour un usage professionnel en raison de leur manque de personnalisation et de contrôle. En comparaison, les solutions de chat payantes offrent des fonctionnalités avancées telles que l'analyse des données utilisateur, l'intégration avec d'autres outils professionnels, et un haut degré de personnalisation.

Compatibilité avec Android et iOS

Une considération importante lors du choix d'une solution de chat pour une application mobile est sa compatibilité avec les systèmes d'exploitation Android et iOS. Intercom, Crisp, et Brevo offrent tous une excellente compatibilité, garantissant que les utilisateurs bénéficient d'une expérience de chat fluide, indépendamment de leur appareil.

Intégration avec des comptes existants

La possibilité d'intégrer des solutions de chat avec des comptes existants, tels que les comptes Google ou Facebook, peut simplifier le processus de connexion pour les utilisateurs et améliorer l'expérience utilisateur. Ces intégrations peuvent également fournir aux entreprises des informations précieuses sur les préférences et les comportements des utilisateurs.

En résumé, choisir la solution de chat appropriée pour votre application mobile dépend de plusieurs facteurs, y compris les besoins spécifiques de votre entreprise, le niveau de personnalisation souhaité, et les préférences de vos utilisateurs. En offrant une vue d'ensemble des options disponibles, cette section aide les développeurs et les décideurs à naviguer dans le paysage des applications de chat et à choisir celle qui convient le mieux à leur application mobile.

Intégration Technique d'un Système de Chat

L'intégration technique d'un système de chat dans une application mobile est une étape cruciale qui nécessite une attention particulière pour assurer une expérience utilisateur fluide et efficace. Cette section aborde les différentes méthodes d'intégration, en mettant l'accent sur l'intégration en webview, les solutions natives, et l'utilisation des SDK.

Intégration en webview

L'utilisation d'une webview dans React Native permet d'intégrer facilement un chat web externe dans votre application en encapsulant la page web du chat dans un composant WebView.

Exemple de code React Native (JSX) pour intégrer une webview :

Une image contenant texte, capture d’écran, Police, logicielDescription générée automatiquement

Cet exemple montre comment charger une interface de chat web dans un composant WebView de React Native, permettant aux utilisateurs d'interagir avec le chat directement dans l'application.

Solutions natives via des SDK

Pour une intégration plus profonde et native, vous pouvez utiliser les SDK fournis par des plateformes de chat comme Intercom, Crisp, ou Brevo. Ces SDK nécessitent souvent l'utilisation de modules natifs ou de wrappers disponibles pour React Native.

Exemple d'intégration du SDK Intercom pour React Native :

Une image contenant texte, capture d’écran, PoliceDescription générée automatiquement

Cet exemple montre comment initialiser et enregistrer un utilisateur avec Intercom dans votre application React Native, permettant une interaction native avec le service de chat.

Utilisation des SDK

Les SDK spécifiques à chaque plateforme de chat, tels que ceux pour Crisp ou Brevo, peuvent être intégrés à React Native à travers des packages spécifiques ou des ponts natifs.

Exemple d'intégration générique d'un SDK:

Une image contenant texte, capture d’écran, PoliceDescription générée automatiquement

Bien que cet exemple soit générique, il illustre comment un SDK de chat pourrait être initialisé dans React Native. Consultez la documentation spécifique du SDK pour des instructions détaillées.

Considérations importantes

  • Sécurité et Confidentialité : Veillez à ce que le chat intégré offre un chiffrement de bout en bout et respecte les réglementations de protection de la vie privée des utilisateurs.
  • Compatibilité : Testez l'intégration sur les différentes versions d'Android et iOS pour assurer une compatibilité et une performance optimales.
  • Personnalisation : Utilisez les options de personnalisation fournies par le SDK pour harmoniser l'interface de chat avec le design de votre application.

En intégrant un système de chat dans votre application React Native, vous offrez une valeur ajoutée significative à vos utilisateurs en facilitant la communication et en fournissant un support en temps réel. Les exemples de code fournis devraient vous aider à démarrer avec l'intégration, mais assurez-vous de consulter la documentation de chaque SDK pour des détails spécifiques à votre mise en œuvre.

En conclusion, l'intégration d'un système de chat dans une application mobile est une démarche stratégique essentielle pour améliorer l'engagement des utilisateurs, fournir un support client en temps réel, et recueillir des feedbacks précieux. Avec des solutions de chat avancées comme Intercom, Crisp, et Brevo, les développeurs disposent d'outils puissants pour incorporer facilement ces fonctionnalités dans leurs applications mobiles, qu'elles soient développées avec React Native ou d'autres frameworks.

L'utilisation de Webviews, l'intégration de SDK spécifiques, ou encore le déploiement de solutions natives, offre une flexibilité permettant de choisir l'approche qui convient le mieux aux besoins spécifiques de l'application et à son public cible. Chaque méthode d'intégration présente des avantages uniques, allant de la facilité de mise en œuvre à la personnalisation poussée, en passant par l'optimisation de l'expérience utilisateur.

Il est crucial, cependant, de ne pas perdre de vue l'importance de la sécurité, de la confidentialité, et de la compatibilité lors de l'intégration de ces systèmes de chat. Ces aspects sont fondamentaux pour maintenir la confiance des utilisateurs et assurer le succès à long terme de l'application.

L'avenir des applications mobiles réside dans la capacité à créer des expériences utilisateur riches et interactives. L'intégration d'un système de chat répond parfaitement à cette exigence, en transformant les interactions numériques en conversations significatives et engageantes. En tant que développeurs et décideurs, il est de notre responsabilité de tirer parti de ces technologies pour construire des applications qui non seulement répondent aux besoins actuels des utilisateurs mais anticipent également leurs attentes futures.

Que vous soyez un développeur expérimenté ou un entrepreneur novateur, intégrer un système de chat dans votre application mobile est un pas en avant vers la création d'une expérience utilisateur véritablement dynamique et connectée. Les possibilités sont vastes, et avec les bonnes pratiques et les outils appropriés, votre application peut devenir un espace où les utilisateurs se sentent écoutés, soutenus, et engagés.

L’Architecture Hexagonale sur un projet Web + Mobile (Partie 2 sur 5)
28/2/2024

Dans l'article précédent nous avons initialisé notre monorepo, la CI, le framework de test et préparé la structure de notre projet et plus précisément de notre Architecture Hexagonale pour la lib core.

Dans ce nouvel article de la série notre objectif va être de mettre en place l'Architecture Hexagonale et de montrer comment grâce à elle nous allons pouvoir développer et créer de la logique métier sans UI (donc sans ouvrir le navigateur ou l'app mobile). Pour cela nous allons travailler en TDD (Test-Driven Development, vous pouvez voir mon article à ce sujet) et utiliser le feedback des tests.

L'Architecture Hexagonale

La structure cible

Pour rappel, voici la structure que l'on va mettre en place à l'issue de cet article :

- src
    - wallet
       - __ tests __
         - wallet.service.test.ts
       - domain
         - wallet.ts
         - wallet.repository.ts
         - wallet.service.ts
       - infrastructure
         - in-memory-wallet.repository.ts
         - local-storage-wallet.repository.ts
         - mmkv-wallet.repository.ts
       - user-interface
         - wallet.store.ts

Chose promise, chose due ! Nous allons maintenant rentrer dans le détail de chaque fichier, à quoi ils servent et ce qu'ils contient.

Développer en TDD

Lorsqu'on travaille en TDD on commence par le test et ce test va nous guider vers un objectif. Il va nous assurer qu'on suit le bon chemin à l'aide de la boucle de feedback régulière qu'on obtient à l'aide des tests. Pour en savoir plus sur la méthodologie à suivre pour faire du TDD je vous invite à nouveau à lire mon article à ce sujet.

Nous allons commencer par travailler sur l'entité Wallet qui correspond à un portefeuille qui a un solde négatif ou positif (par exemple on peut avoir le portefeuille "Compte Principal Julien" qui a un solde positif de 1000€).

Voici les tests mis en place pour cette entité :

describe('Wallet Service', () => {
	let service: WalletService

	beforeEach(() => {
		const repository = new InMemoryWalletRepository()
		service = new WalletService(repository)
	})

	test('getAll > should retrieve all wallets', async () => {
		const newWallet = { id: '1', name: 'Wallet 1', balance: 0 }

		await service.create(newWallet)
		const retrievedWallets = await service.getAll()

		expect(retrievedWallets).toEqual([newWallet])
	})

	test('get > should retrieve a wallet according to an id', async () => {
		const newWallet = { id: '1', name: 'Wallet 1', balance: 0 }

		await service.create(newWallet)
		const retrievedWallet = await service.get(newWallet.id)

		expect(retrievedWallet).toEqual(newWallet)
	})

	test('create > shoudl create a wallet', async () => {
		const newWallet = { id: '1', name: 'Wallet 1', balance: 0 }

		const createdWallet = await service.create(newWallet)
		const retrievedWallets = await service.getAll()
		const retrievedWallet = await service.get(createdWallet.id)

		expect(createdWallet).toEqual(newWallet)
		expect(retrievedWallets).toEqual([newWallet])
		expect(retrievedWallet).toEqual(newWallet)
	})

	test('update > should update the specified wallet', async () => {
		const newWallet = { id: '1', name: 'Wallet 1', balance: 0 }
		const updatedWallet = { id: '1', name: 'Wallet 1', balance: 100 }

		await service.create(newWallet)
		const retrievedWallet = await service.get(newWallet.id)
		const modifiedWallet = await service.update(updatedWallet)
		const retrievedModifiedWallet = await service.get(modifiedWallet.id)

		expect(retrievedWallet).toEqual(newWallet)
		expect(modifiedWallet).toEqual(updatedWallet)
		expect(retrievedModifiedWallet).toEqual(updatedWallet)
	})

	test('delete > should delete a wallet according to an id', async () => {
		const newWallet = { id: '1', name: 'Wallet 1', balance: 0 }

		await service.create(newWallet)
		const retrievedWallet = await service.get(newWallet.id)
		await service.delete(newWallet.id)
		const retrievedWallets = await service.getAll()

		expect(retrievedWallet).toEqual(newWallet)
		expect(retrievedWallets).toEqual([])
	})
})

On peut comprendre via ces tests que les cas d'utilisations de notre entité sont :

  • getAll, récupération de tous les portefeuilles
  • get, récupération d'un portefeuille en particulier
  • create, création d'un portefeuille
  • update, mise à jour d'un portefeuille
  • delete, suppression d'un portefeuille

Nous allons voir maintenant comme réussir à mettre en place ces tests.

Domain

Nous allons commencé par créer le contenu de la partie Domain. Dans cette partie nous allons retrouver tout ce qui représente le problème à résoudre (problème métier). C'est une partie qui doit être totalement indépendante.

L'entité

Commençons par créer notre entité Wallet correspondant à un portefeuille.

type Wallet = {
	// un identifiant unique (ex: 4d0c2e72-be1a-4e2c-a189-2f321fcdc3a4)
	id: string

	// un nom (ex: Compte Principal Julien)
	name: string

	// un nombre positif ou négatif pour le solde (ex: +1000€)
	balance: number
}


Le repository

Maintenant que notre entité est définie, nous allons définir une interface que l'on appelle également port qui va préciser comment interagir avec cette entité. Nous utilisons ici un modèle de conception d'inversion de dépendances qui nous permet de rester totalement libre sur les outils à utiliser pour respecter cette interface. Nous pourrons très bien implémenté cette interface en utilisant une base de données, une API ou un localStorage par exemple, le domaine s'en fiche.

interface WalletRepository {
	getAll(): Promise<Wallet[]>
	get(walletId: string): Promise<Wallet | undefined>
	create(wallet: Wallet): Promise<Wallet>
	update(wallet: Wallet): Promise<Wallet>
	delete(walletId: string): Promise<void>
}

Le service

Nous avons notre entité et nous savons commencer interagir avec, maintenant nous allons créer un service qui va consumer une implémentation du de notre interface repository (partie suivante dans l'infrastructure).

class WalletService implements WalletRepository {
	constructor(private repository: WalletRepository) {}

	getAll() {
		return this.repository.getAll()
	}

	get(walletId: string) {
		return this.repository.get(walletId)
	}

	create(wallet: Wallet) {
		return this.repository.create(wallet)
	}

	update(wallet: Wallet) {
		return this.repository.update(wallet)
	}

	delete(walletId: string) {
		return this.repository.delete(walletId)
	}
}

Infrastructure

L'infrastructure est composée des différentes implémentations des ports du domaine, on les appelle également Adapters. Ici, nous aurons du code spécifique pour consommer une technologie concrète (une base de données, une API, etc.). C'est une partie qui ne doit dépendre uniquement du domaine.

L'implémentation du repository

Nous allons maintenant voir l'une des implémentation possible de notre WalletRepository. Pour commencer nous allons faire du in-memory, pratique notamment pour la mise en place des premiers tests de nos cas d'utilisations.

class InMemoryWalletRepository implements WalletRepository {
	private wallets: Wallet[] = []

	getAll() {
		return Promise.resolve(this.wallets)
	}

	get(walletId: string) {
		return Promise.resolve(this.wallets.find((wallet) => wallet.id === walletId))
	}

	create(wallet: Wallet) {
		this.wallets.push(wallet)
		return Promise.resolve(wallet)
	}

	update(wallet: Wallet) {
		const index = this.wallets.findIndex((w) => w.id === wallet.id)
		this.wallets[index] = wallet
		return Promise.resolve(wallet)
	}

	delete(walletId: string) {
		const index = this.wallets.findIndex((w) => w.id === walletId)
		this.wallets.splice(index, 1)
		return Promise.resolve()
	}
}

Comment dis précédemment, il s'agit d'une des multiples implémentation possible de notre WalletRepository. Nous pouvons très bien imaginer plus tard mettre en place un LocalStorageWalletRepository ou bien un SupabaseWalletRepostory.

Vous pouvez consulter mon répertoire public de broney sur GitHub pour voir mon implémentation de ces 2 repository et notamment de comment j'ai adapté ma série de test pour garantir leur bon fonctionnement.

User Interface

La partie user interface est composée de tous les adaptateurs qui constituent les points d'entrée de l'application. Les utilisateurs utilisent ces adaptateurs pour pouvoir interagir avec le coeur de l'application. Dans notre cas nous allons régulièrement utiliser des stores en utilisant la libraire Zustand. Il s'agit d'une libraire JS minimaliste pour la gestion d'états (une solution plus complexe serait par exemple Redux).

Voyons voir comment articuler notre store Zustand pour permettre à l'utilisateur d'interagir avec le coeur de l'application.

import { createStore } from 'zustand/vanilla'
import { InMemoryWalletRepository } from '../infrastructure/in-memory-wallet.repository'
import { WalletService } from '../domain/wallet.service'
import { Wallet } from '../domain/wallet'

const repository = new InMemoryWalletRepository()
const service = new WalletService(repository)

type States = {
	wallets: Wallet[]
	currentWallet: Wallet | undefined
}

type Actions = {
	load: () => void
	setCurrentWallet: (wallet: Wallet) => void
	getWallet: (walletId: string) => void
	createWallet: (wallet: Wallet) => void
	updateWallet: (wallet: Wallet) => void
	deleteWallet: (walletId: string) => void
}

export const walletStore = createStore<States & Actions>()((set) => ({
	wallets: [],
	currentWallet: undefined,

	load: async () => {
		const allWallets = await service.getAll()
		set({ wallets: allWallets })
	},

	setCurrentWallet: (wallet) => set({ currentWallet: wallet }),

	getWallet: async (walletId: string) => {
		const wallet = await service.get(walletId)
		set({ currentWallet: wallet })
	},

	createWallet: async (wallet: Wallet) => {
		const newWallet = await service.create(wallet)
		set((state) => ({ wallets: [...state.wallets, newWallet] }))
	},

	updateWallet: async (wallet: Wallet) => {
		const updatedWallet = await service.update(wallet)
		set((state) => ({
			wallets: state.wallets.map((w) => (w.id === updatedWallet.id ? updatedWallet : w)),
			currentWallet: state.currentWallet?.id === updatedWallet.id ? updatedWallet : state.currentWallet,
		}))
	},

	deleteWallet: async (walletId: string) => {
		await service.delete(walletId)
		set((state) => ({
			wallets: state.wallets.filter((w) => w.id !== walletId),
			currentWallet: state.currentWallet?.id === walletId ? undefined : state.currentWallet,
		}))
	},
}))


Avec ce store on remarque qu'on va pouvoir facilement, dans n'importe quel environnement JavaScript, charger, définir, récupérer, créer, mettre à jour et supprimer des portefeuilles, tout en maintenant un état global pour l'ensemble des portefeuilles et du portefeuille courant.

Conclusion

Nous avons maintenant terminé ce deuxième article de cette série sur le développement d'une application web et mobile avec l'Architecture Hexagonale et le partage de la logique métier et des composants UI.

Dans cette deuxième partie nous avons vu comment travailler en TDD et surtout comment écrire de la logique métier sans avoir à ouvrir une quelque interface à l'exception du terminal pour les retours de tests.

Nous avons également eu un aperçu de comment nous allons interagir avec nos applications avec le coeur de l'application, via notre store Zustand. Nous irons plus loin à ce sujet dans le prochain article, la troisième partie : Partager de la logique métier et des composants entre le Web et le Mobile.

Changer de version Node.js avec NVM : le guide
24/1/2024

Dans l'univers du développement d'applications mobiles, la gestion des versions de Node.js est cruciale. Découvrez ici comment utiliser Node Version Manager (NVM) pour changer, installer des versions LTS, et éviter les conflits. Que vous soyez débutant ou expert, ce guide vous aidera à maîtriser cet outil essentiel.

Comprendre l'importance de Node Version Manager (NVM)

L'utilisation de différentes versions de Node.js peut être délicate. NVM simplifie ce processus en vous permettant de basculer facilement entre les versions. Vous évitez ainsi les conflits et assurez la compatibilité de vos projets.

NVM offre une flexibilité totale pour installer et gérer des versions spécifiques de Node.js en fonction de vos besoins. Son utilisation est simple, même pour les débutants, avec des commandes intuitives. NVM vous protège contre les conflits de versions en isolant les environnements.

NVM garantit que vos projets restent compatibles avec la version de Node.js sur laquelle ils ont été développés. Vous pouvez également mettre à jour vos projets en douceur sans crainte de problèmes de compatibilité.

En automatisant la gestion des versions de Node.js, NVM vous permet de vous concentrer sur le développement plutôt que sur la résolution de problèmes de version. C'est un gain de temps précieux.

En comprenant ces points, vous serez mieux préparé à tirer parti de Node Version Manager (NVM) dans votre travail de développement Node.js.

Installation de Node Version Manager

L'installation de Node Version Manager (NVM) est la première étape essentielle pour gérer vos versions Node.js. Cette section vous guidera à travers le processus d'installation sur différentes plateformes : 

  • Linux : Utilisez la commande wget pour récupérer NVM depuis GitHub. Suivez notre guide étape par étape pour une installation sans faille.

  • macOS : Apprenez comment installer NVM sur macOS en utilisant la commande curl. Suivez nos instructions pour garantir une installation réussie.

  • Windows : Si vous êtes sur Windows, découvrez comment installer NVM en utilisant des outils tels que Git Bash ou Windows Subsystem for Linux (WSL).

Après l'installation, nous vous montrerons comment configurer NVM pour une utilisation optimale. Vous serez prêt à commencer à gérer vos versions Node.js avec aisance.

Familiarisez-vous avec les commandes de base de NVM, telles que nvm --version pour vérifier la version installée, nvm ls pour afficher les versions disponibles et nvm install pour installer une version spécifique.

Suivez les instructions détaillées dans cette section pour installer NVM sur votre plateforme de choix. Vous serez rapidement opérationnel pour gérer vos versions Node.js de manière fluide.

Utilisation de NVM pour installer la dernière version LTS de Node.js

Maintenant que vous avez installé Node Version Manager (NVM), apprenons comment utiliser cet outil pour installer la dernière version LTS (Long Term Support) de Node.js.

Avant de procéder à l'installation, il est essentiel de savoir quelles versions LTS de Node.js sont disponibles. Vous pouvez le faire en utilisant la commande nvm ls-remote --lts.

Suivez ces étapes simples pour installer la dernière version LTS :

  1. Exécutez nvm install --lts pour installer la dernière version LTS disponible.
  2. Pour vérifier que l'installation a réussi, utilisez node --version pour afficher la version de Node.js installée.

Si vous souhaitez que la dernière version LTS soit la version par défaut utilisée par NVM, exécutez nvm alias default <version>.

Grâce à ces étapes simples, vous pouvez désormais installer et utiliser la dernière version LTS de Node.js avec facilité en utilisant Node Version Manager (NVM). Cela vous permettra de bénéficier des avantages de stabilité et de support à long terme pour vos projets Node.js.

Gestion de multiples versions de Node.js avec NVM

La gestion de plusieurs versions de Node.js est une nécessité pour de nombreux développeurs. Voici comment utiliser Node Version Manager (NVM) pour gérer efficacement ces versions.

Pour voir toutes les versions de Node.js installées sur votre système, utilisez simplement la commande nvm ls. Vous obtiendrez une liste claire de toutes les versions disponibles.

Pour basculer entre les versions, utilisez la commande nvm use <version>. Cela changera votre environnement de développement pour utiliser la version spécifiée.

Vous pouvez également créer des alias pour des versions spécifiques avec nvm alias <alias> <version>. Cela simplifie encore la gestion des versions.

Avec ces commandes simples, vous pouvez gérer facilement plusieurs versions de Node.js sur votre système, en utilisant Node Version Manager (NVM). Cela vous permet de maintenir la compatibilité de vos projets et de travailler sur des versions spécifiques selon vos besoins.

Mettre à jour Node.js avec NVM

Maintenir votre installation Node.js à jour est crucial pour bénéficier des dernières fonctionnalités et correctifs de sécurité. Voici comment effectuer des mises à jour en utilisant Node Version Manager (NVM).

Pour vérifier si des mises à jour sont disponibles, exécutez nvm ls-remote <version>. Cela affichera les versions de Node.js disponibles à la mise à jour.

Pour mettre à jour Node.js vers la dernière version LTS disponible, utilisez nvm install --lts. Cela installera la dernière version LTS sans affecter vos versions précédentes.

Si vous avez une version spécifique que vous souhaitez mettre à jour, utilisez nvm install <version> pour obtenir la dernière version de cette branche.

En utilisant ces commandes simples, vous pouvez maintenir votre installation Node.js à jour avec facilité, en garantissant que vos projets sont toujours optimisés en termes de performances et de sécurité.

Exemples pratiques et code source

Dans cette section, nous explorerons quelques exemples pratiques d'utilisation de Node Version Manager (NVM) avec des extraits de code source pour une meilleure compréhension.

Exemple 1 : Installation de Node.js LTS

Une image contenant capture d’écran, texte, Police, GraphiqueDescription générée automatiquement

Cette commande installe la dernière version LTS de Node.js.

Exemple 2 : Basculer vers une version spécifique

Une image contenant texte, capture d’écran, Police, GraphiqueDescription générée automatiquement

Utilisez cette commande pour basculer vers une version spécifique de Node.js (dans cet exemple, la version 14.17.6).

Exemple 3 : Créer un alias pour une version

Une image contenant texte, capture d’écran, Police, GraphiqueDescription générée automatiquement

Créez un alias pour définir une version spécifique de Node.js comme version par défaut.

Exemple 4 : Vérifier les versions installées

Une image contenant capture d’écran, texte, GraphiqueDescription générée automatiquement

Cette commande affiche la liste des versions de Node.js installées sur votre système.

Exemple 5 : Mise à jour de Node.js

Une image contenant texte, capture d’écran, PoliceDescription générée automatiquement

Mettez à jour Node.js vers la dernière version (ici, la version actuelle) tout en conservant les packages de la version précédente.

Utilisez ces exemples pratiques et extraits de code source pour mieux comprendre comment utiliser NVM dans vos projets Node.js. Cela vous aidera à gérer efficacement les versions et à optimiser votre environnement de développement web.

Les meilleures pratiques de gestion des versions Node.js

Pour tirer le meilleur parti de Node Version Manager (NVM) et maintenir un environnement de développement Node.js efficace, suivez ces meilleures pratiques :

  • Gardez NVM à jour : Pensez à mettre à jour régulièrement NVM pour bénéficier des dernières améliorations et corrections de bogues.
  • Utilisez les versions LTS : Privilégiez les versions LTS (Long Term Support) pour une stabilité à long terme. Cela garantit que vos projets restent stables et sécurisés.
  • Créez des alias significatifs : Lors de la création d'alias pour des versions spécifiques, choisissez des noms significatifs pour vous faciliter la gestion.
  • Documentez vos projets : Tenez un journal des versions utilisées pour chaque projet afin de garantir une compatibilité continue.
  • Gérez les dépendances avec npm : N'utilisez pas NVM pour gérer les dépendances de vos projets. Utilisez npm pour gérer les packages Node.js spécifiques à chaque projet.
  • Restez informé : Suivez les annonces de nouvelles versions Node.js et les mises à jour de sécurité pour rester au courant des dernières avancées.

En suivant ces meilleures pratiques, vous optimiserez votre gestion des versions Node.js avec NVM et garantirez la stabilité, la sécurité et la facilité de gestion de vos projets.

Dans cet article, nous avons exploré en détail l'utilisation de Node Version Manager (NVM) pour la gestion des versions Node.js. Que vous soyez un développeur expérimenté ou que vous découvriez Node.js, NVM est un outil essentiel pour maintenir un environnement de développement propre et efficace.

Nous avons abordé les étapes clés, de l'installation de NVM sur différentes plateformes à la gestion de multiples versions de Node.js, en passant par les mises à jour et les meilleures pratiques. En utilisant NVM, vous pouvez facilement basculer entre les versions, maintenir la compatibilité de vos projets et garantir la sécurité de votre environnement de développement.

Les exemples pratiques et les extraits de code source ont été fournis pour vous aider à mieux comprendre comment utiliser NVM dans vos projets. En suivant les meilleures pratiques recommandées, vous pouvez maintenir un environnement de développement Node.js optimal.

En fin de compte, Node Version Manager (NVM) est un outil puissant qui facilite grandement la gestion des versions Node.js. Il vous permet de rester à jour avec les dernières versions, d'adapter vos projets aux besoins spécifiques et de maintenir un flux de travail de développement efficace. Intégrez NVM dans votre boîte à outils de développement Node.js dès aujourd'hui pour une expérience de développement plus fluide et plus productive.

Maintenant que vous savez correctement utiliser NVM, nous vous invitons à consulter notre guide complet sur l’outil de gestion de versions Git.

Échangeons
sur votre projet !

Nous contacter

Simulateur

Bienvenue dans le
simulateur d’estimation

Sélectionnez
vos besoins

Sélectionnez un ou plusieurs choix

Définissez les
fonctionnalités

Sélectionnez un ou plusieurs choix

Dernière
étape !

Renseignez votre adresse mail pour recevoir l’estimation !
Obtenez l’estimation
Précédent
Suivant

Bravo ! Vous avez terminé
l’estimation de votre future app !

Vous recevrez dans votre boite mail l’estimation personnalisé. Une estimation vous offre la possibilité de vous projeter dans un budget, vous permettant ainsi de planifier en toute confiance. Néanmoins, chez Yield, nous adoptons une approche agile, prêts à remettre en question et ajuster nos évaluations en fonction de l'évolution de vos besoins et des spécificités de votre projet.
Retour au site
Oops! Something went wrong while submitting the form.