lundi 24 février 2014

Les idées révolutionnaires, c'est bien. Les réalisations révolutionnaires, c'est mieux

Quand je dis que je suis dans l'informatique, j'ai souvent ce genre de réaction. "Oh de toute façon aujourd'hui, il suffit d'avoir une bonne idée, et en se faisant racheter par Google, on devient millionnaire".

Facile.

Mince alors, il me manquerait des idées pour devenir millionnaire ? Passons sur le fait que des milliers de développeurs créent des applications tout les jours, et que 1 application tout les 3 mois qui se fait racheter, c'est peu. Beaucoup de candidats et très peu d'élus.

Concentrons nous sur cette histoire d'idée. Prenons WhatsApp, application rachetée 4 milliards par Facebook. Wahou, quel splendide idée ont-ils eu ? 4 milliards ! Ça doit être une sacrée bonne idée !!

Attention, ceci est une révélation incroyable sur les fonctionnalités fantastiques et révolutionnaires de l'application WhatsApp: 


/!\   WhatsApp permet d'envoyer des messages via un mobile en passant par internet   /!\



Incroyable, Formidable, Génial, Bravo !

En fait de nouvelles idées il n'y a pas. MSN ! ICQ ! GTalk ! Même Facebook !  Des chats via le net, ça a déjà existé, mais avec un mobile, c'était compliqué.

WhatsApp a amené une interface utilisateur simple, une application qui marche, pas de pub, gratuit. Le minimum de fioritures, pour un maximum de résultat.

Ce ne sont pas les idées révolutionnaires qui font gagner de l'argent. Prenez un truc qui existe déjà, faites le mieux, et gagner vos parts de marché, c'est tout !

Titanic, film aux multiples oscars. Bateau qui coule, lutte des classes, histoire d'amour, que des thèmes hyper abordés par des centaines de films. Avatar, un Pocahontas en 3D, rien de nouveau. La trilogie Batman de Christopher Nolan, combien de film de Batman ont déjà existé ? Et pourtant, cet trilogie à rapporté des milliards de dollars aux producteurs.

Ce ne sont pas les idées qui rapporte de l'argent, les chercheurs ne croulent pas sous l'argent. La réalisation, c'est tout ce qui compte. Choisissez une technologie qui déchire, à la pointe, avec des ingénieurs géniaux, mettez le prix dans votre recrutement, prenez une application qui fonctionne avec un public mais que vous trouvez lente/lourde/pas intuitive, ou qui n'existe pas sur mobile, et faite mieux.

jeudi 23 janvier 2014

Comment fonctionnent les crypto-monnaies ?

Depuis que de nombreux sites internet acceptent des paiements en Bitcoin, et que ce dernier est devenu plus cher que l'or à l'unité, vous avez surement du entendre parlé des crypto-monnaies.

Le principe n'est pas très compliqué. Imaginez vous que votre porte monnaie ressemble à une urne transparente, les mêmes que les jours d'élections.
Maintenant imaginez un champ d'urnes. Que dis-je, plusieurs milliers d'hectares d'urnes, toutes transparentes. Chacune est numérotée pour pouvoir la retrouver. Vous avez le droit de venir poser votre propre urne dans le champ. Tout le monde voit les urnes de tout le monde, et donc aussi ce qu'il y a dedans.

Votre urne est remplie de pièces et de billets. Votre urne est fermée par un cadenas, et vous êtes le seul à posséder la clé. Par contre, n'importe qui peut y mettre de l'argent. Si vous désirez vous faire payer par quelqu'un, il suffit de lui donner le numéro de l'urne qui est à vous, et l'acheteur viendra y mettre l'argent.
Inversement, si vous désirez payer quelqu'un, il vous suffit de vous rendre à votre urne, de l'ouvrir avec votre clé, de prendre l'argent et d'aller la mettre dans l'urne du vendeur.

Par contre, tout le monde voit ce que tout le monde fait. Et oui, on a du vous dire que les crypto-monnaies c'était le mal parce que c'était 100% anonyme. Pas du tout ! L'argent est très facile à suivre d'une urne à l'autre. Pour peu que l'on découvre l'identité d'une seule personne dans le réseau par un jeu de déduction, alors on pourra en identifier du monde. Il est fort probable que la NSA aient déjà identifié quelques acheteurs du marché noir à l'époque de Silk road (site fermé par le FBI où l'on pouvait acheter de la drogue et des armes au marché noir avec des Bitcoins).

Bitcoin
Voilà pour le principe des échanges. Maintenant, passons à comment est générée cette monnaie ? C'est un peu comme du voyeurisme sur une plage naturiste. Les personnes qui veulent gagner de l'argent virtuel doivent se positionner tout en haut de la dune pour voir toutes les urnes. Et là il faut épier tout ce que tout le monde fait. On appelle ça de la validation, mais bon, c'est plutôt du voyeurisme. Bref, il faut épier les mouvements d'argent et les consigner dans un grand carnet. C'est un grand carnet où l'on retrouve tout les mouvements d'argent d'urne à urne (le carnet qui intéresse beaucoup la NSA). Ce carnet est géré par tout le monde et tout le monde y a accès.

Il n'y a par contre qu'une seule personne qui peut écrire dans le carnet toutes les 10 minutes. Cette personne écrit toutes les transactions qu'elle a vu pendant ces 10 minutes. Pour son dur labeur, cette personne gagne 50 pièces, youhou !

Comment choisit-on cette personne ? Et bien c'est la première à avoir résolu un problème informatique. Le but est de trouver une solution à un problème qui ne sert à rien, un espèce de puzzle. Tout le monde peu jouer, mais il faut avoir un gros ordinateur pour avoir une chance de gagner.

La difficulté du problème s'ajuste en temps réel pour que en moyenne il faille 10 minutes pour le résoudre. Ainsi plus il y a de joueurs, plus le problème est compliqué (plus le puzzle est grand).

On appelle ça `miner`, un peu comme nos ancêtres qui allaient creuser des puits de charbon.

Donc on donne au vainqueur 50 pièces, et toutes les transactions qu'il a écrites dans le carnet sont considérées validées, et les urnes peuvent accepter les pièces. On recommence alors un nouveau puzzle qui aura lui aussi un prix de 50 pièces.

Entre le moment où vous payez le vendeur, et le moment où le vendeur a reçu l'argent, il peut se passer plus ou moins 10 minutes, ce qui en fait un système relativement rapide par rapport à des virements bancaires qui peuvent prendre 24 ou 48 heures. C'est le principale avantage, la rapidité de transfert sans aucun besoin de banque centralisée. Comme les transactions sont vérifiées par tout le monde, et que toutes les urnes sont transparentes, il n'y a quasiment aucune chance de piratage du système. Il faudrait qu'une seule personne arrive à remporter le jeu plusieurs fois de suite pour pourrir suffisamment le grand carnet de compte et y inscrire n'importe quoi. Mais c'est peu probable vu que la plupart des joueurs sont honnêtes.

Au niveau des risques, vous pouvez perdre votre numéro d'urne, et là... dommage. Mais comme généralement votre numéro d'urne est publique, vous aurez toujours un moyen de la retrouver.

Ce qui arrive le plus souvent, c'est de perdre la clé de l'urne. C'est ce qui est arrivé James Howells qui possède une urne de 7500 pièces. Problème, sa clé était sur son disque dur, qu'il a jeté aux ordures. James Howells est donc le malheureux possesseur d'une urne qui vaut plusieurs millions d'euros, mais qu'il ne pourra jamais ouvrir (le cadenas de l'urne est du genre solide, voir très très très solide).
On peut aussi vous voler la clé de votre cadenas, et là malheureusement, aucun recours. Le voleur pourra ouvrir votre urne et prendre l'argent pour le mettre dans une autre urne. Vous pourrez toujours essayer de tracer votre argent d'urne à urne sans jamais pouvoir le récupérer ! (Essayez de demander de l'aide à la NSA !)

Dogecoin
Il existe de nombreuses autres crypto-monnaies avec de petites différences. Les 3 principales sont Bitcoin, Litecoin et Dogecoin. Par exemple, Bitcoin écrit dans le carnet toutes les 10 minutes alors que Dogecoin écrit dedans toutes les minutes.
Il faut aussi préciser qu'il ne sera pas produit plus de 21 millions de bitcoins, et 100 milliard de dogecoins; la récompense pour avoir écrit dans le carnet diminuant progressivement au fur et à mesure que la monnaie est produite, jusqu'à atteindre 0 (en l'an 2140 pour Bitcoin). Dans ce cas les mineurs seront récompensés par des frais de transaction.

Lexique de correspondance entre la vulgarisation de l'article et ce que l'on retrouve officiellement :

  • Une écriture dans le carnet de toutes les transactions en cours : block
  • Le total de toutes les écritures dans le carnet : blockchain
  • Une urne : portefeuille ou wallet
  • Le numéro d'une urne : adresse
  • La clé du cadenas d'urne : clé privée
  • Un voyeur : mineur ou nœud du réseau
  • Le puzzle à résoudre : preuve de travail ou proof of work
  • Les 50 pièces gagnées pour avoir trouvé la solution du puzzle : récompense, incentive


Références :

Vidéo de présentation :


mercredi 18 décembre 2013

Formation Qualité Logicielle

Voici un support de formation Qualité Logicielle qui aborde de nombreux points déjà abordés dans ce blog.

Dilbert by Scott Adams

Dans l'ordre, j'ai choisi de présenter :
  1. Les principales mécaniques de Refactoring, sauvagement appelé `Réusinage de code` en français
  2. Les fameux principes SOLID
  3. Un peu de programmation fonctionnelle avec une courte démonstration de LINQ (un cours entier consacré à LINQ suivra)
  4. L'analyse statique de code qui devient très à la mode, notamment grâce au changement de job d'Eric Lippert, l'un des top users de StackOverflow, ancien programmeur sur le compilateur C#, qui travail maintenant pour Coverity, éditeur d'un logiciel d'analyse statique
  5. Pour finir, de la programmation par contrat qui en est à ces débuts (façon de parler, c'est juste que ce n'est pas natif C# encore, le principe existe depuis 1985)
Cette présentation est à destination des programmeurs de tout niveaux, que ce soit pour renforcer des connaissances ou pour apprendre à mieux développer.
Pour certains points, il est nécessaire d'avoir des bases en programmation orienté objet tout de même.
La présentation est parsemée d'images et de citations qui je l'espère aide à garder la lecture agréable et pas trop universitaire.




jeudi 5 décembre 2013

Le MBTI (test de personnalité)

Les tests de personnalité, c'est un peu comme la religion. Il y a les croyants, les non-croyants, et le reste, soit 90% des gens qui n'ont pas vraiment choisi.

J'ai fait récemment le test de personnalité MBTI (Myers Briggs Type Indicator), le plus pratiqué des tests par les RHs du monde entier.

L'idée est de classer les personnes selon 4 critères : Energie, Observation, Choix et Action. Ces 4 critères sont complètement bipolaires, soit vous êtes d'un coté de la barrière, soit de l'autre.


  • Energie : soit vous êtes Extraverti : vous tirez votre énergie des personnes qui vous entoure; ou Introverti : vous tirez votre énergie de la solitude
  • Observation : soit vous êtes iNtuitifs : vous voyez les choses globalement; ou Sensitif : vous voyez les choses dans leurs détails
  • Choix : soit vous êtes logique (Thinking) : vous faites vos choix basé sur des critères précis; ou émotif (Feeling) : vous faits vos choix basé sur vos coups de cœurs
  • Action : soit vous êtes structuré (Jugment) : vous préférez les environnements bien établis et stables; ou souple (Perceiving) : vous préférez les environnements organiques, qui changent souvent.


Les axes sont donc E/I, N/S, T/F et J/P. Choisissez bien vos lettres, après on ne peut plus en changer. Enfin, la théorie du test dit qu'on est forcement catégorisé, depuis très jeune, et que quoi qu'il arrive, on conservera toujours notre personnalité de départ tout au long de notre vie (non, on ne devient pas Extraverti, ni Introverti, ou l'est ou on ne l'est pas).

ENFP - La vie est plus belle avec un sourire
Je suis tombé sur ENFP, ce qui fait de moi le Champion (c'est pas moi qui le dit c'est Wikipédia). Cela me donne une bonne raison d'être plutôt du côté croyant que non-croyant !

Ce test est utile si vous vous posez des questions sur votre rapport à votre travail notamment. Peut être que votre personnalité ne correspond pas du tout à votre rôle dans l'entreprise. Dans ce cas, ce test peut vous aider à vous réorienter sur un chemin de carrière plus compatible avec votre personnalité. Une personne de type souple aura du mal dans l'administration, et inversement, quelqu'un de structuré se sentira mal à l'aise en start-up.

Les critiques soulèvent le problème que projeter 7 milliards d'individus dans 16 cases c'est un peu gros. En effet, ce test reste une grosse approximation de la complexité de l'esprit humain. Les approximations n'ont tout de même pas empêché l'homme d'aller sur la lune, donc pourquoi ne pas tenter le coup !

Enfin, sachez que le test MBTI est un test payant, qui doit être fait par un professionnel pour le relire et en discuter avec vous avant de tirer toute conclusion et pouvoir valider votre profil. Si cependant vous êtes ruiné, sachez qu'en cherchant `mbti test` sous google, vous avez de grande chance d'en trouver quand même.

mardi 19 novembre 2013

Bientôt les soldes, réchauffez vos neurones

Vous allez dans un magasin avec un bon de réduction de -30%. Vous décidez d'acheter un article à 120€, soldé à -80%, et ô magie, les deux réductions sont cumulables.
Combien va vous coûter l'article au final, et est-il plus intéressant d'appliquer d'abord les -80% puis les -30%, ou bien l'inverse ?

Ceci nous ramène à quelques calculs de pourcentages. Commençons par la base, comment applique-t-on une réduction de -80% ?
Appliquer -80% revient à payer 20% du prix. Il faut trouver le complémentaire de 80% pour arriver à 100%. L'opération est donc 100% - 80% = 20%.


L'article coûte 120€, donc on paye 20% de 120€. Cela revient à l'opération 120 x 0.2. Le plus simple pour faire le calcul est de conserver les chiffres significatifs, ici 12 et 2, et de les multiplier, cela nous donne 24, et ensuite de s'assurer d'avoir un résultat crédible, 24€ semble un chiffre crédible.

Appliquons la deuxième réduction, -30%. Le complément est 70%. Chiffre significatif, 7 * 24 = 168. Rajoutons une virgule au bon endroit pour avoir un résultat crédible, 16.80€.

Que se passe-t-il si on inverse l'ordre des réductions ? Commençons par la réduction de 30% puis celle à 80%.
Première réduction : 70% de 120€, 7 * 12 = 84€. Puis la deuxième, 84 * 2 = 168 = 16.80€, pareil.

L'ordre des réductions n'est pas important, puisqu'on ne fait que multiplier des nombres entre eux, et la multiplication est commutative, a x b = b x a.

Petite démonstration : soit x1 la première réduction, x2 la deuxième réduction et N le prix de départ. Soit R1 le prix final dans le scénario x1 puis x2, et R2 le prix final dans le scénario x2 puis x1.

R1 = (100% - x1).(100%-x2).N
R2 = (100% - x2).(100%-x1).N = (100% - x1).(100%-x2).N = R1

Et au final, R1 = R2, donc l'ordre des réductions n'a pas d'impact sur le résultat.

Cela nous donne aussi la formule pour calculer la réduction totale de deux réductions cumulées. Si je cumule 80% et 30%, quelle est ma réduction finale ?

(100%-30%).(100%-80%) = 70% . 20% = 14%

Je payerai donc 14% du prix au final, soit une réduction de 86%. Et ce quelque soit l'ordre dans lequel j'applique mes réductions.

Vérifions sur l'exemple : 120€ * 14% = 16.80€, le compte est bon!

vendredi 18 octobre 2013

Le conte de la course d'aviron entre les États-Unis et le Japon

Ce conte nous est rapporté par Debito Arudou, depuis son site www.debito.org, et originalement nommé The tale of the boat race between the us and japan.

Debito aurait reçu ce texte en janvier 1997 d'un étudiant diplômé de UCLA nommé Dave Friedman.

En voici la traduction :
La grande course américaine 
Deux grandes entreprises américaine et japonaise ont décidé de s'engager dans une course d'aviron. Les deux équipes se sont entraînées durement et longtemps pour atteindre leur meilleur niveau. Le jour J, les deux équipes se sentaient prêtes. Les japonais gagnèrent avec 1.5 km d'avance. 
Les américains étaient très déçus par cet échec et le moral était au plus bas. La direction de l'entreprise décida que les raisons de l'échec devait être identifiées. Elle engagea un cabinet de conseil pour étudier le problème et recommander des mesures correctives. 
La conclusion des consultants fut la suivante : les japonais avaient 8 rameurs et 1 barreur. Les américains avaient 1 rameur et 8 barreurs. 
Après une année à étudier le problème, et des millions dépensés, le cabinet de conseil conclut qu'il y avait trop de barreurs, et pas assez de rameurs. 
Le jour de la course approcha et la hiérarchie s'en trouva complètement réorganisée. La nouvelle structure comprenait 4 barreurs principaux; 3 barreurs, 1 par partie : avant, milieu et arrière; et un nouveau système d'évaluation des performances pour inciter le rameur à ramer plus efficacement. 
Les japonais remportèrent la course avec 3 km d'avance. 
A nouveau humilié, l'entreprise américaine renvoya le rameur pour performance insuffisante, et donna un bonus aux managers pour avoir découvert le problème.

mercredi 16 octobre 2013

L'aléatoire en informatique

Vous savez surement lancer un dé ? Ça vous donne un nombre aléatoire entre 1 et 6. Rien de plus simple dans la réalité que de générer un nombre aléatoire. On utilise beaucoup les dés à 6 faces dans toutes sortes de jeu. On appelle ça un D6. Il existe aussi des dés à 20 faces, des D20, et on monte jusqu'à 100 faces même !

Bref, dans la réalité, on sait faire. Comment s'en sort l'informatique ? L'ordinateur ne lance pas un dé pour faire ça, ça prendrait trop de temps ! Certains algorithmes demandent des centaines de milliers de chiffres aléatoires à générer, il faut pouvoir les générer rapidement. Le plus connu est la méthode Monte-Carlo, utile pour calculer des probabilités à de très grandes échelles.

Pour générer ces nombres, on ne va pas faire de l'aléatoire, mais du pseudo-aléatoire. C'est presque aléatoire, mais pas vraiment.

L'idée est de générer une simple suite de nombre, de la forme un = A un-1 + B.
On choisit un point de départ, u0.
Ensuite, u1 = A . u0 + B
Puis u2 = A . u1 + B
etc...

Ainsi on généré la suite un : u0, u1, u2.... Qui nous donne autant de nombre aléatoire que l'on veut !
Pour avoir des nombres qui imite le fonctionnement d'un dé, on va ajouter un modulo 6 pour être sur de rester entre 1 et 6, ce qui nous donne la formule d'un générateur congruentiel linéaire :

un = [A un-1 + B] mod m

Et là, si vous avez suivi, vous avez envie de dire `mais, la suite va toujours avoir la même tête pour le même u0`, et je vous répondrais que c'est vrai. u0 est appelé la graine du générateur, ou `seed` en anglais. Il faut pouvoir la choisir.... aléatoirement !
En pratique, on utilise souvent la date actuelle, ce qui suffit à avoir une génération assez aléatoire.

Enfin, les constantes A et B doivent être choisies pour obtenir les meilleurs suites aléatoires possibles. De nombreux mathématiciens se sont pencher sur le problème, au hasard, A = 31415821, B = 1 et C = 108, et on obtient le générateur de Robert Sedgewick.

Il existe aussi d'autres formules pour créer la suite, d'autre choix de constante, mais le principe de base est toujours le même, un élément de départ u0, puis une suite un = f(un-1).

L'erreur que font la plupart des développeurs est de réinitialiser la graine trop souvent avec la même valeur. Si on initialise la suite selon la seconde actuelle, et qu'on lance l'algorithme 3 fois pendant la même seconde, et bien on tombera 3 fois sur le même résultat, pas super aléatoire.

La méconnaissance de la base de la génération des nombres pseudo-aléatoires amène beaucoup de suspicion et de crainte quand à leurs utilisations, alors qu'en pratique, c'est une simple suite mathématique !

Pour les plus développeurs d'entre vous, l'article de Microsoft sur l'utilisation de la classe Random en C# est concis avec un exemple très précis des erreurs à ne pas faire : Random (Constructeur)

La valeur initiale par défaut est dérivée de l'horloge système et a la résolution finie. En conséquence, les objets Random différents qui sont créés successivement par un appel au constructeur par défaut ont des valeurs initiales par défaut identiques et produisent ainsi des jeux identiques de nombres aléatoires. Ce problème peut être évité en utilisant un seul objet Random pour générer tous les nombres aléatoires. Vous pouvez également le contourner en modifiant la valeur de départ retournée par l'horloge système, puis en fournissant explicitement cette nouvelle valeur de départ au constructeur Random(Int32).