
Un outil pour l’amĂ©lioration continue du standard
DĂ©solĂ© pour les gamers, mais non je ne vais pas vous parler du dernier Day of Defeat. Par DoD comprenez plutĂŽt « Definition of Done », c’est Ă dire lâensemble des critĂšres Ă respecter pour considĂ©rer une tĂąche terminĂ©e. Par exemple, avant de soumettre son code, un dĂ©veloppeur doit s’assurer de respecter le critĂšre: « tests unitaires OK ».
En quoi un outil aussi « low-tech » et aussi simpliste quâune check-list peut nous aider Ă lâĂšre de Google et de lâiPhone ? Ă une rĂ©volution dans le niveau de qualitĂ© fournie. Pour preuve emblĂ©matique, les initiatives rĂ©centes dans le milieu hospitalier. Cet extrait parle de la pose d’un cathĂ©ter (voie veineuse centrale).
« In 2001, though, a critical care specialist at Johns Hopkins Hospital named Peter Pronovost decided to give a doctor checklist a try. [...] Doctor are supposed to (1) wash their hands with soap, (2) clean the patient’s skin with chlorhexidine antiseptic, (3) put sterile drap over the entire patient, (4) wear a mask, hat, steril gown, and gloves, and (5) put a steril dressing over the insertion site once the line is in. [...]
In the Keystone initiative’s first eighteen months, the hospitals saved an estimated $175 million in costs and more than fifteen hundred lives.«
Et ce seulement dans le Michigan !
Avant mĂȘme de parler des DoD, je rappelle que ceux-ci sont au service de l’amĂ©lioration continue du standard.
Qu’est ce qu’un ( bon ) standard ?
Je vous propose cette définition :
« Un standard est la meilleure pratique constatĂ©e Ă ce jour, Ă©noncĂ© explicitement, avec une finalitĂ© affichĂ©e, et dont on sait mesurer les Ă©carts. »
Celui-ci au sens Lean se doit de respecter certaines grandes caractĂ©ristiques, il doit ĂȘtre :
Les DoD sont des éléments de ce standard, ils se doivent donc eux aussi de respecter ces caractéristiques. Appliquons donc celles-ci à nos DoD :
Issu du terrain
C’est sur le terrain que devra ĂȘtre appliquĂ© le standard et c’est bien lĂ que les problĂšmes sont rencontrĂ©s et encore lĂ que le standard sera remis en cause et amĂ©liorĂ©.
Voici un autre extrait tirĂ© du mĂȘme livre qui relate l’Ă©chec de la premiĂšre version de cette check-list. Cette premiĂšre version ayant Ă©tĂ© rĂ©digĂ©e par des chirurgiens, non pas au bloc, mais lors de rĂ©unions en omettant la plupart des acteurs, infirmiĂšres, anesthĂ©sistes, …
« I gave the checklist to Dee, the circulating nurse, and asked her to run through the first section with us at the right time. Fifteen minutes later, we were about to put the patient under general anesthesia, and I had to say, Wait, what about the checklist?
« I already did it, » Dee said. She showed me the sheet. All the boxes were checked off.
No, no, no, I said. It’s supposed to be a verbal checklist, a team checklist.
« Where does it say that? » she asked. I looked again. She was right. It didn’t say that anywhere.
Just try it verbally anyway, I said.
Dee shrugged and started going through the list. But some of the checks were ambiguous. [...]. And after a few minutes of puzzling our way through the list, everyone was becoming exasperated. Even the patient started shifting around the table.
« Is everything okay? » she asked.
Oh yes, I told her. We ‘re only going through our checklist. Don’t worry.
But I was getting impatient, too. Â The checklist was too long. It was unclear. And past a certain point, it was starting to feel like a distraction from person we had on the table.
By the end of the day, we had stopped using the checklist. Forget making this work around the table. It wasn’t even working in one operating room. »
Dans cet extrait il est clair que l’infirmiĂšre Dee aurait dĂ» ĂȘtre consultĂ©e pour l’Ă©laboration de la check-list. Les propositions d’amĂ©liorations doivent ĂȘtre Ă©mises par ceux qui rencontrent le problĂšme et qui ont la meilleure vision de toutes les contraintes. Mais c’est loin d’ĂȘtre suffisant.
Un exemple issu de nos mĂ©tiers : Jean dĂ©veloppeur dĂ©cide qu’Ă partir de maintenant le passage dans un formateur de code est obligatoire avant tout commit. C’est donc un nouveau DoD pour terminer une tĂąche de dĂ©veloppement.
C’est sans doute une bonne initiative, mais elle est vouĂ©e Ă l’Ă©chec. Pourquoi ?
Ăvoluant sur la base de l’amĂ©lioration continue et de la rĂ©solution de problĂšme
Le standard ne pourra ĂȘtre respectĂ© que si il est partagĂ© par toute l’Ă©quipe. Pour y arriver, le Lean nous met Ă disposition l’amĂ©lioration continue et la rĂ©solution de problĂšme via, dans le cas des mĂ©thodes agiles, les rĂ©trospectives.
Revenons au formateur de code de Jean. C’est une nouvelle contrainte pour les dĂ©veloppeurs qui ne la comprennent pas forcĂ©ment ( « c’est pour faire joli ? », « moi j’aime pas les accolades Ă droite ! « , etc…).
En effet, les autres membres n’Ă©prouveront pas le besoin puisqu’ils n’y voient pas de solution Ă un problĂšme donnĂ©.
Pourquoi ne pas se servir de la rétrospective ?
Si des actions d’amĂ©lioration ont Ă©tĂ© trouvĂ©es lors d’une rĂ©trospective, il est trĂšs probable que des DoD puissent s’en dĂ©duire. De plus, c’est un moment privilĂ©giĂ© oĂč toute l’Ă©quipe est concentrĂ©e Ă l’amĂ©lioration du process.
Comment ce cas aurait pu ĂȘtre traitĂ© en rĂ©tro ?
Jean : « Je n’ai pas pu finir ma user story pour la recette, le merge Ă©tait trop difficile avec la US de RenĂ©. »
RenĂ© : « Mais on ne travaillait pas sur les mĂȘmes mĂ©thodes ? »
Jean : « J’ai eu pleins de conflits parce que tu mets toutes tes accolades Ă la ligne… »
RenĂ© : « Mais c’est beaucoup plus lisible au niveau de l’indentation, non ? »
Jean : « C’est pas le standard le plus rĂ©pandu ! »
RenĂ© : « C’est toi le stand… »
La vache Octo : « Meuuuuuuuuuuuuuuuuuuuuuuh »
Le coach Octo : « Ca vous dit de traiter le point au calme et en rĂ©trospective technique ? »
Dans cette retro spĂ©cifique aux dĂ©veloppeurs le coach (ou team leader) va aider l’Ă©quipe Ă clore ce dĂ©bat « passionnant » de l’indentation et convenir d’un formateur unique ainsi que de l’ajout au standard d’un DoD « FORMATEUR DE CODE APPLIQUĂ ».
On a maintenant deux fervents défenseurs de cette partie du standard, Jean qui appréhende un nouveau merge difficile et René qui aime ses accolades !
C’est donc bien le processus d’amĂ©lioration continue qui nourrit et fait Ă©voluer le standard.
Simple
Le but final est de construire le meilleur standard applicable. Qui dit applicable dit simple. Cela implique que les DoD qui le composent soient le plus simples possibles.
Ainsi, la formalisation d’un DoD doit respecter quelques rĂšgles :
Management visuel
Toujours dans le but de rendre notre standard applicable le plus simplement possible, nous allons cette fois ci nous appuyer sur le management visuel.
Rendre les DoD visuels les rendra plus accessibles et donc plus facilement utilisables.
Comme ils ne seront qu’une source d’informations parmi d’autres, il convient de les rendre clairs et normĂ©s. Par exemple Post-It vert clair / marqueur noir / en majuscule.
Je vous laisse apprécier la différence :
En agile, les Ă©tapes du processus sont reflĂ©tĂ©es par les colonnes du scrumboard / kanban board. Les DoD doivent ĂȘtre contrĂŽlĂ©s au changement d’Ă©tat. Celui-ci se matĂ©rialise par le dĂ©placement du Post-It de la colonne A vers la colonne B. Le meilleur endroit pour afficher les DoD est donc, Ă mon sens, au dessus (ou en dessous) de celles-ci.
Remis en cause sur la forme et sur le fond lorsqu’il est non appliquĂ©
L’un des grands principes d’un standard, tel que le Lean le dĂ©finit, est qu’il est vivant. La dĂ©finition d’un standard donnĂ©e en dĂ©but d’article parlait bien d’un instant T. Si Ă T+1 on observe que le standard n’a pas Ă©tĂ© appliquĂ©, il faut le remettre en cause.
Si un critĂšre du DoD n’est pas appliquĂ© il est nĂ©cessaire de se poser les questions suivantes :
Dans le cas oĂč le critĂšre a Ă©tĂ© mal compris il convient de le modifier. Par exemple si le critĂšre « TEST FONCTIONNEL OK » ne suffit pas car le test peut passer en local mais Ă©chouer en environnement sandbox, le reformuler en « TEST FONCTIONNEL OK EN SANDBOX ».
Mais que faire quand on découvre que le DoD a été contourné à tort ?
Déboires
Dans la pratique il s’avĂšre que, mĂȘme avec des dĂ©veloppeurs pleins de bonne volontĂ©, l’application des DoD n’est pas toujours rĂ©alisĂ©e.
Et pourtant… C’est trĂšs frustrant de voir Ă une rĂ©trospective une US KO, la vĂ©locitĂ© chuter, alors que le remĂšde Ă©tait lĂ , en majuscules et visible partout dans lâopenspace :
Jean, en charge de la US Ă KO : « Ca marchait en local. »
L’Ă©quipe : …
Comment garantir le respect des DoD
Quelque chose de simple mais qui fonctionne : le binĂŽmage dans le dĂ©placement des Post-It. Un dĂ©veloppeur souhaitant faire avancer sa tĂąche doit avertir un autre dĂ©veloppeur. Le but Ă©tant de responsabiliser deux personnes sur le respect du DoD mis en place pour ce changement d’Ă©tat.
De maniĂšre gĂ©nĂ©rale, il faut Ă tout prix responsabiliser lâĂ©quipe au respect des DoD : « câest votre standard, câest-Ă -dire la meilleure façon que vous avez trouvĂ© jusquâici pour rĂ©aliser lâobjectif. Soit vous lâappliquez Ă la lettre si il est pertinent soit vous le remettez en cause en Ă©quipe».
Un autre outil qui peut dĂ©ranger mais qui peut fonctionner dans certaines Ă©quipes, le « wall of shame ». TrĂšs simple… un Post-It gĂ©ant avec le nom de chaque dĂ©veloppeur. Le non respect d’un DoD entrainant un bĂąton Ă cotĂ© du nom du dĂ©veloppeur concernĂ©.
Il suffit d’en faire un jeu plus qu’un outil de « flicage » et c’est Ă mon avis le meilleur moyen de garantir le respect des DoD. L’Ă©quipe est responsable des DoD donc Ă l’Ă©quipe elle-mĂȘme de fixer, dans un cadre pro, la consĂ©quence du non respect du standard. Le but n’Ă©tant pas de sanctionner mais de faire prendre conscience des DoD.
Comment en faire un jeu ?
Enfin, quelque chose que je n’ai pas encore pu essayer mais qui me semble prometteur, les cases Ă cocher. De la mĂȘme maniĂšre que pour une check-list classique, il faudrait possĂ©der sur les Post-It matĂ©rialisant les User-Stories une case Ă cocher par DoD. Ainsi un oubli de DoD est clairement visible de tous. Et tout le monde peut participer au respect du standard. Si vous avez des retours d’expĂ©riences la dessus, je suis preneur !
Conclusion
On peut maintenant définir un DoD :
« ElĂ©ment visible de tous, concis et univoque dĂ©finissant les conditions permettant de passer une tĂąche d’un Ă©tat Ă un autre. Leur ensemble dĂ©finissant le standard d’un processus ».
Avec l’utilisation des DoD, il devient possible de partager tous les standards d’une Ă©quipe sur l’outil que tout le monde utilise et voit en permanence, le scrumboard / kanban board.
Autrement dit, la meilleure façon d’apporter de la valeur au projet connue Ă ce jour est visible par tous et Ă tout instant.

L’un des facteurs clĂ© pour la rĂ©ussite de la mise en place dâune architecture orientĂ©e services, câest de parvenir Ă identifier et mettre en Ćuvre des services Ă forte valeur ajoutĂ©e. Cet article synthĂ©tise, sous forme de questions pratiques, les principaux Ă©lĂ©ments et concepts Ă considĂ©rer pour rĂ©ussir cette transformation du SI.
Cet article sera publié en 3 parties :
Partie 1 – Questions 1 et 2
Partie 2 – Questions 3 Ă 6
Partie 3 – Questions 6 Ă 10
1) Quâest-ce quâun service ?
Dans le domaine informatique, un service est tout programme exposant une ou plusieurs fonctionnalités à des tierces applications en environnement distribué
2) Comment émergent les services ?
Pour quâon puisse parler de service, il faut un client et un fournisseur de service.
Dans un processus « Bottom up », un service Ă©merge dâune dĂ©marche « Push » initiĂ©e par un fournisseur ou « Pull » initiĂ©e par un consommateur.
Dans un processus « Top-down », il est la rĂ©sultante dâune Ă©tude plus globale et systĂ©mique du SI ou dâun bloc du SI.
Processus Bottom-Up
- Processus « push» – par le fournisseur (Le fournisseur fournit un service le plus « gĂ©nĂ©rique » possible)
Câest une dĂ©marche initiĂ©e par un fournisseur qui expose un service et le propose Ă ses partenaires. Le fournisseur essaie de proposer un service le plus gĂ©nĂ©rique possible qui rĂ©pond au besoin de tous ses partenaires (exemple : les services exposĂ©s par ViaMichelin, Amazon, Google, etc.)
- Processus « Pull» – par le client (Le client demande un service)
Cette dĂ©marche est initiĂ©e par un consommateur qui exprime le besoin pour un ou plusieurs service(s) lui permettant dâĂ©changer avec des tierces applications. Dans ce cas, le fournisseur essaie de rĂ©pondre au besoin du consommateur sans forcĂ©ment prendre en compte des perspectives de rĂ©utilisation du service. Cela s’explique par le fait que ce genre de demande se conjugue gĂ©nĂ©ralement avec des impĂ©ratifs « Time To market » imposĂ©s par le client du service.
Processus Top-Down (Le service est identifé)
Certains services de ce processus Ă©mergent dâune dĂ©marche dâurbanisation ou de refonte du SI. Le besoin dâĂ©changes est prĂ©alablement Ă©tudiĂ© et une dĂ©finition des services est proposĂ©e.
Il est vrai que cette dĂ©marche garantit une cohĂ©rence globale de lâensemble des services, nĂ©anmoins, sa mise en place sâavĂšre un challenge inintelligible dont les bĂ©nĂ©fices sont loin dâĂȘtre acquis.
Quelle démarche favoriser?
Dans l’absolu, il n’y a pas de dĂ©marche Ă favoriser en particulier. Les 3 peuvent co-exister selon le contexte et l’offre de services existante. NĂ©anmoins, en phase de conception et de mise en Ćuvre du service, il est primordial de prendre en considĂ©ration les points suivants:
1) Favoriser une démarche itérative et collaborative entre clients(s) et fournisseurs de services.
Pourquoi? Parce qu’un service est un processus dont le rĂ©sultat ne prĂ©existe pas Ă la demande du client, cela signifie que le client va devoir sâengager vis-Ă -vis dâun fournisseur avant que la service ne soit rĂ©alisĂ©e, câest-Ă -dire avant quâil puisse Ă©valuer la qualitĂ© de ce rĂ©sultat, puisque celle-ci ne pourra ĂȘtre Ă©valuĂ©e quâune fois le service rĂ©alisĂ©. Ce dĂ©calage temporel entre lâengagement de la transaction client/fournisseur et la rĂ©alisation du service crĂ©e une situation dâincertitude. DâoĂč lâimportance des mĂ©thodologies de mise en Ćuvre projet concernant ce type de besoin.
2) Penser un service donnĂ© en tant qu’offre de services, plutĂŽt qu’un mono-service qui essaie de rĂ©pondre Ă tous les besoins
3) Ne pas considĂ©rer l’Ă©tude d’urbanisation, s’il y en avait une, comme une cible en elle mĂȘme, mais plutĂŽt comme un fil conducteur pour la cible.
Suggestion d'articles :

Ces formations destinĂ©es Ă nos architectes sont la meilleure illustration de notre devise « Apprendre Ă jouer l’excellence ».
Elles sont animées par :
Elles couvrent 4 thématiques :
Le site OCTO Academy (en bĂ©ta) prĂ©sente un petit catalogue formation avec un formulaire dâinscription.
Le catalogue va s’Ă©toffer progressivement dans les mois Ă venir…
Suggestion d'articles :

A l’Ă©poque de la bulle Internet, les « brick-and-mortar » Ă©taient destinĂ©s tout simplement Ă disparaĂźtre face Ă l’Ă©mergence des « pure-players » internet. Il Ă©tait alors vital pour toute sociĂ©tĂ© « classique » souhaitant survivre de disposer d’un site web, si possible marchand. Un crack et 10 ans plus tard, nombre de pure players ont disparu, certains sont maintenant des gĂ©ants, et les « brick-and-mortars » sont bien prĂ©sents sur le marchĂ©.
Une nouvelle rĂ©volution est entamĂ©e avec la mobilitĂ© et l’ubiquitĂ© d’internet, portĂ©es en particulier par l’avĂšnement de l’iPhone et autres smartphones. Internet s’est dĂ©mocratisĂ© et l’homme de la rue a appris Ă se servir des outils que ce medium met Ă portĂ©e de sa main. La possibilitĂ© de consulter le web Ă tout moment et en toute occasion vient modifier l’importance accordĂ©e Ă ce medium. Au delĂ d’offrir un simple site marchand, il s’agit maintenant de tirer partie des synergies possibles entre ces diffĂ©rents canaux et des utilisations faites d’Internet. Le ROPO (Research Online, Purchase Offline) devient par exemple un service nĂ©cessaire pour toutes les enseignes pour attirer les clients qui souhaitent s’assurer de la disponibilitĂ© de l’article avant de se dĂ©placer ou qui ne veulent pas payer de frais de livraison.
Or du cĂŽtĂ© des anciens « brick-and-mortar », la mise en ligne d’un site marchand s’est rarement accompagnĂ©e d’une rĂ©flexion sur les relations entre le canal web et les magasins physiques. Des silos opĂ©rationnels et SI sĂ©parent souvent la gestion du site web et celle des magasins physiques. Pourtant, c’est le tissage de liens Ă©troits entre le web et le monde physique qui doit permettre non seulement d’accompagner un client sur l’ensemble de son parcours, qu’il soit sur internet ou dans la rue (et donc Ă le suivre sur diffĂ©rents canaux), ou de lui offrir de nouveaux services tels que le ROPO, mais aussi de dĂ©gager de nouvelles synergies dans les organisations. Ainsi, pour commander en magasin un article en rupture de stock et le faire livrer, l’utilisation d’une plate-forme logistique spĂ©cialisĂ©e dans l’expĂ©dition, par exemple la plate-forme adossĂ©e au site marchand, se rĂ©vĂšle plus efficace qu’une gestion des livraisons par chaque magasin.
Cette capacitĂ© Ă tirer des synergies entre les diffĂ©rents canaux de vente est un facteur de dĂ©veloppement majeur. En effet, un distributeur US, Nordstrom, a fait le calcul qu’un client « multi-canal » dĂ©pense quatre fois plus qu’un client « mono-canal » et que le recours au stock magasin pour rĂ©pondre aux ruptures de stock sur le site marchand a permis de doubler le taux de conversion des recherches en ventes (Source : article du International Herald Tribune).
Du point de vue du SI, cette capacitĂ© demande en gĂ©nĂ©ral une rĂ©volution copernicienne pour passer d’une orientation purement « produits » historique Ă une orientation « clients » et mettre en place une gestion des donnĂ©es en temps rĂ©el dans un systĂšme centralisĂ©. Elle implique donc, non seulement des projets d’organisation, mais Ă©galement des refontes majeures dans la rĂ©partition des systĂšmes d’information et dans leur mise en oeuvre, avec une gestion dĂ©licate du dĂ©ploiement de ces nouveaux outils. Elle exige Ă©galement une attention particuliĂšre Ă l’arrivĂ©e de nouveaux canaux ou Ă de nouvelles utilisations des canaux existants. Pour ce faire, le systĂšme d’information doit bien sĂ»r rester maĂźtrisĂ© mais aussi ouvert et Ă©volutif. Plus qu’adaptĂ©, on lui demande surtout d’ĂȘtre adaptable. Et sur ce dernier point, les « pure players » ont pris une longueur d’avance sur les « brick-and-mortar » aussi bien dans leurs mĂ©thodes de dĂ©veloppement que dans la gestion de leur SI…

Jâai constatĂ© Ă de nombreuses reprises que des problĂšmes de montĂ©e en charge revenaient souvent dĂšs lors quâon utilisait WCF. WCF, pour Windows Communication Foundation, est le protocole liĂ© au framework .Net qui permet la communication distante. Cela est, la plupart du temps, du Ă une vision « magique » de WCF, qui est censĂ© fonctionner tout seul, sans configuration. Sauf quâen rĂ©alitĂ©, cela ne marche pas. Voici donc quelques clefs pour comprendre comment configurer et utiliser WCF.
ConfigurationWCF possĂšde plusieurs paramĂštres de configuration qui dĂ©terminent sa maniĂšre de gĂ©rer les requĂȘtes. Une analogie qui permet de bien comprendre leur rĂŽle est celle de Theme Hospital, un jeu datant dâun certain nombre dâannĂ©es.
Parcours dâun maladeDans cette mĂ©taphore, un appel WCF est comparĂ© Ă un malade qui va se faire soigner. Tout dâabord il dĂ©termine comment se rendre Ă lâhĂŽpital, sâil y a plusieurs moyens, puis se prĂ©sente Ă lâaccueil pour crĂ©er un dossier, va ensuite en salle dâattente en attendant que soient libre Ă la fois une salle de consultation et un mĂ©decin pour le recevoir. Il va alors Ă cette consultation, qui reprĂ©sente le traitement effectif de la demande. Les diffĂ©rents Ă©lĂ©ments de ce parcours sont guidĂ©s par des paramĂštres de configuration, que nous allons dĂ©tailler.
MaxConcurrentInstanceCe paramĂštre reprĂ©sente le nombre de moyens dâaccĂšs Ă votre hĂŽpital (routes, hĂ©licoptĂšre, ambulance, tĂ©lĂ©portation,âŠ). Selon la maniĂšre dont est configurĂ© un autre paramĂštre, InstanceContextMode, la stratĂ©gie des patients sera diffĂ©rente.
Ce paramĂštre reprĂ©sente le nombre de salles de consultation, et donc le nombre de requĂȘtes quâil est possible de traiter en parallĂšle. Attention cependant, une salle de consultation sans mĂ©decin est inutile. Ce paramĂštre doit donc avoir une valeur proche de MaxConcurrentCalls, bien que lĂ©gĂšrement infĂ©rieure, afin de ne pas avoir de salle vide. Il faut Ă©galement noter que, les malades Ă©tant quelque peu Ă©litistes, ils souhaitent une salle de consultation dĂ©diĂ©e Ă eux et aux malades provenant du mĂȘme endroit. Une session est donc créée par client se connectant.
MaxConcurrentCallsCe paramĂštre reprĂ©sente le nombre de mĂ©decins. Il y en faut un peu plus que de salles de consultation, parce quâil arrive quâun mĂ©decin fasse une pause. Techniquement, cela signifie quâune fois la session créée, il faut libĂ©rer du temps processeur pour traiter lâappel, et que cela se base sur le nombre de threads allouĂ©es par le ThreadPool (sur lequel nous allons revenir). Il faut donc prĂ©voir les temps de switch et de concurrence entre threads qui peuvent conduire Ă la « pause » prise par les mĂ©decins.
MaxConnectionsCe paramĂštre reprĂ©sente la taille de la salle dâattente. Cela est quelque peu biaisĂ© dans la mesure oĂč sont comptabilisĂ©s aussi bien les malades en attente que ceux en consultation. Ainsi, lâaugmentation de ce paramĂštre fournira une plus grande possibilitĂ© de mise en tampon des requĂȘtes.
ListenBacklogCe paramĂštre reprĂ©sente le nombre de siĂšges devant lâaccueil. Les patients ne sont pas encore enregistrĂ©s auprĂšs de lâhĂŽpital et attendent quâune charmante secrĂ©taire veuille bien sâoccuper dâeux. De la mĂȘme maniĂšre que dans le monde rĂ©el, ce paramĂštre doit ĂȘtre maintenu assez bas. Le patient nâest en effet pas encore dans le systĂšme et perdra vite patience. Cela correspond Ă une connexion TCP en Ă©tat Half-open et se traduit par un timeout assez court au niveau du systĂšme. Augmenter ce paramĂštre conduit donc simplement Ă dĂ©layer la remontĂ©e dâerreur au client, et Ă changer la nature de lâerreur qui passe de « il nây a plus de place » à « jâai attendu trop longtemps », ce qui complique le dĂ©bogage.
PrĂ©conisationsBien quâil soit impossible de donner des valeurs idĂ©ales pour ces paramĂštres, puisquâelles dĂ©pendent bien Ă©videmment du contexte applicatif, il est possible de donner des relations entre ces paramĂštres :
Ă part pour ce dernier, il est Ă noter que sur dimensionner les paramĂštres nâa que trĂšs peu dâinfluence sur les performances. En effet, il sâagit de maximums, le systĂšme ne crĂ©ant les ressources quâĂ la demande. Il faut cependant tenir compte des pics de communication, afin dâĂ©viter que la crĂ©ation et le maintien des ressources liĂ©es Ă WCF ne prenne tout le temps de processeur disponible.
Autres Ă©lĂ©ments ThreadPoolTout est configurĂ©, les paramĂštres sont bons, et pourtant, cela ne fonctionne toujours pas ? Normal, vous nâavez pas assez de threads dans votre ThreadPool. Avec lĂ encore, lâeffet baguette magique, qui pousse Ă croire que le ThreadPool va fonctionner pour vous dans sa configuration par dĂ©faut. Pour comprendre lâinfluence du ThreadPool, il faut savoir que dâune part, chaque appel WCF est traitĂ© dans un thread dâI/O asynchrone, gĂ©rĂ©e par le ThreadPool, et dâautre part, que le ThreadPool Ă un fonctionnement particulier.
En effet, lâobjectif ultime du ThreadPool, sa raison dâĂȘtre, est dâamener ou de ramener le nombre de worker threads et de thread dâI/O asynchrones Ă son idĂ©al, qui est par dĂ©faut Ă©gal au nombre de cĆurs logiques de la machine. Par ailleurs, il est cadencĂ© Ă 500ms, et obĂ©it Ă lâalgorithme suivant :
Sur un appel : Si nombre_de_threads < idéal Alors créer un thread Sinon mettre en attente Sur déclenchement du timer interne (500ms) Si il y a au moins un demande en attente Alors créer un thread Sinon supprimer un thread
Pour illustrer son fonctionnement, prenons un cas dâĂ©cole. Imaginons que chacune de vos threads peut traiter 10 appels par 500 ms, que vous recevez 50 appels par 500 ms et que vous avez 2 cĆurs. On obtient le graphe suivant :
Figure 1 Ăvolution des traitements WCF dans le temps
On sâaperçoit que le fonctionnement du ThreadPool le fait osciller autour de lâidĂ©al. Dans la pratique, le ThreadPool Ă©tant optimisĂ©, on finit par arriver Ă lâidĂ©al de traitement (dans notre cas, 5 threads), mais on sâaperçoit que cela peut prendre du temps et que, pendant cette pĂ©riode de âcalibrationâ, les requĂȘtes entrantes peuvent patienter un temps trĂšs long, au point mĂȘme parfois de dĂ©clencher des timeouts.
La solution consiste Ă rĂ©gler manuellement lâidĂ©al du ThreadPool. Cela se fait par lâappel Ă la mĂ©thode System.Threading.ThreadPool.SetMinThreads, en dimensionnant les paramĂštres de lâappel en fonction de la capacitĂ© de traitement de vos services WCF. Attention cependant Ă ne pas trop relever ce paramĂštre, puisque cela conduit Ă la crĂ©ation de nombreux threads, ce qui peut ĂȘtre dommageable (temps de switch + taille mĂ©moire de chaque thread)
Dans la pratique, ce nombre est largement supĂ©rieur au nombre de cĆurs logiques de la machine. Il ne faut donc pas hĂ©siter Ă monter jusquâĂ une cinquantaine de threads par cĆurs, sans que cela nâimpacte rĂ©ellement les performances, tout en gardant en tĂȘte que le dimensionnement idĂ©al est « au plus juste » et se dĂ©couvre par essais successifs.
ConclusionIl nây a pas de baguette magique ! MĂȘme si WCF est plus simple Ă utiliser que ses ainĂ©s, il demeure cependant quâil faut savoir le configurer correctement afin dâen tirer le plein potentiel.

Dans les projets agile, on utilise souvent des dashboards ou des tableaux Kanban. On les retrouve, soit sous forme de Post-its au murs :

soit sous forme électronique :
image de kanban electronique est une image de greenhopper prise sur http://www.atlassian.com/software/greenhopper/
La forme électronique présente plusieurs avantages :
- pas de post-its qui se décollent
- possibilitĂ© d’interagir entre Ă©quipes distantes
- possibilitĂ© de suivre automatiquement le temps de rĂ©alisation d’une tache
- etc.
Mais on leur reproche de perdre au moins deux gros intĂ©rĂȘts :
1) Ătre visible Ă tout moment par l’Ă©quipe
2) Pouvoir interagir directement avec les Post-Its
Un simple vidéo-projecteur peut suffire a résoudre le premier point.
Le deuxiÚme semble plus compliqué, la vidéo suivante vous montre le contraire.
Suggestion d'articles :

Aujourdâhui les grands groupes industriels font face Ă une multiplication des solutions de gestion dans leurs filiales avec un constat, plus on sâĂ©loigne du centre et plus les solutions se font hĂ©tĂ©rogĂšnes et exotiques. Ces diffĂ©rentes solutions vont de SAP, leader du marchĂ© pour lequel les processus sont presque gravĂ©s dans le code jusqu’Ă un simple ensemble dâoutils de bureautique : un tableur pour suivre les commandes et un Ă©diteur de texte pour Ă©mettre des factures. Entre ces deux extrĂȘmes il existe quelques acteurs majeurs : Oracle EBS, SAGE, NAVISION… et de nombreux Ă©diteurs locaux.
Comment rationaliser un écosystÚme aussi diversifié ?
Au niveau du groupe les gains dâune solution uniforme sur lâensemble des entitĂ©s sont Ă©vidents :
Dâun autre cotĂ©, les filiales en devenir veulent ĂȘtre capables dâĂ©voluer rapidement sans ĂȘtre contraintes par un outil mais en ayant la possibilitĂ© dâinformatiser un processus qui Ă©merge de leur organisation. Et cela passe donc par des choix diffĂ©rents de ce qui est proposĂ© par la maison mĂšre. Il sera souvent prĂ©fĂ©rĂ© une solution ERP intermĂ©diaire au core model pour de nombreuses raisons dont :
Ces points se rĂ©sument Ă un choix entre simplicitĂ© et complexitĂ© qui est proposĂ© par le centre. Or le coeur est complexe parce quâil est riche et cette richesse est intrinsĂšquement lourde, ce qui est un atout au centre mais deviendra un frein dans les jeunes filiales.
Certains Ă©diteurs essaient de pallier Ă cette problĂ©matique en proposant des solutions distinctes pour des BU de tailles diffĂ©rentes, c’est le cas par exemple avec SAP Business One, mais ce modĂšle ne fonctionne pas. Les synergies entre les solutions sont dĂ©truites au fur et Ă mesure que lâon essaie dâadresser les besoins de lâune ou lâautre des cibles.
Alors comment faire ? Et surtout, comment bien faire ?
A lâapproche top-down qui dĂ©finit une cible au centre, nous allons prĂ©fĂ©rer lâapproche bottom-up. Construire une application qui rĂ©ponde aux besoins des petites entitĂ©s, puis augmenter le pĂ©rimĂštre avec des entitĂ©s plus importantes jusquâĂ rejoindre le core model⊠peut-ĂȘtre.
Nous allons donc nous inspirer de la méthodologie agile, itérative, pour construire le coeur de cet ERP de façon incrémentale.
La base doit ĂȘtre acceptable par de toutes petites structures et solide afin de pouvoir grandir. Pour cela les critĂšres de choix vont ĂȘtre les suivants :
Câest donc naturellement que nous allons chercher des candidats du cotĂ© des projets open source matures : OpenERP, Compiere, Neogia, ERP5…. Souples et robustes, ils sont modulaires ce qui est l’empreinte dâun dĂ©veloppement communautaire au niveau de lâarchitecture logicielle. Cette modularitĂ© est la garantie dâune Ă©volutivitĂ© future. De plus, les projets open source nous apportent des technologies ouvertes et standardisĂ©es facilitant lâintĂ©gration avec dâautres systĂšmes.
Et câest un point important, lâapproche dâOCTO nâest pas de crĂ©er un second core model dĂ©corĂ©lĂ© du centre, en concurrence avec le centre. Il sâagit de rĂ©aliser un systĂšme qui soit potentiellement une marche vers le systĂšme central, une marche qui rapproche du centre. Ainsi cette solution apporte de la valeur Ă la filiale ET au centre.
Le choix dâune approche incrĂ©mentale pour la rationalisation du SI est diffĂ©renciante dans le sens oĂč il sâagit dâaccompagner la crĂ©ation de valeur depuis le dĂ©but dâune activitĂ©. Le systĂšme qui va ĂȘtre implĂ©mentĂ© doit aider lâorganisation cible sur un cycle court en terme de rĂ©alisation de « business » et sur un cycle long en lâaidant Ă sâintĂ©grer dans le core model du centre. Et ceci de façon progressive. La mĂ©thode agile va nous permettre de faire Ă©voluer en douceur l’ERP retenu vers les limites fixĂ©es : couvrir X% des processus, supporter une charge maximum de X utilisateurs…
Bien que les notions d’ERP et d’agilitĂ© puissent paraĂźtre antinomiques, il s’avĂšre possible de profiter du meilleur des deux mondes dans ces projets souvent rĂ©putĂ©s pour ĂȘtre trĂšs lourds Ă cadrer, Ă rĂ©aliser et Ă mettre en oeuvre.
Dans un prochain article, nous verrons comment aborder ce type de projet dâun point de vue organisationnel et fonctionnel. Les projets ERP forment intrinsĂšquement un ensemble de fonctionnalitĂ©s fortement imbriquĂ©es et nous verrons comment, avec une approche agile / incrĂ©mentale, nous allons pouvoir segmenter ces projets dans des livraisons frĂ©quentes et fonctionnelles apportant de la valeur aux mĂ©tiers rĂ©guliĂšrement.
Suggestion d'articles :

La communautĂ© « DevOps » nous invite Ă repenser la frontiĂšre classique de nos organisation, sĂ©parant d’un cĂŽtĂ© les Ă©tudes, i.e. ceux qui Ă©crivent le code (le âBuildâ) et de l’autre cĂŽtĂ© la production, i.e. ceux qui dĂ©ploient et exploitent ces applications (le âRunâ).
2 groupes se retrouvent dans le mouvement DevOps et apportent un peu de fraicheur dans ces réflexions aussi anciennes que les DSIs :
Au delà des fractures organisationnelles, les préoccupations des études et de la production sont bien distinctes et respectivement louables.
Les Ă©tudes recherchent plus de rĂ©activitĂ© (sous la pression du mĂ©tier et du marchĂ© notamment) : il faut aller vite, ajouter de nouvelles fonctionnalitĂ©s, rĂ©adapter les directions, refactorer, upgrader les frameworks, dĂ©ployer rapidement pour tester…La nature mĂȘme du code (âSoftâ) est celle ci : malĂ©able, adaptable.
A lâinverse, la production a besoin de stabilitĂ© et de standardisation. StabilitĂ© car il est souvent difficile dâanticiper quels impacts auront telles modifications de lâinfrastructure : un disque local qui devient un disque rĂ©seau mais impacte les temps de rĂ©ponses, ou bien un changement de code qui impacte fortement la consommation CPU et par la mĂȘme le âcapacity planningâ. Standardisation enfin car la production veut sâassurer que certaines rĂšgles (sĂ©curitĂ© rĂ©seaux, configuration des fichiers de logs…) sont uniformĂ©ment respectĂ©es.
TrĂšs souvent, la frontiĂšre entre ces deux populations se concrĂ©tise par la phase de dĂ©ploiement oĂč les Ă©tudes âlivrentâ ou parfois se « dĂ©barrassent » de leur code et oĂč ce dernier va suivre un long chemin au travers des couloirs de Mise En Production. Et ce point prĂ©cis cristallise la divergence dâobjectifs. Les Ă©tudes voudraient la main sur une partie de lâinfrastructure, pouvoir dĂ©ployer rapidement, Ă demande et simplement sur les environnements (a minima ceux de âtestsâ au sens large). A lâinverse, la production a le souci des environnements, de lâutilisation des ressources, de la consommation de bande passante et de la fiabilitĂ© en gĂ©nĂ©ral. Ce que veut la production : des fichiers de log standards, une configuration du serveur HTTP identique…
Sauf que ces deux groupes ont un objectif commun : faire fonctionner le systĂšme…et finalement le dĂ©ploiement nâest pas le plus important dans cette problĂ©matique mĂȘme si câest certainement une des activitĂ©s les plus consommatrices en ressource : la moitiĂ© du temps de la production est ainsi consommĂ©e par le dĂ©ploiement ou des problĂšmes liĂ©s au dĂ©ploiement.

Câest donc certainement le premier levier dâamĂ©lioration mais non lâunique. Damon Edwards et John Allspaw nous rappellent :
Atteindre cet objectif ne se fera pas sans douleur et trouve des leviers dâamĂ©lioration dans 4 axes :
En dĂ©finitive ces 4 axes nous permettront d’atteindre les objectifs supĂ©rieurs de DevOps : amĂ©liorer la collaboration, la confiance et l’alignement d’objectifs entre les Ă©tudes et la production.

DĂ©velopper en Groovy et Grails simplifie grandement le dĂ©veloppement d’une application Web. PassĂ©e l’Ă©tape du prototype, les simplifications apportĂ©es par Grails ne vous Ă©pargneront pas de devoir vous plonger dans les frameworks sous-jacents afin de rĂ©soudre des problĂ©matiques plus complexes.
Qu’en est-il des transactions en Grails ? Sur un sujet aussi sensible, il est important de comprendre quel est ce comportement par dĂ©faut choisi par Grails.
La documentation de Grails est un peu sommaire, ne traitant vraiment que de oĂč et comment les dĂ©clarer mais pas vraiment de comment les utiliser. Les premiers points ne seront pas rĂ©-expliquĂ©s ici, vous pouvez vous rĂ©fĂ©rer Ă la documentation.
L’article complet, en anglais uniquement, aborde les points suivants :
Vous pouvez retrouver le code et les tests mentionnés dans cet article dans notre repo SVN .
Suggestion d'articles :

Dernier article de la sĂ©rie consacrĂ©e aux services web AMAZON, celui-ci se veut avant tout un retour d’expĂ©rience.
Alors AWS ?Pour rappel dans lâĂ©tude menĂ©e, nous devions Ă©tudier lâoffre dâAMAZON sur trois axes : facilitĂ© de mise en Ćuvre, coĂ»ts et montĂ©e en charge.
Lâapplication que nous avons dĂ©ployĂ©e repose sur un certain nombre de services AWS. Sans rentrer dans les dĂ©tails, lâapplication de test assurait les fonctions suivantes :
Pour répondre à ces besoins, nous avons utilisé les services AMAZON suivants :
De nombreux services AWS (CloudFront, SimpleDB, VirtualPrivateCloud âŠ) nâont pas Ă©tĂ© mis en oeuvre. NĂ©anmoins, nous pouvons tirer les conclusions suivantes pour ceux utilisĂ©s :
Le calcul des coĂ»ts par anticipation est quelque chose dâassez complexe, câest sans doute pourquoi AMAZON propose dâutiliser un outil pour vous aider. La tarification se fait par service mais pour la plupart des services, la bande passante utilisĂ©e intervient dans le calcul du prix. Qui plus est, ces donnĂ©es qui traversent les firewalls des data centers dâAMAZON ont des tarifs dĂ©gressifs en fonction de leur volumes !
Attardons nous sur cette notion de données entrantes et sortantes des data centers.
Eléments ayant un impact sur le prix
Sans rentrer dans la tarification détaillée des AWS, voici quelques indications
Cette complexitĂ© tarifaire impose dâavoir une grande connaissance de lâapplication qui va ĂȘtre dĂ©ployĂ©e. Cela peut ne pas poser de trop gros problĂšmes dans le cas dâune application existante, dĂ©jĂ en exĂ©cution au sein dâun SI interne puisque lâobtention de mĂ©trique pourra se faire par une instrumentation sommaire si elle nâest pas dĂ©jĂ faite. En revanche, dans le cas dâune conception « from scratch » cela peut ĂȘtre moins aisĂ©. En outre, on notera que la tarification peut impacter les choix dâarchitecture : comment grouper les services au sein dâune mĂȘme rĂ©gion pour les limiter les coĂ»ts tout en ayant un dĂ©ploiement sur plusieurs sites ? Quelle granularitĂ© pour les messages SQS sachant que la facturation est faite par requĂȘte ? âŠ
Pour conclure cette partie, comme soulignĂ© dans lâarticle suivant, il est clair que comparĂ©e Ă une solution dâhĂ©bergement classique, une offre dâIaaS comme celle d’AMAZON nâest pas avantageuse si lâon souhaite exĂ©cuter des instances en permanence. La vraie force de lâIaaS, câest lâĂ©lasticitĂ©, le dimensionnement automatique pour suivre la montĂ©e en charge.
MontĂ©e en chargeCe point Ă©tait lâun des plus important pour notre Ă©tude. Le service AutoScaling fourni par AMAZON fonctionne correctement : lorsque les critĂšres sont atteints la taille dâun groupe de machines.
NĂ©anmoins, il est important de souligner que la pĂ©riode selon laquelle un groupe dâinstances EC2 est dimensionnĂ©, doit ĂȘtre dĂ©terminĂ©e avec attention, au risque de lancer de multiples instances et donc de voir les coĂ»ts sâenvoler. Supposons quâun site web ait une courbe dâutilisation qui associĂ©e Ă certains paramĂštres dâAutoScaling (typiquement la pĂ©riode de dimensionnement dâune heure) produise le diagramme de vie des instances EC2 suivant :
Diagramme de vie des instances
Ainsi, nous aurons consommĂ© : 12 heures pour lâinstance 1, 6 heures pour lâinstance 2, 4 heures pour lâinstance 3 et 2 heures pour les instances 4, 5 et 6. Soit un total de 28 heures machines.
Supposons maintenant que lâĂ©chelle de temps du graphique prĂ©cĂ©dent ne soit pas lâheure, mais la minute. Nous avons alors 6 heures machines Ă payer â car chaque heure consommĂ©e est pleinement facturĂ©e â pour seulement 12 minutes de fonctionnement. Notons au passage que 4 instances auraient suffi. Cet exemple s’applique sur quelques minutes et quelques machines, imaginons maintenant que cela concerne des dizaines de machines pendant une annĂ©e…
Dans une premiĂšre approche, on souhaite disposer dâun systĂšme trĂšs rĂ©actif et donc dâune pĂ©riode de dimensionnement trĂšs courte - de lâordre de quelques minutes. Or ce choix peut sâavĂ©rer ruineux.
DoncTout dâabord, et câest positif, AMAZON WS existe depuis un certain temps et fonctionne bien : aucun plantage ou message dâerreur, une documentation claire et une communautĂ© importante font quâil est assez agrĂ©able de travailler sur lâinfrastructure AMAZON. Par ailleurs la portabilitĂ© est lĂ Â : envie de rapatrier l âapplication chez vous ? Câest faisable.
Par ailleurs, le cotĂ© âinfraâ plus que âappliâ peut avoir son importance dans le choix du fournisseur car contrairement Ă GOOGLE qui annonce : « ne vous inquiĂ©tez pas, nous gĂ©rons votre appli », AMAZON donne les outils pour gĂ©rer et maitriser son soft : nous savons oĂč sont les machines, les donnĂ©es, nous avons la possibilitĂ© de rester maĂźtre de notre soft. Le revers de la mĂ©daille est la quantitĂ© de facteurs Ă gĂ©rer.
Le premier de ces facteurs est la rĂ©activitĂ© de lâĂ©lasticitĂ©. Cette Ă©lasticitĂ© est la raison dâĂȘtre du cloud computing IaaS, sinon autant aller chez un hĂ©bergeur. Voulez-vous dimensionner votre infrastructure toutes les 10 minutes, toutes les heures ou bien tous les jours ? La rĂ©ponse Ă cette question passe par une maĂźtrise avancĂ©e de lâapplication Ă dĂ©ployer.
Par ailleurs, et câest aussi vrai pour Microsoft et GOOGLE, les diffĂ©rents Ă©lĂ©ments Ă prendre en compte pour une estimation budgĂ©taire et plus spĂ©cifiquement les volumes de donnĂ©es entrants et sortants des data centers AMAZON, nĂ©cessitent une maitrise de la volumĂ©trie de  son application. LâidĂ©al Ă©tant une application existante quâil ne reste plus qu’Ă outiller. En outre, lâaspect financier (volumĂ©trie, nombre de requĂȘtes âŠ) peut impacter lâarchitecture de lâapplication.
AMAZON est la solution si il sâagit de faire une externalisation dâinfra privĂ©e vers le Cloud â normal puisquâil nây a presque rien Ă faire ! Pour du dĂ©veloppement from scratch, AMAZON se prĂȘte mieux Ă du web-service, du batch ou du site web statique lĂ ou on peut supposer que GOOGLE et MICROSOFT sont meilleurs pour des applis web, mais attention dans ce cas aux problĂšmes de portabilitĂ©. Rien ne vous empĂȘche de dĂ©ployer une archive WAR sur un TOMCAT au sein dâune instance EC2 mais le niveau dâabstraction offert par les solutions GOOGLE et MICROSOFT permet de faciliter grandement le dĂ©ploiement, vous avez beaucoup moins de questions Ă vous poser. Par ailleurs, il est tout Ă fait possible dâintĂ©grer AMAZON avec une autre solution.
Pour terminer, il faut garder Ă lâesprit que les choses Ă©voluent trĂšs vite dans le monde du Cloud Computing. Ainsi, GOOGLE supporte maintenant le SQL pour les App Engine Business alors que le principal point nĂ©gatif de GAE Ă©tait son systĂšme de Base de DonnĂ©es non SQL.
De mĂȘme lâoffre AMAZON a encore Ă©voluĂ© entre la fin du projet prĂ©sentĂ© ici (mars 2010) et la rĂ©daction du prĂ©sent document (Juin 2010) : le service de load balancing gĂšre les sessions http (sticky-sessions) tandis que cloud front supporte le protocole HTTPS
Suggestion d'articles :

Le concours sâest terminĂ© dĂ©but juillet et les gagnants ont Ă©tĂ© dĂ©signĂ©s lors dâune session USI 2010 dĂ©diĂ©e au challenge (voir vidĂ©o).
Le jury du Green Challenge était composé de :
Il a désigné 3 équipes lauréates :
Ces Ă©quipes ont rĂ©ussi Ă faire baisser la consommation en Watts de lâapplication de 20% cĂŽtĂ© serveur (Google App Engine), et de 80% cĂŽtĂ© navigateur (mesure par l’AddOn GreenFox).
Les graphiques suivants prĂ©sentent les Ă©conomies en Watts qu’ils ont rĂ©ussi faire au travers de leur application. Leurs rĂ©sultats sont comparĂ©s Ă ceux de l’application de rĂ©fĂ©rence livrĂ©e au dĂ©but du challenge. Il y a un facteur 100 entre les unitĂ©s de mesures de GreenFox et celle d’AppEngine. Le gain maximum Ă©tait donc obtenu en travaillant sur la partie client de l’application.
Les Green Patterns
Les Green Patterns issues du Challenge sont présentées en détail dans cette page. Voici une synthÚse rapide :
Nous allons publier GreenFox, lâAddOn Firefox dĂ©veloppĂ© pour mesurer les consommations CPU, dans lâĂ©cosystĂšme Mozilla.
Nous aimerions diffuser les Green Patterns.
Votre aide est la bienvenue pour relayer lâinformation et pointer vers cette page.
Et si vous connaissez un site communautaire pertinent pour les publier, nous sommes preneurs…
Suggestion d'articles :

L’Ă©dition USI Paris 2010, qui a eu lieu au Pavillon d’Armenonville les 1er et 2 juillet derniers, est certes terminĂ©e….
Mais les premiers Webcasts sont enfin disponibles !
Participants USI et lecteurs du blog OCTO vous pouvez maintenant revivre les sessions et les keynotes USI en allant sur le site de l’Ă©vĂ©nement : www.universite-du-si.com
Suggestion d'articles :

Afin de tester nos dĂ©veloppements iPhone nous utilisons largement les frameworks Google-Toolbox-for-Mac et OCMock (cf Tests unitaires et tests dâinterface sur iPhone : Ătat des lieux)
AprĂšs la mise Ă jour du SDK4 et le passage Ă Xcode 3.2.3 nous avons eu une dĂ©sagrĂ©able surprise : nos frameworks de tests ne compilaient plus et jusqu’Ă aujourd’hui on trouve trĂšs peu d’information sur la façon de rĂ©gler ce problĂšme.
Voici comment nous nous y sommes pris :
L’erreur de build rencontrĂ©e est la suivante :
Undefined symbols:
"_OBJC_CLASS_$_OCMockObject", referenced from:
objc-class-ref-to-OCMockObject in WebServiceTest.o
ld: symbol(s) not found
Jusqu’Ă maintenant nous ajoutions la bibliothĂšque OCMock.framework Ă la phase de build « Link Binary With Libraries ». Il semble que l’on ne peut plus utiliser la version prĂ©compilĂ©e du Framework disponible dans la section tĂ©lĂ©chargement du site dâOCMock.
Pour faire fonctionner OCMock avec Xcode 3.2.3 vous devez :
Vous buildez Ă nouveau et… rien ne se passe.
Apres OCMock c’est maintenant le script de Google-Toolbox-for-Mac qui reste bloquĂ© indĂ©finiment sur cette erreur :
SBSetAccelerometerClientEventsEnabled failed: (ipc/
send) invalid destination port
LĂ encore la solution est de rĂ©cupĂ©rer les sources de GTM sur le trunk du repository, puis de remplacer tous les fichiers nĂ©cessaires aux tests iPhone comme indiquĂ© dans le guide d’installation :
http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting
Maintenant vous pouvez enfin relancer vos tests !
Suggestion d'articles :

Les grands acteurs de lâInternet font souvent le âpari de la confianceâ en proposant des API ouvertes, accessibles depuis le Web. Ces APIs permettent Ă dâautres acteurs, entreprises ou dĂ©veloppeurs indĂ©pendants, dâinnover en les exploitant, et dâinventer de nouveaux modĂšles Ă©conomiques.
On peut citer en exemple les plateformes suivantes : Google Maps API, Facebook Graph API, SalesForce AppExchange, Twitter API, etc. Et plus prĂšs de nous, il existe des Ă©cosystĂšmes issus dâacteurs français : Mappy API, Netvibes UWA, Nabaztag API, etc.
Cette dĂ©marche permet la constitution dâun Ă©cosystĂšme fĂ©cond, tant pour l’entreprise qui met Ă disposition les APIs, que pour celles qui les exploitent. Cette mise Ă disposition permet en particulier de :
Marc Andreessen (ancien fondateur de Netscape) distingue 3 types de plateformes ouvertes (voir ce billet) :
Il est clair que lâinvestissement du fournisseur de lâAPI va croissant du niveau 1 au 3. Il est donc frĂ©quent de commencer au niveau 1, avant dâenvisager les niveaux supĂ©rieurs.
Lâoutillage destinĂ© aux dĂ©veloppeursLe succĂšs dâun Ă©cosystĂšme ouvert est fortement dĂ©pendant de l’enthousiasme des dĂ©veloppeurs. Pour les conquĂ©rir, il est crucial de leur fournir un langage facile Ă prendre en main et, si possible, des outils de productivitĂ©.
CĂŽtĂ© langage, il existe un large consensus autour des APIs REST/JavaScript, simples Ă prendre en main, et adaptĂ©es Ă des dĂ©veloppeurs connaissant mal les langages objets. Exemples : API Google, Yahoo, Mappy, etc. Proposer un langage simple est particuliĂšrement recommandĂ© aux nouveaux entrants qui nâont pas le pouvoir de persuasion dâApple (qui a rĂ©ussi Ă convaincre des milliers de dĂ©veloppeurs de se former Ă ObjectiveC…).
Pour ce qui concerne lâoutillage, on peut distinguer 3 niveaux dâoffres :
Là encore, le niveau 3 représente un investissement beaucoup plus conséquent que le 1 ou le 2.
Le lancement de la communautĂ©La publication dâune documentation claire, simple Ă prendre en main, et dâexemples de code rĂ©utilisables est incontournable pour satisfaire les dĂ©veloppeurs. Lâanimation de la communautĂ© passe aussi par la mise en oeuvre de forums de discussions et autres outils participatifs (par exemple, ZenDesk).
Il peut ĂȘtre intĂ©ressant de se raccrocher Ă une communautĂ© existante plutĂŽt que dâen crĂ©er une Ă partir de rien. Par exemple, Android a recrutĂ© dans les communautĂ©s Java.
Enfin, il est classique dâorganiser un concours avec des prix Ă la clef, pour initier le mouvement communautaire. Voir par exemple, lâAndroid Developer Challenge.
Un dernier point est essentiel : le modĂšle dâaccĂšs aux APIs. Certaines plateformes nĂ©cessitent une inscription prĂ©alable Ă leur usage (câĂ©tait le cas pour Google Maps jusquâĂ mai 2010). Dâautres plateformes vont mĂȘme jusquâĂ valider les applications dĂ©veloppĂ©es (câest le cas de la trĂšs polĂ©mique validation par Apple des applications iPhone).
Je pense quâimposer le minimum de contraintes aux dĂ©veloppeurs est un signe trĂšs positif, Ă mĂȘme de crĂ©er un climat de confiance, et dâĂ©largir la communautĂ©. La modĂ©ration Ă postĂ©riori me parait ĂȘtre la meilleure pratique.
Comment démarrer ?Il est relativement simple de démarrer avec une plateforme / un outillage de niveau 1. Par exemple, la Ville de Rennes a récemment lancé une expérimentation en ouvrant des API sur les données de ses transports publics.
On pourra ensuite monter en puissance de maniÚre itérative vers une plateforme de niveau 2/3 et un outillage plus avancé.
Je vous propose quelques pistes par secteurs dâactivitĂ©. Ces pistes sont largement issues de mes envies en tant quâutilisateur :
Alors, quand pensez-vous lancer votre écosystÚme ouvert ?

Depuis les 5 derniĂšres annĂ©es, on assiste Ă une intensification de l’usage des Nouvelles Technologies de lâInformation et de la Communication (NTIC) dans le monde professionnel : tĂ©lĂ©phonie mobile, courrier Ă©lectronique, plateformes collaboratives, partage documentaire en ligne, solutions de messageries instantanĂ©es, AccĂšs internet mobile, voix sur IP, etc. Tout cela a Ă©tĂ© possible grĂące Ă la gĂ©nĂ©ralisation et la banalisation de la connexion internet et Ă la standardisation et la modernisation des rĂ©seaux filaires et sans fil (wifi, Bluetooth, connexion internet 3G, etc.).
Conscientes de lâimportance de ces technologies et outils, la plupart des entreprises se sont pressĂ©es Ă les adopter, chacune Ă son rythme, et ses besoins, offrant aux collaborateurs de nouveaux canaux de communication et dâĂ©changes. LâarrivĂ©e de solutions mobiles et de systĂšmes dâexploitation Ă interfaces ergonomiques (iPhone, Ipad, Android, Windows Mobile, etc.) dote les technologies de lâinformation et de la communication dâun bel avenir.
Par ailleurs, les NTIC constituent un facteur dâĂ©volution des rapports sociaux, des emplois et des mĂ©tiers. Elles accompagnent une sĂ©rie de transformations concernant la stratĂ©gie de lâentreprise, lâorganisation du travail, les formes de management, la concertation et la nĂ©gociation.
Cet article porte sur le positionnement des NTIC, ses apports et ses impacts sur l’entreprise et sur la vie quotidienne des collaborateurs et lâenvironnement de travail. Il donne Ă nos dĂ©cideurs (DSI, R&D, stratĂ©gie, marketing, etc) une premiĂšre grille de lecture leur permettant de viser la bonne politique NTIC Ă adopter en adĂ©quation avec l’histoire et la culture de l’entreprise et un aperçu des challenges Ă relever aujourd’hui et demain.
NTIC et l’ « Entreprise » OpportunitĂ©s 1) Augmenter la rĂ©activitĂ© de lâentrepriseLes outils de communication permettent lâaccĂšs Ă lâinformation Ă tout moment, Ă tout endroit. La multiplication des canaux de communication (tĂ©lĂ©phone, connexion internet mobile, messagerie) Ă la portĂ©e des diffĂ©rents collaborateurs, dote lâentreprise dâune capacitĂ© de rĂ©activitĂ© non nĂ©gligeable face aux besoins de plus en plus oppressants du marchĂ© et des clients. Cela permet Ă lâentreprise de rĂ©pondre Ă des opportunitĂ©s et des demandes, de conclure des contrats en un temps optimal grĂące Ă lâaccessibilitĂ© des collaborateurs Ă lâinformation et aux donnĂ©es dâaide Ă la dĂ©cision (disponibilitĂ© des ressources, niveaux stocks, seuils de rentabilitĂ©, etc.) leur permettant de prendre les bonnes orientations.
2) Communication peu onĂ©reuse mais porteusePlusieurs solutions ont vu le jour permettant Ă nâimporte qui de communiquer et Ă©changer plus facilement ses idĂ©es. En plus du site internet institutionnel, de plus en plus dâentreprises proposent des outils communautaires rapprochant collaborateurs et internautes.
Les objectifs sont multiples :
Cela dit, ce canal de communication permet aussi de tester des concepts, comme le Customer Driven Design ou le Crowd Sourcing privilĂ©giant lâouverture de lâentreprise vers lâextĂ©rieur via des pratiques bottom-up quâinternet va continuer Ă favoriser. Dans ce registre, vous pouvez apprĂ©cier par exemple lâinitiative innovante dâAsus concernant ses produits du futur wepc, qui a mis Ă disposition des utilisateurs un site internet trĂšs novateur leurs permettant d’exprimer leurs imaginations et leurs besoins pour les futurs produits.
3) Formalisation du savoir faireLes outils collaboratifs et de gestion des connaissances (wiki, blog, etc.) permettent de formaliser le savoir-faire, son partage et sa transmission. Un Ă©norme de gain de temps et dâefficacitĂ© permettant dâaugmenter la rĂ©activitĂ© et la rentabilitĂ© de lâentreprise.
RisquesMais ces opportunités définies précédemment, comme les usages évoqués en premiÚre partie, font ressortir des inquiétudes et des risques variés.
1) Changements incessants et Ă©volutifs du cĆur de mĂ©tier de lâentrepriseIl y a quelques annĂ©es, lâinformation au sens large Ă©tait moins prĂ©sente sur internet. En mĂȘme temps lâaccĂšs Ă cette information Ă©tait moins gĂ©nĂ©ralisĂ©. Aujourdâhui, avec la gĂ©nĂ©ralisation de la connexion internet et la multiplication des sites dâĂ©change dâexpĂ©rience, dâidĂ©e, de solutions techniques, on assiste Ă lâexplosion des sources dâinformation et la facilitĂ© Ă y accĂ©der. ĂnormĂ©ment dâentreprises voient leurs mĂ©tiers changer ou se transformer au fil du temps se sentant de plus en plus oppressĂ©es Ă sâadapter pour survivre. Quelques exemples de domaines les plus marquants : LâĂ©dition papier, la distribution, le conseil au sens large, etc.
La R&D, lâinnovation, lâexpĂ©rience, la veille concurrentielle deviennent les maĂźtres mots pour survivre
2) Exposition Ă la concurrenceAvec lâexplosion des blogs et le partage du contenu avec les internautes, la veille concurrentielle nâa jamais Ă©tĂ© aussi facile. Toute diffĂ©rentiation sur un domaine donnĂ© peut ĂȘtre facilement copiĂ©e, ce qui nĂ©cessite de lâentreprise des efforts financiers lourds et une diffĂ©rentiation de lâoffre produits/services plus marquĂ©e afin de garder une longueur dâavance sur les concurrents.
3) Exposition au pillageUn risque qui peut nous paraĂźtre improbable mais reste tout de mĂȘme important Ă mentionner concerne la confidentialitĂ© et la sĂ©curitĂ© des donnĂ©es de lâentreprise. Les diffĂ©rents canaux (web, terminaux mobiles dont on dispose) multiplient les risques de pillage et le piratage des donnĂ©es. Il serait important par exemple de dĂ©finir diffĂ©rentes politiques de sĂ©curitĂ© selon la criticitĂ© de la donnĂ©e pour l’entreprise.
4) Risque de baisse de la productivitĂ©MĂȘme si ses outils augmentent la rĂ©activitĂ© de lâentreprise, leur multiplication excessive risque dâengendrer Ă lâĂ©chelle de lâentreprise une baisse de son rendement : rĂ©daction excessive de courriers et de messages Ă©lectroniques, alimentation de divers outils de lâentreprise (blog, wiki, outils de reporting, etc.), navigation prolongĂ©e sur internet, etc. Des campagnes de sensibilisation et de communication ne pourraient-elles pas ĂȘtre suffisantes pour limiter ce risque sans franchir la frontiĂšre de la rĂ©pression et la restriction Ă l’usage?
5) Risque de bouleversement des relations hiĂ©rarchiquesLa gĂ©nĂ©ration dâindicateurs de performance et de rentabilitĂ© en temps rĂ©el, accessibles peu importe le lieu et lâheure risque de rythmer la relation entre managers et collaborateurs vers le meilleur comme vers le pire.
NTIC et l’ « Individu » OpportunitĂ©s 1) Acquisition facile du savoir et de lâinformationDâun point de vue individuel, tous ces outils permettent aux collaborateurs dâavoir plus dâautonomie dans la rĂ©alisation de leur travail au quotidien et un accĂšs facilitĂ© Ă lâinformation. On assiste vraiment Ă la dĂ©mocratisation du savoir, quelque soit la formation de lâindividu et ses diplĂŽmes. Seul le manque dâinitiative personnelle peut ĂȘtre un frein.
2) LibertĂ© du collaborateurPlus besoin dâĂȘtre prĂ©sent sur le de travail pour bien accomplir les tĂąches au quotidien. Du moment oĂč chaque collaborateur soit joignable Ă tout moment de la journĂ©e et quâil ait accĂšs aux outils et Ă lâinformation, le tĂ©lĂ©travail devient une option qui prend pleinement son sens. Une flexibilitĂ© et une libertĂ© non nĂ©gligeable pourraient ĂȘtre offertes aux collaborateurs pour conjuguer contraintes de la vie privĂ©e et exigences professionnelles sans impacts sur les dĂ©lais et la qualitĂ© du travail fourni. Bien Ă©videmment, cet impact nâest valable que pour les domaines et les tĂąches qui se prĂȘtent au tĂ©lĂ©travail.
Risques 1) Bouleversement de lâespace/temps de travailAvec les moyens NTIC dont on dispose aujourdâhui, il est de plus en plus difficile de faire le distinguo entre temps de travail et temps personnel et de tracer une frontiĂšre entre la sphĂšre professionnelle et la sphĂšre privĂ©e. MĂȘme si pas mal dâentreprises se sont pressĂ©es Ă dĂ©ployer des politiques dâaccĂšs aux ressources internet trĂšs restrictives et sĂ©lectives, la prolifĂ©ration des solutions mobiles personnelles Ă interfaces ergonomiques et la banalisation de la connexion internet mobile rendent ce genre de politique obsolĂšte.
2) RĂ©duction de la sphĂšre privĂ©eAu-delĂ de lâenvironnement professionnel, lâomniprĂ©sence des NTIC entraine une rĂ©duction de la sphĂšre privĂ©e des individus tout en accĂ©lĂ©rant leur popularisation. LâaccĂšs et lâalimentation des rĂ©seaux sociaux professionnels ou personnels sort les individus de lâanonymat et trace leur histoire. Quand un collaborateur intervient sur un blog, peu importe lequel, commente un post, forcĂ©ment, nâimporte qui peut en porter un jugement, positif soit-il ou nĂ©gatif.
3) Impact sur la cultureDe plus en plus de contenu est produit sur internet, indexĂ© par des moteurs de recherche occupant une place prĂ©pondĂ©rante dans notre quotidien. Ce constat nous mĂšne Ă se poser les questions suivantes : aujourd’hui, vaut-il la peine de tout apprendre par cĆur? Cela risque t-il d’appauvrir la culture individuelle Ă terme, ou au contraire de l’enrichir? Un premier Ă©lĂ©ment de rĂ©ponse nous a Ă©tĂ© donnĂ© par le philosophe Michel Serres dans ce podcast qui nous Ă©claire sur le fait qu’il faut se libĂ©rer l’esprit, en s’appuyant sur internet et l’informatique d’une façon gĂ©nĂ©rale, pour se focaliser sur l’innovation…
Les challenges d’aujourd’hui et de demain…Les NTIC sont en train de transformer profondĂ©ment le monde du travail, dâabord en interne des entreprises avec lâĂ©mergence dâĂ©quipes complĂštement transversales, elles, basĂ©es sur la facilitĂ© de lâĂ©change et la collaboration au regard des organisations hiĂ©rarchiques traditionnelles, qui elles, Ă©taient cantonnĂ©es et cloisonnĂ©es. Cependant la rĂ©volution rĂ©side plus dans la mise Ă disposition et le partage dâune information riche renforçant le sentiment dâautonomie et permettant Ă chacun de rester en contact permanent avec lâentreprise.
Quelques soient les risques et les opportunitĂ©s pour les entreprises, leur adoption deviennent inĂ©luctables et tout le challenge aujourdâhui est : comment conjuguer risques et opportunitĂ©s pour bĂ©nĂ©ficier de lâapport des NTIC dans la rentabilitĂ© et le dĂ©veloppement de lâentreprise.
MalgrĂ© tout, plusieurs challenges restent Ă relever par les NTIC. Dâabord, la multiplication des outils et la prolifĂ©ration dâinternet a conduit Ă lâutilisation de plus en plus de serveur de stockage, Ă la construction dâordinateurs de plus en plus puissants. Câest le dĂ©veloppement durable et la green IT qui seront Ă terme au cĆur du provisionnement des NTIC dans lâentreprise.
Un autre challenge Ă relever aussi concerne la sĂ©curitĂ© des systĂšmes dâinformation et la protection de la vie privĂ©e.
Pour finir, Ă force de voir la frontiĂšre disparaĂźtre entre temps de travail et temps personnel, lâorganisation de travail actuelle aura-t-elle un sens Ă terme? Ou bien, tendons nous vers le travail Ă la demande, peu importe le jour de la semaine, lâheure de la journĂ©e.
Suggestion d'articles :

RĂ©cemment, jâai Ă©tĂ© amenĂ© Ă participer Ă plusieurs Ă©tudes dâĂ©volution de SI. Ce qui mâa personnellement frappĂ© dans ces diffĂ©rentes missions câest lâimage commune quâutilisaient nos interlocuteurs pour dĂ©crire leur SI idĂ©al. Cette image est celle de la boĂźte de « LEGO » ! En effet, pour rationaliser les coĂ»ts et diminuer les dĂ©lais des projets, ils souhaitaient avoir des briques applicatives gĂ©nĂ©riques quâils pourraient combiner Ă souhait comme les briques de « LEGO ». Je me suis alors interrogĂ© sur les raisons qui font que ces personnes, dâhorizons diffĂ©rents, partagent cet idĂ©al commun.
Lâexcellente prĂ©sentation de Luc De Brabandere Ă lâUSI 2009 intitulĂ© « Les dix paradoxes de la crĂ©ativitĂ© » mâa Ă©clairĂ© sur le sujet. En effet, Luc De Brabandere explique que la crĂ©ativitĂ© des individus est conditionnĂ©e par la perception quâils ont de leur environnement. Dans notre cas, la vision rĂ©pandue des SI est hĂ©ritĂ©e du monde des BTP. Pour sâen rendre compte, il suffit de regarder les termes que nous utilisons : maĂźtrise dâouvrage, maĂźtrise dâĆuvre, briques, architectes⊠En consĂ©quence, il est totalement naturel que le SI idĂ©al soit une boĂźte de « LEGO » gĂ©ante !
Changer de vision pour changer le SIA OCTO nous constatons que cette vision boĂźte de « LEGO » nâest pas efficace. Dâune part, le 100% rĂ©utilisable est un mythe quâaucune entreprise nâa rĂ©ussi Ă atteindre (nous sommes plutĂŽt dans une fourchette de 5-10%). Dâautre part, les composants rĂ©utilisables coĂ»tent trĂšs cher et, lorsquâun projet veut en bĂ©nĂ©ficier, des adaptations sâavĂšrent souvent nĂ©cessaires.
Alors comment faire pour atteindre les objectifs initiaux qui sont la rationalisation des coûts et la diminution des délais des projets ?
La premiÚre étape consiste à nous ouvrir de nouvelles perspectives en dépassant le cadre mental que nous nous sommes imposés en regardant le SI comme
Un systÚme évolutif et non comme un systÚme figé comme le sous-entend la vision BTP
Une fois ce nouveau cadre Ă©tabli, il faut commencer Ă repenser notre approche des projets informatiques. Pour Ă©tayer cette idĂ©e, je vais prendre lâexemple des briques rĂ©utilisables.
Des briques rĂ©utilisables Ă©volutivesLâapproche classique des projets informatiques consiste Ă vouloir dĂ©finir en totalitĂ© et dans le dĂ©tail une application tout en amont du projet (projet en cascade). Pour les briques rĂ©utilisables cette approche nous conduit Ă vouloir dĂ©finir, en amont, une brique qui rĂ©pond Ă tous les besoins actuels et futurs.
A contrario, en partant du principe que le SI est en Ă©volution constante, il devient naturel dâopter pour une approche incrĂ©mentale. En effet, au lieu de vouloir rĂ©pondre Ă tous les besoins en mĂȘme temps, nous allons rĂ©pondre aux besoins avĂ©rĂ©s des projets un par un en enrichissant continuellement les fonctionnalitĂ©s du composant. Et pour rendre possible une Ă©volution continue dans le temps, il faut prĂ©server un temps de traitement des demandes stable, malgrĂ© l’inexorable montĂ©e en complexitĂ©. Dans ce but, deux Ă©lĂ©ments peuvent ĂȘtre mis en place :
Cette approche prĂ©sente plusieurs avantages. Dâabord, le composant dĂ©veloppĂ© est adaptĂ© aux besoins des projets et il est directement utilisable. Ensuite, la complexitĂ© du composant est rĂ©duite considĂ©rablement puisquâil nâembarque que les fonctionnalitĂ©s nĂ©cessaires aux projets (Ă©vite le sur-design qui a pour but dâembarquer des besoins futurs non avĂ©rĂ©s). De plus, le harnais de tests permet dâaccĂ©lĂ©rer la dĂ©tection les problĂšmes (tests qui ne passent plus). Enfin, la flexibilitĂ© offerte par le modĂšle incrĂ©mental permet de tenir compte des nouveaux besoins qui nâont pas Ă©tĂ© prĂ©vu au dĂ©but du projet.
ConclusionChanger notre vision du SI nâest pas chose facile. En effet, ce changement implique le changement de nos mĂ©thodes et notre organisation du travail. Cependant, il faut prendre conscience que pour dĂ©passer les limites actuelles auxquelles nous sommes confrontĂ©s, ce changement est nĂ©cessaire.
RĂ©cemment, jâai Ă©tĂ© amenĂ© Ă participer Ă plusieurs Ă©tudes dâĂ©volution de SI. Ce qui mâa personnellement frappĂ© dans ces diffĂ©rentes missions câest lâimage commune quâutilisaient nos interlocuteurs pour dĂ©crire leur SI idĂ©al. Cette image est celle de la boĂźte de « LEGO » ! En effet, pour rationaliser les coĂ»ts et diminuer les dĂ©lais des projets, ils souhaitaient avoir des briques applicatives gĂ©nĂ©riques quâils pourraient combiner Ă souhait comme les briques de « LEGO ». Je me suis alors interrogĂ© sur les raisons qui font que ces personnes, dâhorizons diffĂ©rents, partagent cet idĂ©al commun.
Nous avons déterminé dans la premiÚre partie que les nombres à virgule flottante sont à proscrire.
Nos armes seront donc le BigDecimal en Java, le type decimal en .Net. Malheureusement, d’autres piĂšges pavent notre chemin.
Notes:
J’ai souvent le commentaire suivant: « J’aime pas les BigDecimal, on ne peut pas utiliser les opĂ©rateurs du langage avec ». C’est vrai, mais en attendant que Java supporte la surcharge d’opĂ©rateur (et c’est pas demain la veille), vous n’avez pas le choix, il faut utiliser les mĂ©thodes de la classe BigDecimal.
Le respect de la premiĂšre rĂšgle ci-haut proscrit les choses suivantes:
BigDecimal d = new BigDecimal(1.0); // initialisation par un double BigDecimal d = BigDecimal.valueOf(1.0); // aussi une initialisation par un double boolean b = (d.doubleValue() == 0.0); // comparaison avec un double BigDecimal d = BigDecimal.valueOf(d1.doubleValue() * d2.doubleValue()); // passage par un double pour calcul mathématique
remplacer tout cela par
BigDecimal d = new BigDecimal("1.0"); // crée trÚs précisément un BigDecimal de mantisse 10 et d'échelle 1
BigDecimal d = BigDecimal.valueOf(10, 1); // MĂȘme rĂ©sultat que la ligne prĂ©cĂ©dente
boolean b = (d.signum() == 0); // signum compare avec zéro et retourne -1, 0 ou 1. Pour une valeur différente de zéro, faire un compareTo
BigDecimal d = d1.multiply(d2); // tout le calcul se fait en type décimal
Ăchelle
L’Ă©chelle (scale) indique le nombre de chiffres Ă droite de la virgule. Il faut bien comprendre que deux chiffres apparemment identiques peuvent ĂȘtre en fait diffĂ©rents de par leur Ă©chelle. C’est pour cette raison qu’en Java, dans l’exemple ci-dessous, b sera faux
BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
boolean b = d1.equals(d2); // false
L’Ă©chelle a aussi un impact lors d’opĂ©rations mathĂ©matiques.
Note: L’affichage d’un BigDecimal (d.toString()) affichera toujours l’Ă©chelle en entier et non uniquement les zĂ©ros significatifs.
Additions et soustractionsL’Ă©chelle du rĂ©sultat d’une addition ou soustraction sera la plus grosse Ă©chelle des deux opĂ©randes.
BigDecimal d1 = new BigDecimal("1.0"); // échelle de 1
BigDecimal d2 = new BigDecimal("2.00"); // échelle de 2
BigDecimal r = d1.add(d2); // résultat d'échelle 2
System.out.println(r); // affiche 3.00
Multiplications
L’Ă©chelle du rĂ©sultat d’une multiplication sera la somme des Ă©chelles des opĂ©randes (car mathĂ©matiquement, le rĂ©sultat ne sera jamais sur plus).
BigDecimal d1 = new BigDecimal("1.0"); // échelle de 1
BigDecimal d2 = new BigDecimal("2.00"); // échelle de 2
BigDecimal r = d1.multiply(d2); // résultat d'échelle 3
System.out.println(r); // affiche 2.000
Divisions
Tout se complique pour les divisions. En effet, l’Ă©chelle thĂ©orique du rĂ©sultat d’une division est potentiellement infinie (si le rĂ©sultat de la division est un nombre pĂ©riodique par exemple). C’est trĂšs diffĂ©rent de l’arithmĂ©tique en virgules flottantes qui stockera, dans sa taille finie, la valeur la plus proche du rĂ©sultat rĂ©el. Vous aurez donc les rĂ©sultats suivants:
BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("3.0");
System.out.println(d1.divide(d2, RoundingMode.HALF_UP)); // affiche 0.3
System.out.println(d1.divide(d2, 4, RoundingMode.HALF_UP)); // affiche 0.3333
System.out.println(d1.divide(d2)); // ArithmeticException
Si la rĂšgle d’arrondi n’est pas spĂ©cifiĂ©, comme le BigDecimal ne peut dĂ©cider comment arrondir par lui-mĂȘme, il retourne une exception *et c’est une bonne chose*. En effet, il ne faut jamais arrondir au hasard. Si vous ne savez pas comment arrondir, demandez Ă votre MOA. L’arrondi est systĂ©matiquement liĂ© Ă une rĂšgle mĂ©tier (ex.: arrondir Ă la prĂ©cision de la monnaie). Je vous recommande d’ailleurs de mettre dans vos tests unitaires des chiffres testant l’arrondi pour prĂ©venir les problĂšmes.
ComparaisonC’est l’un des comportements laissant le plus perplexes les dĂ©veloppeurs. Nous en avons parlĂ© plus haut, le equals
du BigDecimal compare aussi l’Ă©chelle. Il ne faut donc jamais l’utiliser si l’on souhaite comparer la valeur du BigDecimal. C’est lĂ oĂč compareTo vient Ă notre secours. Il se comporte comme nous le voudrions intuitivement.
BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("1.00");
int i = d1.compareTo(d2); // 0, ce qui veut dire de mĂȘme valeur selon le contrat de compareTo
Ă noter: Comparativement Ă la comparaison entre nombres Ă virgule flottante, il n’est pas nĂ©cessaire d’ajouter un delta lors des comparaisons. Le dĂ©cimal Ă©tant toujours prĂ©cis, la comparaison sans delta le sera donc aussi.
ConversionIl faut prendre quelques prĂ©cautions lors de la conversion d’une BigDecimal vers une valeur entiĂšre. En effet, celui-ci arrondira Ă l’unitĂ©. Il est souvent plus sĂ©curitaire de vĂ©rifier s’il y a des dĂ©cimales lors de la conversion. Les mĂ©thodes xxxValueExact() ont donc Ă©tĂ© mise Ă disposition pour faire trĂšs exactement ceci. Une ArithmeticException sera lancĂ©e si une conversion sans arrondi est impossible.
BigDecimal d1 = new BigDecimal("1.1");
System.out.println("i: " + d1.intValue()); // affiche 1
System.out.println(d1.intValueExact()); // lance une ArithmeticException
.NET
L’article s’est pour l’instant beaucoup penchĂ© sur Java. L’Ă©quivalent .Net du BigDecimal est le decimal. De mĂȘme qu’en Java, il doit ĂȘtre utilisĂ© en tout temps au lieu du float et double.
LittĂ©rauxLe type decimal Ă©tant un type primitif de .Net, C# fournit une syntaxe littĂ©rale pour ce dernier (suffixe m). Les zĂ©ros non significatifs sont utiles pour dĂ©terminer l’Ă©chelle.
decimal d = 99.9m; // le m indiquant qu'il s'agit d'un décimal decimal b = 9.00m; // decimal d'échelle 2
Il est d’ailleurs judicieusement nĂ©cessaire de convertir explicitement d’une virgule flottante Ă un dĂ©cimal.
decimal a = (decimal) 9.0; // conversion explicite nécessaire et perte de précision potentielle. à ne pas faire!Calculs mathématiques
Ătre un type primitif a d’autres avantages, les calculs mathĂ©matiques sont plus Ă©lĂ©gants qu’en Java.
decimal d = 1.0m * 2.0m; // +, -, /, * et % sont utilisables decimal b = decimal.Multiply(1.0m, 2.0m); // l'équivalent en méthode statique est aussi disponible
La division n’a pas besoin et ne peut avoir de rĂšgle d’arrondi. Elle fera au mieux dans les 96 bits d’espace. Il ne faut toutefois pas oublier qu’un arrondi sera Ă©ventuellement nĂ©cessaire et sera comme toujours guidĂ© par une rĂšgle mĂ©tier.
ComparaisonComparativement Ă Java, le compare et le equals donne le mĂȘme rĂ©sultat peut importe l’Ă©chelle. C’est beaucoup plus intuitif, mais implique qu’il est impossible de comparer en voulant considĂ©rer l’Ă©chelle.
Console.WriteLine(decimal.Compare(1.00m, 1.0m)); // affiche 0, donc égal Console.WriteLine(1.0m.CompareTo(1.00m)); // autre façon de comparer, retourne aussi 0 Console.WriteLine(1.0m.Equals(1.00m)); // affiche true
Il est d’ailleurs impossible de connaĂźtre l’Ă©chelle d’un dĂ©cimal facilement en .Net. Pour avoir l’Ă©chelle, il faut faire ceci:
int scale = (System.Decimal.GetBits(monDecimal)[3] >> 16) & 31; // oui oui, ça s'invente pas
ou passer par un ToString, trouver le séparateur décimal (en fonction de la culture) et compter le nombre de chiffres à sa droite.
ConversionAu niveau conversion, il existe des mĂ©thodes ToXXX permettant la conversion vers un autre type. Le concept de ToXXXExact n’existe pas. Il faut donc s’assurer au prĂ©alable qu’il n’y aura pas de perte de prĂ©cision. Une solution possible est ceci:
decimal toInt = 1.1m; int i = decimal.ToInt32(toInt); Console.WriteLine(toInt.Equals(new decimal(i))); // n'est pas égal, car nous avons perdu les décimalesConclusion
Le but n’est pas de comparer, mais vous l’aurez compris
Mais peu importe le langage, les choses importantes Ă retenir se rĂ©sument Ă
Une seule nuance Ă ces rĂšgles. Il est possible que pour des raisons de performance vous deviez utiliser des nombres Ă virgule flottante. Par exemple, dans le cadre du simulation de Monte-Carlo. Je ne peux dans ce cas que vous recommander de bien vous documenter sur la manipulation des nombres Ă virgule flottante. Il existe de nombreuses mĂ©thodes pour minimiser les problĂšmes mais le tout reste relativement complexe et sors du cadre de cet article. Ne les utilisez donc qu’en dernier recours.
En conclusion, appliquez ces rĂšgles religieusement et vous devriez ĂȘtre parĂ©s pour Ă©viter les soucis de calcul de vos futures applications d’entreprise. Je vous souhaite de prĂ©cis calculs et vous dis Ă la prochaine.
Suggestion d'articles :

Avec la croissance de la plateforme Android et l’annonce de Google sur le nombre de terminaux activĂ©s chaque jour, le nombre de projets Android a de bonnes chances de progresser Ă©galement. Avec cette augmentation, la question de lâindustrialisation des dĂ©veloppements se pose donc. Pourquoi industrialiser ? Comment ? Des questions auxquelles nous allons rĂ©pondre dans ce billetâŠ
Autant sur une application de gestion, la question ne se pose quasiment pas, autant sur une application Android, on est en droit de se demander si cela vaut le coup.
Effectivement, alors que les projets java se dĂ©roulent gĂ©nĂ©ralement sur plusieurs mois avec des Ă©quipes un peu consĂ©quentes, les projets dâapplications mobiles sont gĂ©nĂ©ralement plus courtes, avec des Ă©quipes plus petites. Les applications doivent ĂȘtre innovantes et rapidement mises sur le Market pour arriver avant la concurrence. Cela vaut-il donc le coup dâinvestir dans tous les moyens habituels (build, intĂ©gration continue, âŠ) qui peuvent paraĂźtre lourds et dĂ©mesurĂ©s pour un tel projet ?
A fortiori, le versionning du code est indispensable, peu importe la nature et la taille du projet. Je ne vais pas mâĂ©tendre sur le sujet, cela fait des annĂ©es que cette pratique sâest gĂ©nĂ©ralisĂ©e. Concernant le build et lâintĂ©gration continue, cela a un intĂ©rĂȘt dĂšs lors que lâĂ©quipe de dĂ©veloppement est constituĂ©e de plus dâune personne. Cela facilitera le travail des dĂ©veloppeurs et permettra dâavoir une version rapidement montrable au marketing ou la MOA, indispensable pour avoir du feedback rapide.
MalgrĂ© la taille rĂ©duite de ces projets, il ne faut donc pas hĂ©siter Ă investir un minimum pour faciliter le travail des dĂ©veloppeurs dâune part et dans une optique de maintenance dâautre part. Lâapplication doit certes sortir rapidement, mais elle devra continuer de vivre et dâĂ©voluer et donc la qualitĂ© incombe.
Maven, la bonne solution ?Maven a ses dĂ©tracteurs mais est globalement trĂšs rĂ©pandu en entreprise pour construire les projets java. Concernant Android, je ne suis pas sĂ»r quâon puisse en dire autant pour le momentâŠ
AprĂšs lâavoir utilisĂ© sur lâapplication Sinistres de Generali, plusieurs constats :
Au final beaucoup de temps perdu pour avoir un environnement de dĂ©veloppement un peu bancal et la question : est ce que Maven est vraiment utile dans notre cas ? On pense tout de suite Ă Maven lorsquâil sâagit de builder notre application mais nâest-ce pas un peu too much ?
Lâun des principaux bĂ©nĂ©fices de Maven est la gestion des dĂ©pendances. Hors, dans une application Android, le nombre de dĂ©pendances est somme toute assez ridicule. Vous aurez gĂ©nĂ©ralement lâapi google maps, Ă©ventuellement une librairie pour faire du soap, et en poussant le bouchon admob ou google analytics. Aucune dĂ©pendance transitive. Bref, pas de quoi sortir la grosse artillerie. Dâautant plus quâaucune de ces librairies nâest dispo dans un repo central et il vous faudra donc les installer manuellement dans un repo dâentreprise ou local.
Pour le reste, toutes les commandes disponibles grĂące au plugin Maven le sont Ă©galement avec ant, qui semble ĂȘtre lâoutil prĂ©conisĂ© par Google.
Ant, la solution fournie en standardLorsque vous crĂ©ez un projet via la ligne de commande (android create project --target 8 --name AndroidAnt --path ./AndroidAntProject --activity AndroidAntActivity --package com.octo.android.androidant), un fichier build.xml est gĂ©nĂ©rĂ©, contrairement aux projets créés dans Eclipse. Ce build.xml minimaliste (quasiment vide) fourni toutefois lâessentiel des tĂąches nĂ©cessaires :
Câest assez confortable car vous nâavez pas Ă Ă©crire ces tĂąches, elles sont dĂ©finies dans le fichier {SDK}/platforms/{platform}/templates/android_rules.xml. ComparĂ© Ă toutes les tĂąches plus ou moins manuelles Ă effectuer avec Maven, on y gagne franchement au dĂ©part.
Par contre, la solution Ant souffre Ă©galement de l’intĂ©gration avec Eclipse. En effet, les tĂąches Ă©tant dĂ©finies dans un fichier externe, elles ne sont pas disponibles dans la vue Ant. La solution alternative consiste Ă utiliser les external tools avec une des commandes ci-dessus.
IntĂ©gration continueSi les deux outils vu prĂ©cĂ©demment sont un peu en dĂ©saccord avec lâIDE, ils nâen restent pas moins tout Ă fait utilisable en dehors via la ligne de commande et donc Ă©galement via un outil dâintĂ©gration continue comme Hudson.
Aussi simplement que sur un projet Java standard, vous pouvez configurer un build (maven ou ant) et la commande souhaitĂ©e. Mais Hudson va plus loin puisque via le plugin Android Emulator Plugin, vous pouvez dĂ©marrer lâĂ©mulateur au dĂ©but du build et lâĂ©teindre Ă la fin. Vous pouvez Ă©galement installer l’application sur diffĂ©rentes configurations (version d’Android, rĂ©solution d’Ă©cran, densitĂ© d’Ă©cran, locale) afin de valider l’application sur les diffĂ©rentes plateformes cibles.
Si vous ne testez que sur une plateforme, mieux vaut laisser un émulateur fonctionner, ca évite de perdre plus de 5 minutes à chaque build.
Pour le reste, tout se passe comme pour un build standard, la seule particularitĂ© Ă©tant d’avoir le SDK installĂ© sur le serveur d’intĂ©gration continue.
Conclusion Maven Ant SimplicitĂ© / Prise en main 2/5Alors, Ant ou Maven ? AprĂšs nos dĂ©boires avec Maven sur le projet Generali, j’aurai conseillĂ© Ant sans hĂ©siter. L’arrivĂ©e (trĂšs) rĂ©cente des jars dans le repo central me laisse Ă penser qu’on pourra bientĂŽt travailler avec Maven, Android (et Eclipse) plus sereinement.
Android a lâavantage dâĂȘtre basĂ© sur le langage Java. On bĂ©nĂ©ficie ainsi des outils existants pour construire nos applications. Si lâintĂ©gration nâest pas totale entre lâIDE, le SDK et ces outils de builds, ils sont indispensables sur un serveur dâintĂ©gration continue. Câest aujourdâhui leur principal intĂ©rĂȘt, car Eclipse et le plugin Android (AJDT) restent Ă mon sens incontournable sur le poste du dĂ©veloppeur pour ĂȘtre productif.
Dans un prochain article, nous aborderons les problĂ©matiques de qualitĂ© du code et des tests…
Suggestion d'articles :

AprĂšs la dĂ©mocratisation d’Ajax (ie. requĂȘtes HTTP asynchrones en Javascript), plusieurs techniques ont Ă©tĂ© Ă©laborĂ©es afin de permettre le push de donnĂ©es depuis le serveur toujours en utilisant HTTP. C’est grĂące Ă ces techniques que l’on reçoit nos mails dans une application web sans avoir Ă cliquer sur le bouton « Refresh », que les applications de chat sont possibles sans plugin tierce (Flash, Java, …), etc. Le W3C et l’IETF ont spĂ©cifiĂ© une API Javascript et un protocole nommĂ© Websocket. Ce protocole connectĂ© est adaptĂ© Ă l’envoi de donnĂ©es dans les deux sens et Ă©vite de dĂ©tourner HTTP de son usage initial (ie. un protocole dĂ©connectĂ© sans Ă©tat).
Websocket n’est donc pas une spĂ©cification des techniques de push sur HTTP (long polling, HTTP Streaming, …), ni une surcouche Ă HTTP mais bien un protocole Ă part entiĂšre.
Il reste pourtant liĂ© Ă HTTP en rĂ©utilisant l’architecture rĂ©seau de celui-ci. En effet, l’ouverture d’une connexion Websocket s’effectue avec une requĂȘte HTTP qui demande au serveur « de mettre Ă jour la connexion » en connexion Websocket.
GET /demo HTTP/1.1 Host: example.com Connection: Upgrade Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 Sec-WebSocket-Protocol: sample Upgrade: WebSocket Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Origin: http://example.com ^n:ds[4U
Le serveur, s’il supporte le protocole Websocket, peut ainsi terminer l’ouverture de la connexion et la suite du dialogue entre le client et le serveur s’effectuera avec le protocole Websocket.
HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS'y:G*Co,Wxa-
Ce type d’ouverture de connexion permet de rĂ©utiliser le port HTTP (ou HTTPS) classiquement utilisĂ© et de passer les proxys comme une simple requĂȘte HTTP. Cependant, certains proxy n’autorisant pas les connexions longues risquent de poser problĂšme en coupant les connexions Websocket.
Avec la démocratisation du protocole Websocket, on peut cependant espérer que ce type de proxy disparaßtra peu à peu.
L’utilisation de Websocket sĂ©curisĂ© (wss:// dans l’URL au lieu de ws://) permet d’augmenter les chances de passer Ă travers ces proxys peu coopĂ©ratifs. En effet, si un proxy est explicitement configurĂ© dans le navigateur, les implĂ©mentations actuelles de Websocket utilisent des tunnels via HTTP CONNECT de la mĂȘme façon que HTTPS. La connexion n’est ainsi plus diffĂ©rentiable d’une connexion HTTPS du point de vue des proxys.
Comme pour les autres fonctionnalités qui viennent avec HTML5, les Websockets ne sont pas supportées par tous les navigateurs :
Quant aux autres navigateurs, ils ne les supportent tout simplement pas encore.
Pour pallier à ce manque temporaire, deux approches ont été implémentées :
CÎté serveur, il faut distinguer deux types de composants (dans le monde Java) :
Cette distinction ne veut cependant pas dire que les frameworks implĂ©mentant le protocole Websocket sont forcĂ©ment de plus bas niveau que Atmosphere ou JWebSocket. Par exemple, Kaazing propose des fonctionnalitĂ©s et une API d’au moins aussi haut niveau que celle de JWebSocket.
Pourquoi (pas) les Websockets ?Au-dela de pouvoir pousser des donnĂ©es du serveur vers le client, encore faut-il pouvoir l’exploiter sans passer son temps dans la plomberie. C’est bien de pouvoir rĂ©agir Ă une connexion, un message, une dĂ©connexion, … mais il faut gĂ©rer les clients connectĂ©s, les timeouts des connexions (le client ne connait pas le timeout aprĂšs lequel le serveur coupe la connexion), savoir quels messages renvoyer lorsqu’une coupure de connexion survient et autres limitations du fait de la jeunesse du protocole Websocket.
LĂ encore les frameworks comme Kaazing, JWebsocket ou Cometd sont bien utiles pour s’occuper de ces problĂ©matiques bas niveau mais aussi pour proposer des fonctionnalitĂ©s utilisant tout le potentiel des Websockets.
Parmi celles-ci, on peut trouver :
Enfin, il est légitime de se dire que toutes ces fonctionnalités sont envisageables avec des techniques comme Comet sur HTTP. Alors pourquoi préférer les Websockets alors que leur support par les navigateurs est encore limité et que les proxys risquent de ne pas toujours jouer le jeu ?
Tout d’abord, lorsqu’on utilise du polling ou tout autre technique sur HTTP, on utilise forcĂ©ment une connexion dĂ©diĂ©e pour recevoir des donnĂ©es poussĂ©es du serveur vers le client et une autre connexion pour envoyer des donnĂ©es depuis le client (via une requĂȘte HTTP classique). Une connexion Websocket, quant Ă elle, est full duplex. C’est Ă dire que la mĂȘme connexion est utilisĂ©e pour recevoir et envoyer des donnĂ©es. Le serveur gĂšre donc moins de connexions ouvertes et moins d’ouvertures et fermetures de connexions ponctuelles. Il faut cependant souligner que les implĂ©mentations serveur doivent ĂȘtre adaptĂ©es Ă la gestion d’un grand nombre de connexions simultanĂ©es et continues (utilisation d’un pool de threads plutĂŽt qu’un thread par socket ouverte, entrĂ©es-sorties non bloquantes, notifications par l’OS de l’activitĂ© des sockets, …), que ce soit en utilisant Comet ou les Websockets.
Ensuite, en terme de bande passante, la taille du message minimum du protocole WebSocket est de 2 octets (0×00 pour le dĂ©but du message et 0xFF pour la fin). Avec HTTP, il faut compter au moins 200 octets pour un header. Quand il s’agit d’envoyer des messages de maintient de connexions (ou de rĂ©ouverture de connexion avec Comet), avec un nombre important de clients connectĂ©s, l’occupation de la bande passante avec Comet devient non nĂ©gligeable.
ConclusionLe protocole Websocket est donc un moyen de rĂ©pondre au besoin de push de donnĂ©es depuis le serveur qui Ă©tait jusque-lĂ implĂ©mentĂ© en dĂ©tournant HTTP de son usage prĂ©vu initialement. Il permet ainsi d’optimiser l’usage des resources cĂŽtĂ© serveur et de faire le pont entre une architecture web (ie. centrĂ©e autour de HTTP et des navigateurs Internet) et les autres protocoles connectĂ©s (JMS, IMAP, Jabber, …) ouvrant ainsi la porte au web « temp rĂ©el ».
Suggestion d'articles :

J’inaugure aujourd’hui une nouvelle chronique que j’ai appelĂ©e problĂšmes courants. J’y traiterai l’une aprĂšs l’autre les erreurs classiques rencontrĂ©es Ă travers mes annĂ©es d’informatique.
Ce premier article de la sĂ©rie visera Ă dĂ©mystifier les calculs mathĂ©matiques et Ă Ă©tablir de bonnes pratiques au sein d’une application d’entreprise. Par application d’entreprise, nous entendons une application gĂ©rant des montants d’argent, des prix, des quantitĂ©s. Il a Ă©tĂ© coupĂ© en deux, la premiĂšre partie expliquant le problĂšme, la deuxiĂšme montrant comment le gĂ©rer en Java et .Net.
Bill travaille sur un logiciel de paiement de commissions. Il doit ajouter une commission de 1,2$. Il se fait donc une petite méthode faisant cette opération et le petit test unitaire qui va avec.
@Test
public void testAddCommission() {
double actual = addCommission(1000000.1);
assertEquals(1000001.3, actual, 0);
}
public static double addCommission(double nominal) {
return nominal + 1.2f;
}
java.lang.AssertionError: expected:<1000001.3> but was:<1000001.3000000477>
« Ah ben zut alors! C’est pas le bon rĂ©sultat ».
Qu’est-ce qui se passe?
Les nombres Ă virgule flottante (floating point numbers) ont Ă©tĂ© introduits pour des raisons de performance (et uniquement pour ça) dans les ordinateurs. Ils sont devenus omniprĂ©sents depuis l’arrivĂ©e du Intel 80486 et son coprocesseur de virgules flottantes. Cela permet de faire une multiplication ou une division en 1 cycle de processeur. Il s’agit des types float, double et quad (leur prĂ©cision respective dĂ©pend du langage mais chacun double la prĂ©cision du prĂ©cĂ©dent).
Avec des dĂ©cimaux, c’est plus lent (en gros autant d’opĂ©rations que quand vous posiez une multiplication au primaire, sauf quâheureusement un ordinateur va plus vite et fait moins de fautes…). Par dĂ©cimaux nous entendons le type decimal (en .Net) et BigDecimal (en Java).
Pourquoi utilisez de dĂ©cimaux dans ce cas me direz-vous? Car ils n’utilisent pas la mĂȘme reprĂ©sentation.
Dans les deux cas, nous avons une mantisse et un exposant. Toutefois, la mantisse d’un dĂ©cimal est un entier. Celle de la virgule flottante, un nombre entre 0 et 1 en base 2. Il faut bien comprendre que les chiffres Ă droite de la virgule sont donc puissance de fraction de 2, car nous sommes en base 2. Par exemple, 0,1 en base 2 vaut 0,5 en base 10.
Un autre exemple: 7.5, s’Ă©crit 75E-1 en dĂ©cimal, la mantisse est de 75 et l’exposant sera -1. Pour la virgule flottante, nous aurons 0.75E1 en base 10, ce qui donne 0.11 en base 2 ((1/2)^1 + (1/2)^2) pour la mantisse et 1 pour l’exposant. En gros, il s’agit d’une sĂ©rie de puissance d’1/2 au lieu d’un sĂ©rie de puissance de 1/10. C’est ce changement de reprĂ©sentation qui permet des calculs si rapide, car comme on le sait, les ordinateurs aiment bien le binaire.
C’est un problĂšme de baseLes problĂšmes surviennent quand le nombre se reprĂ©sente parfaitement en base 10, mais ne peut l’ĂȘtre en base 2. L’exemple courant est 0.1. Sa valeur en base 2 est pĂ©riodique (0.000110011001100…). Nous ne pouvons par le reprĂ©senter prĂ©cisĂ©ment. La norme IEEE 754 rĂ©gissant l’arithmĂ©tique des nombres Ă virgule flottante s’efforce donc de les exprimer au mieux et de gĂ©rer les arrondis, mais la perte de prĂ©cision reste.
Il est trÚs important de comprendre que les problÚmes dont on parle sont des problÚmes de représentation et non pas des problÚmes de précision.
Les problĂšmes de prĂ©cision, on sait les gĂ©rer. Il suffit d’augmenter la prĂ©cision. La prĂ©cision n’est pas suffisante dans un double et hop, on passe Ă un quad. Mais notre 0,1 ne pourra toujours pas ĂȘtre reprĂ©sentĂ© prĂ©cisĂ©ment. Ă noter, ce n’est pas dĂ©pendant du langage. Tous les reprĂ©sentent de la mĂȘme façon et utilisent le coprocesseur de virgules flottantes pour leurs calculs.
L’exemple de 0.1 en plus dĂ©taillĂ©:
float f = 0.1f; System.out.println(f); // affiche 0.1 BigDecimal d = new BigDecimal(f); System.out.println(d); // affiche 0.100000001490116119384765625
On pourrait croire que le passage vers le BigDecimal dĂ©truit le chiffre. Et non. Pour compliquer l’histoire, c’est l’affichage du float qui est faux. La vraie valeur du float est celle affichĂ©e par le BigDecimal. Mais l’algorithme d’affichage des virgules flottantes est d’afficher autant de bits que nĂ©cessaire pour faire la diffĂ©rence entre deux valeurs adjacentes. Donc, en fait, l’affichage tronque la vraie valeur.
ConclusionComme nous avons briĂšvement vu plus haut, le type dĂ©cimal est diffĂ©rent. Il est composĂ© d’une mantisse et d’une Ă©chelle, mais la mantisse est sous forme d’entier. La valeur dĂ©crite est donc dans tous les cas parfaitement reprĂ©sentĂ©e et n’a pas besoin d’ĂȘtre arrondie. Cette prĂ©cision est essentielle dans le cadre d’une application manipulant des montants d’argent par exemple.
D’ailleurs, nos ancĂȘtres le savaient. Aucun programmeur Cobol de l’Ă©poque n’utiliserait une virgule flottante. Malheureusement, le savoir s’est perdu en chemin. Le plus cuisant exemple est Java qui n’avait mĂȘme pas de type dĂ©cimal (BigDecimal) lors de sa crĂ©ation.
Cette erreur a Ă©tĂ© rĂ©parĂ© et en prime, le BigDecimal java n’a virtuellement pas de restriction de taille (et donc de problĂšme de prĂ©cision). Le decimal .Net est de son cĂŽtĂ© sur 128 bits. C’est largement suffisant pour prĂ©venir les erreurs de prĂ©cision Ă©tant donnĂ©e l’Ă©chelle des montants des applications d’entreprise.
PremiĂšre rĂšgle: Ne jamais utiliser de nombres Ă virgule flottante dans vos applications de type entreprise. Dans aucun cas! MĂȘme pour vos littĂ©raux. Mettez une rĂšgle Checkstyle s’assurant que personne ne les utilise.
Il y a bien sûr des exceptions à cette rÚgle (performance), mais elles sont rarissimes.
La suite de cet article dĂ©taillera l’usage des types dĂ©cimaux (BigDecimal et decimal) en Java et .Net. En effet, mĂȘme s’ils prĂ©viennent les problĂšmes de reprĂ©sentation, d’autres erreurs vous attendent Ă l’orĂ©e du bois.
Suggestion d'articles :