Coding Style

Ce blog post se consacre à quelques pratiques que j'ai adopté dans mes développements, et en particulier les plus "borderlines" : celles qui sont sans doute les moins couramment utilisées, ou les plus sujets à débats.

Notez que certains exemples ne suivent pas l'ensemble des conventions de ce document. J'ai essayé de ne pas surcharger les exemples afin de bien mettre en valeur le point évoqué.


Toujours mettre un espace entre les opérateurs, y compris (particularité) entre les parenthèses et autres brackets.

Simplement pour aérer le code, et permettre de séparer rapidement chaque composant à la lecture.

L'humain n'est pas très bon pour lexer manuellement un bloc de code (d'où l'existence de la coloration syntaxique), autant lui simplifier la vie en séparant clairement les débuts et fin des différents éléments.

var makePair = function ( first, second ) {  
  return [ first, second ];
};

Faire un usage intensif des lignes vides pour séparer les blocs sémantiques.

Faire cela permet d'aérer le code, le rendant plus aisé à relire par la suite.

Un conseil pour une découpe correcte : imaginez le pseudo-code de votre fonction, aussi simple qu'elle soit. Chaque ligne de ce pseudo-code peut être transcrit comme un bloc sémantique. Séparez-les par des lignes vides, et la fonction n'en sera que plus lisible et compréhensible.

var inheritor = function ( Base, Source ) {

  var F = function ( ) { };
  F.prototype = Base.prototype;

  Source.prototype = new F( );

  return Source;
};

Si un morceau de code peut être rendu fluide, envisager d'en tirer parti.

Un bloc fluide représente généralement une unique instruction mais, plus important : elle n'est pas censée en contenir d'autres (c'est à dire qu'aucune évolution du code ne devrait à priori la complexifier).

Ce style d'écriture convient donc particulièrement à des fonctions et méthodes helpers, comme dans l'exemple qui suit :

var buildAuthConfiguration = function ( user, pass ) {  
  return { user : user
         , pass : pass }; }

var buildAdditionAST = function ( functionName, a, b ) {  
  return new AST.Addition(
    new AST.Number( a ),
    new AST.Number( b ) ); };

Éviter les closures libres.

Les closures sont un composant important de Javascript, a tel point que les développeurs les découvrant ont une légère tendance à les utiliser partout à la fois. Ce n'est pas une bonne idée : bien que puissantes, elles introduisent une complexité supplémentaire lorsque le code doit être lu : où est définie la fonction ? Quelles variables utilise-t-elle ? Quelles variables viennent du scope global (argh), et quelles autres du scope parent ?

En règle générale, une closure peut assez souvent être remplacée, au moins en grande partie, par une méthode ou fonction dédiée. L'idéal est de ne les utiliser que dans un seul cas : en tant que callback (celles-ci n'introduisant pas d'ambigüité quand à leur champs d'action.


Utiliser la bibliothèque standard, y compris les fonctions apportées par ES5.

Trop de codes Javascript utilisent à mon goût certains 'templates' de code, dont vous pouvez quelques exemples sur ce gist. Bien que certains pourraient arguer que ces codes sont plus optimisés, dans le sens où ils ne nécessitent pas d'"inutiles" appels de fonction, je préfère considérer d'une part que les performances d'un forEach ou d'un map sont rarement le bottleneck d'une application classique, et d'autre part que le moteur d'exécution sait probablement mieux optimiser certains cas que moi.

Utiliser les fonctions standard permet d'apporter un style de développement conventionné : un développeur lisant le code aura certainement plus de facilité à comprendre la façon dont il est censé s'exécuter, et l'état d'esprit de la personne l'ayant écrit.


Se limiter à un composant par fichier.

Je rencontre régulièrement des projets disposant de plusieurs classes / prototypes par fichier. C'est à mon sens une erreur, principalement parce que compartimenter une classe dans un fichier permet de mieux souligner leur indépendance.

Regardez par exemple le tree de Castel. Simple et élégant : vous avez instantanément accès à toutes les informations dont vous pourriez avoir besoin. Vous savez comment sont agencées les classes, vous savez lesquelles sont disponibles. Aucune documentation particulière n'est ainsi requise.

Ce concept se transpose également dans les applications web. A l'heure où nous disposons de systèmes de gestion de dépendances efficaces (Require.js, CommonJS-Everywhere, ...), il est dommage de rester sur des architectures où retrouver du code revient à faire des grep et espérer tomber sur le filon.

@JSMontreal !

Depuis la résurgence du Javascript en tant que langage web, de nombreux groupes communautaires ont été créé afin de favoriser la diffusion des connaissances dans le secteur. Récemment a d'ailleurs été publiée l'initiative francejs afin de référencer ces différents groupuscules (même si une recherche Google "<MaVille> js" suffit généralement :).

Prouvant que les amateurs de Javascript sont partout, Montréal ne fait pas exception à la règle, et propose lui aussi un rassemblement régulier (rencontre mensuelle) donnant la parole à divers orateurs faisant des présentations sur des sujets assez variés touchant au Javascript.

Ayant été l'un des orateurs des deux dernières rencontres, j'ai beaucoup apprécié cette expérience ! C'est une occasion précieuse de mettre en valeur de nouvelles technologies, tout en pratiquant à la fois ses compétences en matière de pédagogie et de communication.

Mes deux présentations ont été assez différentes l'une de l'autre : la première portait sur une présentation d'Angular.js, tandis que la seconde était une vue d'ensemble de la conception de Voxplode. Il m'est apparu qu'il est bien plus compliqué de préparer cette dernière présentation, pour plusieurs points :

  • Les composants étaient borderline JS, et traitaient plus de programmation générique

  • Etant 'calé' sur ce type de question, il était parfois difficile de se mettre dans la peau de l'auditeur

  • Beaucoup de choses à voir, peu de temps pour tout évoquer, encore moins pour l'expliquer, incentive à se dépêcher

  • La vulgarisation des termes n'est pas toujours chose aisée pour l'auditoire

Ceci étant, dans les deux cas, on tire clairement des enseignements, d'améliorer sa fluidité orale à faire des slides plus clairs pour le public. Une expérience que je renouvellerais donc sans hésiter si j'en ai l'occasion, que ce soit à Montréal ou ailleurs :)

(A noter qu'à ParisJS, les pizzas et la bière pour tout le monde sont sponsorisés par diverses entreprises / startups, des fois que ça inspirerait aussi les startups de Montréal ;)

New York City

Un mois, ça me parait être un rythme de publication raisonnable, non ? Aller, disons que oui ! Je me rattraperais sur les quelques autres billets qui devrait venir dans la semaine ... on y croit ;)

Donc, la raison de celui-ci est, comme le titre l'indique, New York ! Ayant été recruté le mois dernier pour entamer un CDI chez Sketchfab, les fondateurs et moi avons décidé de nous rencontrer physiquement avant le début effectif du contrat. Et vu qu'ils étaient de passage par The Big Apple, c'était aussi l'occasion pour moi de faire un petit détour par les US pendant mon année à l'étranger. Les billets ont été rapidement pris, et je rentre à l'instant de ce séjour.

C'est long

Trajet allé de 9h à 21h, trajet retour de 8h à 20h. Mine de rien c'est bien usant, heureusement les sièges étaient tout de même bien confortable (genre on pouvait s'allonger dans tout les sens), et sur le retour ma voisine était bien sympa et on a parlé pendant la majorité du trajet. Le temps est passé plus vite, du coup, mais poser le pied sur la terre ferme a tout de même été un réconfort. Même moi après autant de temps en train, j'ai tendance à me sentir un peu nauséeux :(

Une fois arrivé à New York, je n'ai pas eu de mal à repérer les directions, ayant déjà mémorisé les itinéraires à suivre, et les villes américaines ayant cet avantage de faciliter grandement la déduction quant à la direction à prendre (curieusement, quand t'es sur la 8eme et que tu veux à aller sur la 7eme, t'as pas tant de doute que ça quant à leur emplacement l'une par rapport à l'autre. En France si t'es pas familiarisé avec la ville, tu as un GPS où tu demande ton chemin toutes les deux minutes).

C'est brillant

Etant arrivé de nuit sur NYC, la première constatation a été que la ville est sacrément lumineuse. Mais pas avec des jolies lumières décoratives comme à Montréal, plutôt les lumières flashy des enseignes lumineuses. Et genre partout, même sur les stands de hot-dog.

C'est GTA

La ville de GTA IV, Liberty City, est basée sur New York City. Clairement, l'inspiration se voit régulièrement (surtout dans le quartier où l'on était ?) : les voitures de police ont un air familier (ainsi que leurs sirènes), les publicités sont dans le même genre que celle que l'ont trouve dans le jeu, et on trouve bien des stands de hot-dog à tout les croisements de rue. Heck, pendant que l'on était à l'un des rooftop bars de NYC, j'ai même vu le bâtiment MetLife, parodié dans GTA sous le nom GetaLife !

Ceci étant, la plus grosse ressemblance entre la réalité et la fiction était bien évidemment la conduite des américains. Je vous jure, j'ai vu le soir de mon arrivé une voiture litéralement pousser un bus sur le côté pour passer. Ou un taxis s'arrêter en plein passage une-voie pour faire monter un passager, pendant que ceux derrière passent sur les côtés sans se géner.

C'est haut

Après une soirée bien sympa dès mon arrivé (il y avait des bières \o/) et une bonne nuit de sommeil (il y avait un courant d'air \o/), on a migré faire un peu le tour du quartier. On n'a pas tellement vu de monuments (juste la statue de la liberté au loin), mais je repasserais sûrement plus tard faire un tour de la ville pour plus qu'une journée ! Il y a encore beaucoup de choses à voir.

Quoi qu'il en soit, on s'est baladé dans la ville, et c'est amusant parce que les bâtiments sont généralement très hauts. Si je devais comparer, la ville ressemblerait bien plus à Toronto qu'à Montréal sur ce point-là, notamment avec le concept des affiches publicitaires géantes.

C'est rapide

Séjour express oblige, j'ai donc rapidement dû repartir ce matin, après être resté la journée complète d'hier. Ca a été l'occasion de constater un autre point amusant ! Contrairement à ce à quoi je me serais attendu, la ville était toute endormie le matin (un dimanche vers 7h) ! Très, très peu de monde dans les rues, et même niveau voiture c'était le strict minimum. Sur certaines rues j'aurais presque pû me balader au centre du passage et la jouer Un Indien dans la Ville ...

Ca augure du meilleur

En bref, je suis très content du séjour !

Les patrons m'ont parus très sympas, la boîte a clairement un avenir, j'ai hâte de commencer à bosser sur le projet Sketchfab !

De façon générale, j'ai vraiment hâte de revenir sur Paris pour profiter de mes expériences des derniers mois. En dépit des épreuves auxquelles elle m'a confronté, l'année à l'étranger m'a ouvert un peu l'esprit sur autre chose que bosser en permanence (y compris sur des side projects), et j'ai envie de continuer la mise en pratique à mon retour. Beaucoup de monde à revoir, beaucoup d'amis à retrouver ! Et beaucoup de bières à descendre ... :)


Sur ces bonnes paroles, un bon sommeil m'attend, je crois ...

Je bosserais demain sur ma présentation de mardi à JS Montréal, qui traiterait d'un projet dont je parlerais plus longuement sur ce blog à une autre occasion. Avant ça je ferais probablement un article sur les premières expériences en terme de communication oral que j'aurais pu tirer de mes deux prestations (celle du mois dernier et celle à venir), peut-être que ça décidera certains à s'investir dans leurs communautés ! :)

Oh, et ... les appartements, aussi. Pas mal de coups de fil à passer ! Je veux trouver avant de partir !

Nuit Blanche

Hey, ça fait un petit temps que je n'ai rien publié, ça ne va pas du tout. Pour marquer le coup, j'en profite pour poster aussi quelques photos ! Vu que ces dernières semaines je n'ai pas arrêté de bouger, ça a été un peu short de trouver du temps pour ce blog, mais je vais essayer de reprendre un rythme de croisière. A suivre ;)

La nuit dernière avait lieu une manifestation appellée la Nuit Blanche de Montréal. Le principe est simple : de 18h à 6h, Montréal s'anime à l'aide d'un bon gros tas d'animations, autant dans les rues qu'en intérieur. J'y suis allé avec des amis, et j'ai eu l'occasion de prendre quelques photos avec mon nouvel appareil :)

Messire Paul de Chomedey, Sieur de Maisonneuve (et, accessoirement, fondateur de la ville de Montréal) ! Sa statue est placée devant une cathédrale, et avec la neige qui tombait et le projecteur placé derrière, j'ai trouvé que la scène avait un air assez poétique.

Je ne sais plus si j'ai posté la photo prise de jour de cet arbre, mais en voici en tout cas une version de nuit ! Il est entièrement composé d'illuminations, et est magnifique à voir, vraiment. Il est tellement plus joli de nuit ...

Non, rien de spécial à voir. Mais je vous ai déjà dit que j'aimais bien les illuminations, non ? :p Il y a un air vaguement fantômatique à ce bâtiment, presque comme s'il s'apprêtait à changer de dimension. Mais vous verrez par-vous même quand vous passerez un jour à proximité ;)

De gauche à droite, Ambre, Annie, Floris, Sam, Hélène ! Il en manque sur la photo, mais je n'ai qu'un petit angle, moi. Qui n'aime pas vraiment les mouvements brusques. :(

La photo a été prise alors qu'on était en train de faire un combo jeux de société (genre pictionnary, on a gagné _o/), bombecs, bières. Ensuite on est monté au deuxième étage participer à un quizz, mais .. c'était un peu trop orienté québec pour les pauvres français que nous étions :D

(edit) Petite mise à jour avec la photo prise par Floris. Je suis dessus ;)

Après ça, on a été voir de l'Art à la place des Arts. C'était assez weird. A l'entrée, il y avait une toile sur laquelle les invités pouvaient dessiner ce qu'ils voulaient (j'ai fait un dragon trop cool, because maybe I'm a Dragon).

Ok donc là c'était vraiment chelou. On est tombé dessus par hasard et on est resté, poussés par une sorte de fascination wtfesque. En gros, le type courait partout en braillant des trucs incompréhensibles dans son mégaphone en plastique, pendant que la meuf répétait dans son micro "J'ai quelque chose d'important à vous dire" en variant l'intonation. Très, très chelou. "Art contemporain", okay.

C'était ça qu'on était venu voir à la base, et en fait c'était presque aussi weird que le show précédent, mais avec au moins une dimension un peu physique. Le titre du truc était "Equilibre sur sofa", et comme vous pouvez le voir c'était à prendre au pied de la lettre (ici, elle fait des crêpes). Vers la fin c'est un peu parti dans du n'importe quoi, mais mine de rien ça demande de sacré muscles.

On a ensuite marché un petit peu dans Montréal, avant de rentrer chez nous prendre de bon trucs chauds. Et ce fût la fin de la soirée Nuit Blanche :)

Les Amendements de l'UMP

Je viens de voir passer le tweet suivant de Maître Eolas :

En petit curieux que je suis, j'ai cherché à comprendre ce qu'il entendait par là exactement. Il s'avère qu'il faisait référence à l'amendement 2063 proposé par l'UMP au projet de loi légalisant le mariage homosexuel. Toujours aussi curieux, j'ai cherché ce que cet amendement avait de notable. Voyez plutôt :

ARTICLE 4

À l’alinéa 3, après la référence :

« VII »

insérer les mots :

« et de l’article 149 »

(source)

Ca a l'air relativement anodin. L'alinéa en question est le suivant :

Article 4

Le code civil est ainsi modifié :

  1. Avant le titre Ier du livre Ier, il est inséré un article 6-1 ainsi rédigé :
    • Art. 6-1. – À l’exception des dispositions du titre VII, les dispositions du présent livre s’appliquent également :
      • aux parents de même sexe, lorsqu’elles font référence aux père et mère ;
      • aux aïeuls de même sexe, lorsqu’elles font référence aux aïeul et aïeule ;
      • aux conjoints survivants de même sexe, lorsqu’elles font référence aux veuf et veuve ;
      • aux branches parentales, lorsqu’elles font référence aux branches paternelle et maternelle. » ;

(source)

Donc il veulent indiquer que les dispositions mentionnées dans l'article 6-1 (considérer que les termes père et mère du code civil font également référence aux membres d'un couple de même sexe) ne s'applique pas dans les dispositions du livre VII (qui traitent de la filiation, jusque là ça me parait compréhensible), mais également dans l'article 149 du présent livre, autrement celui-ci :

Si l'un des deux est mort ou s'il est dans l'impossibilité de manifester sa volonté, le consentement de l'autre suffit.

Il n'est pas nécessaire de produire l'acte de décès du père ou de la mère de l'un des futurs époux lorsque le conjoint ou les père et mère du défunt attestent ce décès sous serment.

Si la résidence actuelle du père ou de la mère est inconnue, et s'il n'a pas donné de ses nouvelles depuis un an, il pourra être procédé à la célébration du mariage si l'enfant et celui de ses père et mère qui donnera son consentement en fait la déclaration sous serment.

Du tout, il sera fait mention sur l'acte de mariage.

Le faux serment prêté dans les cas prévus au présent article et aux articles suivants du présent chapitre sera puni des peines édictées par l'article 434-13 du code pénal.

(source)

En conséquent, l'amendement demanque à ce que cet article de loi ne soit pas affecté par la considération que père et mère s'appliquent également aux couples de même sexe. Autrement dit, que dans un cas de décès (ou dans l'impossibilité de manifester sa volonté), le consentement de l'autre suffit. Partant de là, si le terme l'autre tiens compte du sexe, cela signifie que l'article n'est pas applicable aux personnes de même sexe, et donc que dans le cas où l'un des parents serait incapable de manifester sa volonté (par exemple pour cause de décès), il serait tout de même nécessaire de l'obtenir, l'exemption ne s'appliquant pas ici.

Pour note, il s'agit ici du consentement à ce qu'un mineur se marie. Je ne sais même pas comment l'idée de modifier cet article en particulier leur est venu.

Heureusement, ils ont tout de même justifié l'amendement par l'exposé sommaire suivant :

On veut nous faire croire que, dans toute la législation existante, « père et mère » ou « mari et femme » peuvent vouloir dire « deux hommes » ou « deux femmes » sous prétexte d’étendre le mariage et la filiation à des couples de même sexe.

Or, cette fiction juridique se heurte manifestement aux principes de clarté et d’intelligibilité de la loi. En outre, elle a des conséquences pour tous les couples puisqu’elle vide de son sens la réalité de l’altérité sexuelle et de la filiation biologique.

(source)

... qui n'explique malheureusement pas du tout en quoi cet amendement rend la législation plus "claire".

Bref, c'est malheureusement vrai, l'UMP souhaite relever les morts.

The Legion

Aujourd'hui, c'est l'Avant-Première de la nouvelle édition Magic : Gatecrash. Ca fait un certain temps que je n'avais pas pu assister à une AP, donc j'ai fini par me décider à y aller, en dépit de l'heure (le premier tournoi se déroule de minuit à six heures du matin). Pour rappel du concept, il s'agissait d'un scellé : tout le monde reçoit plusieurs paquets de carte au random, et doit se construire un deck de minimum quarante cartes qu'il utilisera durant les X manches qui suivent (ici, cinq).


00h20 Les paquets sont distribués. Franchement ils ont vraiment fait des efforts, on a droit à une boite de jeu super pratique pour ranger correctement les cartes (et très faciles à distribuer, incidemment), aux couleurs de la guilde que l'on a choisi (Boros pour ma part, pour réveiller la violence latente qui est en moi).

Et une fois ouvert on a même droit au pamphlet de propagande Boros. C'est le petit détail de rien du tout qui est vraiment appréciable :D

00h45 Bon scelé! Je joue Boros, et pas mal de cartes late game sont adaptées à ce genre de jeu. En revanche, petite déception pour l'early game, très peu de créatures faisant la différence. A voir dans les matchs à venir. Les cartes maitresses :

  • Aurelia, the Warleader, le nouveau patron de la guilde, dotée de capacités très sympas en scellé (vol, vigilance, célérité), mais ayant surtout la killer feature de donner deux phases d'attaque. Une sorte de double-initiative en mieux, quand le jeu se goupille bien.

  • Assemble the Legion, pour mettre un sérieux coup de pression à l'adversaire (je gagne X jetons célérité par tour, X augmentant lui-même à chaque tour).

  • Foundry Champion, carte de guilde 'offerte', elle est plutôt sympa vu qu'elle permet de supprimer une créature adverse à son entrée en jeu, ou d'infliger de lourds dégâts à l'adversaire. Ses capacités ne gatent rien, vu qu'elles lui permettent également d'être très sensible à la double initiative.

  • Boros Charm, justement, est tout simplement abusé. Toutes ses options sont utiles. La plus abusée reste la possibilité de rentre toutes mes créatures indestructibles jusqu'à la fin du tour, en éphémère. Et j'ai eu deux charmes. : 3

  • Boros Reckoner, aussi appelé "le mur qui pique", une 3/3 pour 3 qui peut se donner l'initiative pour 1, et qui fork tout les dégâts qui lui sont infligés vers n'importe qui. De quoi faire hésiter n'importe qui à la bloquer, ou à attaquer.

01:25 Premier round concédé 2-1 face à Orzhov :( La première manche a été plombée par Aurelia retirée de la partie à la faveur d'un effet Orzhov random. La deuxième défaite a été due à un essouflement rapide des créatures.

02:16 Argh, un autre round perdu en 2-0, face à un confrère Boros. J'ai mené la première manche pour être battu en traitre à la deuxième par un honteux vol de créature juste avant le tour qui devait théoriquement voir aboutir mes plans. Ma propre Aurelia m'a tuer :( La deuxième game a été trop lente à se mettre en place, et la défense adverse était solide, pas réussi à passer.

Petite modification du deck entre deux pour faire rentrer deux sorts Orzhov (Beckon Apparition) permettant de mettre en jeu des jetons vol à bas prix. Sortie de sorts donnant +1/+1 vol initiative, trop peu d'impact réel dans les manches.

03:15 Yeah, victoire 2-0 \o/ Deux manches avec des conclusions violentes : la première s'est soldée par une attaque à 12 (vedette : Aurelia et ses amis volants), la seconde à 18 (Champion gonflé à bloc et couplé avec un Charme double-initiative). Dans les deux cas, pile poil le nombre de points de vie de l'adversaire. Adopter une stratégie défensive en attendant d'avoir l'occasion de me développer semble payant.

Commence à se faire tôt, pas mal de monde semble partir. Mais je resterais jusqu'au bout ! \o/

04:08 Victoire à 2-0 itou, Simic n'a pas aimé :) Première manche gagnée à l'aide d'un bataillon de trois petites créatures, mais suffisamment puissantes pour gérer le banc adversaire. Deuxième manche donnée par Aurelia, protégée d'un touché mortel en traitre par un Charme. Ces deux cartes sont juste awesome en scellé <3

05:05 Victoire 2-1, encore contre Boros :) Pas grand chose de spécial, si ce n'est encore une fois une victoire en infligeant pile poil le nombre de point de vie de l'adversaire en un seul tour (15). Les Charmes sont teeeeellement bons !


C'est la fin de cette prerelease, et je suis bien content d'y être allé: j'ai choppé des cartes sympas, les parties ont été intéressantes et souvent jouées sur le fil, et l'ambiance plutôt cool. Je fini sur du 3-2, ce qui signifie malheureusement pas de prix pour moi, à priori. Tant pis ! Les $18 du prix d'entrée ont clairement été rentabilisés avec ce que j'ai reçu dans les scellés de départ.

Un deuxième tournoi commence à 11h, mais je pense que je serais trop crevé pour y aller. C'est l'heure de faire un gros dodo bien mérité. Après tout, j'ai aussi dû supporter six heures de québecois :D D'ailleurs, petite note à ce sujet, les québecois disent la moitié des phrases en français et la moitié en anglais. Ca demande pas mal de concentration pour switcher rapidement entre les deux.

Mon premier adversaire a d'ailleurs été tout dérouté quand je lui ai dit que j'engageais mes terrains :D "Ca fait tellement longtemps que j'ai pas entendu ce mot-là ... ici on dit juste 'land'".