Mots-clé : développement

Python, débutant et jeu : Soko-ban version geek

Avez-vous déjà entendu parler de Sokoban, le jeu ?
J’ai eu la formidable idée (c’est de l’humour…) de le coder en Python, et encore mieux (c’est encore de l’humour…) de le coder pour pouvoir y jouer en mode console.

\o/

J’ai commencé à développer pour qu’il soit international, donc les commentaires sont pour la plupart en anglais.

La première chose que je voulais faire c’est pouvoir faire des affichages différents. Donc, selon que votre console le supporte ou pas, vous pourrez changer l’affichage :

# Different drawings:
glob_tab_chars = \
[
    # Ground / GroundStoneDest / Wall / Player / Stone
    [ ' ', '.', '█', '☺', '☻', '○','♦' ],
    [ ' ', '.', '#', '@', '+', '$','*' ],
    [ ' ', '.', '░', '☺', '☻', '○','◙' ]
]

Voici l’écran de base :

Copie d'écran de PySoko

Voici l’écran, si on veut changer les graphismes (en cliquant sur « + » ou sur « -« ) :
Copie d'écran de PySoko

Voici l’écran, si on veut encore changer les graphismes (en cliquant sur « + » ou sur « -« ) :
Copie d'écran de PySoko

Le code orienté objet

Les classes de base

Et ensuite le plus important à mon sens : le code orienté objet. J’ai voulu apprendre l’orienté objet de python. J’ai donc crée des classes qui correspondent aux objets de base (dans l’ordre, classe du Sol sans rien, classe du Sol où il faut ranger une pierre, classe Mur, et classe Joueur) :

# Different drawings:
class Ground(object):
    def __init__(self):
        super(Ground,self).__init__() # Parent call:

class GroundStoneDest(object):
    def __init__(self):
        super(GroundStoneDest,self).__init__() # Parent call:

class Wall(object):
    def __init__(self):
        super(Wall,self).__init__() # Parent call:

class Player(object):
    def __init__(self):
        super(Player,self).__init__() # Parent call:

Classe Level

Et de la même façon j’ai crée la classe Level qui est la plus complexe, et qui contient les fonctions les plus utilisées :

  • apply_drawings_set()
    Calculer les motifs pour dessiner le tableau (oui, oui c’est plus complexe que ça n’en a l’air) ;
  • draw()
    Dessiner les motifs en cours à l’écran ;
  • register_player_move()
    Se souvenir des mouvements du joueur, soit pour pouvoir faire un « undo » (pas implémenté), soit pour pouvoir les sauver pour les rejouer (pas implémenté non plus) ;
  • move()
    Essai de déplacer un objet situé en (x,y) du décalage (add_x, add_y), sachant que le décalage peut être négatif ;
  • solved()
    Test si toutes les pierres sont bien rangées.

Classe LevelsReader

De la même façon, j’ai crée la classe LevelsReader qui lit un niveau, et l’analyse pour voir s’il est un minimum cohérent. Pas la peine d’entrer dans le détail, les fonctions sont suffisamment explicites je pense.

Bibliothèque curses

Et pour terminer, la fonction de la boucle principale qui concerne l’unité curses : def curses_main(stdscr, code). C’est ici qu’on affiche le menu, qu’on attend qu’on tape sur une touche, etc.

Notez bien : le code n’est pas terminé. C’est un début de code, relativement correctement fait. J’ai passé à peine deux jours dessus pour réussir à faire cela, donc ne m’en voulez pas trop, il n’est pas peaufiné, mais il fonctionne.

Si jamais vous l’améliorez, ce serait gentil de me faire parvenir la nouvelle version 🙂

Le lien que tout le monde attend avec impatience, la bave aux lèvres :

Cliquez ici : pysoko.tar.bz2

AUSY, SYNCHRONE TECHNOLOGIES, Sogima et autres pipeauteurs

Plus exactement, le titre devrait être : pour les benêts qui veulent se faire exploiter par des guignols en costard cravate qui se surgavent sur leur dos tels que AUSY, SYNCHRONE TECHNOLOGIES, Sogima et autres pipeauteurs, en leur mettant la pression à mort, 2000 postes sont à pourvoir.
Exemple concret : lesjeudis.com : c’est bien simple, il n’a que des SSII. Et les SSII, le principe est simple : Sogima, AUSY et autres bande de pseudo professionnels qui parlent de « développement en Php de base de données » et de « requêtes bases de données orientés développement C » et autres aberrations caratéristiques de l’enfumage complet qui est l’objectif #1 des commerciaux (je le rappelle, un bon vendeur est un bon menteur), non et non : désolé, mais lesjeudis.com, actuellement, promeut ce genre de marché qui se résume en une phrase :
« Je suis un bon pipeauteur, un gros blaireau incompétent en informatique mais mon nez de parasite me dit qu’il y a plein d’argent à se faire, alors je me reconvertis, je vends des prestations à des grosses entreprises et je démarche des pauvres étudiants qui viennent tout juste d’avoir leurs diplômes, et je les fais bosser comme des esclaves pour un salaire de misère, en me prenant une commission démesurée au passage, et surtout, surtout, je tiens des discours grandiloquents sur ma société ».

Et je reste poli, encore, quand je parle de guignols qui n’y comprennent rien (si si je promets, je reste poli, il aurait fallu voir l’entretien que j’ai eu chez SOGETI pour comprendre que je reste poli).
J’espère, pour être plus constructif, que lesjeudis.com réussiront à s’orienter vers d’autres compagnies que des groupes de crétins qui sortent des phrases (je n’invente rien) telles que, allez au hasard AUSY : « Nous cherchons, pour nos équipes de Marseille, un Chef de Projet dont le rôle sera d’effectuer des reportings adaptés aux besoins de l’équipe projet, du Project Office, ou du management », ou encore « Assurer la gestion des comptes applicatifs, notamment appliquer les procédures et process User-id management. ».

Et dans le domaine du gros pipeautage qui ne veut absolument rien dire de concret :
« Vous interviendrez sur des missions liées à des environnements hétérogènes, principalement sur des projets d’envergure internationale, dans le cadre de missions de conseil ou d’assistance technique pour le compte de nos clients. ». Ah oui merci, maintenant je sais exactement où je vais aller, chez qui, et ce que je vais faire. Mais, bon, ça fait bien, ça met en confiance, ça vend bien, wow, avec ça je vais en vendre des contrats et en empocher, un paquet de fric !

Si ces gens ne faisaient que se gaver, je ne dirais rien, mais ils se gavent au détriment des développeurs. Et là ça m’exaspère.

Donc lesjeudis.com = bonne idée, bonne initiative, mais que des SSII, à une ou deux près, dedans les offres = décrédibilise tout sérieux selon moi.

Analyste d’exploitation SYNCHRONE TECHNOLOGIES
INGENIEUR SUPPORT NIVEAU 3 Softway Medical
Administrateur Système Réseau Sogima
Ingénieur Système Réseau Sogima
ADMINISTRATEUR SAN H/F AUSY
ADMINISTRATEUR UNIX AIX AUSY
Administrateur Systèmes Windows Citrix H/F AUSY
INGENIEUR RESEAU SECURITE AUSY
CHEF DE PROJET AUSY
TECHNICIEN INFORMATIQUE AUSY
Ingénieur VMWARE/WINDOWS H/F GFI Informatique
Ingénieur d’étude et dévelopement C/PHP PROLOGUE
Ingénieur réseaux IP/FAI confirmé SYNCHRONE TECHNOLOGIES
Chargé d’étude et d’implantation du Réseau Telecom (f/h) Orange
TECHNICIEN SYSTEME RESEAU Softway Medical
Responsable Infrastructures Advise RH
Technicien Réseaux H/F Advise RH
Développeur Java J2EE (H/F) ART Informatique
Business Analyst/Analyste décisionnel SYNCHRONE TECHNOLOGIES
Administrateur Websphere en production SYNCHRONE TECHNOLOGIES
Conception orientée Objet H/F SOGETI HIGH TECH
Chef de Projets Fonctionnel / Editeur de Logiciels – H/F Selescope
Technicien Support Informatique TELINTRANS
TECHNICIEN ASSISTANT UTILISATEUR (H/F) OSIATIS
TECHNICIEN SYSTEMES OSIATIS
Développeur Java J2EE (H/F) ART Informatique
Business Analyst/Analyste décisionnel SYNCHRONE TECHNOLOGIES
Administrateur Websphere en production SYNCHRONE TECHNOLOGIES
Responsable Infrastructures Advise RH
Technicien Réseaux H/F Advise RH
Développeur Java J2EE (H/F) ART Informatique
Business Analyst/Analyste décisionnel SYNCHRONE TECHNOLOGIES
Conception orientée Objet H/F SOGETI HIGH TECH
Chef de Projets Fonctionnel / Editeur de Logiciels – H/F Selescope
Technicien Support Bureautique ESR
Service Desk Analyst Abritel
Administrateur Stockage SAN Sauvegarde H/F ALTRAN TECHNOLOGIES
administrateur Windows H/F ALTRAN TECHNOLOGIES
Consultant en Développement J2EE ALTRAN TECHNOLOGIES
Développeur technologies .NET H/F Progexio
Développeur Java J2EE (H/F) ART Informatique
Business Analyst/Analyste décisionnel SYNCHRONE TECHNOLOGIES
Administrateur Websphere en production SYNCHRONE TECHNOLOGIES
Chef de Projets Fonctionnel / Editeur de Logiciels – H/F Selescope
Technicien Support Bureautique ESR
Service Desk Analyst Abritel
Administrateur Stockage SAN Sauvegarde H/F ALTRAN TECHNOLOGIES
administrateur Windows H/F ALTRAN TECHNOLOGIES
Consultant en Développement J2EE ALTRAN TECHNOLOGIES
Conception orientée Objet H/F SOGETI HIGH TECH
ADMINISTRATEUR LINUX AUSY
Développeur confirmé JAVA/J2EE SNEF
Administrateur stockage SAN SYNCHRONE TECHNOLOGIES
ANALYSTE FONCTIONNEL/CONCEPTEUR C++ SYNCHRONE TECHNOLOGIES
INGENIEUR LINUX/UNIX (F/H) COMPUTACENTER

Php : T_PAAMAYIM_NEKUDOTAYIM !

Si jamais un jour vous vous trouvez en face de cette erreur surprenante :
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in {fichier source} on line 35
l’explication (et la solution) sont sûrement ici :

  • il vous manque un point virgule à la ligne concernée ;
  • il y a une variable utilisée qui n’est pas définie ;
  • il y a une erreur incompréhensible, par exemple dans mon cas c’était un define mal écrit :
    if (!defined(SESSION_NAME)) {...}
    alors que le bon code était avec les côtes :
    if (!defined('SESSION_NAME')) {...}

En espérant, comme d’habitude, aider quelqu’un, un jour, quelque part…

Php et Smarty : comment simuler print_r(), var_dump() ou var_export()

Si jamais vous utilisez le moteur de templates Smarty, il pourra vous arriver, à un moment ou à un autre, de vouloir afficher le contenu d’une variable Smarty. Rien de plus simple : prenons un exemple concret :

{foreach name=tab_g key=id_g item=item_g from=$tab_garanties}
{/foreach}

Imaginons que vous vouliez afficher ce qu’il y a dans $tab_garanties. Il suffit de faire :

{$tab_garanties|@print_r}

Et c’est tout !

Si vous avez une autre solution, je suis preneur !

Cette idée vient d’ici, mais, comme souvent, comme c’est en anglais, j’aide un peu par mes traductions, la communauté Française.

scp : comment résoudre le problème C0644

Il arrive parfois que lorsqu’on fait un scp, ça ne fonctionne pas, et on peut lire quelque chose comme :

>> scp root@olivierpons.fr:/var/www/html/pysoko.tar.bz2 .
root@olivierpons.fr's password:
C0644 129502 pysoko.tar.bz2
>>

Dans cet exemple, je veux récupérer le fichier :
pysoko.tar.bz2
qui est sur le PC distant dans le répertoire
/var/www/html/
sachant que le PC distant est nommé :
olivierpons.fr.
En fait le problème est super simple : lorsque le programme scp se connecte pour faire la copie, un shell du distant nommé olivierpons.fr est ouvert, et par conséquent tout ce qu’il y a dans la configuration du shell est exécuté, donc tout ce qu’il y a dans le fichier de configuration du shell .bashrc.
Pour faire simple, si vous avez fait un « echo » quelque part dans le fichier de configuration du shell .bashrc, changez le par tty -s && echo ".
L’explication est dans ce site génial, qui explique tout sur le SCP, encore mieux que mon article, qui sort pourtant numéro un sur google France lorsqu’on tape scp linux

Le monde est injuste !

Motivation : mais bon sang ! T’as fait quoi là ?

C’est la traduction d’un article que j’ai lu ici.

Je crois qu’il y a un équilibre sain que tous les développeurs ont besoin d’établir, entre …

  1. S’enfermer dans un bureau privé et avoir un dialogue intime avec un compilateur et son programme ;
  2. Sortir en public et avoir un dialogue ouvert avec les autres êtres humains au sujet de son programme.

La plupart des programmeurs sont introvertis, ils n’ont pas besoin d’encouragements pour partir en courant, se retrouver seuls et passer du temps avec leur ordinateur. Ils le font naturellement. Livrés à eux mêmes, c’est la seule chose qu’ils feraient de toute façon. Je ne les blâme pas pour ça ; les ordinateurs sont incroyablement plus rationels que les gens. C’est d’ailleurs ce qui nous amène le plus souvent dans ce domaine. Mais il est possible d’aller trop loin dans l’autre sens aussi. C’est beaucoup plus rare, parce que cela va dans le sens inverse de l’introversion naturelle de la plupart des développeurs de logiciels, mais cela arrive.  Prenons moi, par exemple. Parfois, je crains de passer plus de temps de parler programmation que de programmer tout court.

Le jour où j’en suis arrivé au point de passer plus de temps à parler de développement que de développer, ma plus grandeur peur a été concrétisée : je suis devenu un expert. La dernière chose dont le monde a besoin, c’est d’avoir encore plus d’experts. Les experts ajoutent systématiquement des commentaires éphémères au lieu de faire quelque chose de concret et de réel. Ils ne participent en rien de matériel à la construction de quelque chose qui dure ; à l’inverse, ils observent passivement le travail des autres et se contentent de faire des commentaires à la blablablabla qui n’en finissent jamais en tournant des phrases dans un style complexe et tourmenté, de manière à se gonfler un peu l’ego. C’est pathétique.

C’est peut-être pour ça que cet article de SEO Black Hat m’a autant inspiré et motivé :

Do it F***ing Now.

Traduction :

P*tain, Fais Le Maintenant.

N’attends pas. Ne procrastine pas. Les vainqueurs ne sont pas ceux qui trouvent les meilleures excuses pour ne pas faire ce qu’ils savent comme un potentiel de gain d’argent. Les vainqueurs sont ceux qui savent organiser leurs priorités et remplir leurs journées.

Fais une liste des actions correspondantes aux tâches importantes et assure toi qu’elles soient réalisées. Tous les projets que tu as en tête devraient être en mouvement. Si tu n’avance pas, tu stagne.  Chaque pas que tu fais ne dois jamais se transformer en « pour le reste je m’y consacrerai la semaine prochaine ». Si ça peut te faire gagner de l’argent :

P*tain, Fais Le Maintenant.

Certains d’entre vous peuvent penser que le « P*tain » est en trop. C’est faux. Il vous faut l’impact. Il vous faut cette force, pour arriver à créer cet appel à agir, ce coup de pied au derrière qui va vous faire bouger. Sinon, vous allez finir comme la plupart des gros loosers qui avaient eu une super idée il y a longtemps mais qui n’ont jamais rien fait. Les rêveurs ne gagnent jamais d’argent. Ceux qui se bougent, si. Et ceux qui se bougent, p*tain, le font maintenant.

Note personnelle : cette suite d’expressions est intraduisible, mais j’aime bien

  1. Do it.
  2. Do it right.
  3. Do it right now.
  4. Do it f***ing right now.

Python : mes premiers essais

Bon, sur cet article ici, j’ai traduit tout le vécu d’un auteur, et j’ai voulu tester par moi même.

En pratique, j’ai installé un dictionnaire de Français entièrement gratuit, et je voulais récupérer les mots Français, sans la définition (je ne dirai pas pourquoi par contre hahahah).

Donc je regarde les fichiers, c’est du XML.
Ok donc il me faut juste un parseur.
En Delphi, ça m’aurait pris disons… une trentaine de minutes.
Eh bien pour mon premier script en Python, ça m’a pris… 10 minutes.
Oui oui je n’exagère pas : 10 minutes, j’ai lancé le chrono pour voir si j’allais être rapide ou pas.
Voilà mon script :

1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # r = open('/datas/dictionnaire/test
5
6 import types, fileinput
7
8 def process(line):
9 if line[0:7] == ' 0):
12 sub = sub[:sub.find(' ')]
13 if (sub.find(',') > 0):
14 sub = sub[:sub.find(',')]
15 print(sub)
16
17 for line in fileinput.input():
18 process(line)

Incroyable. Effectivement, en pratique c’est vraiment ce que j’ai mis sur mon article précédent : tout est clair, lisible, la documentation aide bien, et c’est extrêmement rapide, en tous les cas sa rapidité suffit amplement pour faire toutes les tâches de scripts de base que l’on veut.

Je suis extrêmement content, à part depuis la découverte de la librairie ExtJs, qui est très impressionnante, ça allait faire longtemps que je n’avais pas été autant enthousiasmé (du point de vue informatique, j’entends).

Delphi : TClientDataSet, TDataSetProvider et TTable

Je développe en Delphi depuis plusieurs années et je me suis remis à la base de données il y a peu.

Donc je fais un petit mémo expliquant ce que j’ai compris, en espérant que cela fera gagner du temps à ceux qui n’y arrivent pas, et en sautant les étapes de l’aide Delphi, qui, quoique très précise et détaillée, aurait tendance dans un premier temps à plus nous embrouiller qu’autre chose.

Dans une application « orientée base de données », il faut tout d’abord afficher les données. Il y a les composants de données, qui commencent tous par TDB (TDBGrid, TDBEdit, TDBMemo etc.). On prend le composant, on le dépose sur la fiche. On a une « DBGrid1 » qui s’affiche.

Ensuite, il faut aller chercher les données qu’on veut afficher. Une « source de données ». En Anglais, un composant « TDataSource ». On prend le composant, on le pose sur la fiche, on initialise la propriété « DataSource » de notre « DBGrid1 » à « DataSource1 ».

Ensuite, ce composant « source de données » doit aller chercher les données quelque part. Mais où ? Eh bien chez un « serveur de données ». Pour cela il nous faut un objet appelé le client. Ça peut paraitre bizarre, mais on l’appelle « client » parce que c’est lui qui ira demander des informations à un serveur de données. C’est le client de données du serveur de données. Donc un client d’ensemble de données, en Anglais : « TClientDataSet ». On prend un composant « TClientDataSet », on le pose sur la fiche, et on initialise la propriété « DataSet » de « DataSource1 » à « ClientDataSet1 ».

Ce fameux Client, lui, doit donc se connecter à un serveur de données. C’est intéréssant dans la mesure ou ce fameux serveur peut être « hors » de l’application, sur un autre ordinateur, mais faisons simple : on va supposer que ce serveur est directement intégré à l’application. On utilise donc un composant fournisseur de données, en Anglais : « TDataSetProvider ». On prend un composant « TDataSetProvider », on le pose sur la fiche, et on initialise la propriété « ProviderName » de « ClientDataSet1 » à « DataSetProvider1 ».

On y est presque !

Il reste le côté purement physique, c’est à dire l’objet réel qui ira lire les informations. Nous allons prendre un objet TTable. (Il y a les objet TIBTable pour Interbase, TMyTable pour MySQL, TSQLTable pour dbExpress, bref, plein de tables dont on se sert de la même manière que TTable). On prend un composant « TTable, on le pose sur la fiche, et on initialise la propriété « DataSet » de « DataSetProvider1 » à « Table1 ».

Voilà l’image résultat :
Résultat Delphi TClientDataSet, TDataSetProvider, et TTable

Voilà le trajet des informations :

Lorsque la grille de données voudra lire des informations pour les afficher, la demande suivra ce trajet :

DBGrid1 => DataSource1 => ClientDataSet1 => DataSetProvider1 => Table1

et la Table ira lire les bonnes informations, et créera une réponse. La réponse fera le trajet inverse :

Table1 => DataSetProvider1 => ClientDataSet1 => DataSource1 => DBGrid1

L’intérêt d’avoir autant de composants c’est qu’on peut faire deux applications : le client qui affiche les données, et le serveur, qu’on peut mettre sur un autre ordinateur.

Il est possible de « couper » directement la route et de ne faire qu’un lien direct entre DataSource1 et Table1. (Le propriété DataSource1.DataSet = « Table1 »). Mais ce ne sera pas du tout évolutif. A éviter donc.

Jusqu'à quel point peut-on pousser la machine ? (Part. I)

Par Joel Spolsky, mars 2008.

Cet article vient d’ici. Il est en deux parties. Vous trouverez la seconde partie ici.

Première partie

Je n’ai pas beaucoup dormi lorsque j’étais dans l’armée, en Israël, malgré le fait que j’aie servi durant une brève période de paix située entre la fin des gros combats au Liban et le début de l’intifada.

C’était en 1986. J’étais dans un camp d’entraînement de six mois pour devenir sergent d’infanterie et j’étais épuisé. Durant la période d’entraînement basique, nos officiers étaient durs avec nous, mais ils nous laissaient habituellement avoir nos six heures de sommeil par nuit. L’entraînement pour devenir sergent, lui, était plus dur : les officiers nous faisaient nous coucher à minuit, et nous lever à quatre heures du matin. Et pendant ces quatres heures, nous devions tous avoir un tour de garde d’une demi-heure. Pire : comme on ne s’était pas entraîné durant le Sabbath, on s’entrainait presque 30 d’affilée du jeudi au vendredi suivant. Nous étions en permanence épuisés ; on marchait comme des zombies pendant les exercices – exercices qui impliquaient l’utilisation de balles réelles, rien de moins que ça -et le manque de sommeil commençait à avoir un impact grave sur nos performances. Les gens étaient contrariés, et c’était bien plus que le simple fait de râler parce qu’on était soldat dans l’armée.

C’est à ce moment précis, en plein milieu d’un exercice ridiculement difficile (4 jours qui d’exercices qui comprenaient marche, course, simulation d’invasions, roulements dans la boue et autres futilités telles que monter et descendre des marches sans une minute de pause), que le brigadier-général est venu nous voir. Les officiers de ce grade, dans l’armée Israélienne, étaient les gentils policiers, et étaient là afin de nous aider à nous sentir mieux, tandis que les sergents qui nous commandaient au jour le jour étaient les méchants policiers. Il était donc là pour nous faire un discours de « bienfaisance ». Durant les premières minutes, le brigadier-général nous fit un discours brillant sur la strategié qui m’a appris plus en cinq minutes que tout ce que j’ai pu apprendre de dizaines de livres traitant du commerce. Cela concernait le « fire and motion » (« tir puis avance »), une idée qui consistait à alterner l’attaque de l’ennemi et l’avancée pour gagner un peu plus de terrain. Plus tard, lorsque j’ai travaillé à Microsoft, j’ai réalisé que c’était la metaphore parfaite sur la manière dont les compagnies technologiques devaient se comporter pour gagner des parts marché sur leurs concurrents. L’idée expliquée était si intéréssante que je vais consacrer une seconde partie (qui suit celle là) uniquement dessus.

Mais pour l’instant, je vais parler de l’effet général du discours au complet de notre homme. Tout le monde a ses forces et ses faiblesses, et il n’échappait pas à la règle. Malgré le fait que son discours était bien intentionné et intéréssant, la plupart des personnes, qui étaient épuisées, se battaient pour ne pas fermer les yeux et s’endormir. Un petit plus sympa pour le compte de l’armée : on nous avait autorisé à rester debout durant ce genre de discours, si cela pouvait nous aider à rester éveillés. Tout au long du disours, les têtes se levaient et s’abaissaient comme des sousliks.

Finalement, le discours toucha à sa fin et le général nous offrit de répondre à des questions, si nous en avions. « Quels sont les problèmes que vous avez ? », nous demanda-t-il. « Je suis là pour les résoudre pour vous ».

Très noble de votre part, monsieur.

A ce moment un soldat tout au fond de la foule a levé sa main. « Nous n’avons pas assez de temps pour dormir durant ce exercice », a-t-il dit. « Nous dormons à peu près trois heures par nuit. Nous commençons à faire des erreurs vraiment dangereuses avec de vraies munitions parce qu’on n’est pas clairs du tout. »

Les troupes d’élite Israéliennes ne sont pas des mauviettes. Elle n’exagèrent jamais.

Le général sourit et dit : « Ah ! Ce n’est pas un problème. Vous pouvez toujours trouver du temps pour dormir. Par exemple, je dors dans la voiture lorsque je me déplace ». Lui non plus ne plaisantait pas et n’exagérait rien. Ce qu’il voulait dire, c’était que vous pouviez toujours trouver du temps libre et que pendant ce temps libre il fallait en profiter pour faire une sieste, ce n’était pas plus compliqué que ça pour lui. Content de son excellente réponse, le général a de nouveau souri et puis il a fait un signe d’au-revoir.

Comme vous pouvez l’imaginer, l’effet sympatique qu’il pensait avoir fait n’a eu aucun résultat. Non, mon Général, en réalité, on ne peut pas trouver de temps pour dormir, avons-nous pensé. C’est ce qu’on essaie de vous dire, mon Général. On n’a pas de temps libre, et nous n’avons pas de chauffeur non plus : nous marchons, partout, avec au minimum vingt kilos de bagages inutiles sur le dos. Lorsque vous envoyez une petite goutte de café sur votre carte, mon Général, et que vous confondez cette tache avec une colline, cela signifie une marche-détour de 20 kilomètres supplémentaires pour nous. Quelques minutes après que le général soit parti, nous étions encore sous le coup du choc : ce type était complètement désolidarisé de l’expérience de ses propres troupes. Est-ce qu’il pensait vraiment qu’on était crevés parce que nous n’avions pas pensé à dormir à l’arrière de voitures conduites par un chauffeur ?

Lorsque j’ai crée ma société avec mes propres fonds, j’avais, et j’ai encore aujourd’hui, ce discours en tête. Cette désolidarisation complète, cette incapacité de comprendre ces troufions sur le champ de bataille, concerne aussi plein de dirigeants. C’est vraiment très facile d’oublier la vie des autres dans les tranchées, quand on n’y est pas. Après plusieurs années de travail jour et nuit, week-end compris, pour construire une compagnie qui tourne, après avoir sué sang et eau à trimer sur un bureau constitué par une porte posée sur deux tréteaux, les dirigeants d’une société en oublient que les employés qui travaillent pour eux ne sont pas les co-fondateurs : ce sont des employés. Si vous leur donnez une porte pour qu’ils la mettent à plat et s’en servent comme bureau, et que vous leur demandez de travailler le week-end, ils ne vont pas du tout voir les choses comme vous les voyez.

C’est normal. Ils n’ont pas crée la compagnie. Même si vous avez été généreux en leur donnant des stock options, vous êtes celui qui pourra finir avec un hélicoptère et une gigantesque maison en bord de mer à Cannes. Si tout fonctionne à merveille, dans le meilleur des cas, ils auront une jolie petite maisonnette dans le Sud de la France et pourront payer une bonne école à leurs enfants.

Les bons employés peuvent être dévoués, bien sûr, et c’est tout à fait raisonnable de s’attendre à ce qu’ils se décarcassent. Mais, à l’inverse des fondateurs, les employés se sentent concernés par ce qu’il se passe aujourd’hui, maintenant. Ils ne sont pas super enthousiastes pour faire des sacrifices à long terme. Alors ne dites pas à votre excellent chef des ventes de rester ici, juste après un coup de fil important de ses parents qui sont à 200 km de son travail, même si c’est ce que vous avez fait lorsque vous avez démarré la société.

Bosser comme un dingue vous faisait peut-être plaisir et vous faisiez ça gratuitement en rêvant, pendant votre boulot, à la bonne retraite que vous aurez sur un magnifique bateau à St. Tropez ou bien comment vous régalerez vos petits enfants à leur raconter vos histoires du pain dur que vous avez dû manger lorsque vous avez commencé. Mais cette femme, développeur, super intelligente, que vous avez embauché pour vous construire complètement votre site Internet ? Vous pensez qu’elle n’a jamais entendu parler des excellents repas de cantine chez Google ? (NASDAQ:GOOG)

Je dis encore et toujours ces mêmes choses aux patrons qui n’ont toujours pas réalisé cela, lorsqu’ils sont déçus et qu’ils virent tous leurs employés, mauvais et bons, en demandant toujours « pourquoi Olivier (ou Jeanne) n’a pas encore fini son travail ? Je l’aurais terminé ce week-end ! »

Ce général m’a appris une autre leçon sur les subtilités de la direction. Il était arrivé dans un énorme 4×4 flambant neuf, climatisé. Son uniforme était impeccable, et (tenez vous bien, vous allez être surpris) repassé. Je ne savais pas que le fait de dormir peut automatiquement repasser les habits que l’on porte. Ça n’a fait qu’une chose supplémentaire : le démarquer encore plus de nous et de souligner le fait qu’il vivait vraiment dans un monde complètement différent.

De la même façon, lorsqu’une compagnie commence à décoller, et que son fondateur commence à gagner un peu d’argent, il doit garder à l’esprit ce que c’est que d’être salarié. Quelque soit le montant du salaire de vos employés, l’idée qu’il se feront de l’argent sera toujours différente de la vôtre. Vous ne pouvez pas montrer que vous gagnez plein d’argent et espérer qu’ils ne s’en apercevront pas. J’ai entendu parler d’un PDG, embauché dans une start-up en tant que « professionnel expérimenté », qui avait déjà fait sa petite fortune. La compagnie n’avait pas encore commencé à décoller. Bien au contraire, elle démarrait, et tout le monde faisait des sacrifices et travaillait de longues heures pour réussir à faire avancer les choses. Mise à part le PDG. Comme mon général à l’armée, il semblait être dans un monde totalement différent. Il vivait en Californie, et le business était à New York, donc il ne se donnait la peine d’être présent à son bureau que peu de jours par semaine. Il avait pourtant bien donné l’instruction à son équipe de l’appeler si jamais il y avait un problème. « Surtout ne vous inquiétez pas », leur avait-il dit, « j’ai un téléphone portable à côté de la piscine ». Quel que soit le problème, son teint hâlé est devenu le symbole même de tout ce qui n’allait pas dans la société. Imaginez comment auraient été les personnes de l’équipe si, en plus du comportement de leur PDG, ils n’avaient dormi que quatre heures par nuit.

Dix règles d'or pour les filtres de sortie.

Le contenu en Anglais non traduit se trouve ici.

Voilà les règles que doivent suivre à la lettre les filtres de sortie :

  1. Les filtres de sortie ne devraient pas passer de brigades vides le long de la chaine de sortie, mais devraient être tolérantes sur l’arrivée de brigades vides.
  2. Les filtres de sortie doivent passer tous les seaux de métadonnées (metadata buckets) le long de la chaine de sortie ; les seaux de vidages (FLUSH buckets) devraient être respectés en passant tous les seaux en attentes le long de la chaine de sortie.
  3. Les filtres de sortie devraient ignorer tous les seaux qui suivent un seaux de fin de fichier (EOS buckets).
  4. Les filtres de sortie doivent traiter une quantité fixe de données, à la fois, afin de s’assurer que la consommation mémoire n’est pas proportionelle à la taille du contenu qui est filtré.
  5. Les filtres de sortie devraient ignorer les types de seaux, et doivent être capables de traiter des seaux de type inconnu.
  6. Après avoir appelé ap_pass_brigade pour faire suivre une brigade le long de la chaine de filtres, les filtres de sortie devraient appeler apr_brigade_cleanup pour s’assurer que la brigade est vide avant de s’en resservir ; les filtres ne devraient jamais utiliser apr_brigade_destroy pour « détruire » des brigades.
  7. Les filtres de sortie doivent mettre de côté les seaux qui sont destinés à être gardés plus longtemps que la durée du filtrage.
  8. Les filtres de sortie ne doivent pas ignorer la valeur de retour de ap_pass_brigade, et doivent renvoyer les erreurs appropriées en retour, à la chaine de filtres.
  9. Les filtres de sortie doivent seulement créer un nombre fixe de brigades de seaux pour chaque réponse, plutôt que une par invocation.
  10. Les filtres de sortie devraient en tout premier lieu essayer des lectures non bloquantes sur chaque seau, et envoyer un buffer de vidage (FLUSH bucket) le long de la chaine de filtres si la lecture doit être faite à nouveau, et de manière bloquante, avant de recommencer une lecture bloquante.

Sachant que la règle 9 n’est pas très claire pour moi, je vous la relivre en Anglais :
Output filters must only create a fixed number of bucket brigades for each response, rather than one per invocation.