Agilité, Productivité et Qualité au Centre avec Visual Studio 2012

Preview:

Citation preview

Code / Développement

Agilité, Productivité et Qualité

au Centre

avec Visual Studio 2012

13 Février 2013Philippe PUSCHMANNArchitecte SolutionCTO OfficeAvanade France

Cédric GOUGEArchitecte Solution

Application IntegrationAvanade France

AvanadeLeader mondial dans l’intégration des technologies Microsoft, présent dans 24 pays

La mission d’Avanade consiste à aider les entreprises à optimiser leurs investissements informatiques et à développer des solutions complètes, génératrices de bénéfices concrets, autour des technologies Microsoft.

Technology

Software

Products

Business &

Management

AGENDA

Succès = SCRUM + Excellence Technique

SCRUM : Quand et Pourquoi?

Done = Tested!!

Demo : Développement d’une application Windows 8

avec Visual Studio 2012 : Scrum Pomodoro

Visual Studio 2012 ALM : La Solution et les Outils

AGENDA

Succès = SCRUM + Excellence Technique

SCRUM : Quand et Pourquoi?

Done = Tested!!

Demo : Développement d’une application Windows 8

avec Visual Studio 2012 : Scrum Pomodoro

Visual Studio 2012 ALM : La Solution et les Outils

Always

7%

Seldom

19%

Sometimes

16%

Often

13%

Never

45%

Functionalities Usage Statistics

0%

20%

40%

60%

80%

100%Standish Group Chaos Report

Successful Challenged Failed

Principales Causes D’échecs

Time to Market

toujours plus agressif

Métier du client et technologies

utilisées toujours plus complexes

Manque de réactivité

face au changement

1

2

3

Gaspillage de Ressources (64%)

Forte part de livrables sans valeur métier

au détriment de livrables à haute valeur

ajoutée

Project Informatiques : La situation

Agile vs Waterfall

Successful

43%

Challenged

45%

Failed

12%

Successful

26%

Challenged

59%

Failed

15%

Agile Waterfall

Quels sont les fondements de l’Agilité?

L’ALM peut être définie comme une collection de disciplines

et d’outils qui vont permettre de transformer un besoin métier

en une solution informatique opérationnelle

Le Développement Agile confère une approche

incrémentale, itérative et flexible du développement

logiciel en s’appuyant sur 12 Principes qui constituent le

Manifest AGILE

Agile Manifesto (1/2)

Agile Manifesto (1/2)

Agile Manifesto (1/2)

Agile Manifesto (1/2)

Agile Manifesto (1/2)

Agile Manifesto (1/2)

Agile Manifesto (2/2)

Agile Manifesto (2/2)

Agile Manifesto (2/2)

Agile Manifesto (2/2)

Agile Manifesto (2/2)

Agile Manifesto (2/2)

Eligibilité de SCRUM

pl

Technologie : Le Comment

Fon

ctio

nn

alit

és:

Le Q

uo

i

CRITERESSimpleTout est connu

CompliquéPlus de connu que d’inconnu

ComplexePlus d’inconnu que de connu

ChaotiqueQuasiment rien n’est connu

SCRUM

Le cas Salesforce.com : un cas édifiant

Salesforce, une exemple de succès de l’ère .com qui a su durer.Avec en 2006 plus de 450 millions de dollars de revenus, et 2000 employésAyant vu sa fréquence de releases passer de 4 à 1 par an, et des clients insatisfaits, il a fallu réagir donc changerSalesforce décida d’engager une transition vers ScrumLes résultats furent édifiant: • 1ère année : Salesforces a augmenté de 94% le nombre de fonctionnalités, délivré 38%

de fonctionnalités en plus par développeur, et délivré plus de 500% de valeur supplémentaire à ses clients

• Les 2 années suivantes ont permis de doubler le revenu à plus d’un milliard de dollars• Au regard de tels résultats, il n’est pas étonnant de voir l’engouement autour de

l’adoption de Scrum

Scrum est simplement un Framework avec

des règles…

Vous pouvez jouer et respecter les règles…ou vous pouvez tricher…

SCRUM And

SCRUM But

Water SCRUM Fall

Reduce waste

Think

Holistically Work

Incrementally

Succès = SCRUM + Excellence Technique

Done = Tested!!

Demo : Développement d’une application Windows 8

avec Visual Studio 2012 : Scrum Pomodoro

SCRUM : Quand et Pourquoi?

Visual Studio 2012 ALM : La Solution et les Outils

AGENDA

Specification by Example

CIContinuous

DeliveryBuild

AutomationTest Driven

Development

ContinuousDeployment

Design for Operations

Refactoring

Clean CodeReducingTechnical Debt

Emergent Architecture

Fitness for Purpose

ExecutableSpecifications

ATDD

BDD

SCRUM…AND

Just in Time Planning

User Stories Collective Ownership

Planning Poker

Relative Estimation

Release Planning

Pair Programming

Information Radiators

BurndownCharts

SCRUM

Clean Code == Quality Code;

SOLID

DI BDD

YAGNI

MVVM / MVC

CITDD /

ATDD

Pour EviterDuplicated Code

Long Method

Large Class

Too many Params

Feature envy

Inapropriate intimacy

Refused bequest

Contrived Complexity

Lazy Class /

Freeloader

Excessive Long

Identifiers

Excessive short

identifiers

UberCallback

Complex Conditionals

DRY

IoC

SoC

GRASP (Object

Oriented design)

Design Patterns

High Cohesion

CQRS

SOLID

Le développement d’application n’est pas un jeu de Jenga

SOLID

Single

Responsability

Open/Closed

Liskov

Substitution

Interface

Segregation

Dependency

Inversion

SOLID

Ca n’est pas parce que vous pouvez le faire que vous devez le faire

SOLID

Responsabilités Multiple Responsabilité Unique

public interface IBankAccount {string AccountNumber;decimal AccountBalance;

}

public interface IInterestRateCalculator {decimal CalculateInterest(IBankAccount account);

}

public class BankAccount : IBankAccount {public string AccountNumber { get; set; }public decimal AccountBalance { get; set; }

}

public class InterestRateCalculator : IInterestRateCalculator{

public decimal CalculateInterest(IBankAccount account) {return 42;

}}

public class BankAccount{

public string AccountNumber { get; set; }

public decimal AccountBalance { get; set; }

public decimal CalculateInterest() {return 42M;

}}

SOLID

De la chirurgie n’est pas nécessaire pour mettre un manteau

public abstract class Geometrie {public abstract double Aire();

}

public class Cercle : Geometrie {public double Rayon { get; set; }

public override double Aire() {return Math.PI * this.Rayon * this.Rayon;

} }

public class Rectangle : Geometrie {public double Largeur { get; set; }public double Longueur { get; set; }

public override double Aire() {return this.Largeur * this.Longueur;

} }

public static class CalculAire {public static double SommeAires(IEnumerable<Geometrie>

geometries) {return geometries.Sum(g => g.Aire());

}}

SOLIDNon ouvert pour extensions Ouvert pour extensions

public static double SommeAires(IEnumerable<Geometrie> geometries){

double aireTotale = 0d;

foreach (var geo in geometries){

if (geo is Cercle){

var cercle = (Cercle)geo;aireTotale += cercle.Rayon * cercle.Rayon *

Math.PI;}else if (geo is Rectangle){

//...}

}}

SOLID

S’il ressemble a un canard, cancane comme un canard, mais a besoin de

piles – vous avez certainement la mauvaise abstraction.

SOLID

public interface IDuck{

void Swim();}

public class Duck : IDuck {public void Swim() {}

}

void MakeDuckSwim(IDuck duck){

duck.Swim();}

public class ElectricDuck : IDuck {public void Swim() {

// Swim logic}

}

Que ce passe-t-il si l’on a pas allumé notre canard?

SOLID

Option 1 : Sans respecter les principes d’OpenClose

public interface IDuck{

void Swim();}

public class Duck : IDuck {public void Swim() {}

}

void MakeDuckSwim(IDuck duck){

duck.Swim();}

public class ElectricDuck : IDuck {public void Swim() {

// Swim logic}

}

Que ce passe-t-il si l’on a pas allumé notre canard?

void MakeDuckSwim(IDuck duck){

if (duck is ElectricDuck)((ElectricDuck)duck).TurnOn();

duck.Swim();}

SOLID

Option 2 : L’approche SOLID

public interface IDuck{

void Swim();}

public class Duck : IDuck {public void Swim() {}

}

void MakeDuckSwim(IDuck duck){

duck.Swim();}

public class ElectricDuck : IDuck {public void Swim() {

// Swim logic}

}

public interface IDuck{

void Swim();}

public class Duck : IDuck {public void Swim() {}

}

void MakeDuckSwim(IDuck duck){

duck.Swim();}

public class ElectricDuck : IDuck {public void Swim() {

if (!this.IsTurnedOn)return;

// Swim logic}

}

SOLID

Vous voulez que je branche ce composant, Où?

SOLIDpublic interface IOiseau {

void Voler();void Pondre();

}

public class Canard : IOiseau {public void Voler() { // ...}

public void Pondre() { // ...}

}

static void FaireVolerLesOiseaux(IEnumerable<IOiseau> oiseaux){

foreach (var oiseau in oiseaux)oiseau.Voler();

}

public class Manchots : IOiseau {public void Voler() {

throw new NotSupportedException();}

public void Pondre() {}

}

public interface IOiseau {void Pondre();

}

public interface IVolatile : IOiseau {void Voler();

}

public class Canard : IVolatile{public void Voler() { // ...}

public void Pondre() { // ...}

}

public class Manchots : IOiseau {public void Pondre() { // ...}

}

static void FaireVolerLesOiseaux(IEnumerable<IVolatile> oiseaux) {

foreach (var oiseau in oiseaux)oiseau.Voler();

}}

SOLID

Est-ce que vous brancheriez une lampe en faisant une soudure

directement sur le réseau électrique dans le mur?

SOLID

Méthode Créeant une dépendance

public class CoolSQLRepository{

public CoolThing GetThing(int id);}

public class CoolService{

public CoolThing GetCoolThing(int id){

var repository = new CoolSQLRepository();return repository.GetThing(id);

}}

public interface ICoolRepository {CoolThing GetThing(int id);

}

public class CoolService{

private ICoolRepository repository;

public CoolService(ICoolRepository repository){this.repository = repository;

}

public CoolThing GetCoolThing(int id) {return repository.GetThing(id);

}}

public class CoolSQLRepository : ICoolRepository {public CoolThing GetThing(int id);

}

Inversion de dépendance par constructeurd’injection

Demo Clean Code with Visual Studio 2012

Done = Tested!!

Demo : Développement d’une application Windows 8

avec Visual Studio 2012 : Scrum Pomodoro

SCRUM : Quand et Pourquoi?

Succès = SCRUM + Excellence Technique

Visual Studio 2012 ALM : La Solution et les Outils

AGENDA

TESTS FONCTIONNELS ET TECHNIQUES

Pourquoi Tester?

Ariane 5 Flight 501Le bug le plus couteuxde l’histoire

• Réutilisation de code d’Ariane 4 d’ou une

trajectoire différente à cause d’un design

diffèrent du Booster. Code non retesté!

• La Conversion d’un float 64 bit en int 16

bits a causé un erreur de type overflow

exception

• Cout du Bug : > $370 million (1996),

temps d’occurrence : 40 secondes

Mais aussi pour éviter cela!

Pratiques de Tests et domaines

Développement Acceptance Exploratoire

ATDD Extensibility Performance System

BDD Functional Regression TDD

Beta Integration Scenario Unit

Black Box Load Security Usability

Build verification Maintainability Smoke User

Component Module Static White Box

End to End Non Functional Story …Autres

Tests et Visual Studio 2012

Visual Studio 2012

Build and Lab

Management

Mock / Stub /

Shims / Fakes

Tests Unitaires

Tests d’intégration

Tests d’acceptance

Tests de

Performance

Unit Tests

UI Coded Tests

Performance /

Load Tests

Test cases

Types de Tests

Isolation

Automation

Principes TDD

TDD : Test Driven Development• Pratique qui consiste à écrire les tests unitaires

avant d’écrire le code d’implémentation• TDD est utilisé comme

• Une pratique de Design• Un moyen puissant pour éviter les

anomalies dans une application• Une garantie de l’écriture des tests• Techniques de non régression• Production de code plus robuste

Red

GreenRefactor

La Dynamique TDD / ATDD

FailPass

FailPass

FailPass

Automated Tests

Automated Tests

Sprint 1 Sprint 2 Sprint 3

Les équipes de développement performantes utilisent les test de non régression automatisés

Demo TDD with Visual Studio 2012

System Center

Office

Web Access

Windows Azure

RequirementsManagement

Test CaseManagement

ProjectManagement

Intellitrace In Production

Lab ManagementPreemptiveAnalytics

FeedbackManagement

New Enhanced

Demo : Développement d’une application Windows 8

avec Visual Studio 2012 : Scrum Pomodoro

Agenda

SCRUM : Quand et Pourquoi?

Succès = SCRUM + Excellence Technique

Done = Tested!!

Visual Studio 2012 ALM : La Solution et les Outils

Presentation Pomodoro TechniqueLa technique Pomodoro est une technique de planification développée par Francesco Cirillo à la fin des années 1980. Cette méthode se base sur l'usage d'un minuteur permettant de respecter des périodes de 25 minutes appelées pomodori (qui signifie en italien « tomates »). Ces différentes périodes de travail sont séparées par de courtes pauses. Proches des concepts de cycles itératifs et des méthodes de développement agiles, utilisées dans le développement de logiciel, la méthode est utilisée pour la programmation en binôme.La méthode a pour principale idée que des pauses régulières favorisent l'agilité intellectuelle.

La technique se présente sous la forme de cinq étapes :

• décider de la tâche à effectuer ;• régler le pomodoro (minuteur) sur 25 minutes ;• travailler sur la tâche jusqu'à ce que le minuteur sonne et la noter comme faite ;• prendre une courte pause (5 minutes) ;• tous les quatre pomodori prendre une pause un peu plus longue (15-20 minutes).

Réunion de démarrage : Envisioning

Sketch : Croquis sur une serviette en papier Backlog : Liste des fonctionnalités sur une page de cahier

Création du Product Backlog avec

Web Access

Scrum Pomodoro Application

Demo SQL Server Data Tools / SQL AzureProductive Database Development

Demo PowerPoint Storyboarding

merci!

Scrum On!