Home Assistant vers PubSub vers BigQuery vers Datastudio

Tout un programme !

Connaissez-vous Home Assistant ? C’est un chouette logiciel de domotique, compatible avec une multitude d’objets, de protocoles…. Vous pourrez facilement faire des tableaux de bord, et avoir des interactions assez poussées avec vos objets à condition d’accepter d’écrire un peu de YAML. Sa communauté est vraiment dynamique, les plugins sont nombreux et on trouve à peu prêt ce que l’on veut.

Par défaut, Home Assistant va utiliser un stockage SQLite. C’est pratique, ça ne réclame pas de dépendance particulière, et ça fait le job. Mais par défaut, et je ne comprends franchement pas l’idée, nous n’avons qu’un historique de 24h sur nos différents capteurs. Dans mon cas j’ai un dongle ZWave, avec un capteur de température Fibaro:

L’oeil de Sauron… Ceux qui savent, savent.

Et ça me frustre. Avant j’utilisais Domotizc et je n’avais pas ce soucis. On avait un véritable historique, et ça me permettait d’analyser un peu l’effort énergétique que je devais mettre dans ma maison pour maintenir une certaine température.

Fort heureusement, beaucoup de plugins existent pour arranger ça.

rien que ça…

Pour votre utilisation personnelle, toutes ces solutions peuvent convenir en fonction de vos connaissances ou vos affinités.

Quand j’ai vu la présence de Google Pub/Sub, j’ai réalisé que je pourrais très vite réaliser des tableaux de bord grâce à la suite Google à un cout proche de 0€. (OK, tout service a un prix. Mais je ne souhaitais pas consacrer de réel budget à ce service).

Quelle est l’idée ?

Pousser les données Home Assistant dans Pub/Sub

Pub/Sub, c’est un message broker. L’idée est donc de recueillir tous les événements Home Assistant grâce à ce plugin : https://www.home-assistant.io/integrations/google_pubsub/
Ce plugin est préinstallé dans Home Assistant. Vous n’aurez donc qu’à modifier le fichier configuration.yaml selon la documentation du plugin. Chez moi, cela ressemble à ça :

google_pubsub:
project_id: <GCP_PROJECT_ID>
topic_name: <GCP_PUBSUB_TOPIC>
credentials_json: <CREDENTIALS>.json
filter:
include_entities:
- sensor.salon_temperature
- sensor.salon_humidity
- sensor.fgms001_motion_sensor_air_temperature

Cela me permet de pousser dans pubsub uniquement les évènements relatifs à mon fibaro, et à mon thermostat Nest.

OK, des messages arrivent dans Pub/Sub, qu’est ce que j’en fais maintenant ?

Déjà, vérifions si des messages arrivent. Les messages sont publiés dans un « topic » ou « sujet » en français.

Bonne nouvelle en ce qui me concerne, on voit quelques messages passer. Home Assistant parle, et assez peu (ce qui est aussi une bonne nouvelle, les filtres configurés ont l’air de fonctionner).

Plusieurs options s’offrent maintenant à vous pour faire quelque chose de ces messages. Pub/Sub vous propose deux options pré-construites : « Exporter vers BigQuery » ou « Exporter vers Cloud Storage ». Ces tâches, qui vont en effet fonctionner, sont basées sur Dataflow. C’est une solution basée sur Apache Beam qui permet d’exécuter du code sur de volumineux flux de données avec différents patterns (agrégation, filtre, transformation…).
Je ne vous conseille pas son utilisation pour ce cas précis, juste parce que vous allez le payer cher (€) pour pas grand chose.

Une autre option m’intéresse un peu plus. En haut de l’écran, on peut lire une option « Déclencher une cloud function ». Qu’est ce donc ? C’est la possibilité d’exécuter un bout de code, simple et unitaire, pour chaque message qui arrive. Et c’est exactement ce que nous souhaitons vu l’objectif : lire les messages et les stocker quelque part. La volumétrie impliquera un coût proche de 0.

Pré-requis : Création du dataset BigQuery

Avant de s’occuper de la Cloud Function, allons préparer la base de données. Pour cela, rien de plus simple, on se connecte à la console d’administration de BigQuery pour y créer un dataset. Vous pourrez choisir l’emplacement des données. Dans l’exemple de code que je vais vous donner, j’ai choisi de ne garder que 3 simples informations :
– Le device id
– La date de l’évènement
– La valeur associée
C’est la définition d’une Time Série…

Un dataset, une table et son schéma.

Création de la Cloud Function

Maintenant que BigQuery est prêt à accueillir nos données, allons les déverser.
Sur l’écran de votre sujet Pub/Sub, cliquez sur « Déclencher une cloud function ». Cela vous amènera à un écran pré-rempli où vous pourrez mettre un nom à votre cloud function, une région d’exécution (par habitude je prends local, Europe-West1 😉 ). Et si vous voulez utiliser un bout de code pré-écrit, il y aura 3 variables d’environnement d’exécution à fournir dans les paramètres avancés :

Paramètres avancés pour la Cloud function

Etape suivante, le code.
Je vous propose ce dépot : https://github.com/lborie/home-assistant-to-big-query

Soit vous essayez de lier ce dépot que vous aurez forké à votre compte GCP, soit vous copiez coller le contenu dans l’éditeur intégré. Le code est en golang 1.13, le point d’entrée étant une fonction Main

function.go, go.mod et go.sum

Et plus qu’à déployer.

Si tout va bien, une fois déployée, vous devriez voir votre fonction se déclencher à chaque nouveau message dans Pub/Sub ! Sur l’écran d’administration de la cloud function, vous trouverez un onglet pour accéder aux logs générés.

La fonction est lancée, le message qui provient de Home Assistant est loggé et doit être sauvé dans BigQuery

Et normalement, votre table BigQuery devrait aussi s’alimenter…

De la donnée ! Victoire !

Comment en faire un graphique ? Direction Datastudio

Datastudio permet de faire des tableaux de bord en se connectant à plein de sources de données différentes, dont BigQuery. Lors de la création d’un nouveau rapport, vous allez pouvoir ajouter des données au rapport.

BigQuery parmi les centaines de connecteurs disponibles…

Vous allez pouvoir pointer vers la table Data du bon dataset. Une fois que la source de données est ajoutée, vous allez pouvoir éditer le rapport. En haut à droite, différents types de graphiques seront disponibles, dont un qui me parait pertinent : « Graphique de série temporelle lissée ». Comme on parle de température, un lissage me parait approprié.

Une date, un type et une valeur : on est bien dans la timeserie

Et magie…

La température dans mon bureau… On voit quand les moniteurs sont allumés, pas besoin de chauffage.

Conclusion

Tout ça pour ça me direz-vous ?
BigQuery est un outil extrèmement puissant. Pour une volumétrie Domotique, vous n’aurez jamais à vous soucier de quoi que ce soit, à condition de ne pas réclamer une réactivité trop grande. La puissance est illimitée, les couts de stockage ridicules. Intéressez-vous à cet outil.
Datastudio possède une grande variété de données, et vous serez capable de croiser les informations, peut-être avec une autre source de données que vous avez quelque part ?
On aura aussi vu du PubSub, de la Cloud Function, bref une chaine de traitement complète autour de l’IOT ! Et le tout sera scalable… Amusez-vous en jouant avec les filtres de configuration Home Assistant par exemple !

L.B.

La vie en ESN versus la vie en Startup : le revers de la médaille

Fin avril, avec Hubert Sablonnière, nous avons eu la chance d’être conviés par Cyril Lakech et Damien Cavaillès dans les bureaux de nos amis de WeLoveDevs pour deux heures de discussion. Pendant ces deux heures, avec Hubert nous avons retracé nos parcours en société de service, ce qu’elles nous ont apportés dans nos carrières, et ce qu’on a mis en place pour tenter de nous différencier et de progresser.

Deux heures, c’est long ! Si vous aimez les podcasts, écoutez nous en version audio 😉

Dans cet univers assez lisse que sont les sociétés de service, il s’agit bien de trouver un vecteur de différenciation pour faire son trou (vous faites partie « des devs »). Pour Hubert, c’est passé par l’expertise technique et son succès en tant que speaker reconnu. Pour moi c’est passé par mon travail dans les communautés tech par lesquelles je suis passé, et plus particulièrement le GDG Lille. Et c’est là qu’il y a débat : ça nous a demandé beaucoup de travail personnel sur notre temps libre, même si nos ESN respectives nous ont soutenues comme elles pouvaient, que ce soit en temps disponible (« non facturé ») ou en sponsoring… Bien entendu elles y ont gagné en visibilité et en image developer friendly. Bref, le débat n’est pas clos, n’étant pas tous égaux devant l’investissement personnel que chacun peut mettre en dehors des heures de bureau.

Au final avec Hubert nous étions d’accord sur les raisons qui nous ont fait changer de parcours. Nous voulions choisir les structures dans lesquelles nous travaillons, des structures avec un impact concret sur ses utilisateurs, conformes à nos valeurs. Et surtout, nous voulions nous sentir vraiment utiles à nos entreprises.

La recette du bonheur est bien entendu plus complexe…

Je tenais à mesurer un peu mes propos. Oui, j’aime mon job, mes collègues, mon impact dans l’entreprise et ce que nous faisons tous les jours. Cela dit, parlons un peu plus des différences entre mon ancienne vie de développeur en ESN et ma vie actuelle en startup.

Je parle des sociétés de service, parce que c’est mon expérience. Mais concrètement, la vie du développeur en société de service se résume beaucoup à la vie chez son client. Et statistiquement, vous avez plus de chance de travailler en sous traitance pour des grands comptes que pour une PME. Et c’est là un point important : mon article devrait sans doute s’appeler Grand Compte versus PME, quelles différences pour un développeur ?

Travailler en mode Projet

Je n’ai compris que très récemment à quel point l’équipe technique était une entité bien à part dans une grande structure.
Oui une équipe technique sur un projet peut avoir une pression folle, un management toxique, le projet peut-être compliqué et n’avoir aucun sens ni technique, ni produit, ni rien. On est tous d’accord. Mais mon propos est tout autre : la mission de l’équipe se résume souvent à réaliser un service bien défini.

Un input : le besoin, un output : le produit conçu

Bon, dans la vraie vie de la grosse entreprise ce n’est pas aussi binaire bien entendu. Votre projet évolue dans un environnement complexe, qui vous dépasse. D’un côté vous avez les moyens d’agir, la main d’œuvre, les outils. D’un autre côté, beaucoup de décisions sont prises à l’échelle de l’entreprise, et votre équipe ne pourra que les subir. Vous avez envie de faire bouger les lignes ? Il faudra vous confronter à une inertie très forte. Convaincre, sortir des KPI, construire sa roadmap autour de convictions fortes, et puis du jour au lendemain, non. Maintenant chez <GRAND_GROUPE> on fait comme ça et pas autrement. Ce manque de sens, d’autonomie et cette incapacité à changer les choses m’ont fait migrer vers la startup.

Et travailler en mode…. Startup ?

Quand j’ai rejoint Karnott, j’ai surtout rejoint deux personnes qui avaient une idée et la vision d’une agriculture connectée au service de l’agriculteur. Il faut se rendre compte qu’un « founder » en startup, c’est quelqu’un qui croit dur comme fer en son idée et qui met toute l’énergie pour y arriver. Et il en faut de l’énergie pour tracter tout le monde. De mon point de vue c’est un mélange d’enthousiasme, de force de persuasion, d’énergie, d’insouciance et de sentiment d’invincibilité. Soyons réalistes, je ne coche pas toutes les cases et je ne me lancerai jamais seul 🙂

La première conséquence de travailler avec des entrepreneurs, c’est qu’ils se réveillent souvent le matin avec une nouvelle idée. Un problème ne reste jamais longtemps un problème, ça se transforme en idée, voire en opportunité.

J’ai essayé de lister quelques difficultés courantes auxquelles il est difficile d’échapper dans une jeune startup. Peut-être que certains points sont communs avec les grosses entreprises mais je pense que ça sera toujours exacerbé par le contexte startup.

Premier point : ambitions, vélocité d’équipe et réaction face à l’échec

Les ambitions sont toujours énormes. On va bouleverser le marché, aller plus vite que les autres, faire les choses mieux avec une expérience utilisateur incroyable. On fait du LEAN, on sort un MVP, on trouve nos premiers utilisateurs, on se sent fort. On a de la traction (croissance), et maintenant il faut convertir. Faire de son MVP un produit qui a de la gueule… Il n’empêche qu’on est toujours 3 développeurs, que les stories s’allongent à l’infini, et que les idées arrivent toujours en nombre.

Viennent aussi les premières désillusions commerciales. Il faut changer de fusil d’épaule, alors qu’on avait entamé le super chantier tech dont on parlait depuis des mois. Hop, on met tout ce travail dans un tiroir, et on repart d’une feuille blanche. Moralement, techniquement, c’est dur.

Les équipes techniques ont besoin de stabilité et de sérénité : ce n’est pas l’apanage d’une startup.

Second point : la variété de sujets à traiter

Cette capacité à mettre son travail en suspens pour travailler sur autre chose, ça n’est pas lié qu’au produit. Une startup, c’est une entreprise complète avec son équipe commerciale, sa compta, sa gestion du support, son comité de pilotage… Une startup, c’est une seule équipe dont vous faites partie. Et cette équipe, pour avancer sur plein de sujets, elle a besoin de vous. Vous n’aimez pas faire du support ? Le marketing / SEO n’est pas votre panacée ? Faire des tableaux de bord de suivi ne vous intéresse pas vraiment ? Et quid de la facturation ? Pourtant on a vraiment besoin de vous, et c’est toujours urgent. Alors il faut être malin, trouver les solutions les plus efficaces pour mettre tout en place à moindre coût. D’ailleurs ce n’est pas pour rien que beaucoup de solutions no-code émergent ! Objectif : réduire la frustration des différentes personnes de la startup en les autonomisant, et permettre à l’équipe produit de se concentrer sur… le produit.

Chez Karnott, nous sommes friands de plein de SaaS pour ne pas avoir à tout faire nous-même, mais ce n’est pas magique. Et quand quelqu’un à côté de vous a besoin d’aide sur un sujet hors de votre scope principal, et bien vous l’aidez, c’est normal.

Troisième point : la charge mentale

Si vous êtes l’archétype du développeur le casque vissé sur la tête qui ne supporte pas être dérangé tant qu’il n’a pas fini sa tâche, je doute qu’une jeune startup soit faite pour vous. On peut vite être noyé par une myriade de demandes en tout genre, autour du produit mais pas que, et urgentes mais pas que. On s’implique sur nos tâches en cours et on essaie de bien les faire. Ça, ma carrière en ESN m’a appris à gérer la chose à-peu-près correctement. Mais par dessus tout ça, il y a la vie de la startup, les réflexions sur le produit, les défaites et les victoires de chacun, les changements de cap, les implications financières, les perspectives et les imprévus. Je vois ça comme un carrefour permanent, et on doit choisir le meilleur chemin : un océan de possibilités dans lequel il est possible de se noyer à tout moment.

Une autre pression permanente est celle de la réussite. Vous êtes peu nombreux, pressés, et vous devez sortir un produit de qualité. Vous savez que ces trois ingrédients ne font jamais bon ménage. Pouvoir mettre en production n’importe quand ne veut pas dire proder n’importe quoi : personne d’autre que vous ne sera là pour réparer une bêtise à 2 heures du matin si toute l’infra tombe. Vos actions ont un impact sur vos clients, mais aussi sur vos collègues. C’est un point totalement sous estimé par tout le monde, jusqu’au jour où rien ne se passe comme prévu.

Mais alors comment gérer tout ça ? On m’aurait menti, c’est tout nul la startup ?

Cet article n’est pas un article contre les startups, c’est une mise en garde. Je n’ai jamais entendu parler d’une réussite incroyable en startup où le chemin a été tout tracé, sans que les équipes n’aient douté, ou galéré à un moment.

Lorsque Damien Cavaillès nous demande l’ingrédient du bonheur, je réponds « avoir un travail où on peut avoir de l’impact », et je le pense toujours. Être confronté tous les jours à un océan de possibilités, c’est difficile, mais c’est aussi la chance de faire de vrais choix, pour le meilleur ou pour le pire.

Quelques conseils, pour ce que ça vaut :

  • Prenez soin les uns des autres. La charge mentale n’est pas une invention, ça peut être vraiment difficile. Je pense qu’un élément de toxicité, c’est de penser que la personne à côté de vous peut tout encaisser.
  • On foire ensemble, on réussit ensemble. Autonomisez les équipes, ne cherchez pas à tout contrôler. Quand tout le monde est dans son rôle et se sent libre de ses choix, la personne avancera sans contrainte et sera plus efficace. Et puis si vous êtes son manager, cela vous déchargera d’un poids. L’échec ne sera pas son échec, et la réussite ne sera pas la votre. On vit l’aventure ensemble. L’équilibre est à trouver. En tant que CTO, je cherche à distiller la bonne quantité d’information pour rendre les équipes autonomes sans pour autant les surcharger mentalement. Exercice de funambule.
  • Identifiez bien les rôles de chacun. Pour que le point précédent réussisse, il me paraît important que chacun sache exactement quelle est sa place dans l’entreprise. Ne nous marchons pas sur les pieds…

Conclusion

J’adore les gens avec qui je bosse, j’adore mon job. En 2021, en tant que développeur, nous avons le luxe de pouvoir choisir dans quel contexte travailler. Une ESN n’est pas un mauvais choix, une grosse entreprise non plus, tout comme la startup. C’est juste différent, et il est important d’avoir toutes les clés en main pour choisir.

Il reste une dernière catégorie, l’entreprise de taille moyenne (50+) avec une belle équipe technique. Sur le papier, j’ai l’impression que cette typologie apporte une certaine stabilité dans l’équipe tout en donnant les moyens d’agir à son échelle. Prochaine étape pour Karnott?

L.B.

CTO chez Karnott, une 3ème année dont je me souviendrai

Tous les ans, je fais un petit article résumant mon expérience chez Karnott, année après année. En toute logique j’aurais du rédiger mon article cet été, mais avec ce premier semestre si éprouvant, je n’ai pas eu le courage de mettre tout ça par écrit.

Dernier bilan: septembre 2019. Nous avions créé un début de plateforme technique (qui s’est avéré plutôt payant), mais nous nous posions beaucoup de questions autour de la création produit, de la cible cliente, de la complexité applicative, et un poste de Product Owner / Product Manager était ouvert pour nous aider. La bonne nouvelle, c’est que nous avons trouvé la bonne personne (Coucou Sarah!). La mauvaise, c’est qu’elle est arrivée début 2020, et pour un rôle aussi transverse, elle aurait pu être plus chanceuse sans un violent confinement et une situation économique proche du flou total.

Concrètement, dans une startup de moins de 5 ans, comment gérer une situation comme ce que nous avons vécu cette année ?

Début 2020, nous avions de belles ambitions en terme d’investissement. Je m’imaginais déjà avec une équipe incroyable de plusieurs dizaines de personnes dans tous les domaines hype, un pôle R&D à la pointe, et des claviers mécaniques pour tout le monde (ou pas 🤓 ). Mais voilà, lors de cette soirée si marquante de Mars 2020, après ce discours très dur du président, tout s’arrête, et tout le monde se regarde en chien de faïence.
Très vite, nos deux fondateurs prennent une décision capitale : il faut réduire la voilure. On doit dépenser le moins possible, ou tout du moins le plus raisonnablement possible, ne sachant pas de quoi demain sera fait.

Il est l’or ! L’or de se réveiller !

La suite leur aura clairement donné raison, c’était la bonne chose à faire au bon moment.

Le mot d’ordre pour toute l’entreprise : serrons les dents ensemble, et soyons malin.

Je ne parlerai pas de stratégie commerciale, mais en résumé, nous avons tout fait pour sortir de nouveaux produits rapidement, nous ouvrant d’autres marchés qui n’étaient pas forcément prévus initialement. Mais encore faut-il être en capacité de sortir de nouveaux produits, n’est-ce pas? Alors, quels ont été les faits marquants ?

Le télétravail

Vous l’avez tous plus ou moins vécu : se retrouver du jour au lendemain à devoir travailler de chez soi, sans l’équipement adéquat mais avec les enfants sur les genoux! J’ai personnellement de la chance habitant une maison avec un endroit où pouvoir m’isoler. De toute façon, travailler avec un enfant dans les parages, c’est vraiment impossible! J’ai très vite cherché à m’équiper d’un micro pratique, d’une Webcam (malgré l’incroyable pénurie), et dernièrement d’un vrai fauteuil. Double chance pour nous, toute l’équipe pouvait travailler dans de bonnes conditions. Nous avons juste réquisitionné nos écrans du bureau, et voilà.

Le chat, cet assistant indispensable au télétravail. Il a même sa propre chaine twitch !

Et maintenant, nos outils :
Discord est devenu un élément central de l’équipe. Ce que nous apprécions, c’est le fait de pouvoir rester dans un canal, et si quelqu’un veut venir discuter, il peut. On est un peu comme dans un bureau virtuel, sans avoir à payer le prix démesuré de Sococo.
Google Meet pour les réunions avec quelqu’un d’extérieur à l’entreprise, ou avec caméra / partage d’écran. Même en payant, j’ai toujours trouvé la qualité de Discord en retrait pour vraiment faire du partage d’écran de qualité.
Metroretro est un outil génial pour faire ses rétrospectives d’équipe en remote. C’est simple, intuitif et ludique.
VSCode Live Share que nous avons utilisé plusieurs fois pour faire du pair programming. Etant le seul à utiliser IntelliJ pour le backend dans l’équipe, je n’ai malheureusement pas pu expérimenter leur nouveau plugin autant que je l’aurais souhaité.

Pas mal d’entreprises ont fait preuve de solidarité et ont partagé leurs retours d’expérience tout au long de l’année. On remerciera par exemple Zenika qui a maintenu à jour de précieuses ressources.

Même pendant le déconfinement, nous avons fait le choix fort de continuer en télétravail. Nous y avons trouvé plusieurs avantages inattendus pour l’équipe et l’entreprise.
En premier lieu, nous avons découvert à nos dépens à quel point nous manquions de rituels d’entreprise planifiés et nous avons tâchés d’y remédier. Oui les discussions autour d’une machine à café, c’est chouette et il s’y dit souvent beaucoup de choses, mais ça a l’inconvénient d’être impromptu et « éphémère ». Dorénavant, chaque pôle (Technique, CSM, Sales…) se parlent et échangent de façon ritualisée toutes les semaines.
Nous avons aussi compris qu’une culture de la documentation, dans une entreprise, ne s’improvise pas. Toutes ces discussions informelles méritaient d’être tracées, des comptes rendus rédigés. Ce serait mentir de dire que ce point est complètement résolu, mais nous faisons de notre mieux. Entre autres choses, le concept d’ADR (Architecture Decision Record) m’intrigue et m’attire, mais je reste circonspect sur la bonne façon de l’implémenter (où ? comment ?).

Une difficulté liée au télétravail, c’est la perte d’unité entre les membres de l’entreprise. Autant l’équipe tech se parle tous les jours, autant les autres membres du bureau nous manquent. Comment garder un esprit d’entreprise au delà de son équipe ? Nous avons mis en place des visios journalières pour discuter et échanger, mais il manque quelque chose. C’est clairement un point à améliorer…

Malgré tout cela, je prends le pari de continuer sur ce chemin. Je suis d’ailleurs ravi de voir l’équipe tech grandir en 2021 avec des recrutements déjà bouclés, dont un non Lillois !

Le rôle de CTO dans ce contexte

Cette année, j’ai découvert la communauté Tech Rocks (dont je conseille chaudement le podcast) et j’ai accepté quelque chose de fondamental : le métier de tech leader, ou de CTO, est quelque chose qui dépend profondément du contexte dans lequel vous évoluez. Attention, je n’ai pas du tout la prétention d’avoir le même métier que le CTO de Criteo, Leboncoin ou même des entreprises bien plus modestes.

Quand on démarre une startup, on est avant tout un développeur à tout faire. Et puis on recrute, on devient un peu manager. Et puis l’entreprise grossit, on devient ambassadeur du produit auprès des autres pôles, on défend nos choix, on trouve des compromis. Un métier de diplomate en quelque sorte, où on défend l’équipe technique, tout en cherchant le bénéfice de tous.

Alors dans ce contexte, il a fallu se battre pour que l’équipe ait toutes les cartes en main pour produire de la valeur malgré la situation. Et tout le monde a joué le jeu (merci mille fois) j’ai la chance d’être hyper bien entouré. L’un des changements opéré, c’est d’avoir proposé en tant que manager des entretiens individuels à tout le monde de façon plus régulière. Nous ne le faisions pas, et je pense qu’avec la distanciation c’est devenu indispensable. C’est un chouette moment d’échange.

Il y a beaucoup de points que je souhaite améliorer pour 2021 dans mon rôle de CTO :
– Donner une meilleure visibilité dans le temps sur ce que nous produisons et allons sortir, c’est indispensable, malgré ma profonde réticence. Dans un environnement mouvant comme une startup, avec une quantité de tâches en parallèles où les devs doivent aider (support / facturation / marketing…), nous avons du mal à connaître à l’avance le temps dédié au développement produit. Comment estimer quoi que ce soit dans ces conditions ? Nous devrons trouver des solutions.
– Mieux structurer l’emploi du temps de chacun pour donner une véritable place à la R&D. Sans innovation point de salut.
– L’agriculture met un point d’honneur à apporter une traçabilité bien documentée à son travail, je dois m’en inspirer.

Et d’un point de vue perso ?

Quoi qu’il se passe en 2021, on peut se douter 2020 aura été une année charnière pour tous. Ceux qui me connaissent savent que je ne suis pas adepte d’un positivisme à outrance, mais j’ai quand même essayé de tirer quelque chose de cette année.

Tout d’abord, j’ai pris soin de moi. Finie la junk food d’Euratechnologies ! (Adieu Pick it up et les food trucks!). Quitte à être chez moi, et avoir une douche à disposition, j’ai décidé de faire du footing à mon rythme de sportif du dimanche, et de manger plus sainement. Le bilan ?
Plus de 600 km parcours en footing depuis Mars, et 15 Kgs perdus. J’en suis plutôt fier.

Faites du footing, 1km autour de chez vous, moins de 20minutes !
Des hauts et des bas, mais la tendance est là…

Mais c’était aussi l’occasion de passer du temps avec ma fille de 3 ans comme jamais, de la voir progresser tous les jours et de se nourrir de son innocence. Pour elle, rien d’anormal à ce que nous avons vécu, et ça faisait franchement du bien au moral.

Qui a dit que c’était un poids sur les épaules ?

Cela peut paraitre aussi plus anecdotique, mais j’en ai profité pour me désintoxiquer de Twitter ou des réseaux sociaux en général. Nous pourrions beaucoup discuter de ce sujet, mais je suis maintenant persuadé que ce lieu d’échange n’a malheureusement plus grand chose à apporter au débat public.

Conclusion

J’écris ces mots le 21 décembre après une année délirante. Chez Karnott, ce sont des milliers de balises vendus, plus de 10 Millions de kms parcourus cette année par nos clients et plus de 2 Millions d’Hectares travaillés. Beaucoup de discussions formelles et informelles, des visios qui foirent, des soucis d’internet, des rigolades et quelques moments très difficiles. Ce n’était pas gagné d’avance…
Alors pas de longue conclusion, juste un petit conseil : Sachez vous adapter, ensemble.

Prenez soin de vous et de vos proches !
A l’an prochain,
LB

L’aventure Karnott, 2 ans déjà !

L’an dernier, j’avais déjà écrit un premier article racontant mes 12 premiers mois chez Karnott. Cette année, je voulais réitérer l’expérience, histoire de faire le point sur ce qui a été accompli, nos réussites et nos échecs. J’ai beaucoup cogité, ne sachant par où commencer, et je suis tombé sur ce tweet :

L’article pointé apparait comme une évidence aujourd’hui, mais ça ne l’était pas il y a un an.

Remise dans le contexte

Juin 2018. Equipe constituée de 3 développeurs, dont moi. Nous avions commencé à prendre le virage de « la data », ce qui voulait dire être capable de la stocker, la traiter, la partager. Autant dire que les 3 sujets sont très propices à l’over-engineering. En août et septembre 2018, nous nous sommes renforcés avec 2 personnes de plus, expérimentées. Plutôt Backend et Devops, avec l’objectif de sécuriser notre plateforme.

Techniquement, où en étions-nous ?
Une API redéveloppée en Golang, de l’intégration continue qui produit des JARs, du Ruby, du Go, du JS, et des scripts bash de déploiement sur des VMs plus que fragiles. Pour notre Devops, le premier chantier tombait sous le sens : rationaliser notre déploiement continu, et plus globalement, notre hébergement.

Choix technique, scalabilité et résilience…

A J+500 dans ma vie de CTO chez Karnott, Il était temps de faire l’un de ces fameux choix critique qui impacterait notre façon de travailler, mais aussi notre SRE, le cout de notre infra (et donc le modèle économique de l’entreprise), et qui restera surement plusieurs années : passer sous Kubernetes et Google Cloud Platform.

J’entends d’ici les critiques classiques : « c’est pour la hype, vous n’en n’aviez pas vraiment besoin, vous avez introduit plus de problèmes que vous en avez résolu… ». Reprenons le cahier des charges que nous nous étions fixés :

  • Avoir un DSL décrivant nos services et notre infrastructure (même si bon sang, le YAML…)
  • Uniformiser la façon dont nous déployons tous nos services
  • Gérer du 0 downtime pendant nos montées de version
  • Avoir une façon simple de monitorer et gérer la montée en charge
  • Ne pas avoir à se soucier de la captation de logs, et être capables d’en générer des métriques simples (ai-je des erreurs sur l’un de mes services ?)
  • Pouvoir profiter de services managés si besoin, et ne rien s’interdire techniquement (capacité à faire un POC rapidement dans une nouvelle techno)

Et franchement, la stack choisie a répondu à toutes nos attentes. La mise en place a été très rapide (moins d’un mois à mettre en place, avec la dockerisation de nos services), même si, avec le recul, trois éléments ont facilité la migration :

  1. La base de données n’est pas « Kubernetisée », mais gérée à côtée.
  2. Nous n’avons aucune problématique réseau compliquée, tous nos messages internes transitant à travers Google Cloud PubSub
  3. La personne de l’équipe qui a mis tout ça en place, David, avait l’expérience pour le faire

La conception produit et les interrogations

D’un point de vue technique, le reste de l’année a été consacré en grande partie à l’amélioration de notre scalabilité dans la gestion de la flotte de Karnott. Cela revient à améliorer notre capacité à stocker, transformer, visualiser la donnée, mais aussi améliorer notre gestion du support pour fournir les bons outils à l’entreprise pour diagnostiquer au plus vite le moindre soucis. Ces problématiques seront toujours un fil rouge chez Karnott, et mériteraient pas mal d’articles pour parler de la vente d’objet physique à l’échelle d’une startup… (Coucou Amaury, Guillaume et Georges !)

ça commence à avoir de la gueule non ?

Et la création produit dans tout ça ?

Revenons-en au développement de l’application Karnott, que nos clients utilisent tous les jours.
Lors de la première année, nous avons développé une application.
Lors de cette seconde année, nous avons essayé de développer la bonne application.
Mais encore ? C’est maintenant que je vous renvoie à l’article cité premier paragraphe. Nous n’insisterons jamais assez sur le fait que pour construire le bon produit, le développeur en startup doit être pragmatique, ne pas avoir peur de s’approprier le métier, et faire parfois des concessions sur la technique pour satisfaire un besoin urgent, que l’on ne comprend pas toujours, ou que nous aurions souhaité différer pour X raisons. Oui nous introduisons tous les jours de la dette et je suis persuadé qu’il est important de le faire. Finalement, nous ne faisons que caler notre modèle sur celui de la startup. Ce n’est pas de la dette, mais de l’investissement, qui nous permet d’avancer.

Mais est-ce vraiment le BON produit ?

C’est la grande question. Comment éviter la surcharge featurale ? L’empilage de fonctionnalités en espérant que cela convienne ? Cette seconde année, nous avons pris le parti de prendre un maximum d’initiatives. Concrètement, chaque développeur a travaillé main dans la main avec nos différentes équipes : Customer Success et support ( <3 ), l’équipe commerciale, l’équipe marketing, le Design, et bien entendu nos fondateurs pour garder la vision d’un produit utile et simple, profondément ancrée dans l’ADN de l’entreprise. Cela passe aussi par une réflexion UX de tous les instants. Un résultat simple implique toujours une conception compliquée.

Quelques choix forts de l’année : nous avions absolument besoin d’une présence sur les stores Android et iOs, ce qui a amené une nouvelle stack technique chez nous ( React Native). Autre exemple qui peut paraitre anecdotique, un client, ça n’aime pas le CSV. Quand on lui fait télécharger un export, c’est du format excel obligatoirement ! Nous avons aussi fait de la dataviz autour de la Geodata et expérimenté des choses rigolotes…

D3js, leaflet, de la donnée sympa, et on peut faire de belles choses !

Bilan

Le bilan de cette seconde année, c’est que nous sommes fiers du travail accompli. Maintenant pour passer un cap, et continuer à construire le bon produit avec toute la connaissance métier et client accumulée, nous savons que nous avons besoin de nous structurer différemment. Cela passe par le recrutement obligatoire d’un Product Owner / Product Manager (poste ouvert!) qui sera le pivot de l’entreprise, le carrefour entre toutes les approches clientes différentes. Mettre sur papier les persona, les obstacles et les opportunités, prioriser, analyser plus profondément les besoins et la pertinence de chacun, c’est notre limite d’aujourd’hui. Les besoins en UX sont aussi très présents. Comme je l’ai évoqué, nous attachons beaucoup d’importance à la simplicité du produit. Cela passera aussi par le recrutement d’un UX à temps plein.

J’en profite pour mettre un petit lien vers notre page WelcomeToTheJungle, cette page donne un bon aperçu de nos différents corps de métier, et de la bonne humeur générale 🙂

Un dernier mot pour les développeurs qui auront travaillé chez Karnott cette année. François, Georges, David, Guillaume, Paul et Amaury. Développeur en startup, ce n’est pas jouer au ping pong et rigoler toute la journée… Cette année, il y avait de la solidarité, de l’envie, de la compétence et c’était vraiment chouette. Merci à eux.

A l’an prochain !
LB.

Postgis, GeoJSON et approximations

Chez Karnott, nous usons et abusons de Postgis, cette extension PostgreSQL qui permet de stocker de nouveaux types géographiques et ajoute beaucoup de fonctions bien pratiques pour requêter en SQL dessus.

Pour bien comprendre, rien de mieux que leur exemple sur leur page d’accueil :

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

On comprend tout de suite qu’une ville a une entité géométrique geom, qu’un superhero a une position, et qu’il est possible de requêter tous les superhero de Gotham.

L’une de nos dernières fonctionnalités avec Postgis, c’est d’avoir importé l’intégralité du parcellaire français (anonymisé) pour faciliter la vie de nos agriculteurs lors de la saisie de leur parcellaire chez Karnott. Ils n’ont plus qu’à faire clic clic dans l’interface, les parcelles étant déjà dessinées pour eux.

Mais côté technique, comment cela se déroule ? Comment représenter une parcelle agricole à travers une API ? Il y a beaucoup de formats et de standards pour représenter des polygones. Par homogénéité avec le reste de notre API, nous avons naturellement choisi de représenter tous nos objets géographiques en GeoJSON (RFC 7946) . Et pour cela, Postgis est plus que pratique !

SELECT ST_AsGeoJSON(field.geom) from field limit 1;

Par défaut, nous allons avoir quelque chose du genre :

{
    "coordinates": [
        [
            [
                0.584523334321845,
                42.9562400255637
            ],
            [
                0.585194166712806,
                42.9565556385987
            ],
            [
                0.586094811603247,
                42.9566130759021
            ],
            [
                0.586148521684631,
                42.9564425054839
            ],
            [
                0.584523334321845,
                42.9562400255637
            ]
        ]
    ],
    "type": "Polygon"
}

Vous remarquerez que les coordonnées sont fournies en Degrés Décimaux, et non en Degrés Minutes Secondes. Pourquoi pas. Cela dit, si l’API doit retourner une centaine de parcelles comme sur l’écran vu précédemment, la taille du JSON associé est trop conséquente. (Une parcelle contient rarement 4 points comme dans mon exemple, mais plutôt une 20aine!)

Se pose alors une question : Quel intéret d’avoir 15 décimales après la virgule ?

Nombre de chiffres après la virgule Equivalent en mètres
0 111.32 km
1 11.132 km
2 1.1132 km
3 111.32 m
4 11.132 m
5 1.1132 m
6 111.32 mm
7 11.132 mm
8 1.1132 mm

8 chiffres après la virgule : 1mm. Autant dire que 15 chiffres, ça n’a aucun sens!

Heureusement, Postgis vient encore à la rescousse. Pour 6 décimales, il suffit de demander…

SELECT ST_AsGeoJSON(field.geom,6) from field limit 1;
=>
{
    "coordinates": [
        [
            [
                0.584523,
                42.956240
            ],
            [
                0.585194,
                42.956555
            ],
            [
                0.586094,
                42.956613
            ],
            [
                0.586148,
                42.956442
            ],
            [
                0.584523,
                42.956240
            ]
        ]
    ],
    "type": "Polygon"
}

 

Et voilà une API qui a divisé sa taille par 2!

En Conclusion

Postgis est vraiment un outil puissant et pratique. En contrepartie, Postgis embarque avec lui toute la complexité du monde de la GeoData, avec son système de projection, ses transformations et ses approximations. Si nous avions un retour d’expérience à faire, c’est de bien lire la documentation de chaque fonction, et de ne jamais se fier aux valeurs par défaut.