dimanche 30 juin 2013

Visual Studio ALM 2013 Preview et Scrum Boat

Le mercredi 26/06 fut une sacrée journée. A la Build 2013, les sorties de Visual Studio 2013 et Team Foundation Server 2013 en version Preview ont été officialisées, avec en parallèle la sortie de l'Update 3 de Visual Studio 2012. La soirée était aussi riche côté Agilité avec la soirée Scrum Boat.

Visual Studio 2013 Preview et TFS 2013 Preview

Je ne vais pas énumérer l'ensemble des nouveautés excitantes de cette nouvelle version. Je vais citer mes 5 préférées.
  • Les améliorations de l’éditeur de code : il permet désormais de prévisualiser la valeur de retour d'une fonction, visualiser les indicateurs de code "tête haute" en début de fonction : références, dernières modifications et auteurs, état des tests et testé par, et enfin la visualisation en ligne de la définition d'une fonction (Peek definition)
  • Editer et continuer la session de débogage sur une plateforme x64, vous permettra de gagner du temps en évitant de redémarrer une session de débogage pour une petite correction du code.
  • Le support pour les applications Windows Store écrite en Xaml des tests codés de l'interface utilisateur (Coded UI)
  • Le début de la gestion de portefeuille Agile avec la gestion d'une hiérarchie de backlogs et le nouveau type d'élément de travail Fonctionnalité (Feature)
  • Le rachat de InRelease qui étend et facilite l'automatisation des processus d’intégration et de déploiement des applications.
Pour tester les nouveautés, vous pouvez profiter dans Windows Azure de la nouvelle image d'ordinateur virtuel pré-configurée avec Visual Studio 2013 Preview et Windows Server 2012. Les comptes MSDN n'ont maintenant plus l'obligation de  fournir les informations d'une carte bancaire à l'inscription et bénéficier de 150€ le premier mois puis chaque mois de 40€ (Professionnel), 75€ (Premium) et 115€ (Ultimate) . La preuve en images :
150€ chaque mois

Scrum Boat

J'ai eu le bonheur de participer à cette soirée organisée par le French Scrum User Group sur une péniche parisienne.
Mon premier atelier fut un rafraîchissant Open Space. Même Merci à Guillaume, Emilie, Yannick, Raphaël, Sébastien, Marine et les invités ponctuels pour ce bon moment et ces échanges. J'en ai retenu quelques points :
  • Nous aimons l'Agile pour le travail en équipe (non en groupe), le sentiment de fierté du produit réalisé, la performance de la méthode 
  • Le top management pousse de plus en plus à l'adoption  de méthode Agiles  L'équipe de développement n'est plus systématiquement à l’initiative de l'adoption
  • Pour promouvoir l'Agilité au top management, il vaux mieux évoquer les intérêts financiers : ROI, efficience, time to market, dette technique réduite (les anomalies détectés en production coûtent chères) ou encore le bénéfice pour l'image de l'entreprise par l'extérieur, par ses employés. L'introduction des concepts via des Serious Games peut accélérer la compréhension des bénéfices.
  • L'Agilité est une innovation de processus et de rupture. Elle est donc encore nouvelle, il faut aussi la promouvoir au travers d’exemples de réussites concrètes.
Le deuxième atelier portait sur l'expression du besoin et la création rapide d'une maquette fonctionnelle à l'aide d'un outil de User eXperience Domain Driven Devlopment. La démonstration de la méthode est assez convaincante. En un peu moins d'une heure, il a été possible de capter l'expérience utilisateur attendue pour la création d'une application permettant à des équipes distantes de réaliser un Speed Boat.

Après cette soirée studieuse et ludique, le bateau est parti pour une croisière nocturne d'environ 1 heure sur la seine avec au programme échanges et networking.

have a nice day.

dimanche 23 juin 2013

Faciliter la création et le partage de vos interfaces

Pour accélérer et obtenir une bonne cohérence entre les différentes interfaces sur des applications Windows Store et Windows Phone, je pratique régulièrement 2 astuces. La première permet de créer des pages à partir d'un ou plusieurs modèles partagés, la deuxième permet de partager au maximum les styles entres les différentes plateformes cibles d'une même application.

Créer vos modèles de page

Je décris ci-dessous une procédure vous permettant de créer un modèle de page. Celui peut alors être simplement réutilisé lorsque vous choisissez "Ajouter un nouvel élément", il apparaît dans le formulaire de création comme ci-dessous.

Bien que la procédure détaillée porte sur une page d'application Windows Store avec XAML/C#, la même procédure pourra être appliquée pour des pages d'applications Windows Store avec HTML/CSS, ou encore Windows Phone 7 et 8.
  1. Exporter votre page comme modèle de nouveaux éléments.
    Cliquer dans le menu sur Fichier > Exporter le modèle pour ouvrir le la fenêtre de dialogue. Choisissez ensuite "modèle d'élément" et le projet dans lequel la page à exporter comme modèle est située. Choisissez l'élément à exporter. Choisissez les références à exporter (elles sont ajoutées au moment de l'import dans le projet). Choisissez le titre, la description, l'icône et décochez l'importation automatique.
  2. Dézipper le fichier créé dans un sous-dossier du même nom que le fichier zip. Vous pouvez supprimer le fichier zip d'origine. Ouvrez le fichier MyTemplate.vstemplate quelques modifications y sont à réaliser.
  3. Indiquer le groupe de plateforme auquel appartient le modèle.
    Il vous suffit d'ajouter la ligne suivante dans la balise TemplateData pour une application Windows Store:
    <TemplateGroupID>WinRT-Managed</TemplateGroupID>
    pour une application Windows Phone 7 ou 8 utilisez :
    <TemplateGroupID>Windows Phone</TemplateGroupID>
  4. (Rendre le modèle non-visible par défaut)
    Lorsque vous ajouterez un élément dans un site site Web par exemple ce modèle n'apparaîtra pas. Il faut ajouter la ligne suivante dans le noeud TemplateData.
    <ShowByDefault>false</ShowByDefault>
  5. Faire apparaître le modèle de page dans la catégorie supérieure.
    Si vous souhaitez voir le modèle dans votre catégorie personnalisée et aussi dans la catégorie parente Visual C#, il suffit d'ajouter la ligne suivante dans le noeud TemplateData.
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
  6. Importer le modèle dans Visual Studio.
    Enregistrez les modifications précédentes. Naviguez vers le répertoire "C:\Users\nomutilisateur\Documents\Visual Studio 2012\Templates\ItemTemplates". Créez un nouveau répertoire "Mes Modèles". Et déplacez le répertoire contenant le modèle dans celui-ci.
Vous pouvez maintenant ajouter de nouvelles pages à votre application suivant votre nouveau modèle. Pour aller plus loin, vous pouvez envisager d'intégrer vos modèles de page à une extension de Visual Studio .vsix afin de les diffuser largement.

Répartir et partager vos styles dans différents fichiers

L'idée est de construire plusieurs fichiers de styles qui seront plus ou moins partagés avec les différentes plateformes. Pour le développement d'une solution sur les 3 plateformes en XAML/C#, j'utilise la configuration suivante avec trois types de fichiers selon leur niveau de partage :
  • Les couleurs. L'ensemble de color, brush, .. constituent une partie importante de la charte graphique, le fichier contenant celles-ci est partagé sur l'ensemble des applications Windows Store, Windows Phone 7 et 8. Pensez simplement à retirer la référence xmlns:local qui est ajoutée automatiquement à la création d'un dictionnaire de ressources.
  • Les styles de textes, boutons, et contrôles de base : Même s'ils sont en général communs aux  3 plateformes, vous ne souhaitez pas utiliser la même taille de texte pour un titre sur la tablette que sur le téléphone. 1 fichier est créé pour l'application Windows Store. 1 autre fichier du même nom est créé et partagé entre les applications Windows Phone 7 et 8.
  • Les styles et modèles d'un composant spécifique à une plateforme. Le fichier correspondant est bien entendu créé uniquement pour la dite plateforme par exemple le contrôle Pivot de Windows Phone.
    Remarque : le contrôle Pivot  existe sur Windows Phone 7 et 8 mais dans une librairie différente. Pour partager le fichier de style, il faudra déclarer l'espace de nom controls pour la réutilisation dans l'application Windows Phone 7 comme dans l'exemple ci-dessous. Notez aussi les références aux dictionnaires de ressources précédents.
    <ResourceDictionary
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="CustomColors.xaml"/>
            <ResourceDictionary Source="CustomStyles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <!-- Pivot's style -->
        <Style x:Key="MainPagePivotStyle" TargetType="controls:Pivot">
            <Setter Property="Margin" Value="0,50,0,0" />
        </Style>
    </ResourceDictionary>
Pour partager un même fichier, il suffit de les créer dans le premier projet de "base" (je choisis celui de Windows Store, puis Windows Phone 8). Ensuite, il suffit d'ajouter de les Ajouter en tant que lien dans les autres projets compatibles.
Cliquer sur Ajouter un élément existant. Dans la fenêtre de choix, naviguez vers le projet de "base" et choisissez le fichier souhaité à importer, enfin cliquer sur "Ajouter en tant que lien".

Le partage des styles complète bien les librairies portables et le modèle d'architecture MVVM afin de partager un maximum de code. Vous pouvez consulter l'article du MSDN magazine de juin 2013 à ce sujet ici.
have a nice day.

vendredi 31 mai 2013

Créer des maquettes efficaces en collaboration

J'ai enregistré une nouvelle émission dans la série Bon App!. Je vous y présente les outils à disposition pour la réalisation des maquettes dynamiques dans la suite Visual Studio ALM et comment les créer en collaboration.

Les avantages d'une maquette dynamique

La création d'une maquettes dynamique (storyboard, animation, mockup) permet de clarifier les fonctionnalités d'une application à développer. Elle permet aux utilisateurs de se projeter dans la future application afin de valider les fonctions à implémenter. Si vous y intégrez la charte graphique, vous pourrez aussi la valider à l'avance!

Les outils Storyboard et SketchFlow

Visual Studio 2012 Premium installe un Add-In PowerPoint. Celui-ci vous permet d'étendre les fonctionnaltés de PowerPoint et vous fourni beaucoup de formes prédéfinies pour accélerer le maquettage (PageWeb, controles Windows UI, Windows Phone, ...).
Dans l'update 2, Microsoft a inclus SketchFlow un outil de mockup intégré à Blend. Celui-ci vous permet d'aller encore plus loin en créant une véritable maquette interactive avec une expérience utilisateur très proche de celle de l'application finale (clique et sélection d'éléments, navigation libre dans les différents écrans, réutilisation de composants, ...)

La collaboration et l'implication des utilisateurs

Pour obtenir une maquette de la meilleure qualité et acceptée par tous, il est important d'obtenir des retours et commentaires de la part de l'équipe et des utilisateurs. Les outils de collaboration sont variés : TFS, SharePoint, FeedBack Client, Yammer.... Dans ma société, nous avons mis en place un processus pour nos outils internes. Il permet un premier retour par l'équipe via SharePoint puis une deuxième boucle par les utilisateurs finaux via Yammer.

lundi 20 mai 2013

Afficher le bogue dans le Web Access

Dans un billet précédent Ajouter l'effort au type bogue, j'ai expliqué comment ajouter le suivi des temps au type Bogue. Afin de tirer parti des nouvelles fonctionnalités du Web Access, je vous propose de réaliser les modifications nécessaires pour l'y ajouter. A nouveau, je précise que cet ajout n'a de sens que dans le cadre de l'utilisation du processus Msf Agile 5.x ou 6.x
Celui-ci affiche l'ensemble des éléments de travail dont le type est dans la catégorie Task. Si vous souhaitez intégrer le type Bogue à l'outil de planification Agile, il faut l'ajouter à cette catégorie. Vous aurez alors la possibilité de gérer la capacité de l'équipe sur l'ensemble du travail restant des tâches et bogues.

Modifier le type bogue

Avant de l'intégrer, il nous faut à nouveau modifier le type Bug/bogue. Il est indispensable d'ajouter un champ Activity utilisé dans la planification agile et il est intéressant d'ajouter l'état New/Nouveau au type Bug/Bogue pour obtenir une meilleure cohérence entre les 2 types.

Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger les définitions du type Bug/Bogue et Task/Tache :
cd %programfiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE
witadmin exportwitd /n:Bug /f:C:\Bug.xml /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj
witadmin exportwitd /n:Task /f:C:\Task.xml /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj
Si ce n'est pas déjà fait, vous devez Ajouter l'effort au type bogue en ajoutant les champs de référence Microsoft.VSTS.Scheduling.Xxxx.
D'abord, vous copiez la définition de champ de référence Microsoft.VSTS.Common.Activity depuis le fichier Task.xml et les collez dans le fichier Bug.xml sous le noeud FIELDS. Vous devez aussi ajouter le contrôle correspondant dans la colonne Planning dans la définition de l'interface.
<FIELD name="Activity" refname="Microsoft.VSTS.Common.Activity" type="String" reportable="dimension">
    <HELPTEXT>Type of work involved</HELPTEXT>
    <SUGGESTEDVALUES expanditems="true">
        <LISTITEM value="Development" />
        <LISTITEM value="Testing" />
        <LISTITEM value="Requirements" />
        <LISTITEM value="Design" />
        <LISTITEM value="Deployment" />
        <LISTITEM value="Documentation" />
    </SUGGESTEDVALUES>
</FIELD>
Vous ajoutez l'état "New" au noeud STATES en le copiant à partir de l'état "Active" du type Bug/Bogue :
        <STATE value="New">
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ResolvedReason">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedDate">
              <EMPTY />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ClosedBy">
              <ALLOWEXISTINGVALUE />
              <EMPTY />
            </FIELD>
          </FIELDS>
        </STATE>
Puis, vous remplacez la transition de l'état "" à l'état "Active" par les suivantes:
        <TRANSITION from="" to="New">
          <REASONS>
            <DEFAULTREASON value="New" />
            <REASON value="Build Failure" />
          </REASONS>
        </TRANSITION>
        <TRANSITION from="New" to="Active">
          <REASONS>
            <DEFAULTREASON value="Work started" />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="System.AssignedTo">
              <DEFAULT from="currentuser" />
            </FIELD>
          </FIELDS>
          <ACTIONS>
            <ACTION value="Microsoft.VSTS.Actions.StartWork" />
          </ACTIONS>
        </TRANSITION>
        <TRANSITION from="Active" to="New">
          <REASONS>
            <DEFAULTREASON value="Work halted" />
          </REASONS>
          <ACTIONS>
            <ACTION value="Microsoft.VSTS.Actions.StopWork" />
          </ACTIONS>
        </TRANSITION>
Enfin, vous ajoutez au minimum la transition de l'état "Closed" à "New" dans le noeud TRANSITIONS. Vous pouvez copier la transition depuis celle de l'état "Closed" à "Active". Vous pouvez aussi ajouter toutes les transitions depuis/vers l'état "New", cela permettra de déplacer depuis/vers n'importe quelle colonne du tableau le bogue:
        <TRANSITION from="Closed" to="New">
          <REASONS>
            <DEFAULTREASON value="Regression" />
            <REASON value="Reactivated" />
          </REASONS>
          <FIELDS>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedBy">
              <ALLOWEXISTINGVALUE />
              <COPY from="currentuser" />
              <VALIDUSER />
              <REQUIRED />
            </FIELD>
            <FIELD refname="Microsoft.VSTS.Common.ActivatedDate">
              <SERVERDEFAULT from="clock" />
            </FIELD>
            <FIELD refname="System.AssignedTo">
              <COPY from="field" field="Microsoft.VSTS.Common.ResolvedBy" />
            </FIELD>
          </FIELDS>
        </TRANSITION>
Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger sur le serveur la nouvelle définition du type Bug/Bogue dans le projet d'équipe :
cd %programfiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE
witadmin importwitd /f:C:\Bug.xml /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj

Modifier les catégories

Vous allez ajouter le type Bug/Bogue à la catégorie Task pour qu'il apparaisse dans le tableau de taches. Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger en local le fichier des catégories :
cd %programfiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE
witadmin exportcategories /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj /f:C:\Categories.xml

Vous allez ensuite modifier la catégorie Task pour lui ajouter le type Bug/Bogue comme suit.
  <CATEGORY refname="Microsoft.TaskCategory" name="Task Category">
    <DEFAULTWORKITEMTYPE name="Task" />
    <WORKITEMTYPE name="Bug" />
  </CATEGORY>
Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger sur le serveur la nouvelle définition des catégories.
cd %programfiles(x86)%\\Microsoft Visual Studio 11.0\Common7\IDE
witadmin importcategories /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj /f:C:\Categories.xml

Modifier la configuration du processus :

Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger en local le fichier de configuration du processus :
cd %programfiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE
witadmin exportcommonprocessconfig /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj /f:C:\commonConf.xml
Vous ajoutez à la categorie Bug l'état "New" en "Proposed" :
  <BugWorkItems category="Microsoft.BugCategory">
    <States>
      <State type="Proposed" value="New" />    
      <State type="InProgress" value="Active" />
      <State type="Complete" value="Closed" />
      <State type="Resolved" value="Resolved" />
    </States>
  </BugWorkItems>
Et vous ajoutez à la categorie Task  le statut "Resolved" en "Resolved" afin de visualiser aussi cette colonne dans le tableau de taches :
  <TaskWorkItems category="Microsoft.TaskCategory">
    <States>
      <State type="Proposed" value="New" />
      <State type="InProgress" value="Active" />
      <State type="InProgress" value="Resolved" />
      <State type="Complete" value="Closed" />
    </States>
  </TaskWorkItems>
Ouvrez une console de commande en tant qu'administrateur et tapez les commandes suivantes pour télécharger sur le serveur la nouvelle configuration du processus:
cd %programfiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE
witadmin importcommonprocessconfig /collection:http://tfsserveur:8080/tfs/DefaultCollection /p:TestProj /f:C:\commonConf.xml
Note : Si nous n'avions pas ajouter le champ Activity au Bug/Bogue, nous aurions l'erreur du type suivant:
The following element contains an error: TypeFields/TypeField[type='Activity'].
TF400501: The value of this element is set to: Microsoft.VSTS.Common.Activity. Y
ou must set the value to a field that exists in the work item types that are def
ined in: TaskWorkItems. These work item types must also have the following field
 defined:  TypeFields/TypeField[type='RemainingWork']. The field does not exist
in the following work item types: Bug.

Afficher et gérer les bogues

Vous pouvez maintenant planifier la capacité de votre équipe en considérant le temps restant sur les bogues et visualiser ou modifier ceux-ci depuis le tableau de tache du Web Access.
Il vous faudra tout comme pour les taches vous assurer que le bogue est attaché en tant qu'enfant à un User story/récit utilisateur et qu'il est bien assigné aux bonnes zones et itérations. Je conseille de créer le lien et vérifier les infos au moment du triage.

have a nice day.

mardi 30 avril 2013

Retour sur le Scrum Day 2013

Je vous expose (enfin!) mon retour d'expérience sur le Scrum Day du 11 avril 2013. Tout d'abord, mon impression générale est très positive, l'ambiance est chaleureuse avec énormément d'échanges. Je sens personne de "perdu" ou qui se soit retrouvé ici par hasard.

Après une session d'ouverture pleine d'excellentes idées et conseils pour travailler sur soi, et ses pratiques en équipe par Rorbert Richman. J'ai ensuite effectué une matinée très REX avec les 3 sujets :
  • Expérimentation de l'agilité au CNES, 
  • Projet Mobile chez Cetelem en Scrum,
  • 5 ans d'agilité à la DSI d'Orange.
Ces retours d'expérience mettent en lumière des points communs. L'effort et le courage sont essentiels pour l'adoption d'un processus agile puis son amélioration continue. La mise en place des bonnes pratiques se fait par étapes (presque une après l'autre). Globalement les équipes travaillent mieux ensemble et avec une meilleur satisfaction au travail.

L'après-midi fut moins terre à terre : embarquement et décollage pour objectif Mars ... version 2. Cet "Agile Game" montre bien l'équilibre délicat entre la production de valeur (le code), la réduction de la dette technique, l'analyse fonctionnelle/technique et la formation de l'équipe. La forme est à la fois très proche d'un jeu de société et des conditions de réalisation de Sprints. Ces 2 éléments transforme l'atelier en un moment convivial et passionnant.

La session de clôture m'a semblé comme le bouquet final de cette journée. Elle fut très animée et présentée par un excellent orateur Dominique Dupagne. De part son métier de médecin, il fait un intéressant parallèle entre le Vivant et l'Agile. Le système immunitaire serait par essence Agile (auto-organisation, création des anti-corps par itérations), nous serions des Sprints. L'idée est poussée très loin, voir jusque une certaine forme de provocation : l'agilité? c'est le retour à la vie !

have a nice day.