Parallel Framework Extensions

De plus en plus de personnes sont maintenant équipées de processeurs Dual Core. Les Quad Core commencent aussi à gagner de la popularité, et même les processeurs à huit coeurs (Octo Core ?) deviennent réalité. Il est très facile d'imaginer un processeur seize coeurs dans chaque nouvel ordinateur d'ici seulement quelques années.

Tout ceci est bien beau, mais pour prendre avantage de toute cette puissance, il faut que les applications soient programmées pour utiliser plusieurs threads. Ceci peut devenir très compliqué avec les techniques actuelles, et représente parfois trop de travail pour justifier les résultats. Mais lorsque les processeurs à multiples coeurs deviendront chose du commun, ces résultats seront de plus en plus impressionnants.

Afin de diminuer la complexité de la programmation multi-thread, et ainsi favoriser le développement de ce type d'applications, Microsoft travail sur une librairie très intéressante nommée Parallel Framework Extensions (PFX). Cette librairie offre des façons très simples d'accomplir certaines tâches communes dans le monde de la programmation parallèle.

Par exemple, supposons que vous avez une collection d'objets sur lesquels vous désirez effectuer un traitement. Une implémentation naïve de cela pourrait ressembler à ceci :

private void DoManipulationOnFooList(IList<Foo> data)
{
    foreach (Foo f in data)
    {
        // Do something with f
    }
}

Ce code est très simple et parfaitement acceptable lorsque l'ordinateur n'a qu'un seul processeur. Toutefois, une machine à quatre coeurs ne pourra utiliser que le quart de sa capacité pour traiter ce code.

Une meilleure implémentation serait d'utiliser le ThreadPool.

private void DoManipulationOnFooList(IList<Foo> data)
{
    foreach (Foo f in data)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallBack(delegate(object arg)
        {
            Foo foo = (Foo)arg;
            // Do something with foo
        }, f));
    }
}

De cette façon, plusieurs coeurs seront utilisés. Toutefois, le code est moins élégant que la première version, et quelques problèmes peuvent survenir. Qu'arrive-t-il si une exception a lieu lors du traitement de l'un des item? Plusieurs détails doivent être considérés pour utiliser le ThreadPool, et cette méthode pourrait facilement devenir très compliquée. De plus, pour obtenir le même comportement que la première version du code, il faut ajouter un mécanisme pour empêcher DoManipulationOnFooList de retourner tant que tout le travail n'est pas terminé.

Avec PFX, une implémentation complète et très efficace de cette situation pourrait ressembler à ceci :

private void DoManipulationOnFooList(IList<Foo> data)
{
    Parallel.ForEach<Foo>(data, delegate(Foo f) 
    {
        // Do something with f
    });
}

Notez qu'il ne s'agit peut-être pas de la syntaxe exacte. Je n'ai pas trouvé d'exemple concret de la méthode ForEach.

Beaucoup plus simple n'est-ce pas? Le code est très semblable à la première version, mais celui-ci utilisera efficacement tout les processeurs disponibles. La liste d'objets sera séparée entre les différents coeurs, qui travailleront chacun de leur côté. Si un processeur termine son travail avant les autres, il ira voler du travail aux autres. Les exceptions seront gérées d'une manière prévisible, et la méthode ne retournera que lorsque tout le travail sera terminé.

Bien entendu, PFX ne s'arrête pas là. Bien que cette façon de faire sera satisfaisante dans plusieurs cas, des problèmes plus compliqués demandent des méthodologies différentes. Pour ces cas, il est possible de descendre d'un niveau d'abstraction et d'utiliser des composantes plus flexibles.

Ces concepts de parallélismes ont aussi été adapté à LINQ. Avec PLINQ, vous pourrez prendre avantage de tous les processeurs de l'ordinateur lors de vos requêtes LINQ et ce, en ajoutant simplement .AsParallel() à celles-ci.

Il est difficile d'en dire plus sur ce sujet car très peu de documentation existe pour le moment. Toutefois, il s'agit d'une technologie très intéressante, et je crois bien que tous les développeurs devraient se familiariser avec cela le plus tôt possible. Je vous suggère de commencer par ce vidéo sur Channel9 qui présente un survol des bases de PFX et PLINQ.

Mise à jour, 13 mai 2008: J'ai réalisé que certains liens dans cet article ne fonctionnaient plus. Je les ai remplacés par des liens fonctionnels. Remarquez qu'un CTP de Parallel Extensions est maintenant disponnible à télécharger.

ReSharper

Un autre outil que j'ai récemment découvert est ReSharper. Il s'agit d'un add-in pour Visual Studio qui aide les développeurs à créer du code à la fois robuste et élégant.

Bien qu'il ne soit pas gratuit, ses nombreuses fonctionnalités le rende très intéressant. Son slogan, "The Most Intelligent Add-In To Visual Studio", semble prétentieux, mais après quelques jours à utiliser cet add-in, je ne crois pas que vous voudrez vous en passer.

Je ne peux pas énumérer ici tout ce qu'il peut faire, mais voici un aperçu.

ReSharper analyse votre code et indique les endroit où il semble y avoir des erreurs ou problèmes. Par exemple, si vous retournez un object au lieu d'une string dans une méthode, le code sera souligné et vous serez averti de cela avant même d'avoir compilé. Ou encore, si vous utilisez String.Format() et que vous utilisez plus de paramètres que vous ne fournissez d'arguments, les paramètres en trop seront soulignés.

Pour la plupart des problèmes identifiés, ReSharper offre des corrections automatiques. Ainsi, dans le cas du mauvais type de retour pour une méthode, un menu vous permettra d'insérer un cast à l'endroit approprié en seulement deux clics.

Ajoutez à cela de l'autocomplétion, des outils de refactoring avancés, de nombreux raccourcis claviers très utiles et beaucoup plus encore, et vous avez devant vous un outil qui augmentera à coup sur votre productivité.

ReSharper supporte C# et VB, ainsi qu'ASP.NET, XML et XAML. Je vous invite fortement à télécharger la version d'essais, et de convaincre votre employeur d'investire dans cet outil.

Ghost Doc

Dans le cadre de mon nouvel emploi, j'ai découvert un outil très pratique : Ghost Doc.

Cet add-in gratuit pour Visual Studio aide les développeurs à créer de la documentation pour leur code. Il suffit de positionner le curseur sur le nom d'une méthode ou d'une propriété et de taper un raccourci clavier (Ctrl+Shift+D par défaut), et Ghost Doc génère automatiquement un bloc de commentaire XML Doc.

La beauté de Ghost Doc est la façon dont il génère ces commentaires. Si vous documentez une méthode que vous implémentez d'une interface ou d'une super classe, la documentation existante sera copiée pour votre implémentation. Si toutefois vous documentez une nouvelle méthode, le commentaire sera généré à partir du nom de la méthode. Par exemple, avant :

public void ChangeDirectory(string targetDirectory)
{
}

Et après :

/// <summary>
/// Changes the directory.
/// </summary>
/// <param name="targetDirectory">The target directory.</param>
public void ChangeDirectory(string targetDirectory)
{
}

À première vue, ceci ne semble peut être pas si utile. Peut-être que vous n'utilisez pas les commentaires XML Doc présentement, et que vous ne voyez pas pourquoi vous utiliseriez un tel outil. Demandez-vous dans ce cas : pourquoi n'utilisez-vous pas XML Doc? La réponse est probablement : parce que c'est trop long à écrire! Et bien, avec Ghost Doc, vous n'avez plus d'excuse! Bien entendu, certaines méthodes demandent quelques ajustements aux commentaires générés, mais comme toute la base du commentaire a déjà été générée pour vous, il est très facile de faire les modifications nécessaires.

Un autre avantage de Ghost Doc que j'ai remarqué est qu'à force de l'utiliser, on apprend à mieux nommer ses méthodes. Après avoir bien compris comment les commentaires sont générés, il deviens naturel de choisir un bon nom pour une méthode afin que le commentaire généré soit le plus clair possible, sans avoir à le modifier manuellement. Ce n'est pas évident à expliquer, mais on comprend bien à force de l'utiliser.

Finalement, plusieurs options de configuration sont disponnibles, permettant ainsi d'ajouter certains mots ou certains types de méthodes pour lesquels des traitements spéciaux sont nécéssaires.

J'utilise cet outil depuis maintenant quelques jours, et déjà, je ne m'en passerais plus! Je vous suggère fortement d'en faire l'essaie!

Nouvel emploi

Aujourd'hui était la première journée de mon nouvel emploi chez bxsystems. C'était un retour aux sources pour moi car il s'agit de la compagnie pour laquelle je travaillait auparavant.

Toutefois, la compagnie est méconnaissable. La petite entreprise d'une quinzaine d'employés s'est transformée, en seulement un an, en un joueur important à Québec et embauche maintenant environ 40 personnes. Elle touche à beaucoup plus de domaines qu'auparavant, et ses employés sont divisés en projets internes (tel le projet timesheet), en projets à distances (dont je fais partie) et en consultation.

Le projet sur lequel je travail est très impressionnant. Il s'agit d'un des plus gros système de e-commerce au monde. Le client est Best Buy, qui comprend, entre autres, la chaine Future Shop. Près de 200 développeurs sont impliqués, dans des bureaux à Gatineau, Québec et aux États-Unis. Microsoft est impliqué de très près dans le projet, car une fois complété, il représentera une preuve de l'efficacité des nouvelles technologies .NET.

Une fois livré, tous les sites web de Best Buy, Future Shop, etc. seront gérés par ce système. De plus, toutes autres formes de commerce électronique (kiosques, smartphones, xbox...) pourraient être supportées par ce même système. Il s'agit d'un projet très vaste, très ambitieux et on ne peut plus passionnant.

Un projet et une équipe de cette envergure exigent bien entendu des méthodologies différentes. C'est pour moi l'occasion rêvée d'étendre mon champ de connaissances et d'apprendre à utiliser une foule de nouveaux outils. J'ai très hâte de maitriser l'ensemble de ce projet.

Mon emploi chez bxsystems ne s'arrête pas non plus au projet Best Buy. Il est très possible que je sois appelé à travailler comme consultant dans d'autres firmes, ou que je sois déplacé vers un autre projet. Comme j'ai pu comprendre, les développeurs à l'embauche de la compagnie changent régulièrement de projet. Ceci est intéressant car ça permet de se changer les idées et de voir du nouveau de temps en temps. Bien entendu, je ne crois pas qu'ils déplaceraient un employé affecté à un projet urgent!

Bref, je suis très content de ma première journée. Je suis certain que cet emploi m'offrira une multitude de sujets intéressants pour des articles futurs. Restez-donc à l'écoute!

Modèle de couleur

Tel que promis, j'ai expérimenté avec différents thèmes de couleurs pour Visual Studio.

Premièrement, j'ai réalisé que les thèmes à fonds sombres ne sont vraiment pas pour moi. Initialement je les trouves jolis, mais après les avoir utiliser un peu, je les aimes de moins en moins. Je crois que le principal problème est le trop grand contraste entre la zone de travail foncée, et le reste de l'interface de Visual Studio qui est pâle. Ceci pourrait être amélioré en modifiant mon thème Windows, mais je ne voulais pas faire cela.

Ensuite, j'ai découvert que le point le plus important (pour moi) pour un modèle de couleur est de ne pas utiliser un fond complètement noir ou complètement blanc. Il est préférable d'utiliser des teintes de gris (ou encore d'autres couleurs), car ce sera beaucoup moins fatiguant pour les yeux. Certaines personnes ne jurent que par les fonds noirs, et si ça fonctionne pour eux, tant mieux! L'important est d'éviter les contrastes trop élevés.

Modèle de couleur

Après quelques essais, je me suis arrêté sur une variation au thème de Jeff Atwood. Les principales modifications sont un fond très légèrement plus foncé, ainsi que des couleurs un peu plus vives pour marquer les nombres et les chaines de caractères. J'ai aussi modifié la couleur de fond pour les commentaires XML Doc. Ceci a l'effet de marquer visuellement la séparation entre les différentes méthodes d'une classe.

Vous pouvez voir un aperçu du résultat ou télécharger le fichier vssettings afin de pouvoir vous-même utiliser ou modifier ce modèle.

Bien entendu, le point le plus important dans le choix d'un modèle de couleur est de choisir celui qui fonctionne le mieux pour VOUS. Ne vous fiez pas à l'opinion des autres, essayez les modèles vous-même, et faites une décision en vous fiant sur votre propre expérience.

Polices pour programmeurs

Jeff Atwood a écrit un article très utile sur les polices de caractères pour les programmeurs. Il présente différentes polices rendues avec la technologie ClearType.

Après une brève comparaison, j'arrive à la même conclusion que lui : Consolas est la police que je préfère. Chaque caractère de cette police est facile à différencier des autres, et l'ensemble de la police est légerte pour les yeux.

J'utilise Courier New depuis pratiquement toujours, et je crois bien que je suis prêt à changer!

La prochaine étape sera de trouver un meilleur modèle de couleur. J'aime bien celui de Jeff Atwood, mais je vais voir si je peux faire encore mieux!

Le code source du Framework sera ouvert

Microsoft nous annonce que le code source du Framework .NET sera mis à la disposition de tous.

Shawn Burke a écrit un article donnant plus de détails sur cette nouveauté et a aussi enregistré un vidéo montrant le tout en action.

La liste des librairies ainsi ouvertes est impressionnante :

  • Base Class Libraries (mscorlib.dll)
  • ASP.NET (System.Web.dll)
  • Windows Forms (System.Drawing.DLL & System. Windows.Forms.dll)
  • ADO.NET (System.Data.DLL)
  • XML (System.Xml.DLL)
  • WPF (System.Windows.DLL)

De plus il se peut que d'autres librairies (LINQ, WCF, Workflow) s'ajoutent à cette liste dans le futur.

Tout ceci sera offert dans le cadre de la sortie prochaine de Visual Studio 2008.

Cette nouvelle est très excitante car elle offre quelques avantages comparativement à la méthode actuelle d'ouvrir ces librairies dans Reflector.

Tout d'abord, nous aurons accès au code source original des librairies, ce qui signifie que tous les commentaires ainsi que les particularités de mises en formes seront présents. Mais la plus intéressante des fonctionnalités que cela offrira est la complète intégration dans Visual Studio. Par exemple, si une exception est lancée par l'une des librairies ouverte, Visual Studio pourra afficher la ligne de code exacte où l'exception est survenue, de la même façon que s'il s'agissait de votre propre code. Ainsi, il sera très facile de déterminer la cause exact du problème.

Encore plus de détails, et des images de cette fonctionnalité en action, sont disponibles sur le blog de Scott Guthrie.

Bienvenue

Bonjour et bienvenue sur mon nouveau blog. Ici j'écrirai à propos de divers sujets relatifs à ma profession de programmeur-analyste .NET.

J'héberge mon blog sur Blogger, une compagnie appartenant à Google. Leur système est extrèmement flexible, et permet de faire à peu près tout ce que l'on veut avec son blog.

Par exemple, j'ai pu configurer le blog pour être accessible à partir d'un sous-domaine de leddt.com, en ajoutant une simple entrée à ma configuration DNS et en spécifiant un minimum d'informations à Blogger.

De plus, les options de personalisation de l'affichage du blog sont pratiquement illimitées, à condition de prendre le temps de bien comprendre leur système de modèles. J'ai donc pu, après quelques heures de travail (pour apprendre le fonctionnement des modèles, et faire un peu de mise en page), donner au blog la même apparence que le reste des pages de leddt.com.

En bref, blogger est excellent pour quelqu'un qui veut avoir un blog hébergé exterieurement, tout en gardant un maximum de contrôle sur le fonctionnement de celui-ci.