La création d'une meilleure expérience client nécessite souvent un logiciel flexible qui peut être mis à jour pour s'adapter à de nouvelles situations sans nécessiter l'intervention de développeurs. Mais il n'y a pas beaucoup de solutions prêtes à l'emploi qui fournissent une telle plateforme. DoorDash a été confronté à ce défi à plusieurs reprises alors que nous nous efforcions de créer une excellente expérience pour les consommateurs, les Dashers et les commerçants. Notre croissance rapide a entraîné l'apparition régulière de nouveaux problèmes. Cela peut prendre du temps de s'appuyer exclusivement sur les équipes d'ingénieurs pour construire des solutions pour les nouveaux types de problèmes au fur et à mesure qu'ils sont identifiés. Pour répondre rapidement aux problèmes des clients, nous savions que nous devions trouver un meilleur moyen.
Notre solution devait permettre aux équipes chargées de l'expérience client de relever directement les nouveaux défis. Cela signifiait permettre à nos opérateurs d'expérience client de créer des flux de travail personnalisés pour résoudre les problèmes sans dépendre de l'ingénierie. La mise en place de ce type de plateforme flexible a posé un défi d'ingénierie ; nous avons réalisé que nous devions construire une solution sans code et développer des outils permettant à nos opérateurs de créer et de déployer des flux de travail dans un environnement de production en direct. Faute de solutions non propriétaires pour atteindre cet objectif et désireux d'éviter le verrouillage des fournisseurs, nous avons décidé de construire notre propre solution sans code en utilisant des technologies open source telles que Kotlin, Postgres et React.
Principaux défis à relever pour soutenir un paysage en évolution rapide
Une plateforme de flux de travail sans code efficace doit être suffisamment souple pour interagir avec les membres de l'équipe chargée de l'expérience client ou avec les consommateurs, en permettant aux utilisateurs de faire des choix pour passer à l'étape suivante de l'exécution du flux de travail ; par exemple, les consommateurs doivent pouvoir choisir s'ils souhaitent obtenir un remboursement, un crédit ou une re-livraison. La plateforme doit permettre l'exécution de processus automatisés, par exemple en ouvrant la voie aux membres de l'équipe chargée de l'expérience client pour déterminer l'éligibilité de la demande de remboursement d'un client. Enfin, l'interface utilisateur de la plateforme doit permettre aux opérateurs d'élaborer un nouveau flux de travail et de le déployer de manière transparente dans un environnement de production en direct.
Décider de construire ou d'acheter
Nous avons examiné un certain nombre d'outils déjà disponibles sur le marché, mais nous avons finalement conclu que nous devions créer une solution nous-mêmes. L'activité de DoorDash s'exerçant dans un environnement dynamique, il faut faire face à des incertitudes permanentes et à des priorités commerciales en constante évolution. Aucune des solutions existantes que nous avons examinées n'était suffisamment flexible pour répondre à nos besoins. En outre, nous craignions que le choix d'une solution commerciale ne nous lie à un fournisseur qui ne serait pas en mesure de s'adapter assez rapidement aux besoins commerciaux en constante évolution de DoorDash.
Au lieu d'acheter une solution sur le marché, nous avons décidé d'exploiter des technologies open source telles que Kotlin, React et Postgres que nous pouvions prendre en charge nous-mêmes pour réaliser la vision technologique de DoorDash.
Création du studio de workflow et du moteur d'exécution de DoorDash
Nous devions créer deux ensembles d'outils, chacun destiné à des publics différents :
Workflow Studio permet à nos opérateurs de créer des flux de travail plutôt que de demander à notre équipe de développement de les ajouter à l'outil existant. Comme le montre la figure 1, nous avons construit une interface utilisateur utilisant React pour permettre aux utilisateurs de dessiner des flux de travail. Nous avons construit des API dorsales utilisant Kotlin pour accepter les données de configuration des flux de travail et les stocker en JSON - JavaScript Object Notation - dans notre base de données Postgres. Les données de configuration du flux de travail forment un arbre de décision qui est sérialisé dans un format JSON pour le stockage.
Le moteur d'exécution du flux de travail permet aux membres de notre équipe d'expérience client et aux consommateurs d'interagir avec le flux de travail et d'exécuter des étapes, par exemple en permettant aux consommateurs de choisir la raison d'une annulation à partir d'un menu déroulant. L'interface utilisateur est construite sur plusieurs canaux - web, iOS et Android - pour servir à la fois les membres de l'équipe d'expérience client et les consommateurs. Nous avons utilisé Kotlin pour construire l'API dorsale ; la configuration du flux de travail est extraite d'une base de données Postgres et désérialisée dans un format d'objet qui représente un arbre de décision. Comme le montre la figure 2, nous exécutons des étapes automatisées de manière répétée dans une boucle, en répondant à l'interface utilisateur si une étape manuelle est rencontrée.
Au lieu d'essayer d'achever l'ensemble du projet en une seule fois, nous avons opté pour une approche itérative, chaque itération s'appuyant sur la plate-forme existante. Cela nous a permis d'améliorer notre plateforme de manière incrémentale sans retarder son déploiement fonctionnel.
La solution MVP initiale se concentrait sur l'activation de flux de travail composés d'étapes manuelles. Une étape manuelle contient une instruction qu'un membre de l'équipe chargée de l'expérience client peut suivre pour résoudre un problème client. Cette solution a permis à nos opérateurs de convertir des articles de connaissance - des guides utilisés par les membres de l'équipe chargée de l'expérience client pour déterminer les étapes à suivre pour résoudre un problème client - en flux de travail.
Notre deuxième itération a automatisé les flux de travail manuels de la première itération, en introduisant des étapes automatisées, telles que le traitement des remboursements, qui peuvent être enchaînées pour créer des flux de travail personnalisés.
Dans notre troisième itération, nous avons ajouté la prise en charge de l'internationalisation pour nos flux de travail. Le principe de base de la plateforme de flux de travail étant axé sur le développement d'un modèle en libre-service, nous avons ajouté la possibilité pour les opérateurs de configurer des étapes avec une prise en charge multilingue.
Enfin, notre quatrième itération s'est concentrée sur la mise en place de flux de travail pour les clients de l'auto-assistance qui utilisent les applications web, iOS ou Android destinées aux consommateurs, ainsi que pour les Dashers qui utilisent les applications iOS ou Android Dasher.
Restez informé grâce aux mises à jour hebdomadaires
Abonnez-vous à notre blog d'ingénierie pour recevoir régulièrement des informations sur les projets les plus intéressants sur lesquels notre équipe travaille.
Please enter a valid email address.
Merci de vous être abonné !
Résoudre les problèmes liés à l'exécution du flux de travail
Les solutions de flux de travail présentent des défis uniques que l'on ne rencontre généralement pas lors de l'élaboration d'une solution API. Plutôt que de permettre à deux applications de s'interfacer, les configurations de flux de travail sont représentées sous la forme d'un arbre de décision qui commence par un état fini et peut se terminer par l'un des nombreux états terminaux.
Faire face à des défaillances inattendues
Des problèmes sont apparus lorsque l'exécution d'un flux de travail a échoué après avoir exécuté certains états sans achever le processus comme prévu. Comme il était contre-productif d'annuler toutes les transactions effectuées, nous avons décidé d'arrêter l'exécution du flux de travail en cas d'erreur grave, mais de poursuivre l'exécution si l'erreur n'affecte pas de manière significative le résultat escompté.
Maintien de l'état
Une autre question concernait la manière de maintenir l'état afin que les multiples étapes exécutées puissent être regroupées en une seule instance de flux de travail. La résolution implique le passage d'un attribut "request id" entre le client et le backend pour corréler les étapes de l'exécution d'un flux de travail unique. Pour réduire la complexité, nous avons décidé de ne pas maintenir d'état dans le backend. Au lieu de cela, chaque étape automatisée est exécutée indépendamment et ne dépend pas du contexte d'exécution du flux de travail. Cela nous permet de construire des étapes automatisées qui peuvent être insérées dans n'importe quel flux de travail à n'importe quelle étape.
Gestion de l'échelle
Nous devions également éviter que les flux de travail ne deviennent trop volumineux ou que les mêmes étapes soient répétées d'un flux de travail à l'autre. Pour résoudre ce problème, nous avons mis au point une fonction de "saut de flux de travail" qui permet aux opérateurs de configurer des flux de travail plus petits qui peuvent être enchaînés pour former un flux de travail plus important.
Conclusion
Notre parcours vers la création d'une plateforme de flux de travail personnalisée sans code met en lumière les outils et techniques open-source permettant de créer des solutions de flux de travail sans composants de fournisseurs, en tirant parti d'une pile technique générale utilisée dans le développement de logiciels au jour le jour. Notre plateforme de flux de travail sans code crée un modèle réutilisable pour résoudre une grande variété de problèmes chez DoorDash. Aujourd'hui, nous tirons parti de cette plateforme pour résoudre les problèmes de nos clients sur plusieurs canaux : le web, iOS, Android, le chat et l'automatisation téléphonique IVR. La technologie peut répondre aux besoins d'une variété de publics, y compris les opérateurs, les membres de l'équipe d'expérience client, les consommateurs, les Dashers et les commerçants.
Remerciements
Merci à JR Maitre, Abin Varghese, Bhaavyaa Kapoor, Pnina Eliyahu, Kevin Nguyen, Ashish Keshri, Han Yan, Dan Behar, Kumaril Dave et Han Huang pour leur contribution à ce projet.