2002 dans ma tête de nouveau développeur
Ça fait presque un an que j’ai écrit « Mon premier post! » sans trop savoir ce que ce blogue allait devenir. Il ressemble finalement à mon année : un peu de code, beaucoup de questions et quelques détours vers toutes les technos qui me font tripper.
Impossible de passer à côté de .NET. Microsoft a lancé Visual Studio .NET et le .NET Framework en février avec le CLR, plusieurs langages et les services Web XML. Mais la leçon qui relie le mieux mon année n’est pas un nom de produit. C’est qu’un geste visible traverse toujours plusieurs composantes, et que chacune garde un état qu’il faut comprendre.
Prenons un bouton Enregistrer dans une application Windows. Au début de l’année, je voyais surtout sa procédure Click. Maintenant, je peux suivre un trajet plus complet :
- Windows place le clic dans la file de messages de la fenêtre;
- la boucle de messages le dirige vers le contrôle;
- le runtime déclenche l’événement
Click; - le code lit les textes des contrôles et les convertit en types;
- les règles métier refusent les valeurs impossibles;
- ADO.NET ouvre ou reprend une connexion du pool;
- une commande paramétrée est envoyée à SQL Server;
- SQL Server vérifie les contraintes, prend les verrous requis et journalise la transaction;
- le résultat remonte et l’interface confirme ou explique l’échec.
Ce trajet contient presque tous mes bugs préférés de 2002. Une date invalide casse la conversion. Un compte absent du bon groupe Active Directory n’a pas l’autorisation. Une connexion non fermée épuise le pool. Un disque plein empêche le journal SQL de grandir. Un réseau coupé après le COMMIT laisse le client incertain sur le résultat. Le bouton peut même être pressé deux fois si l’interface gèle sans montrer que la première opération travaille.
Le petit pseudo-code que je voudrais appliquer ressemble maintenant à ceci :
au clic
désactiver Enregistrer
lire et convertir les champs
si validation échoue: afficher les champs concernés
sinon
ouvrir connexion et transaction
exécuter commande paramétrée avec un identifiant unique
valider la transaction
toujours fermer les ressources et réactiver le bouton
L’identifiant unique est important en cas de reprise. Si le serveur confirme l’écriture mais que la réponse se perd, répéter avec le même identifiant permet à la base de reconnaître l’opération au lieu de créer un double. Je n’avais pas du tout cette question en tête quand mon seul test consistait à cliquer une fois avec trois belles valeurs.
Les mêmes idées hors du formulaire
Le BlackBerry m’a montré une autre version du même problème : Exchange, BES, le relais de RIM, l’opérateur et l’appareil transportent un message avec des files, des accusés et des reprises. Le GPS combine des signaux de satellites, une correction d’horloge et une phrase NMEA; la latitude sans son indicateur de qualité est incomplète. Le Palm synchronise deux copies de contacts et doit reconnaître les conflits et les suppressions.
Même Photoshop entre dans le portrait. Le .psd conserve des calques modifiables, puis un export aplati devient le livrable de l’application. Dans un cas on sépare la source de son rendu; dans l’autre on sépare les données de travail de ce qui traverse le réseau. Les représentations existent pour une raison, et les confondre fait payer le mauvais composant.
Les jeux m’ont enfin donné une unité très concrète : un budget par image. Une application de bureau possède aussi un budget d’attention. Si la boucle d’interface attend SQL Server pendant plusieurs secondes, le résultat peut être exact et quand même sembler brisé. Mesurer chaque étape vaut mieux que blâmer « le PC » en bloc.
Je suis encore un nouveau développeur, alors mon plan pour 2003 reste volontairement simple. Pour chaque feature, je vais dessiner le trajet des données, nommer le propriétaire de chaque état et provoquer au moins une panne : entrée invalide, permission refusée, connexion coupée ou espace insuffisant. Si je peux expliquer ce qui est déjà commis et comment reprendre, je comprends probablement mieux mon programme que si la seule chose que je sais est qu’il marche sur mon poste.