11
Feb 12

Élégance de code

Un jour, en entretien d’embauche, juste avant de me poser des devinettes destinées à évaluer ma capacité à raisonner out of the box (il s’est avéré que sur les quatre devinettes, je connaissais les quatre et que deux d’entre elles ont eu droit à un post dans ces colonnes, on repassera donc pour le out of the box) on m’a demandé si, pour moi, un code pouvait être “beau”. J’ai été surpris qu’on me pose cette question. C’est une question que j’aurais adoré poser moi-même en entretien, mais je n’ai jamais eu l’occasion d’avoir face à moi quiconque méritait qu’on la lui pose. J’étais flatté donc de la recevoir.

J’ai répondu que oui, un programme pouvait être beau. Puis on m’a demandé pourquoi. Je me suis un peu emmêlé les pinceaux, parce que j’étais stressé d’une part (j’avais envie du poste, c’était une boîte sympa)(spoiler : je l’ai pas eu) et parce que la beauté (je préfère le mot élégance dans ce cas là) est une notion assez fugitive pour que sa définition soit malaisée si l’on est pris au dépourvu.

L’idée la plus importante dans ce qui définit l’élégance d’un morceau de code selon moi, tient dans l’organisation de son exécution. Un morceau de code beau/élégant est sa propre documentation et si une notion purement technique vient à être nécessaire pour le bon déroulement des opérations, cette technicité est clairement isolée et peut tout à fait ne pas être comprise en détail par le développeur suivant sans nuire à la compréhension globale.
Vient à cela s’ajouter une autre notion mais qui est plus large et qui s’appliquer à tout un tas de domaines, notament artistique. C’est l’idée que l’œuvre déclarée belle dépasse (ne serait-ce que d’un chouïa) l’intention du créateur. Quand Conway développe l’algo du jeu de la vie, il n’a aucune idée qu’au-delà des règles simples de computation qu’il donne, on va pouvoir en faire ça :

(ce gif me fascine)

Je termine ma définition floue par un « Et pour vous ? » et le mec me répond « Pour moi, c’est beaucoup plus simple, il faut que le programme soit clair et fonctionne ». Je me redresse sur ma chaise  : « Enfin on ne peut tout de même pas dire que

void function void_function(){}

est une belle fonction si ? Là, on s’ennuie ! » Il a sourit puis a dit « Passons aux devinettes logiques pour voir comment vous réfléchissez face à des problèmes nouveaux. »

04
Jan 12

Re-Captcha et Survie de l’Humanité

Aujourd’hui les enfants, je vais vous parler de Re-Captcha.

Re-Captcha, c’est un exemple de captcha. Une captcha, c’est un “Completely Automated Public Turing test to tell Computers and Humans Apart” ou, en français de part nos contrées francophone un “Test de Turing Complètement Automatisé pour distinguer les Ordinateurs des Humains” (TCAOH c’est moche, on est d’accord). Et puisque je vois vos mirettes d’enfant se rétrécir d’interrogation face à la signification de Test de Turing, je vais vous rassurer de suite, ça ne veut rien dire de plus que “test pour distinguer un ordinateur d’un humain”. Il porte le nom de Turing, un britannique homosexuel qui aimait Blanche-Neige et faire du vélo (quand il n’était pas en train de construire des machines à Bletchley Park pour casser les codes secrets de ces saletés de nazis).

Là, je sens que vous réclamez une image.

C’est bon, ça vous a calmé ? On reprend.

Actuellement, les captchas, c’est notre seul avantage dans la vie par rapport aux ordinateurs, aussi puissants soient-ils. L’autre jour, on me disait « Ouais, et les sentiments, ça nous distingue pas des ordinateurs aussi ? » ce à quoi j’ai répondu « Et comment tu prouves à ton formulaire Facebook que tu as des sentiments ? ». Parce que, bah, tu peux pas. Chiant hein. Donc au lieu d’avoir des sentiments qui servent à rien, apprends à lire des captchas.

Re-captcha, c’est un système avec deux mots (cf l’image ci-dessus) piochés au hasard dans des numérisations de vieux livres. Cette numérisation de vieux livres est faite par des ordinateurs. L’ordinateur en question parcours, page après page, ligne après ligne chacun des livres qui lui est assigné et tente de faire de l’OCR (reconnaissance optique de caractères). À aucun moment l’ordinateur ne comprend ce qu’il lit, mais il sait reconnaître les lettres. Son problème, c’est qu’il ne sait les reconnaître que lorsqu’elles sont bien droites. Si vous avez un logiciel d’OCR chez vous et que vous scannez votre dernière lettre de démission en date, il lui faudra moins d’une minute pour transformer une image en texte que vous pourrez copier-coller. Par contre, si c’est une première édition des Trois Mousquetaires avec des caractères tordus sur du papier froissé, il a aucune chance. Il n’y a que les humains qui savent faire ça pour le moment.

Du coup, quand vous spammez le champs commentaire du wall de votre ex, si vous passez le re-captcha avec succès, Facebook sait que vous êtes effectivement derrière votre clavier et pas que vous avez lancé un script qui va tourner pendant que vous vaquez à d’autres occupations. Zuckerberg tient à ce que sur son site, les communications se fassent entre êtres humains.

Maintenant, pourquoi deux mots dans les Re-Captchas ? Parce qu’on l’a dit ces mots piochés dans des livres, aucun ordinateur au monde ne peut les lire. Pas même ceux de Google qui les génèrent. Par contre, pour une image d’un mot donné, un humain peut entrer en référence le vrai mot, pour vérification (et mémorisation dans la base de donnée de numérisation des vieux livres).
Mais du coup, si on a déjà les solutions de ce à quoi correspondent les mots, ça ne sert plus à rien de les proposer au public pour qu’il aide à les déchiffrer tavu, ça fait pas avancer l’œuvre culturelle de transformation de l’imprimé en numérique pour le Bien de l’Humanité.

L’astuce de Re-Captcha, donc, c’est de proposer deux mots. Un dont il connait la réponse, et un qui lui est pour le moment inconnu (ils sont dans le désordre, évidemment, sur l’image). Re-Captcha part également du principe que globalement, les humains sont des gens honnêtes et bons qui veulent l’avancement des œuvres culturelles pour le Bien de l’Humanité. Il sait également qu’ils sont pas à l’abris d’une erreur honnête. Il sait en outre que les ordinateurs sont de gros abrutis qui ne savent pas lire. Il propose donc deux mots et se comporte comme suis :
- Si l’utilisateur a reconnu le mot qu’il connait, alors il note la réponse pour l’autre mot pour plus tard et dit “ok, tu passes”.
- Si l’utilisateur n’a pas reconnu le mot qu’il connait, alors il dit “non, tu ne passes pas”.

Au bout d’un certain nombre de visiteurs, l’ordinateur constate que les gens donnent très souvent la même réponse pour le mot qu’il ne connaît pas. Quand il estime que ce nombre est suffisant, il considère que la réponse en question est la bonne pour le mot inconnu, ce mot inconnu devient donc un mot connu et peut alors être utilisé en paire avec d’autres mots inconnus.

Et ainsi de suite.

Maintenant, un loleur malhonnête (pléonasme ?) et surtout fainéant, fainéantise qui le rapproche étonnament du robot qui ne sait pas lire, peut tout à fait tricher contre le système. En effet, si il ne rentre qu’un seul mot et qu’il se trouve que c’est celui que l’ordinateur connaît, il passera sans problème. Il a une chance sur deux de réussir et si il se fait refouler, il arguera que c’est la faute du Re-Captcha, ou que c’est parce qu’il n’a pas su choisir le “mot écrit de travers” ou “celui avec le trait dans les lettres”, autant d’indices (complètement débiles) de la preuve irréfutable que ce sont ces mots là que l’ordinateur connaît déjà. Béotiens.

Oui béotiens, j’ose, parce qu’ils participent à un combat qu’ils ne comprennent pas. Ce combat, il est simple : comme je l’ai répété maintes fois depuis le début, les ordinateurs sont incapables de nous lire. Et ce système permet de les instruire. Chaque Re-Captcha correctement remplie est une brique placée dans la construction du plus grand fléau de tous les temps à venir : Skynet. Oui, le Skynet, celui qui va prendre possession de la Terre, créer des robots exterminateurs et annihiler toute présence humaine.
Pour lutter contre lui, c’est assez simple, il suffit de rentrer un second mot erroné. Ou même mieux, de se concerter pour donner systématiquement le même mauvais mot pour la même image. Alors oui, cette lutte a un prix : une fois sur deux, vous serez refoulés et cela marquera une légère pause dans la frénésie de vos insultes sur le mur de votre ex. Mais est-ce bien cher un prix pour la survie et la pérennité future du Bien de l’Humanité ?

02
Dec 11

Chapeaux

Je date le commencement de mon amour de la logique et des mathématiques lors de la seconde lecture de Jeux de Chapeau de Mitsumasa Anno. Il s’agit d’un petit illustré d’une trentaine de pages pour initier les enfants à la logique mathématique. Ça commence tout doucement pour culminer vers ce problème final :

Un chapelier a cinq chapeaus, trois rouges et deux blancs. Il y a trois participants : Anna, Bob et le Lecteur.
Le chapelier demande à chacun de fermer les yeux et dépose sur la tête de chacun d’eux un chapeau. Les autres sont remis dans une malle.
Anna, Bob et le Lecteur ne peuvent voir le chapeau qui est posé sur leur tête. Cependant, ils peuvent voir ce que portent les autres.

Le Lecteur, en ouvrant les yeux, constate que Anna porte un chapeau rouge et que Bob également.
Le Chapelier demande à Anna si, par la logique, elle peut deviner la couleur du chapeau qu’elle porte. Elle réféchit un instant, puis déclare que non.
Il se tourne alors vers Bob et lui pose la même question. Il se gratte le menton quelques minutes et parvient à la conclusion que non, il ne peut rien déduire.

Puis le Chapelier se tourne vers le Lecteur est lui demande de quelle couleur est son chapeau. Toi, Lecteur, peux-tu deviner de quelle couleur est ton chapeau ?

 

Jeux de Chapeaux Mitsumasa Anno

Il s’agit maintenant de réfléchir en toute logique. Le chapeau sur ma tête (je me place dans la position du Lecteur) est forcément de l’une ou l’autre des couleurs. Soit Rouge, soit Blanc.
Supposons donc qu’il est Blanc. Et reprenons la saynète du début.
Plaçons-nous du point de vue de Anna : si mon chapeau est Blanc, celui de Bob étant Rouge, alors évidemment qu’elle ne peut rien dire. Le sien peut être Blanc ou Rouge, elle n’a aucun moyen de deviner. Elle déclare donc qu’elle ne sait pas.
Viens le tour de Bob de réfléchir. Ce qu’il voit, c’est mon chapeau Blanc, et le chapeau de Anna supposé Rouge. Il sait en outre qu’elle n’a pas su répondre. Bob, se gratte le menton et fait le raisonnement suivant : Le chapeau qu’il a sur la tête est ou Blanc, ou Rouge. Il peut supposer que son chapeau est Blanc. Mais alors ! Si son chapeau est supposément blanc et que le mien l’est aussi, Anna n’aurait pas dû hésiter : le Chapelier ne possède que deux chapeaux Blancs et si ils sont sur la tête de Bob et la mienne, elle aurait dû deviner qu’elle porte un chapeau Rouge ! Or elle n’a rien dit, donc Bob peut s’exclamer qu’il porte un chapeau Rouge !
Mais voilà bien la contradiction qui apparaît : Bob, dans le cas réel, n’a pu qu’exprimer son ignorance ! C’est donc que l’hypothèse de base fondant la reconstitution de la saynète était fausse. Mon chapeau n’est pas Blanc. Et si il n’est pas Blanc, c’est qu’il est…

Rouge bien sûr !

22
Nov 11

Héritage ?

J’ai un problème récurrent de conception et je ne suis pas sûr d’avoir le vocabulaire technique pour l’exprimer, et donc pour rechercher exactement une solution sur l’internet mondial. Parce que, forcément, quelqu’un a déjà élaboré une solution sympathique pour résoudre ce problème. Problème qui est le suivant :

Je possède une collection d’objet de types différents (des Artiste, des Albums, des Livres, des Utilisateurs etc…) stockés chacun dans sa proble table de données comme il est coutume de faire.
À chacune des instances de ces objets, (Britney Spears, Stade 2, The Baroque Cycle, toto01 etc…) je veux pouvoir associer une série de commentaires  dont le format ne dépend pas de l’objet auquel il est attribué : je souhaite stocker qui a commenté, le texte de son commentaire et la date du commentaire. Et évidemment l’association.

Comme ça, c’est simple. Pour faire ça, il y a mille manières. J’en voudrais une qui soit efficace et maligne et qui réponde aux contraintes suivantes :
- Je voudrais pouvoir récupérer les n derniers commentaires, des p types tous confondus, et pour chacun toutes les infos de l’objet associé en  un nombre de requêtes ne dépendant de n qu’au plus en o(log n), et ne dépendant pas de p.
- Je voudrais pouvoir récupérer les derniers commentaires d’un objet précis en o(1) requête.
- Pareillement pour les derniers commentaires sur un type (max o(1) requête)
- Je ne souhaite pas dupliquer mes commentaires.
- En Mysql. (hahaha)

Voilà, si quelqu’un a une réponse à cette question qui me chagrine, je la prends aisément. En attendant, je vais continuer avec mes bricolages, mes UNIONs de la mort et mes duplications de commentaires.

08
Nov 11

Conscience

J’ai repris conscience du monde qui m’entoure vendredi à 8h37 quand, pour la première fois depuis des mois, probablement avant même le dernier post en date de ce blog (ça faisait tellement longtemps que je n’étais pas venu ici que j’avais oublié lequel de mes mots de passe habituels j’avais utilisé), je me suis emparé d’un 20Minutes à l’entrée du métro La Fourche.

Il y avait un article sur des intégristes catholiques protestant contre une pièce de théâtre blasphématoire. C’était quelques jours après l’incendie de Charlie Hebdo, du coup on leur demandait, à ces braves catholiques venus prier devant le théâtre après le travail et jusque tard dans la nuit (23h), ce qu’ils pensaient des caricatures de Mahomet. Dans une volonté de dramatiser l’information, c’est un jeune homme radical qui est cité et déclare que l’Islam, c’est pas son problème, lui, il est catholique et français et c’est tout ce qui l’intéresse.
Alors évidemment, et heureusement, ces gens ne représentent qu’une tout petite partie de la population, et c’est dommage qu’ils fassent tant de bruit (que ce soit en priant ou en mettant le feu) mais surtout c’est leur existence même qui m’interpelle. À quel moment, en 2011, en France, on devient intégriste religieux ? Les gens vont plus à l’école ? Que l’on croit en un être supérieur, qu’il inspire, qu’il soit un guide moral, je veux bien. Mais depuis 2000 ans maintenant, il me semble qu’on a suffisament interprété les textes sacrés pour ne plus avoir à expliquer à personne qu’il ne faut pas les prendre au pied de la lettre. Surtout qu’appliquer un texte rédigé il y a quelques millénaires aujourd’hui pose un léger problème de contexte et de temporalité.
Puis j’ai vu un sondage qui soulignait que 15% des Français étaient complètement convaincus par l’existence du mentalisme.

Et puis il y avait la Grèce, la fin de l’univers économique connu, la chute, la crise, on va tous mourir si on sauve pas la Grèce. Alors on occupe Wall Street pour que Sarkozy ne paie pas sa nuit au Martinez au prix du salaire annuel d’un développeur avec deux ans d’expérience. Et ça marche puisqu’il freeze son salaire. Et c’est ça qui est important. Et les mauvaises langues font des vannes comme quoi il a augmenté son salaire de 70% juste avant de le baisser. Parce que c’est ça qui compte. C’est de faire un bon mot et de le voir liké 18 fois et d’atteindre les 29 retweets. Pour changer le monde.

Ce matin, je me suis réveillé avec cette question en boucle dans ma tête, à laquelle je n’ai pas trouvé de réponse satisfaisante :
Imaginons que vous me fassiez vraiment confiance. Et que je me tienne à côté de ce qui est manifestement un arbre tout ce qu’il y a de plus classique. Et que je déclare, fermement et avec aplomb que ce n’est pas un arbre. Que penseriez-vous ?

Une des justification du métier de trader (au-delà du biais de réussite qui convainc les amateurs de mentalisme que c’est parce qu’ils sont très bons en probabilité que les traders gagnent autant d’argent) c’est qu’ils servent à réguler le marché. Quand c’est trop cher d’un côté, bam, on achète de l’autre, on revend et la différence va dans la poche du trader. Ça marche aussi dans l’autre sens en jouant sur la temporalité des échanges (vas-y, shorte moi). J’avais commencé une traduction d’un passage du Baroque Cycle de Stephenson où Eliza expliquait le fonctionnement de tout ça à la cour de Louis XIV. Je ne l’ai jamais terminée, mais tout ça pour dire que s’amuser avec les inégalités du marché, on fait ça depuis longtemps.
Mais alors, quelle est la légitimité du trader à s’enrichir sur le dos des hoquètements d’un Marché supposé parfait pour le reste du commun des mortels participant à l’économie ?
Une blague d’économiste connue met en scène deux économistes, l’un qui croit à la perfection du Marché, l’autre qui n’y croit pas. Ils se promènent dans la rue et tombent sur un billet de 50€. Le non-croyant dit “oh, un billet de 50€”, l’autre lui répond “c’est impossible, si il y en avait un, quelqu’un l’aurait déjà ramassé”. Le non-croyant le ramasse alors et le fourre dans son porte-feuille. Le croyant pointe le sol du doigt : “tu vois, il n’y a rien”.
Au-delà d’illustrer la possibilité d’être divergent sur l’existence ou non d’un Marché parfait, posons la question la plus prosaïque possible en rapport avec cette anecdote : De quel droit le mec s’empare des 50€ pour les mettre dans son portefeuille ?!. Je ne sais pas où, dans la vraie vie, il faudrait rapporter les billets que l’on trouve dans la rue. À la police, à la Banque de France, au Trésor Public, à la Caisse des Dépôts ? En tout cas, à un organe neutre qui les dissoudra dans la piscine globale de l’échange monétaire. Le mec qui a perdu son billet, bah, ok, c’est pas de chance, il avait qu’à faire attention. Mais au moins, personne n’en profite. Ou plus exactement, tout le monde en profite.

Et là, je viens de me rendre compte que je suis pour taxer les échanges financiers et nationaliser les banques d’investissement. Tu m’aurais dit ça y a une heure, j’aurais dit “euh, mais trop pas”.
Maintenant, je vais aller lire des arguments contre.

Je reviens.


Copyright © 2012 Smwhr…
Proudly powered by WordPress