WPF et le focus d’entrée

NewAllez, un peu de développement pour changer de mes derniers billets sur les tendances du futur... Avec Windows 8 on sait que WPF sera le seul moyen de développer des applications échappant au market place, bien designées, et hors sandbox. Une nouvelle jeunesse s’ouvre donc pour cette techno vraisemblablement. Comment gérer le focus d’entrée dans une appli ? voici un b.a.ba pas toujours bien maitrisé ![more]

A l’ancienne

On voit souvent dans les boites de dialogue et les fenêtres d’une application WPF du code hérité de Windows Form qui ressemble à cela :

   1: private void OnLoaded(object sender, EventArgs e)
   2: {
   3:     this.MytextBox.Focus();
   4: }

Ce qui s’accompagne en général du code Xaml suivant dans la fenêtre en question :

   1: <Window ...
   2:         Loaded="OnLoaded">

Cela fonctionne, mais franchement c’est se donner du mal pour pas grand chose et c’est surtout répartir une même fonction logique entre code behind et code UI ce qui est un bon début pour se lancer dans la fabrication de code spaghetti !

WPF offre des moyens bien plus élégants pour réaliser cette opération.

A la page

L’expression “à la page” n’est plus tellement “à la page”, mais puisqu’on parle de page écran... WPF propose donc un moyen plus moderne pour affecter le focus d’entrée d’un dialogue. Par “moderne” je n’entends ce faux modernisme qui consiste à faire “autrement” uniquement parce que c’est plus récent. Je parle de moderniste dans le sens de “progrès” et “d’élégance”.

Ici notamment il est possible d’assurer cette opération purement d’UI uniquement côté UI sans une seule ligne de code behind.

Pour cela on utilise le FocusManager. Son nom se passe de commentaire...

Cela donne :

   1: <Window ...
   2:         FocusManager.FocusedElement="{Binding ElementName=MyTextBox}">

On remarquera que tout tient dans une ligne, en Xaml, et que le lien avec le contrôle qui doit prendre le focus s’effectue via un “element binding”.

 

C’est clair, propre, localisé, ça concerne l’UI et c’est défini dans l’UI.

Bref, une raison d’aller revisiter votre code pour simplifier (ou enfin gérer...) le focus d’entrée de vos dialogues WPF !

 

Et dans tous les cas...

                         ... Stay Tuned !

Le Web 3.0 = Pas de Web ?

NewEn attendant de pouvoir sérieusement vous parler de WinRT, je m’intéresse beaucoup en ce moment à l’avenir du développement, tant pour les développeurs que les éditeurs dans la période très troublée que nous vivons depuis deux ans. Depuis plusieurs mois je vous fais part de mes observations, de mes doutes, de mes conseils et j’espère vous aider par mes réflexions à vous forger votre propre opinion. Souvent en décalage avec la pensée unique de l’instant, mes prévisions choquent parfois certains lecteurs. Force est de constater que le Web, donc HTML, a des soucis à se faire et j’en veux pour preuve de nombreux évènements qu’il faudrait être fou d’ignorer...[more]

Le natif remplace le Web

Ca c’est une certitude, l’avenir est aux applications natives sur les mobiles et j’en ai déjà parlé. Je renvoi le lecteur à mon billet “Mobiles : les apps flinguent le Web !” pour éviter toute redite.

Internet != Web

J’en ai parlé aussi, le Web n’est qu’une façon particulière d’utiliser Internet, au travers de logiciels spécifiques, les browsers, et de normes plus ou moins bien établies (html, Js, Css, Flash, Silverlight...).

La fin du Web n’est donc pas la fin d’Internet, bien au contraire. Internet, cette plomberie électronique planétaire est au contraire de plus en plus sollicitée par les services web, les serveurs de données OData, JSon, les applications et les données dans le Cloud, etc.

Mais il s’avère que cette sollicitation sera de moins en moins le fait des browsers et de plus en plus le fait d’applications natives, principalement sur les unités mobiles.

HTML 5, le buzz qui fait flop

J’en ai parlé longuement dans le billet “Html 5 : la tragique fin d’un buzz”. Si le Web se fait manger par les applications mobiles, ses techniques sont immédiatement ringardisées en perdant toute possibilité d’être “universelles”. Simple question de logique puisque les applications natives des mobiles ne sont pas en Html mais en C#, Objective-C ou Java.

Dès lors Html 5 ne peut prétendre atteindre l’objectif que le buzz nous serine depuis deux ans justement et qui en faisait l’unique intérêt : l’universalité.

L’avenir est aux applications mobiles, donc natives, le Web tel qu’on le connait va se recentrer sur un minimum commun pour rester vraiment universel et devenir une devanture pour les applications mobiles et celles des différents market places...

Ce Web là sera plutôt développé en ASP.NET avec du HTML 3 ou 4 et un coup d’Ajaxisation qu’en HTML 5, sable mouvant d’une norme jamais terminée et forcément implémentée différemment par les différents browsers et leurs différentes versions (Attention danger ! Coût d’écriture et de maintenance prohibitifs en vue pour ceux qui ne suivront pas ce sage conseil !).

Un avenir segmenté

Concernant les plateformes mobiles (ou non, car WinRT tournera aussi bien sur les PC que les mobiles) je vous avais proposé un petit panorama des diverses possibilités dans mon billet “L’avenir proche du développement : quels environnements pour quels produits ?”. Je ne reviendrai pas non plus ici sur cet exposé puisqu’il vous suffit de suivre l’hyperlien pour avoir l’original complet !

Cette segmentation pèse lourd s’il faut tout développer pour 3 ou 4 OS différents avec des langages et des outils différents ! Je doute qu’un seul DSI et qu’un seul patron soit d’accord pour multiplier par 3 ou 4 le nombre d’informaticiens de ses équipes et par autant ses couts de maintenance évolutive et correctrice ! Il faudra donc choisir et faire des impasses ...

Le recentrage vers des applications Cloud ou des serveurs centralisant 100% du code métier est la logique de la prudence : fabriquer des frontaux iOS, Android, WinRT ou autres n’est alors plus qu’affaire d’interfaces utilisateurs ce qui permet de contenir l’explosion des couts de réalisation et de rester plus agile pour réagir aux différents rééquilibrages et bouleversement du marché à venir.

Car le marché si illisible pour l’instant va tendre vers un nouvel équilibre qu’il est bien difficile de prévoir. Il y a donc urgence à se mettre dans la position la plus favorable possible pour aborder une mer agitée et les tempêtes qui éclateront sans crier gare !

Professionnellement, deux approches sont seules à même de permettre la réalisation de telles serveurs centralisés : Java et .NET. Bien que Microsoft pousse WinRT, il est bien évident que .NET reste dans le monde Microsoft la seule technologie sérieuse pour ce type d’applications (on voit mal pour l’instant une application serveur écrite sous WinRT, sandboxée et tombstonée ! Autant qu’on voit assez mal une mise à jour rapide des machines sous Windows server vers du Metro Style...).

Si j’ai bien entendu un penchant largement connu, et assumé, pour .NET, ceux qui choisiront Java pour reformater leurs applications en mode full server ne seront pas dans l’erreur. Ici seule l’affinité qu’on a avec la plateforme compte, elles se valent globalement du point de vue technique. Toutefois, la cohérence de .NET, sa grande proximité avec WinRT et l’ouverture sur le monde mobile que cela représente m’apparait un choix logique minimisant les couts de formation du personnel.

La mort d’Apple ?

Dans un billet fort intéressant, George Colony, patron de Forrester, un des poids lourds du consulting aux US, annoncer la fin en pente douce de Apple pour dans deux ans, en comparant sa chute à celle de Sony (Cf. “Apple = Sony”).

L’argumentation est intéressant et je vous enjoins à lire cette article.

Pour ma part je pense que Apple va chuter aussi parce qu’ils utilisent les mêmes recettes que celles qu’ils ont appliqué à l’époque du MacIntosh : des produits très en avance vendus dans un élitisme le plus total soutenu par une gouroutisation du dirigeant mais dans l'isolement le plus total. Les procès faits à ceux ayant tentés, même légalement, de fabriquer des compatibles Mac a eu pour seul résultat la chute d’Apple alors numéro 1 de la micro au profit de IBM et de tous les compatibles PC.

Apple rejoue exactement la même scène, commettant les mêmes erreurs. Une fois la concurrence à niveau, ce qui est le cas aujourd’hui (Samsung et ses machines Android est devenu ces derniers jours le 1er fabriquant de téléphones devant Nokia par exemple, Windows Phone 8 n’aura rien à envier à iOS non plus), le modèle Apple subira les mêmes défaites que par le passé. Même histoire, rejouée de la même façon. Même issue.

Mais nous restons ici dans la spéculation ce qu’il ne faut jamais oublier. Disons que l’ensemble de tout ce qui est dit ici converge vers un même point nous permettant de préparer l’avenir. Des certitudes sur le futur, cela n’existe pas.

La mort de Google et Facebook ?

On pourrait en conclure facilement que la mort de Apple laisserait un boulevard à Google qui deviendrait à terme le seul géant capable d’imposer la donne, face à Microsoft dont, pour l’instant, nous ne pouvons raisonnablement parier ni sur le succès ni sur l’échec de sa stratégie Windows 8 (puisque tout cela reste à venir).

Il s’agit encore de spéculation qu’il ne faut pas prendre à la lettre. C’est la tendance de toutes ces spéculations qui prend un sens, pas une en particulier.

Qu’est-ce qui pourrait bien tuer des géants tels que Google ou Facebook à l’horizon 2017 ?

La réponse est simple : les entreprises du web mobile qui fonctionnent sur des modèles économiques plus rentables, tout simplement...

Ce n’est pas votre serviteur qui le dit, mais Eric Jackson sur le site de l’agence Forbes...

Et ils proposent bien entendu une argumentation solide pour avancer un tel bouleversement. Il s’agit de spéculation et chacun pourra donner à cette analyse le poids qu’il veut (d’autant qu’un autre contributeur chez Forbes, Haydn Shaughnessy, nuance l’analyse de Jackson selon un autre point de vue). Mais ce n’est pas sans raison que dans ce billet j’ai tenu à rappeler d’autres de mes billets, d’autres analyses de géants du consulting mondial qui, au fil de l’eau, tracent toutes un même lit pour une même rivière : celle d’une mort du Web actuel, une mort qui bien entendu ne sera pas un “silence radio”, mais un changement de cap, un réajustement des objectifs, un recentrage des technologies, une modification des moyens en œuvre et une redéfinition des priorités.

Je vous propose de lire directement l’article fort intéressant de Challenges (en français) qui résume le billet le Jackson:  
Pourquoi Facebook et Google pourraient disparaitre en 2017”.

L’une des bases de cette analyse est qu’une génération chasse l’autre. Il y a eu la génération Netscape, Yahoo, AOL, etc entre 94 er 2001, celle du Web 1.0 qui est mort depuis longtemps.  Entre 2002 et 2009 le Web 2, le fameux Web social a vu naitre des géants comme Facebook et LinkedIn ainsi que les spécialistes des coupons comme Groupon.

Mais, je cite l’article, “Mais depuis 2010, l’internaute va progressivement se changer en mobinaute, à l’image de la profusion de nouvelles applications [natives donc, OD] créées pour l’IPhone d’Apple ou les Smartphones fonctionnant sous Android.

Si le Web 1.0 à introduit la notion de “portail” agrégeant les informations venant de nombreuses sources, si le Web 2.0 a ajouté la dimension “sociale”, le Web 3 pourrait tout simplement ne pas exister... “Car moins que la naissance d’un Web 3.0, cette révolution [des mobiles, OD] signe en fait la mort du Web traditionnel.” (sic)

Le Web 3.0 ne sera pas, HTML 5 non plus donc.

De fait, c’est tout le Web qui flanche, c’est son modèle et ses technologies, incapables d’apporter une nouveauté capable de contrer la montée massive et inattendue des applications natives sur les unités mobiles.

Si le Web n’est tout simplement plus l’avenir d’Internet, il serait bien naïf de prêter encore le moindre intérêt à HTML 5 vous en conviendrez aisément.

Un Web plus “utilitaire” naitra certainement, vitrine des applications mobiles, point d’accroche pour la publicité institutionnelle, support des blogs, bref, un Web très sage, très “pratique”, un Web “aiguillage”, un répertoire géant, loin des applications soi-disant universelles tout en arabesques tracées en SVG sur un Canvas HTML 5...

Conclusion

Dans cette période floue, chacun aimerait avoir une boule de cristal pour prédire l’avenir. Faire des choix en ayant la certitude de ce que sera la futur serait tellement simple...

Hélas, pas plus aujourd’hui qu’hier, pas plus en informatique que dans notre vie privée il n’est possible de lire l’avenir.

Est-ce à dire que tous les possibles sont ouverts et que donc on ne sait rien ?

Bien sur que  non !

Un éclaireur qui amène une troupe vers une cible bien cachée dans une forêt est-il un devin ? Non. C’est un professionnel qui sait lire les traces bien réelles, parfois tellement ténues que seul lui peut les voir, mais il s’appuie sur des faits, des indices matériels et non sur la magie.

Au travers de ces divers billets je ne veux pas être un mage, un gourou ou une madame Irma, je ne suis qu’un éclaireur qui lit les pistes. Libre à vous de me suivre ou de tracer votre route, seul au milieu de cette épaisse forêt dangereuse sans tenir compte de mes conseils, c’est votre droit le plus strict !

 

Mais pour en savoir plus : Stay Tuned !

 

Petit rappel sur quelque chose qui n’a rien à voir mais qui m’agace :

Je vois de plus en plus de gens utiliser “sic” comme une sorte d’onomatopée rigolote sortie d’une BD qui marquerait une forme d’ironie ou de regret. Je rappelle donc que “sic” veut dire “ainsi” en latin et qu’on l’utilise exclusivement pour indiquer qu’on cite une phrase exactement comme elle a été écrite ou prononcée. Donner un autre sens à “sic” c’est à coup sûr passer pour un illettré, un peu comme tordre des expressions façon Coluche “il est sorti de la cuisine de Jupiter”, “mettre des bâtons dans les trous”, “fier comme s’il avait un bar-tabac”... lui le faisait exprès pour faire rire, ne faites pas rire à vos dépens sans le faire exprès... C’était la minute du regretté Maitre Capello !.

Quoi de neuf dans C# 5 ?

NewContre vents et marées, ce fantastique langage qu’est C# continue son éternelle mutation, comme un papillon qui n’en finirait pas de renaitre de son cocon, toujours plus beau à chaque fois. Dernièrement j’ai beaucoup parlé de WinRT et Windows 8, et j’en reparlerai tout l’été pour préparer la rentrée ! Mais lorsque tout cela sera enfin sur le marché la version 5 de C# le sera aussi et il serait bien dommage de l’oublier. Quelles nouvelles parures arbore notre papillon dans cette mouture ?[more]

C#5 Une évolution logique

Selon comment vous regarderez C#5 vous le trouverez révolutionnaire ou bien simplement dans la suite des améliorations déjà immenses des versions précédentes.

C# 5 est “tout simplement” une suite logique en adéquation avec les besoins des développeurs.

D’un côté peu de nouveautés aussi faramineuses qu’à pu l’être Linq par exemple, et de l’autre des avancées absolument nécessaires pour être en phase avec les exigences des applications modernes.

Des petites choses bien utiles...

 

Informations de l’appelant

Parmi ces petites choses bien utiles on trouve les informations de la méthode appelante. C’est simple, c’est pas le truc qui scotche, mais cela permet par exemple d’écrire en quelques lignes son propre logger sans être dépendant d’une grosse librairie externe comme Log4Net ou d’autres.

On connaissait déjà les paramètres optionnels introduits par C# 4 et qui permettent d’écrire un code de ce type :

   1: public void MaMethode(int a = 123, string b = "Coucou") { ... }
   2: MaMethode(753);  // compilé en MaMethode(753, "Coucou")
   3: MaMethode();     // compilé en MaMethode(123, "Coucou")

Sous C# 4 la valeur des paramètres était forcément une constante. C# 5 introduit la possibilité d’utiliser un attribut qui ira chercher la valeur au runtime parmi les informations de la méthode appelante (appelante et non appelée ce qui fait toute la différence ici).

De fait, il devient possible d’écrire un code comme celui-ci :

La méthode de log

   1: public static void Trace(string message, 
   2:                        [CallerFilePath] string sourceFile = "", 
   3:                        [CallerMemberName] string memberName = "") 
   4: {
   5:     var msg = String.Format("{0}: {1}.{2}: {3}",
   6:                              DateTime.Now.ToString("yyyy-mm-dd HH:MM:ss.fff"), 
   7:                              Path.GetFileNameWithoutExtension(sourceFile),
   8:                              memberName, message);
   9:   MyLogger.Log(msg);
  10: }

Ici rien de très spécial, sauf la présence des attributs dans la déclaration des paramètres optionnels. Pour faire court le code suppose une infrastructure hypothétique “MyLogger” qui elle stocke le message (ou l’envoie sur le web ou ce que vous voulez).

Grâce à cette astuce il est très facile de logger des messages dans son code en utilisant son propre code “Trace” :

   1: // Fichier CheckUser.cs
   2: public void CheckUserAccount(string userName) 
   3: {
   4:   // compilé en Trace("Entrée dans la méthode", "CheckUser.cs", "CheckUserAccount")  
   5:   Trace("Entrée dans la méthode");
   6:   // ...
   7:   Trace("Sortie de la méthode");
   8: }

 

A première vue ce n’est pas révolutionnaire en effet. Pratique en revanche. A seconde vue ce n’est toujours pas révolutionnaire mais ça peut s’utiliser de façon plus pratique...

Prenons le cas de l’interface INotifyPropertyChanged qui demande à passer le nom de la propriété dans l’évènement. Il existe tout un tas de “ruses” dans certaines librairies pour soit contrôler le nom passé, soit tenter comme Jounce d’éviter de le taper. Toutes ces tentatives sont essentielles car une simple erreur d’orthographe ou tout bêtement un refactoring du nom d’une propriété peut casser toute la belle logique d’un databinding...

En y réfléchissant bien, les nouveaux attributs de paramètres optionnels peuvent être utilisés pour régler définitivement ce problème récurrent, de façon efficace, simple et uniquement en utilisant le langage et ses possibilités :

   1: public class ViewModelBase : INotifyPropertyChanged {
   2:   protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
   3:  {
   4:     if (!Object.Equals(field, value))
   5:     {
   6:       field = value;
   7:       OnPropertyChanged(propertyName);
   8:     }
   9:   }
  10:   // ...
  11: }
  12:  
  13: public class Ecran1WM : ViewModelBase
  14: {
  15:   private int largeur;
  16:   public int Largeur
  17:   {
  18:     get { return largeur; }
  19:     set { Set(ref largeur, value); }  // Le compilateur remplira le nom de propriété avec "Largeur" 
  20:   }
  21: }

Pas si simpliste que ça donc cet ajout de C#5 !

Variables de boucle et expression Lambda

Ici aussi il ne s’agit pas forcément d’une révolution. Quoi que...

Vous le savez peut-être (je dis bien peut-être car le sujet est loin d’être compris par tout le monde, même des développeurs confirmés) il ne faut pas utiliser les variables de boucle dans des expressions Lambda par exemple.

En effet, le fameux problème de “closure” fait que la variable encapsulée est celle de la boucle et qu’en général cela ne correspond absolument pas à l’effet escompté.

Je ne referai un pas speech sur les closures puisque la bonne nouvelle c’est qu’en réalité C# 5 fonctionne comme on s’y attendait sans plus avoir à se poser de question bizarre...

Un petit exemple pour ceux qui ont du mal a situer le problème. Le code suivant ne fait pas ce qu’on attend de lui :

   1: var nombres = GetNombres(1, 2, 3, 4, 5);
   2: foreach (var n in nombres)
   3:  {
   4:   Console.WriteLine(n(10));
   5:  }
   6:  
   7: // Sortie réelle : 15 15 15 15 15
   8:  
   9:  public static List<Func<int, int>> GetNombres(params int[] addends)
  10:  {
  11:   var funcs = new List<Func<int, int>>();
  12:   foreach (int addend in addends)funcs.Add(i => i + addend);
  13:   return funcs;
  14:  }

Bref c’est pas très clair les closures pour plein de gens.

Au lieu d’avoir a créer une variable locale qui elle peut être capturée par la closure et éviter la catastrophe du code ci-dessus, C# 5 comprend la situation et fournira cette fois-ci le résultat attendu...

Cela supprimera des bugs bien sournois pas encore découverts et qui, au gré d’une recompilation en C# 5 disparaitront tous seuls sans que personne ne sache qu’ils ont pourtant été là !

 

... Aux grandes choses très utiles !

 

La programmation Asynchrone, l’épouvantail à développeur...

Ah, la programmation asynchrone... Il suffit d’en parler pour que le silence se fasse autour de la machine à café et que chacun trouve une excuse pour s’éclipser ! Il est vrai que le sujet à de quoi imposer le silence : soit on est un expert, soit il est préférable de ne rien dire de peur de dire une bêtise. D’ailleurs asynchrone c’est du multitâche ou ce n’en est pas ? Clac-clac font les dents dans le silence des vapeurs de café (ou les volutes de cigarettes en se caillant sur le trottoir, mais là c’est le froid plus que la peur qui fait jouer des castagnettes aux quenottes !).

.NET et C# proposent des tas de moyens de faire de la programmation asynchrone et du multitâche, mais ces méthodes ne passionnaient guère de monde jusqu’à ce que les progrès du hardware ne passent plus par les GHz mais par le nombre de cœurs du CPU et jusqu’à ce que les services Web (et me Cloud) se démocratisent Et là, panique ! Trop peu de compétence pour un sujet si délicat.
Tout le monde a eu, à un moment ou un autre, “peur” du multitâche et de l’asynchrone.

Mutex, Lock, Thread, ThreadPool, ThreadStart, WaitCallBack, Monitor.Enter, Monitor.Exit, TryEnter, Pulse et Wait, BeginGetResponse, EndGetResponse, objets immutables et j’en passe !!!

De quoi avoir le tournis je l’avoue.

Asynchrone ? Multitâche ?

Les deux choses sont très différentes et sont souvent confondues à tort.

Bref c’est un peu le bouillon. C# 5 s’intéresse à l’asynchrone, le multitâche avait plutôt été traité dans C# 4.

Multitâche

Le multitâche consiste à faire tourner plusieurs tâches en même temps. Ni plus ni moins. Il peut être utilisé en conjonction de la programmation asynchrone ou non, il n’y a pas de lien direct entre les deux techniques.

C# 5 ne propose rien de particulier concernant le multitâche proprement dit puisque cela a plutôt été l’une des avancées de C# 4 avec PLINQ et la classe Parallel. Alors passons à la suite...

Asynchrone

L’asynchrone est d’une autre nature. Il s’agit de faire exécuter une tâche (généralement sur une autre machine ou un périphérique) sans être sûr de quand arrivera la réponse (s’il y en a une) le tout sans bloquer le logiciel et son UI (ce sont ces considérations optionnelles qui peuvent amener à utiliser des techniques issu de la programmation multitâche, sans rapport direct avec l’asynchronisme ou faire penser que l’asynchronisme est du multitâche, vous suivez toujours ? !).

Le cas le plus fréquent aujourd’hui est la gestion des données. Qu’il s’agisse de véritables services Web ou d’équivalences techniques, les données sont de moins en moins accédées de façon directe.

L’écriture synchrone est facile. Le programme s’écrit au fil des lignes schématisant le temps qui coule de haut en bas dans le sens de lecture du code. Il est aisé d’entreprendre des actions, d’attendre leur réponse, de tester des valeurs, de passer à la suite. C’est la programmation “d’avant”.

Avec un service Web, une requête SQL, Entity framework, etc, le temps n’est plus linéaire au sein du programme puisqu’en réalité d’autres machines (d’autres cœurs, d’autres ordinateurs plus “loin”, d’autres périphériques) devront, chacun à leur rythme et en fonction de leur charge traiter un bout du problème et retourner une réponse.  Tout ce qui prend du temps peut être rendu asynchrone pour rendre la main le plus vite possible, clé de la réactivité des OS modernes.

L’asynchronisme pose ainsi de gros problèmes d’écriture. Comment faire en sorte que le programme ne soit pas bloqué sur la ligne x, en attende de la réponse à la question “envoyée ailleurs” sans pour autant passer à la ligne x+1 qui doit elle attendre que les résultats soient là pour avoir un sens ? Le propre de l’asynchronisme est de ne pas être bloquant, et c’est bien là que ça... bloque ! Car comment continuer à travailler sur des données qu’on a demandé si elles ne sont pas encore là...

Grâce aux méthodes anonymes de C# il était plus ou moins facile de résoudre le problème en programmant l’action a effectuer sur la réponse au sein d’un Callback. Charge au développeur de gérer les conséquences de tout cela : que faire pendant qu’on attend quelque chose ? rien ? passer à autre chose ? Que faire quand on sera interrompu, “plus tard”, par la réponse qui enfin arrivera ?

Tout cela peut se résoudre en appliquant des guides lines précises et en maitrisant, notamment sous Silverlight, WPF et demain WinRT, les notions de databinding, les méthodes de travail de type MVVM, et bien entendu les bases mêmes à la fois du multitâches et de la programmation asynchrone. Car dans la pratique c’est en faisant un savant mélange de toutes ces choses qu’on arrive à écrire un programme fluide et réactif.

Simplifions un peu

Toutefois, si l’utilisation des méthodes anonymes a rendu les traitements asynchrones plus facile à orchestrer, elles n’ont pas résolu tous les problèmes. Loin s’en faut.

Lorsqu’une application Silverlight doit par exemple demander une liste d’items sur laquelle elle doit effectuer un autre traitement asynchrone (le tout via RIA Services par exemple), les callbacks s’imbriquent les uns dans les autres pour devenir illisibles. S’il faut en même temps prendre en charge la gestion d’éventuelles erreurs, leur log, etc, le code peut devenir rapidement imbuvable, donc in-maintenable.

La programmation asynchrone se généralisant il fallait trouver un moyen de simplifier tout ça.

Async et Await

C# 5 vient à la rescousse avec deux nouvelles instructions. Async et Await.

Et c’est plus simple encore que cela en a l’air au regard de la complexité du sujet.

Async est utilisé pour marquer une méthode. Cette marque est faite à l’intention du compilateur pour lui dire “à l’intérieur de cette méthode je veux écrire mon code comme si tout était synchrone”. C’est le compilateur (et la plateforme) qui vont se charger du reste.

Pour la petite histoire, cette bonne idée à été reprise de F# d’ailleurs.

Il est important de marquer une méthode avec Async car cela est utilisé par les appelants qui doivent savoir qu’ils auront certainement la main avant que le travail de la méthode appelée ne soit terminé. L’impact dépasse donc la méthode marquée pour atteindre tout code qui en fera l’usage.

Await est simplement utilisé comme une sorte de préfixe devant une instruction asynchrone pour dire au compilateur de se débrouiller pour que tout ce passe “comme si” l’appel était bloquant. On revient à une écriture synchrone du code. C’est donc une grande simplification. Mais attention l’astuce est plus complexe, j’y reviendrai certainement, car les appels ne sont pas réellement bloquants... la méthode prendra souvent fin et reviendra à l’appelant avant que le job des tâches asynchrones ne soit terminé. Ce sont bien des callbacks et non des points bloquants...

En fait, C# 5 va bien écrire les callbacks à notre place. Mais comme il le fait pour nous le code qu’on écrit redevient clair et limpide. Il ne faut pas se laisser abuser par cette apparence donc.

Voici un exemple de code utilisant Async et Await :

   1: public async void ShowReferencedContent(string filename)
   2: {
   3:   var url = await BeginReadFromFile(filename);
   4:   var contentOfUrl = await BeginHttpGetFromUrl(url);
   5:   MessageBox.Show(contentOfUrl);
   6: }

Dans la méthode ci-dessus on remarque deux choses : la méthode elle-même est marquée avec le mot clé “async” comme expliqué plus haut, et les lignes 3 et 4 utilise “await” en préfixe du code exécuté. Ces deux lignes de code font des appels à des méthodes asynchrones. Normalement le programme passerait à la ligne 4 avant que le résultat de la ligne 3 ne soit connu. Et forcément ça marcherait moins bien...

Mais ici, inutile d’écrire des méthodes anonymes passées en paramètres de méthodes asynchrones acceptant des callbacks (rien que l’écrire c’est compliqué !). C#5 se chargera de tout. Le code “semble” synchrone, mais il reste asynchrone seule l’imbrication des callbacks est écrite à notre place.

Vous allez penser que c’est très bien, mais que se passe-t-il si on souhaite que la méthode retourne une réponse à ses appelants ?

Comme une méthode “async” pourra se terminer avant que son travail ne soit réellement fini, il va falloir trouver un moyen d’indiquer à l’appelant qu’en plus elle retourne une valeur qui ne viendra que “plus tard”. On utilise alors une notation un peu différente pour son entête.

Par exemple, si la méthode doit retourner un “string”, son entête ne sera pas “public async string maméthode()” mais elle utilisera la classe générique Task pour retourner un Task<string>.

Une instance de Task représente un “bout de travail” qui peut éventuellement retourner une valeur. L’appelant peut examiner l’objet Task pour connaître son état et sa valeur de retour.

Un tel code ressemblera à cela :

   1: public static async Task<string> GetReferencedContent(string filename)
   2: {
   3:   string url = await BeginReadFromFile(filename);
   4:   string contentOfUrl = await BeginHttpGetFromUrl(url);
   5:   return contentOfUrl;
   6: }

On note la particularité suivante : la méthode retourne un string alors que le type est Task<string>. Ici aussi c’est le compilateur qui prend en charge la transformation du string en Task<string>.

Désormais un appelant peut utiliser la méthode comme bon lui semble : dans un mode “à la synchrone” avec await, ou bien en attendant “manuellement” le résultat, en sondant régulièrement le Task pour connaître son état...

Ceux qui ont déjà utilisé les méthodes asynchrones de .NET 4 noteront que les paires de méthodes "Begin / End” (comme WebRequest.BeginGetResponse / WebRequest.EndGetResponse), si elles existent toujours sous .NET 4.5 ne sont pas utilisables avec “await” (les Beginxxx nécessitent un appel de méthode explicite à l’intérieur du callback pour obtenir la réponse notamment). A la place, .NET 4.5 fournit de nouvelles méthodes qui retournent un Task. Ainsi, au lieu par exemple d’appeler WebRequest.BeginGetResponse, on utilisera WebRequest.GetResponseAsync.

Un petit exemple pour clarifier :

   1: private static async Task<string> GetContent(string url)
   2: {
   3:   WebRequest wr = WebRequest.Create(url);
   4:   var response = await wr.GetResponseAsync();
   5:   using (var stm = response.GetResponseStream())
   6:   {
   7:     using (var reader = new StreamReader(stm))
   8:     {
   9:       var content = await reader.ReadToEndAsync();
  10:       return content;
  11:     }
  12:   }
  13: }

 

Conclusion

C# a tellement évolué depuis sa première version qu’on se demande comment il est possible de trouver encore matière à faire de nouvelles versions... Mais c’est sans compter sur les besoins mêmes du développement qui évoluent.

Jusqu’à C# la plupart des langages disparaissaient lorsqu’ils devenaient inadaptés. C# a connu des modifications d’une profondeur rarement atteinte par aucun langage professionnel.

C# était à sa sortie une sorte de Java avec des éléments de syntaxe de Delphi (comme les propriétés). Delphi et C# ayant le même père on sentait la proximité tout comme l’influence de Java qui avait valu quelques soucis à Microsoft à l’époque avant d’être abandonné. Puis, en une dizaine d’années, au fil des versions, C# est devenu un langage totalement différent de ses sources d’inspiration. Intégrant rapidement des techniques empruntées à d’autres langages, ajoutant ses propres bonnes idées ou piochant dans des langages essayistes tels que F#.

Avec C# 5, fonctionnant avec WinRT, WPF et Silverlight, nous allons disposer d’un langage encore plus proche de nos besoins quotidiens pour produire des logiciels de plus en plus sophistiqués, réactifs, fluides, designés, s’adaptant à différents form factors.

Loin de se spécialiser (et perdre de sa souplesse) ou de trop se généraliser (et de se noyer dans trop d’options), C# impose son style unique qui en fait un allié de premier plan pour programmer des logiciels modernes tout en nous permettant de maitriser la complexité croissante du code à produire.

Certaines modes voudrait faire venir au premier plan pour développer de vrais applications de vieux langages utilitaires interprétés dont l’indigence laisse pantois. Ne vous laissez pas convaincre par ces leurres, servez-vous de vos connaissances, rentabilisez vos diplômes et demandez-vous si un informaticien professionnel qui ne sait pas faire la différence en javaScript et C# 5 a encore le droit de se proclamer professionnel...

Mobiles : les apps natives flinguent le web !

NewJ’en parlais dans mon dernier billet “Html 5, la fin tragique d’un buzz” qui a fait réagir beaucoup de monde. Jugé par certains comme une vision délirante du futur, la grande majorité des lecteurs adhéraient à ma prédiction. Celle-ci se confirme bel et bien, les applications natives sont l’avenir du développement, et non plus Html 5...[more]

N’en déplaise aux grincheux ou à ceux qui trop “intoxiqués” par le buzz Html 5 se refusent à voir la réalité en face, j’ai maintenant des chiffres à vous proposer : La fréquence moyenne des sites Internet a baissé de 5,5% sur un an, la faute aux applications mobiles.

Bien sûr je vois les mêmes sceptiques se préparer à m’invectiver en doutant de mes chiffres.

C’est pourquoi que je n’en dirais pas plus, et je renvoie le lecteur à cet article édifiant de BusinessMobile.fr “Le succès des applications mobiles plomberait le trafic des sites Web français”.

C’est court, clair, et cela confirme ce que je disais : Les applications natives des mobiles prennent le pas sur les sites Web, ce qui, de fait retire tout son caractère “universel” supposé à Html 5 puisque les mobiles ne se programment pas en ce langage destiné au Web.

Certains futés me feront remarquer que si, les mobiles qui fonctionneront sous Windows 8 pourront être programmés en html / js, et que donc c’est bien l’avenir.

Je n’entrerai pas dans ce qui m’apparait être ici un concours de mauvaise foi : d’une part Windows 8 n’existe pas encore (fin d’année 2012) on ne peut donc pas encore parler de sa pénétration du marché et encore mois de quels outils de développement seront ou non adoptés sur cet OS, et d’autre part il convient de rappeler que Html/js sous WinRT se programme de façon très spécifique liée à Windows 8 et ne permet en rien de développer des applications pour le Web. Développer sous WinRT c’est développer en “natif” pour Windows 8 quel que soit le langage choisi. Comme sous .NET il existe un choix de langages, dont aujourd’hui JavaScript et html. Mais tout cela permet de faire du natif et non du web.

Bref, l’avenir est au natif et le problème sera de choisir quel natif... iOS, Android ou le prochain Windows 8 ?

En tout cas ne pas écouter la petite voix qui vous dit depuis longtemps que Html 5 n’est pas l’avenir universel que le buzz fait croire serait certainement une grosse erreur. L’avenir du Web lui-même sera toujours Html mais pour la portabilité des sites on choisira certainement plutôt ASP.NET avec du Html 3 ou 4 et une poignée de JavaScript que Html 5.

Même s’il reste impossible aujourd’hui de prévoir le succès de Windows 8 (qui cumule à mon avis autant d’excellentes avancées que de points discutables, notamment Metro Style tout tactile imposé comme menu central même aux PC) nous savons d’ores et déjà que seul Windows 8 offrira une vision cohérente réexploitant le savoir faire des équipes en place pour développer du PC au Smartphone en passant par les tablettes. Si Windows 8 ne fait pas un grand succès au niveau grand public, il y a fort à parier que les DSI réfléchissent à deux fois avant d’engager et de former du personnel supplémentaire pour gérer iOS et Android alors qu’ils possèdent déjà les compétences pour faire du WinRT...

C’est à ces entreprises, à leurs DSI, à leurs développeurs que je m’adresserai bientôt au travers d’une série d’articles sur WinRT programmé en C# et Xaml. En Juin nous disposerons d’une RC de Windows 8 qui permettra bien mieux que les bêta de se faire une idée du produit final. A partir de sa sortie Dot.Blog se tournera sur les diverses possibilités qu’offrent Windows 8, tant du point de vue WinRT pour les PC, Tablettes et Smartphones que dans sa partie “classique” avec WPF et certainement encore Silverlight (car rien ne l’égale pour des applications Intranet ou extranet de qualité).

Nous verrons ainsi au fur et à mesure, comment réutiliser son savoir faire WPF/Silverlight pour créer des applications WinRT pour tablettes ou Smartphones, et même pour PC.

Nous sommes actuellement dans le creux de la vague, il n’est plus l’heure de promouvoir WPF ou Silverlight (malgré le grand intérêt qu’ils conservent) mais il est trop tôt pour parler sérieusement de WinRT, ne serait-ce qu’en raison de l’absence de machines (tablettes et Smartphones) pour le faire tourner. Dot.Blog se veut constructif et s’attache à transférer une connaissance utile, jouer les essayistes avec des bêta et des outils de développement pas encore finis est juste ludique mais nous sommes trop occupés pour perdre du temps à jouer...
Mais d’ici juin les choses vont changer et l’apparition d’une première tablette (la Nokia fabriquée par Asus) pourrait nous permettre de passer du jeu à la réalité en expérimentant réellement les possibilités de WinRT avec un RC très proche de la finale. Appliquer MVVM à WinRT sera par exemple un questionnement passionnant, la gestion du tombstoning même sur PC posera de nouvelles questions. Quelles librairies utiliser ? Comment contourner le manque de certains composants ? Prendre en compte le tactile, les différents form factors ? Publier sur le market place ? Des milliers de questions de ce type attendent des réponses pratiques... J’y travaille...

D’ici là, ne lâchez pas vos compétences C# / Xaml pour céder aux sirènes de Html 5, les sirènes, dois-je le rappeler, créatures fantastiques, étaient craintes des marins car elles faisaient échouer les bateaux qui cédaient à l’appel de leur chant si mélodieux, mais fatal...

 Et forcément,

 Stay Tuned !

HTML 5 : la tragique fin d’un buzz

HTML 5, l’un des plus gros buzz sur du vaporware des vingt dernières années... Ce buzz prend fin de façon tragique. Il faut rapidement s’en rendre compte pour prendre les bonnes décisions pour le futur de vos développements ![more]

Le Web est-il encore l’avenir de l’Homme ?

Le Web est partout, il faut partie de nos vies, il a envahi nos cerveaux, nos écrans, et même celui des petits enfants (malgré l’interdiction de s’inscrire en dessous de 13 ans, Facebook compte beaucoup d’enfant de moins de 6 ans qui ont leur page !).

Le Web ce n’est qu’un outil de l’Internet, ce fantastique réseau qui, comme tout progrès de cette taille, amène autant d’avancées extraordinaires que de mésusages dangereux.

Mais si Internet est là, et pour longtemps, en va-t-il de même pour le Web ?

Mais n’entend-t-on pas dire tout le temps “Le Web est devenu un support et un transporteur d’information essentiel tant au business qu’à la vie privée.” ?

Non ! C’est une erreur... Internet est ce vecteur, le Web n’est qu’une application spécifique de l’Internet !

Le Web sera-t-il présent dans l’avenir ? Oui, mais plus à 100%.

Le Web se programme, il a ses normes (beaucoup), ses modes, ses courants de pensées, ses dogmes. Et il a HTML comme base. Et cela ne changera pas de si tôt.

Ce qui va changer c’est que le Web ne va plus être 100% de l’utilisation d’Internet, comme le PC cesse de représenter 100% du marché des logiciels.

La version 5 de HTML est bien trop en avance sur les browsers, ces derniers implémentent les choses de façon trop anarchique, les outils de développement ne sont pas à la hauteur, etc. Mais la norme 5 de HTML s’imposera au fil du temps, comme ce fut le cas pour pour les 4 précédentes.

Mais voilà, si le Web restera le Web, ce sont les machines pour s’y connecter qui ne sont plus les mêmes ! Et cela change TOUT.

C’est Internet l’avenir de l’Homme, pas le Web...

Internet for ever

On le voit clairement, Internet en tant qu’infrastructure mondiale de communication libre fait aujourd’hui partie de nos “besoins vitaux”, qu’il s’agisse de vendre de la musique ou bien de préparer une révolution au Maghreb... Des plus riches aux plus opprimés, des plus bavards pour le plaisir de pérorer sur FB aux plus muselés derrières les par-feux chinois, Internet est une “plomberie” devenue indissociable de l’avenir des entreprises comme de celui des peuples et des individus.

Le problème pour gérer l’avenir c’est souvent qu’on associe trop facilement ce qui est séparé uniquement parce que l’habitude a créé un lien artificiel entre les choses.

C’est le cas du Web et d’Internet.

Internet la plomberie, le Web l’interface. Une simple application d’Internet. La plus voyante jusqu’à hier. Mais pas demain...

Internet et Web ne sont pas liés. Le second n’est qu’une façon parmi d’autres d’utiliser le premier et pas la seule.

Les browsers ne sont que des applications spéciales proposant une interface pour utiliser Internet d’une certaine façon.

Mais aujourd’hui Internet peut être utilisé directement par des applications sans passer par un Browser ! Des millions d’ordinateurs dans le monde à chaque seconde échangent des données en passant par Internet mais en ignorant totalement les browsers !

Bref : Confondre l’avenir d’Internet avec l’avenir du Web est une erreur grossière...

L’explosion des form factors coulent le Web

S’il est facile d’accéder au Web sur un PC ou un Mac, car double-cliquer sur l’icône d’un browser est aussi simple que de le faire sur n’importe quelle application, l’accès au Web sur des tablettes ou des Smartphones est déjà moins aisé. Tout utilisateur d’unité mobile l’a constaté.

Sur les Smartphones c’est la taille de l’écran qui gêne le plus. Et le nombre de manipulations pour arriver sur une page Web donnée, taper l’adresse avec un clavier tactile qui couvre l’écran, etc...

Sur les tablettes on retrouve les mêmes problèmes, celui de la taille trop petite de l’écran en moins malgré tout.

Mais le problème n’est pas là. Il est dans l’UX et les possibilités offertes.

Lancer une application native sur un Smartphone ou une tablette offre un confort et des possibilités bien supérieurs à toute visite d’une page Web !

Contrôler finement les deux caméras, le détecteur de présence, la boussole, le GPS, accéder aux données du téléphone, automatiser les tâches, tout cela ne peut se faire correctement qu’en natif, indépendamment du fait qu’une application compilée restera toujours plus réactive que du JavaScript interprété sur une machine donnée.

Le royaume du natif qui nait sous yeux relègue le fantasme d’universalité et de portabilité de HTML 5 à sa nature même de fantasme.

Un monde natif

Smartphones, tablettes, et bien entendu depuis toujours les PC et les Mac, offrent une UX très largement supérieure lorsqu’ils sont programmés en natif que n’importe quelle page Web, même en ajoutant le Canvas à HTML.

La preuve ?

Même les rois du Web comme Google propose sur leur OS Android des applications natives pour accéder à Gmail ou à Google+ !

Facebook propose une application native pour Android ou iOS !

Intermarché, Super U, Cdiscount, et bientôt tous les grands acteurs de la consommation offrent dès aujourd’hui des applications natives iOS et Android en place et lieu d’aller visiter leur site ! Quitte parfois à ce que l’application ne soit qu’une copie du site, ce qui montre la précipitation de certains de ces projets et l’urgence ressentie de changer de cap...

Faisant écho à d’autres de mes billets parus ces derniers temps, le monde qui se profile est un monde d’applications natives et non plus de pages web. Refuser cette évidence c’est s’embourber dans un Web qui n’est plus porteur d’avenir.

La mort du Web ?

Bien sûr que non !

Le Web ne mourra pas, pas plus que l’arrivée des Smartphones et des tablettes ne tuera le monde du desktop. Il faudrait être illuminé et ne rien comprendre à ce qui se joue pour penser une chose pareille.

Mais, car il y a un “mais”, les PC ne représenteront plus 100% du marché du logiciel comme ce fut le cas dans ces 20 dernières années.

Et dans cette même voie et pour les mêmes raisons (en plus de celles invoquées plus haut), le Web ne représentera plus 100% de l’utilisation d’Internet.

Le Web n’est pas mort, HTML 5 non plus. Il y aura un HTML 6, un 22 aussi pourquoi pas. Mais ce Web ne pourra plus prétendre être le seul moyen d’accéder à de l’information vivante sur Internet.

Une grande part de ce qui était véhiculé par le Web au travers des browsers sera demain utilisé par des applications natives au travers d’Internet et du Cloud computing sur des unités mobiles.

Et alors ? Et Alors ?

Hé hé ... Zorro n’est pas arrivé, n’en déplaise à Henri Salvador... Aucun sauveur, aucun messie des temps nouveaux pour protéger le pauvre développeur et l’empêcher d’être noyé dans le Styx des choix cornéliens. Aucun salut n’est à attendre.

Bien au contraire. Les blocs en présence vont tout faire pour maintenir la pression et assurer leur suprématie sur le marché. Steve Jobs l’a fait, ils ont tous été obligés de suivre...

Jobs l’avait bien compris dans son refus de Flash. Personnage détestable et pas aussi génial que ça mais à qui il faut malgré tout reconnaitre une sacrée avance sur les autres lorsqu’il s’agissait de parler du futur et de protéger la valeur de ses actions chez Apple...

Car en refusant Flash, donc en tuant Silverlight aussi mais sans le nommer, en prônant HTML 5 comme “universel”, Jobs savait très bien pour en être l’instigateur que seules les applications natives auraient un avenir sur iOS et qu’il lançait tout le monde sur une mauvaise piste histoire uniquement de se débarrasser du danger que représentaient Flash et Silverlight ! Ne pas le croire serait du coup le prendre pour un crétin ce qui serait très éloigné de la réalité tout de même...

En tuant le rêve d’applications cross-plateforme comme Flash ou Silverlight, Jobs a lancé le monde entier sur une fausse piste, celle de HTML qu’il savait lui-même condamnée... Mais tout le monde est tombé dans le panneau...

En évitant l’avènement d’applications cross-plateformes passant par Internet sous Flash ou Silverlight, Jobs s’assurait qu’aucune “vraie” application ne pourrait passer sur son matériel en évitant le market place !

Les moutons qui ont suivi le buzz HTML 5 ont été envoyé au mur, ils ont été utilisés pour tuer Flash et Silverlight, seuls véritables moyens d’offrir la qualité d’UX du natif tout en échappant au market place des applications natives...

Pauvres fous, trimbalés par un manipulateur de talent... Comme un seul homme ils se sont jetés sur le buzz, ils ont piétiné les seuls technologies qui étaient en mesure, enfin, et pour la première fois en micro-informatique, d’apporter le rêve de la portabilité !

Jobs est mort. Mais sa manipulation a fonctionné.

Aujourd’hui, celui qui vise l’universalité, le cross-plateforme pour ces applications n’a plus d’options.

Le monde du natif a pris le dessus, et pour longtemps.

Une part du Web est mort, pour toujours. le Web vecteur de l’universalité au travers d’applications Flash ou Silverlight est mort. HTML ne viendra pas sauvé le monde de ce constat pour toutes les raisons expliquées ici.

Reste trois blocs proposant trois plateformes incompatibles sur lesquelles les applications natives sont privilégiées et où le Web est voué à ne plus être qu’un citoyen de seconde classe. Le Web, donc les browsers, pas Internet !

Alors, sur ce Web, développer en HTML 5 ou en 3 n’a plus guère d’importance... Si vous n’offrez pas une application native, si vous vous acharnez à vouloir à tout prix développer en HTML 5, en dehors des PC et des Mac, vous ne toucherez personne sur les autres form factors...

C’est en cela que la grande époque du Web est révolue. Celle du natif vient de re-naitre. Internet est plus puissant et plus vivant que jamais, mais ces applications spéciales permettant de s’en servir d’une façon spéciale que sont les Browsers servis par Html ne sont plus des outils exclusif du futur.

La modernité n’est plus à HTML ni aux browsers, la modernité est dans le natif.

Conclusion

Apple, Google, et demain Microsoft, nous proposerons trois visions du monde. Il faudra choisir son camp car croire qu’un éditeur de logiciel ou qu’un développeur pourra être compétent dans les trois mondes est une folie.

A ce jour Apple conserve une vision très réactionnaire des choses : d’un côté le Mac, de l’autres le mobile. S’ils ne se réveillent pas demain ils chuteront comme ils ont chuté il y a 20 ans. Apple, l’éternel serpent de mer de la micro, qui chute à chaque fois pour les mêmes raisons : son manque d’ouverture, son égoïsme congénital, son culte de la personne qui trinque quand le gourou disparait... Le gourou a pu revenir une fois car il n’avait été qu’évincé la première fois. Maintenant il est mort, et son retour est une affaire à laisser entre les mains des spiritistes...

Google n’est pas un spécialiste du software et encore moins des OS, Android n’est qu’un relookage rapide de Linux (Ubuntu). Google s’est attaqué avec un talent incroyable aux Smartphones devenant un vrai concurrent d’Apple. Ils ont créé la surprise la où personne ne s’attendait à les voir et encore moins à réussir. Ils ont étendu ce succès aux tablettes. Le rapprochement Android / Ubuntu qui s’opère en ce moment doit  être le signe que Google nourrit peut-être un appétit pour les plateformes desktop. Attention danger ! Mais nous n’y sommes pas.

Microsoft, d’ici octobre prochain, va nous proposer une vision cohérence, un OS qui fonctionne sur tous les form factors, avec les mêmes compétences, réutilisant même celles déjà engrangées dans l’entreprise avec C#, .NET, WPF, Silverlight. Un OS et une plateforme de développement très au dessus de tout ce qui existe chez les concurrents. Visual Studio, Expression Blend, C#, et même le très commercial couple Html5/js. Il y en a pour tous les gouts, toutes les compétences. Mais avec une seule équipe, une seule formation.

Alors certes Microsoft va arriver bien tardivement sur le marché des mobiles. Mais ce seront les seuls à proposer une vision cohérente du “natif” avec WinRT sur toutes les plateformes.

Je ne connais pas un DSI qui ne serait pas séduit par cette offre qui soulage des lourdes charges que représenterait la constitution d’équipes de développement mixtes, accumulant des talents Windows, Android et iOS.

La mode du BYOD est un leurre. Car 80% des tablettes actuelles sont des iPad. Quelle économie pour l’entreprise d’éviter l’achat de quelques tablettes si cela doit être compensé par l’embauche d’une équipe spécialisée sous iOS en plus des équipes Windows déjà en place ?

Le coût d’une formation adaptée ou ne serait-ce que d’un seul salarié permanent est plus lourd sur une année que l’achat de dizaines, centaines de tablettes Windows 8 ARM...

Demain, le Web ne sera plus 100% de l’Internet, demain le natif sera maitre sur les mobiles, demain Microsoft proposera une solution unifiée, il est temps de se préparer à ces changements et d’oublier le buzz HTML 5 qui vous a fait perdre tant de temps.

Car demain, c’est aujourd’hui.

Alors Stay Tuned !