Agilité, Productivité et Qualité au Centre avec Visual Studio 2012
Post on 13-Jul-2015
285 Views
Preview:
Transcript
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!
top related