Méthodologies comparées du développeur et du recruteur

Ce qu’on amasse au cours des expériences professionnelles, ce n’est pas une masse de connaissances prêtes à l’emploi, mais plutôt une façon de penser.

Par exemple, en voulant faire quelque chose de secretly fancy de l’export XML de mes bookmarks yoolink, je me suis retrouvé à devoir transformer la date en datetime python. Au lieu de n’avoir qu’à aller chercher dans un puits sans fond de connaissances (sûrement difficile à maintenir avec le temps et les nouvelles technologies) à propos du format de cette date et sur la manière de la parser, voici ce que j’ai fait :

  1. à tout hasard, date --help, parce qu’il me semble avoir vu ce format dans ce coin là
  2. tiens, essayons date -R pour rfc822
  3. c’est le bon format, et pydoc -k rfc822 mentionne le module rfc822
  4. pydoc rfc822 parle de parsedate qui renvoie un tuple
  5. vicroty dans le code

Au total, 30 secondes, et je peux oublier de suite pour faire place à des choses plus importantes. Il est quand-même plus important de savoir comment trouver la réponse que d’avoir pensé à l’apprendre par coeur (j’espère qu’on enseigne toujours ça à l’école). Ça me fait doucement sourire quand je pense à l’anecdote suivante.

Mon but n’étant pas de faire de la diffamation, l’entreprise mentionnée ci-après (et son boss) sortent tout droit de mon imagination et sont fictifs, les noms, lieu et domaine d’activité ayant été volontairement floutés. Toute ressemblance avec des personnes morales ou physiques existantes (autres que moi-même) serait purement fortuite. Je préfère préciser, hein.

Je cherchais du boulot en fin d’année dernière et via un cabinet de recrutement je me suis retrouvé à passer un entretien dans une boite (cotée en bourse) dans un secteur parfois “limite” de l’informatique (ça ne m’interesse absolument pas mais le cabinet de recrutement a beaucoup insisté sur le côté très technique du poste, tellement technique qu’ils ont une équipe dans la Sillicon Valley). J’ai appris également par la suite qu’ils avaient fait blacklister certains de leurs clients de l’indexation google, parce que la qualité de leur prestation était plutôt du style minable. Presque trop LOL pour être vrai.

Le boss (que j’appellerai Brian car son vrai prénom est Georges), n’ayant même pas pris la peine de regarder mon CV ni vraiment de regarder mon nom avant de me recevoir, commence l’entretien en me montrant mon blog et en me demandant « c’est votre site ? » (bravo il sait utiliser google). « Heu, oui, mais c’est un site perso et ça n’a pas vraiment de rapport avec nos secteurs d’activité ». Le type continue à regarder ce blog (je sais bien que c’est le plus beau et interessant du monde, mais en entretien d’embauche…). C’était peut-être une de ces techniques à la con pour cerner des aspects insoupçonnables de ma personnalité, qui sait.

Aussitôt après, avant de parler du poste ou de mon profil, et alors que la question c’est plutôt combien je veux, il me demande combien je suis payé. Je lui réponds (et c’est ni mirobolant ni folichon), ses sourcils grimpent au plafond et tout ce qu’il trouve à me dire c’est « heu, et vous les valez ? ». Evidemment, je réponds que je pense que oui. « Pourquoi vous cherchez du travail ? ». « On m’a prévenu que vu l’état des finances, il y’avait des chances de licenciement économique, donc je prends les devants ». De nouveau les sourcils au plafond, « Ah tiens, et pourquoi ils ont fait ça ? ». Bah écoute connard, peut-être parce qu’ils sont plus humains que toi ? Bon en fait j’ai répondu « je trouve ça bien de leur part ». Apparemment lui non — je sens que j’ai beaucoup moins envie de bosser pour eux tout d’un coup.

La personne technique arrive et me pose des questions (après avoir demandé la permission de me tutoyer, parce que c’est tellement plus sympa). « Et vous savez faire ci ? », « et vous savez faire ça ? », et [... adlib]. Un peu inhabituel, mais pourquoi pas. J’avoue que j’ai expliqué brièvement mon parcours, mais j’ai un peu peiné et perdu confiance en moi car aucun des deux ne pannait quoi que ce soit. Enfin vient le coup de grâce : les QCM sur papier. Ruby, mysql, java, html, css, javascript. Pour être honnête j’ai répondu au hasard à beaucoup de questions, surtout à celles qui portaient sur les constructions les plus débiles et les plus ambigües qu’on puisse écrire en ruby. C’est exactement aux antipodes de ma façon de penser et ces choses-là ne devraient pas avoir leur place en milieu professionnel.

Pour en revenir au sujet initial, de deux choses l’une. S’ils veulent savoir si le candidat est efficace, autant lui présenter un problème sur un ordinateur avec tous les outils dont disposent les employés. S’ils veulent savoir s’il est intelligent, ou peut résoudre un rubikscube dans sa tête (et c’est vraiment à ça que ressemblaient les morceaux de ruby) ou s’il a une bonne mémoire, bah autant lui faire passer des tests de QI et mémoire sur nintendo DS.

Twitter … ou pas

Ça y est, j’ai définitivement supprimé mon compte twitter. Ça ne veut pas dire que je n’utiliserai plus twitter pour un usage précis comme donner des infos sur un projet dans lequel je suis impliqué, ou suivre des comptes particuliers (comme un RSS++), mais Twitter c’est fini pour moi en tant que réseau social. Ça va sûrement me manquer un peu dans le paysage internet (quoique pour “suivre” l’activité de ses amis, je trouve facebook plutôt propre maintenant quand on filtre les jeux et autres quizz).

C’est bien dommage, j’aimais bien le format 140 caractères, le fait de pouvoir suivre des amis et des “marques”, et l’accès depuis n’importe où et n’importe quelle application. Les trending topics, c’est une bonne idée aussi. J’ai adoré ce qu’ont fait certains avec l’api de recherche en temps réel. Et c’est tellement rassurant, quand flickr ne répond pas, d’aller sur Twitter et constater à coup de 250 tweets par minute qu’on n’est pas tout seul avec le problème. Ayant eu un compte depuis début 2007, j’ai bien aimé l’évolution de Twitter.

Voici dans le désordre (mélange de la politique “à l’aveugle” de Twitter et de ce qu’est devenue la communauté) ce qui m’a décidé à en finir.

Mon compte (vieux de 2 ans, 700+ tweets, tous légitimes) suspendu pendant 3 mois pour “activité suspicieuse” sans aucune explication.

Strictement aucune nouvelle des tickets que j’ai ouverts. Je veux bien qu’ils soient sous-staffés pour gérer au cas par cas des millions d’utilisateurs, mais rien en 3 mois ?

Les Trending Topics blindés de spammeurs (c’est bien la peine d’utiliser Twitter correctement pour se retrouver dégât collatéral, du coup).

Après ouverture d’un nouveau compte, celui-ci est filtré des parties publiques du site et de l’api (il y’a une procédure qui est censée corriger le problème, en envoyant un direct message à quelqu’un du staff, mais n’a rien donné).

Je trouve ma timeline “défigurée” par les retweets (paramétrable je sais, mais c’est dommage d’en arriver là) : c’est comme si on nous forçait à suivre des gens qui à la base ne nous interessaient pas, et le fait de les intégrer visuellement à la timeline n’arrange pas le sentiment d’agression. Les RT sont même parfois devenus des gratifications, juste pour faire mousser quelqu’un, quand aucun des followers ne sera interessé tellement c’est loin des sujets habituels — je n’en fais pas une généralité mais parfois c’est agaçant.

Les Follow Friday : des listes de pseudos à suivre, souvent sans aucune explication, ça montre bien l’absurdité du “donnant-donnant” et du lèche-bottisme ambiant. Qu’on dise une fois par semaine qu’on aime bien suivre telle personne en disant pourquoi, c’est bien. Mais quand ça prend la forme “#ff @machin @truc @chose [... jusqu'à 140]” puis à la fin de la journée “merci pour vos #ff”, ben heu … comment dire … c’était très intéressant, merci. Ce qui nous amène au point suivant.

De nos jours de plus en plus de monde est sur Twitter par intérêt. Non pas parce que, comme les premiers utilisateurs, ils pensent que c’est intéressant de s’exprimer en messages de 140 caractères, mais plutôt parce que bon, il faut être sur Twitter pour être vu. La visibilité est devenue une fin en soi, dommage. Ceux qui disaient hier que Twitter “c’est ridicule et ça ne sert à rien” collectionnent aujourd’hui les followers et y font leur autopromo. D’un côté c’est bon pour Twitter, qui pourra en faire des revenus. D’un autre côté, ça n’en fait rien de plus qu’une énorme plateforme publicitaire à toutes les échelles : de l’individu qui cherche à être “reconnu” dans son métier à l’entreprise qui en fait un canal de vente comme un autre. Avec, perdus au milieu de tout ça, ceux qui n’ont rien à vendre et qui savaient déjà acheter et “reconnaître” avant Twitter.

Bref c’est, comme dirait l’autre, not fun anymore.

Moleskine ou le sens du service

Je suis assez impressionné par la finition du moleskine qu’on vient de m’offrir. Bien pensé, solide, discret, et tout. La plus belle surprise, cependant, se trouve dans le petit carnet qui l’accompagne. On peut y lire ceci :

Le numéro d’identification de votre carnet se trouve dans la pochette à l’intérieur. Veuillez le conserver. Chaque carnet est fait à la main et a été soigneusement contrôlé pour sa qualité. Si, malgré tous nos efforts, nous n’avons pas remarqué un défaut de quelque sorte que ce soit, nous vous demandons de nous le communiquer. Visitez www.moleskine.com/quality, et envoyez une photo numérique qui montre le problème que vous avez rencontré.

Voici un exemple de service après vente moderne et non dissuasif. La quantité de formalités à accomplir pour accéder au service après vente de certains produits “bon marché” est parfois tellement ridiculement importante qu’il devient évident qu’elles ne sont que dissuasives. Et bien ici, ça n’est pas le cas semble t’il. J’imagine que c’est directement lié au fait que le carnet soit d’excellente facture — je n’ai rien trouvé comme «défaut de quelque sorte que ce soit» :) .

PYTHON + WSGI + GLIB + TWISTED F/T/W !

WSGI, avec le recul, c’était vraiment une bonne idée.

Ce week-end, après avoir vu l’application Remote d’apple sur iPhone, je me suis dit que je voulais la même chose pour contrôler la lecture de films/musique sur ma tv via mon pc. Vu que mon téléphone actuel est un iphone, la voie la moins pénible est de faire une application web.

Autre prérequis, ce serait bien de se resservir du code fomenté pendant de nombreuses heures de mon temps libre : une espèce d’explorateur de système de fichiers dédié aux vidéos, et optimisé pour utilisation avec les touches haut+bas+return. L’extraction et la persistance des métadonnées se fait via un processus helper qu’on contacte via D-BUS (comme ça si le fichier vidéo provoque un plantage, l’application GTK reste vivante, et reste toujours aussi interactive que possible).

L’application (mediabrowser est son nom) est écrite en pygtk et utilise les bindings glib+D-BUS et gstreamer pour python. Pour recevoir des réponses asynchrones sans réécrire les bindings, il s’imposait donc pour l’application web (appelons la « remote » pour être original) de tourner dans un environnement qui utilise la mainloop glib.

Ca commence à faire des prérequis assez exotiques, mais il se trouve justement que Twisted permet d’installer comme boucle d’évènements un glib2 reactor. Parfait !

Me voilà donc en train d’expérimenter l’embarcation d’un serveur web dans mon application GTK2 et/ou l’écriture d’un programme externe qui réutilise tout le code de parcours de système de fichiers, d’extraction de métadonnées, etc ! Commencer un projet avec 75% du boulot déjà faits et directement réutilisables, c’est bien commencer :)

Maintenant, phase d’expérimentation sur le framework http à embarquer. Les combinaisons testées sont :

  • Web.py (out car besoin de glib.MainLoop)
  • Twisted + web.py (sympa mais un peu limité)
  • Twisted + tout à la main (heu, sympa mais pas vraiment le temps de réinventer tout ça)
  • Twisted + dispatch via des resource.Resource Twisted (sympa mais ça a fait beaucoup de code à écrire à mon goût)
  • Twisted + cherrypy (la version retenue et actuelle)
  • Twisted + django (la version peut-être future si la version cherrypy devient difficile à maintenir avec plein de nouvelles fonctionnalités)

Et j’aurais pu en tester encore d’autres, dommage que le week-end ne dure pas 5 jours. Le tout sans modifier l’application conteneur (du tout). C’était bluffant à quel point le script Twistd (qui prend en argument un objet callable wsgi) n’a pas bougé … merci wsgi  de m’avoir fait gagner de précieuses heures de temps libres, nan vraiment, merci.

On voit que les gens derrière tout ça n’aiment pas s’agiter dans le vide : N’importe quel framework/application web adhérant à la spec wsgi (et c’est vraiment facile) peut être embarqué dans n’importe quel conteneur wsgi (et Apache en fait partie). Certes c’est loin des paillettes et des jolies couleurs de certains écosystèmes à la mode, mais c’est ça qui rend plus facile la vie d’un développeur, pas de pouvoir écrire 5.days.from_now. Et wsgi n’est finalement qu’un exemple parmi d’autres de la manière dont fonctionne la communauté Python : si on doit gaspiller de l’énergie à faire plusieurs fois la même chose, autant que ce soit réutilisable.

Retour à « Remote ». Comme le contrôle à distance fonctionnouille à peu près, les quelques heures que j’ai à y consacrer cette semaine seront sûrement dédiées au transcodage à la volée en version mobile via gstreamer (un petit épisode de HIMYM en attendant le train ? (un hotspot wifi orange et un vpn devraient suffire)).

Promis, le code de tout ça sera bientôt dispo ! (oui, ça fait bien 2 ans que je promets ça pour Doohickey mais ne désesperons pas bande de mécréants !).