<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-135320003538037575</id><updated>2025-08-16T09:50:49.244+02:00</updated><category term="Agilité"/><category term="SCRUM"/><category term="Développement personnel"/><category term="Efficacité"/><category term="Communication"/><category term="Gestion du temps"/><category term="XP"/><category term="Lean"/><category term="GTD"/><category term="Vie perso"/><category term="Outils"/><category term="Restaurant"/><category term="Balade"/><category term="LE"/><title type='text'>Les Mêlées</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2502119687298835641</id><published>2013-01-10T11:56:00.001+01:00</published><updated>2013-01-10T11:56:26.036+01:00</updated><title type='text'>Reading xml from PowerShell is really easy !</title><content type='html'>&lt;html&gt;

&lt;head&gt;


&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
 {font-family:Wingdings;
 panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
 {font-family:Wingdings;
 panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
 {font-family:Calibri;
 panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
 {margin:0in;
 margin-bottom:.0001pt;
 font-size:11.0pt;
 font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
 {margin-top:0in;
 margin-right:0in;
 margin-bottom:0in;
 margin-left:.5in;
 margin-bottom:.0001pt;
 font-size:11.0pt;
 font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;}
.MsoChpDefault
 {font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;}
.MsoPapDefault
 {margin-bottom:10.0pt;
 line-height:115%;}
@page WordSection1
 {size:8.5in 11.0in;
 margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
 {page:WordSection1;}
 /* List Definitions */
 ol
 {margin-bottom:0in;}
ul
 {margin-bottom:0in;}
&lt;/style&gt;&lt;/head&gt;&lt;/html&gt;






&lt;br /&gt;
&lt;div class=&quot;WordSection1&quot;&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;It
is amusing to see how simple we can read xml node values from powershell :&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;Here
is a peace of xml file&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;?xml
version=&quot;1.0&quot; standalone=&quot;yes&quot;?&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;CoverageDSPriv&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;
&amp;lt;Module&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ModuleName&amp;gt;myLib.dll&amp;lt;/ModuleName&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ImageSize&amp;gt;122880&amp;lt;/ImageSize&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;ImageLinkTime&amp;gt;0&amp;lt;/ImageLinkTime&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;LinesCovered&amp;gt;791&amp;lt;/LinesCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;LinesPartiallyCovered&amp;gt;23&amp;lt;/LinesPartiallyCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;LinesNotCovered&amp;gt;856&amp;lt;/LinesNotCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;BlocksCovered&amp;gt;1220&amp;lt;/BlocksCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;BlocksNotCovered&amp;gt;1289&amp;lt;/BlocksNotCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;NamespaceTable&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;BlocksCovered&amp;gt;939&amp;lt;/BlocksCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;BlocksNotCovered&amp;gt;1054&amp;lt;/BlocksNotCovered&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;lt;/NamespaceTable&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;nbsp;
&amp;lt;/Module&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;&amp;lt;/CoverageDSPriv&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;PowerShell
converts XML elements to properties on .NET objects without the need to write
any parsing code !!&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;&amp;nbsp;
&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;$coverageFileXml
= “C:\temp\myCoverageInfo.xml”&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;[xml]$xml
= (get-content $coverageFileXml)&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;[int]$BlocksCovered
= $xml.CoverageDSPriv.Module.BlocksCovered &lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;[int]$BlocksNotCovered
= $xml.CoverageDSPriv.Module.BlocksNotCovered&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;[int]$TotalBlocks
= $BlocksCovered + $BlocksNotCovered&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;$CoveragePercent
= $BlocksCovered * 100 / $TotalBlocks&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;$CoveragePercent2Decimals
=&amp;nbsp; &quot;{0:N2}&quot; -f $CoveragePercent&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; font-size: 10.0pt;&quot;&gt;Write-Host
&quot;Coverage is $CoveragePercent2Decimals %&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-indent: -.25in;&quot;&gt;
&lt;span style=&quot;font-family: Wingdings; font-size: 12.0pt;&quot;&gt;è&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 7.0pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12.0pt;&quot;&gt;Output
is&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp; Coverage is 48.62 %&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&amp;nbsp;More exemples here : &lt;a href=&quot;http://www.codeproject.com/Articles/61900/PowerShell-and-XML&quot;&gt;http://www.codeproject.com/Articles/61900/PowerShell-and-XML&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
--&amp;gt;
</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2502119687298835641/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2502119687298835641' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2502119687298835641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2502119687298835641'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2013/01/reading-xml-from-powershell-is-really.html' title='Reading xml from PowerShell is really easy !'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-8595725134568554370</id><published>2012-01-16T09:27:00.001+01:00</published><updated>2012-01-16T15:00:18.836+01:00</updated><title type='text'>SpecFlow : StepArgumentTransformation</title><content type='html'>&lt;blockquote&gt;   &lt;p&gt;When writting BDD test features and feature steps, we often need to convert strings to types. Testing strings with a serie of if statement within steps does not maximise reusability and readability. The best would be to get the string recognise as a Type every time we use it in a feature without taking care of the conversion.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;SpecFlow provides a &lt;strong&gt;StepArgumentTransformation &lt;/strong&gt;attribute to achieve this :&lt;/p&gt;  &lt;p&gt;&lt;a title=&quot;https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions&quot; href=&quot;https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions&quot;&gt;https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Exemple :&lt;/u&gt; &lt;/p&gt;  &lt;pre class=&quot;csharpcode&quot;&gt; [Then(&lt;span class=&quot;str&quot;&gt;@&amp;quot;the value of the Shoulder mode is (.*) in the method file&amp;quot;&lt;/span&gt;)]&lt;br /&gt; &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ThenTheValueOfTheShoulderModeIsDropInTheMethodFile(&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; shoulderModeString)&lt;br /&gt; {&lt;br /&gt;     ShoulderModeType shoulderMode = ShoulderModeType.OFF; ;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.Drop.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.Drop;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.OFF.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.OFF;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.Tangential.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.Tangential;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; Assert.Fail(&lt;span class=&quot;str&quot;&gt;&amp;quot;Invalid shoulderModeString: &amp;quot;&lt;/span&gt; + shoulderModeString);&lt;br /&gt;...&lt;br /&gt;     Assert.AreEqual(expectedShouldMode, shoulderMode)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;Can be refactored as &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;strong&gt;[StepArgumentTransformation]&lt;/strong&gt;&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; ShoulderModeType ShoulderModeTransform(&lt;strong&gt;&lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; shoulderModeString&lt;/strong&gt;)&lt;br /&gt;{&lt;br /&gt;     ShoulderModeType shoulderMode = ShoulderModeType.OFF;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.Drop.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.Drop;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.OFF.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.OFF;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (ShoulderModeType.Tangential.ToString() == shoulderModeString) shoulderMode = ShoulderModeType.Tangential;&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; Debug.Assert.Fail(&lt;span class=&quot;str&quot;&gt;&amp;quot;Invalid shoulderModeString: &amp;quot;&lt;/span&gt; + shoulderModeString);&lt;br /&gt;     &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; shoulderMode;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;[Then(&lt;span class=&quot;str&quot;&gt;@&amp;quot;the value of the Shoulder mode is (.*) in the method file&amp;quot;&lt;/span&gt;)]&lt;br /&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;void&lt;/span&gt; ThenTheValueOfTheShoulderModeIsDropInTheMethodFile(&lt;strong&gt;ShoulderModeType shoulderMode&lt;/strong&gt;)&lt;br /&gt;{&lt;br /&gt;   ...  &lt;br /&gt;   Assert.AreEqual(expectedShouldMode, shoulderMode)&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&amp;#160;&lt;/pre&gt;&lt;br /&gt;&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, &quot;Courier New&quot;, courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a title=&quot;https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions&quot; href=&quot;https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions&quot;&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/8595725134568554370/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/8595725134568554370' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8595725134568554370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8595725134568554370'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2012/01/specflow-stepargumenttransformation.html' title='SpecFlow : StepArgumentTransformation'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-7122826004148368111</id><published>2011-10-20T17:36:00.001+02:00</published><updated>2011-10-21T07:13:44.027+02:00</updated><title type='text'>Converting Enum values to user frendly strings</title><content type='html'>&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;    &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;enum&lt;/span&gt; ErrorLevel
    {
        None,
        Low,
        High,
    }&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;    public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; ErrorLevelExtensions
    {
        &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;string&lt;/span&gt; ToLocalizedString(&lt;span class=&quot;kwrd&quot;&gt;this&lt;/span&gt; ErrorLevel me)
        {
            &lt;span class=&quot;kwrd&quot;&gt;switch&lt;/span&gt; (me)
            {
                &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; ErrorLevel.None:
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Everything is OK&quot;&lt;/span&gt;;
                &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; ErrorLevel.Low:
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;SNAFU, if you know what I mean.&quot;&lt;/span&gt;;
                &lt;span class=&quot;kwrd&quot;&gt;case&lt;/span&gt; ErrorLevel.High:
                    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;Reaching TARFU levels&quot;&lt;/span&gt;;
            }
            &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&quot;&quot;&lt;/span&gt;;
        }
    }&lt;/pre&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&amp;nbsp;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, &quot;Courier New&quot;, courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, &quot;Courier New&quot;, courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&lt;/div&gt;
Then it is easy to use :&lt;br /&gt;
&lt;div class=&quot;csharpcode&quot;&gt;
&lt;pre class=&quot;alt&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;   1:  &lt;/span&gt;Console.WriteLine(ErrorLevel.Low.ToLocalizedStrings())&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=&quot;text/css&quot;&gt;
.csharpcode, .csharpcode pre
{
 font-size: small;
 color: black;
 font-family: consolas, &quot;Courier New&quot;, courier, monospace;
 background-color: #ffffff;
 /*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
 background-color: #f4f4f4;
 width: 100%;
 margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;br /&gt;
&lt;br /&gt;
This uses &lt;a href=&quot;http://msdn.microsoft.com/fr-fr/library/bb383977.aspx&quot;&gt;Extensions Methods&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/7122826004148368111/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/7122826004148368111' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7122826004148368111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7122826004148368111'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2011/10/converting-enum-values-to-user-frendly.html' title='Converting Enum values to user frendly strings'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-4340070414329586955</id><published>2011-10-06T13:21:00.001+02:00</published><updated>2011-10-06T13:21:58.073+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Outils"/><title type='text'>Tool to remove useless references in .net projects</title><content type='html'>&lt;blockquote&gt;   &lt;p&gt;Including too much references in projects can lead to tricky dependency graphes.&amp;#160; Checking all references is just boring and long; it’s why we have searched for a way to remove useless references automatically. Resharper provide the Clean Code feature which remove useless using directrives but it does not remove the references. &lt;/p&gt;    &lt;p&gt;Googling made me discover a free VisualStudio extension that does just but exaclty what we need (ie remove useless references and using directives) : &lt;em&gt;&lt;strong&gt;&lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/fc504cc6-5808-4da8-ae86-8d3f9ed81606&quot;&gt;&lt;u&gt;Reference Assistant&lt;/u&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjYTbT3jARQYcOkmUWADsattfcuJrcoIgNBTKO_y_jsG7V0x0pfZaHbmjLtjEqPYC0YiS6QhqXXGuEM3NFdT1f_KQjnOOzJHtSCYMdB3BrOvv1Mp7gcSZ290c7Ho2qE7cZ7RwgJFgin6c/s1600-h/image%25255B9%25255D.png&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhenf8mzg27b8r1UuHojyRoJlWoQhvc1hvXxMJIt2AY6COCxEys5WAwjRKaPqRmKtH41CVFiTHYiY2BLX_ltDCAp4hinW7Lb2S8_ADf47d6Dum9LZCGzZsvmBYU8dMOq44KBEwT1ssR-DM/?imgmax=800&quot; width=&quot;441&quot; height=&quot;157&quot; /&gt;&lt;/a&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;It works perfectly well so I think it is a must have tool !&lt;/p&gt;&lt;/blockquote&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/4340070414329586955/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/4340070414329586955' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/4340070414329586955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/4340070414329586955'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2011/10/tool-to-remove-useless-references-in.html' title='Tool to remove useless references in .net projects'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhenf8mzg27b8r1UuHojyRoJlWoQhvc1hvXxMJIt2AY6COCxEys5WAwjRKaPqRmKtH41CVFiTHYiY2BLX_ltDCAp4hinW7Lb2S8_ADf47d6Dum9LZCGzZsvmBYU8dMOq44KBEwT1ssR-DM/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2049171666402316671</id><published>2011-02-22T13:28:00.001+01:00</published><updated>2011-02-22T13:28:59.565+01:00</updated><title type='text'>CHAPTER 4: Preparing for Sprint Planning</title><content type='html'>&lt;p&gt;My notes out of the book “&lt;a href=&quot;http://luc-jeanniard.blogspot.com/2011/01/practical-guide-to-distributed-scrum.html&quot;&gt;A Practical Guide to Distributed Scrum&lt;/a&gt;”&lt;/p&gt;  &lt;p&gt;Sprint planning =&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Review of highest priority items with PO + decision on how much work could be done according to previous sprints and velocity &lt;/li&gt;    &lt;li&gt;Task break down to decide how the work will get done &lt;/li&gt;    &lt;li&gt;Commit to the sprint plan &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Risk at the sprint planning is that PO cannot answer team’s questions without contacting stakeholders who are not available in the meeting. This is often the sign that the team is not ready to do the Sprint Planning meeting.&lt;/p&gt;  &lt;p&gt;There is no official pre-planning meeting in SCRUM but the team needs to have ready for the sprint planning the following points&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A prioritized Poduct BackLog &lt;/li&gt;    &lt;li&gt;User stories the team can complete within a sprint &lt;/li&gt;    &lt;li&gt;Clear acceptance conditions for each user story &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Preplanning meeting can make the sprint planning meeting shorter&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Preplanning&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Discuss and clarify acceptance conditions for high-priority user stories. &lt;/li&gt;    &lt;li&gt;Provide a relative estimate to help the PO identify their priorities &lt;/li&gt;    &lt;li&gt;Break down high priority user stories so that they can fit within a sprint &lt;/li&gt;    &lt;li&gt;Consider story dependencies owned by different teams &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Clarification of user stories&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The participants have to confirm that the stories have the same meaning to everyone and that they understand what the deliverables for a user stories are. &lt;/p&gt;  &lt;p&gt;&lt;i&gt;Hint: A good mean to make sure participants have the same understanding is to make them rephrase it with their own words. &lt;/i&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The product owner answers questions or take note of them if he cannot answer to get ready for the Sprint Planning &lt;/li&gt;    &lt;li&gt;The team can identify what needs to be investigated technically speaking to be able to commit at sprint planning &lt;/li&gt;    &lt;li&gt;The participant confirm if the estimates seem accurate &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Breaking down User Stories&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Looking at the stories only at the sprint planning – particularly at the beginning of projects – may lead to long time of disaggregating user stories instead of planning for the sprint. The can lead to create user stories sprint after sprint and the team may never understand the quantity of work they need to do for the release.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;KEY POINT: The large user stories must be breakdown the soonest possible in the release to make the team understand how much work they need to do. Teams should not create user stories for the release from sprint to sprint&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Estimating user stories&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;When new stories are added to the backlog, the team can estimate them at pre planning meeting&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Dealing with dependencies&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;3 types of dependencies&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Simple dependency : A user story needs another user story done within the same team      &lt;ul&gt;       &lt;li&gt;Solution : reorder priorities to do first standalone user stories &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;External dependency : A user story needs another user story done from and other team      &lt;ul&gt;       &lt;li&gt;Negotiate integration and delivery dates and reorder priorities &lt;/li&gt;     &lt;/ul&gt;      &lt;ul&gt;       &lt;li&gt;The team should not commit the dependent user stories before integration of the other &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Intertwined dependency: Two user stories need each other to get done.      &lt;ul&gt;       &lt;li&gt;Rework user stories breakdown to get simple dependencies &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Cleanup of Product Backlog&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The Product Backlog is not a Parking lot for every possible feature that could potentially be in the product. &lt;/p&gt;  &lt;p&gt;The Product Backlog must be cleanup up so that it reflects what the team is likely to address. Stories with very low priority can be removed from the PB.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Approaches for the sprint preplanning meeting&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;1 meeting at each sprint or 1 meeting every week or as needed &lt;/li&gt;    &lt;li&gt;The regular meeting is best to get into a rhythm and limit interruptions &lt;/li&gt;    &lt;li&gt;Time box the meetings to remain focused. 1 hour is good. &lt;/li&gt;    &lt;li&gt;Sprint preparation can be 5 to 10% of team time &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;A ) The Full Team Approach&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Regular meeting that involves the entire team.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;PROS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Provide a sense of team ownership &lt;/li&gt;    &lt;li&gt;All team members can ask questions or voice concerns &lt;/li&gt;    &lt;li&gt;The team can use meeting to size the stories &lt;/li&gt;    &lt;li&gt;It allows the PO to get info from stakeholders before the Sprint Planning meeting &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;CONS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It is harder to keep focus of the meeting with many distributed participants. &lt;/li&gt;    &lt;li&gt;It may be difficult to schedule a time that works well for all Scrum Team members &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;B ) The Preplanning Team Approach&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Weekly preplanning meeting with PO and the smallest subset of team representatives able to select and describe stories&lt;/p&gt;  &lt;p&gt;&lt;u&gt;PROS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A smaller group of participant is more effective for teleconferences &lt;/li&gt;    &lt;li&gt;It allows the PO to get info from stakeholders before the Sprint Planning meeting &lt;/li&gt;    &lt;li&gt;It reduce the disruptions on the work of team members for the current Sprint &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;CONS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There is a potential loss of communication or information by not having the full team present. &lt;/li&gt;    &lt;li&gt;Neglecting to go back to the whole team for their contributions can result in a loss if team ownership. &lt;/li&gt;    &lt;li&gt;This approach can easily slip from Scrum to a command and control center &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;C ) The Balanced Team Approach&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Compromise between Full-Team and Preplanning Team approach.&lt;/p&gt;  &lt;p&gt;Weekly meeting with a core group of participant and the entire team as optional participant. The entire team is present only for the last meeting before the sprint planning&lt;/p&gt;  &lt;p&gt;&lt;u&gt;PROS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A smaller group of participant is more effective for teleconferences &lt;/li&gt;    &lt;li&gt;It allows the PO to get info from stakeholders before the Sprint Planning meeting &lt;/li&gt;    &lt;li&gt;It provides a sense of team ownership&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;All team members can ask questions or voice concerns&lt;b&gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;It allows the optional team members to manage the disruptions on their work for the current sprint&lt;b&gt;&lt;/b&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;CONS&lt;/u&gt; :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There may be a loss of communication or information because the full team is not always present&lt;b&gt;&lt;/b&gt; &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2049171666402316671/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2049171666402316671' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2049171666402316671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2049171666402316671'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2011/02/chapter-4-preparing-for-sprint-planning.html' title='CHAPTER 4: Preparing for Sprint Planning'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2147736087597654150</id><published>2011-02-01T09:48:00.001+01:00</published><updated>2011-02-01T09:48:13.480+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>CHAPTER 2: Challenges faced by distributed teams</title><content type='html'>&lt;p&gt;My notes out of the book “&lt;a href=&quot;http://luc-jeanniard.blogspot.com/2011/01/practical-guide-to-distributed-scrum.html&quot;&gt;A Practical Guide to Distributed Scrum&lt;/a&gt;”&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Communication&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Generally speaking, communication is a lot about non verbal channel. Indeed, verbal channel is only 35% of communication. As a consequence distributed teams communicate with a real handicap.&lt;/p&gt;  &lt;p&gt;Meeting at least once help to know each other’s personalities, mannerisms, communication style and culture.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Time zone and working hours &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Every meeting is a challenge&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Cultural differences&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In some countries, it is inappropriate to say “I don’t understand” the speaker. This can result to a big waste of time and energy.&lt;/p&gt;  &lt;p&gt;Humor can differ from country to country. Handle it with care.&lt;/p&gt;  &lt;p&gt;Words can have different meaning.&lt;/p&gt;  &lt;p&gt;Management style can also be different.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Language differences&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A scrum team needs to communicate a lot so the language difference makes it harder. Keeping language simple will help those who are not speaking mother language. &lt;/p&gt;  &lt;p&gt;Give everyone a chance to speak.&lt;/p&gt;  &lt;p&gt;Use chat tools to share links&lt;/p&gt;  &lt;p&gt;Confirm understanding&lt;/p&gt;  &lt;p&gt;Address communication tools issue such bad phone or poor network connection.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Software Engineering practices&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;“Good software engineering practices are important for both collocated and distributed teams BUT for distributed teams poor engineering practices are much more obvious and are a greater problem”&lt;/p&gt;  &lt;p&gt;- TDD helps delivering high quality tested code. It helps the team to evolve design over the time.&lt;/p&gt;  &lt;p&gt;- Continuous integration helps teams to integrate their work frequently&lt;/p&gt;  &lt;p&gt;- CI running automated tests detect regression problem quicker&lt;/p&gt;  &lt;p&gt;Generally speaking, any tool helping to discover problems soon is a good tool because the later issues are discovered, the more expensive they are.&lt;/p&gt;  &lt;p&gt;Delivering value at every 2-3 weeks sprint is a challenge and good engineering practices will considerably help distributed teams.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Schedule difference&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Take into account holidays of the different zones to help commitment.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Team dynamics&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;“Making the daily scrum a priority is one example of how to keep the whole team engaged”&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Telephone dynamics&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Providing access to call -&amp;gt; toll free numbers (very important for home workers)&lt;/p&gt;  &lt;p&gt;The Scrum Master takes the responsibility everyone hears and participates&lt;/p&gt;  &lt;p&gt;Identify the speaker (Luc’s speaking : “bla bla bla”)&lt;/p&gt;  &lt;p&gt;Handling visual cues encourage participation and limit side conversation&lt;/p&gt;  &lt;p&gt;Check for agreement and disagreement.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Impact of Communication problems&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Obvious problems: Team members not doing the right task, doing the task correctly or doing the task at the expected time.&lt;/p&gt;  &lt;p&gt;More subtle problems: tasks outside team’s mission can pull away members to work on lower priority matters. This is more difficult to see on distributed teams.&lt;/p&gt;  &lt;p&gt;Scrum helps mitigate this problem through the daily Scrum.&lt;/p&gt;  &lt;p&gt;“KEY POINT: The more closely a distributed team can adopt Scrum as designed by its creators, the more likely a team will experience success. The design of Scrum promotes good communication. At the same time, with some minor adaptations for distributed teams, Scrum can help teams deliver the right product, at the right time, with the right quality”.&lt;/p&gt;  &lt;p&gt;Forming-Storming-Norming-Performing model: &lt;a href=&quot;http://en.wikipedia.org/wiki/Tuckman&#39;s_stages_of_group_development&quot;&gt;http://en.wikipedia.org/wiki/Tuckman&#39;s_stages_of_group_development&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;- Distributed teams easily block at the storming stage. When the team changes, it can start over at forming stage. The performing stage is fragile and because of the limited personal contact, remote teams take longer to get through this stage.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;How does Scrum help?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;It does not help fixing problems! It just puts a spotlight on them so that the teams can identify and address them. All scrum artifacts are designed to help the team seeing progress and issues. Sprints, daily scrums, retrospectives, sprint planning are all important and mastering them can lead the team to performance. Scrum is like glasses, it makes more visible dysfunctions.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2147736087597654150/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2147736087597654150' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2147736087597654150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2147736087597654150'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2011/02/chapter-2-challenges-faced-by.html' title='CHAPTER 2: Challenges faced by distributed teams'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-8535784046214600768</id><published>2011-01-31T08:32:00.001+01:00</published><updated>2011-01-31T11:37:04.312+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>A Practical Guide to Distributed Scrum – IBM Press</title><content type='html'>&lt;p&gt;By &lt;a href=&quot;http://www.ibmpressbooks.com/authors/bio.asp?a=eda84b99-ac53-4dde-bcbf-dade08bca005&quot;&gt;Elizabeth Woodward&lt;/a&gt;, &lt;a href=&quot;http://www.ibmpressbooks.com/authors/bio.asp?a=a60e5800-f3a1-4167-8d26-86ee564eec4e&quot;&gt;Steffan Surdek&lt;/a&gt;, &lt;a href=&quot;http://www.ibmpressbooks.com/authors/bio.asp?a=1abbe833-6f0a-40ba-b81f-897001a92b01&quot;&gt;Matthew Ganis&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.ibmpressbooks.com/bookstore/product.asp?isbn=0137041136&quot;&gt;http://www.ibmpressbooks.com/bookstore/product.asp?isbn=0137041136&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;font size=&quot;3&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTMlsnj2EfC8bmG6TY_gc0BXwizelyDqc-ZSMpBttEzUdkS4pfAY9d9PmsKGzyA7Y7i2iitlbDnwdn4v2egl4hdrHhxgmFT7zP1W7-T4Ql9dno1Ke9VEuzJ3Jyqk8XsYPIf5_tJox8_4A/s1600-h/Untitled%5B4%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; margin: 0px auto; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Untitled&quot; border=&quot;0&quot; alt=&quot;Untitled&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVUfsXlrBZh2XbbuLIm6Vua_S_q-QH7bEGnByVd1OfYnWi3aXiiIneNptAa1KKwAHA1jckLYf1ZGLHI-ab2RsCXYTuCk7EEm7t4BWWXPO1FF6hU490pyfNpoFYBz0tCQizt35-pyipmMA/?imgmax=800&quot; width=&quot;244&quot; height=&quot;314&quot; /&gt;&lt;/a&gt;&amp;#160;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;font size=&quot;3&quot;&gt;Here are my notes picked up when reading the book&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/u&gt;&lt;/p&gt;  &lt;h1&gt;&lt;b&gt;&lt;font size=&quot;4&quot;&gt;CHAPTER 1 : The Evolution of Scrum&lt;/font&gt;&lt;/b&gt;&lt;/h1&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Collocation is no longer the norm: only 45% of collocated teams – from a recent survey –&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;Advantages of distributed teams&lt;/strong&gt;&lt;/font&gt;&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Use time shift for 24/24 h development effort&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Reaching market more quickly with the “&lt;a href=&quot;http://en.wikipedia.org/wiki/Follow-the-sun&quot;&gt;follow the sum model&lt;/a&gt;” : &lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Multinational companies produce more ideas than domestic counterparts&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;A lot of distributed teams are the result of acquisition.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;font size=&quot;3&quot;&gt;Four level of distribution with more and more difficulties&lt;/font&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Collocated&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Collocated part-time&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;dailies with remote callers,&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;“out of sight, out of mind”,&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;biggest challenge is to invite remote people to planning and design sessions.&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Distributed with overlapping hours&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Not easy to plannify sprint planning and review&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Scrum meetings lack of body language&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Cultural / language difference&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Distributed with no overlapping hours&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Every meeting is a challenge&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;&lt;font size=&quot;3&quot;&gt;Three ways of handling distributed teams&lt;/font&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Isolated Scrums model&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;No synchronization needed between teams&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Each location has a cross functional team.&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Usually the first two level of distribution&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Distributed Scrum of scrum&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Scrum of scrum daily (Ken Schwaber 2004)&lt;/font&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;&lt;font size=&quot;3&quot;&gt;What did you team do yesterday?&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font size=&quot;3&quot;&gt;What will your team do today?&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font size=&quot;3&quot;&gt;What blockers have you met?&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font size=&quot;3&quot;&gt;+ What blockers might you be throwing into another team’s way?&lt;/font&gt; &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Longer meeting fewer time to give all members time to communicate&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Several Product owners who make a single team : Need to speak with single voice&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font size=&quot;3&quot;&gt;Totally Integrated teams&lt;/font&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font size=&quot;3&quot;&gt;Each team has members in several location (Ex : All testers in a single location)&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font size=&quot;3&quot;&gt;In such a context, Scrum can improve productivity by 5 to 10 compared to industry average&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Comments are welcome ; &lt;/strong&gt;&lt;strong&gt;Comming soon : Chapter 2 : Challenges faced by distributed teams&lt;/strong&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/8535784046214600768/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/8535784046214600768' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8535784046214600768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8535784046214600768'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2011/01/practical-guide-to-distributed-scrum.html' title='A Practical Guide to Distributed Scrum – IBM Press'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVUfsXlrBZh2XbbuLIm6Vua_S_q-QH7bEGnByVd1OfYnWi3aXiiIneNptAa1KKwAHA1jckLYf1ZGLHI-ab2RsCXYTuCk7EEm7t4BWWXPO1FF6hU490pyfNpoFYBz0tCQizt35-pyipmMA/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-5631186998749588856</id><published>2010-12-24T09:39:00.001+01:00</published><updated>2010-12-24T09:39:48.050+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><title type='text'>How to implement a generic “waiting for” function with C#</title><content type='html'>&lt;p&gt;In order to avoid repeating myself in the code of my team’s project where we need several times to wait for something to happen such as waiting for a file, I learned how to use the type “Func”.&lt;/p&gt;  &lt;p&gt;Here is how was the code before the refactoring : &lt;/p&gt;  &lt;table border=&quot;5&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;581&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;571&quot;&gt;         &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;public static bool WaitForFile(string filePath, int timeOutMs)              &lt;br /&gt;{               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var fileFound = false;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var timeElapsed = false; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;&amp;#160;&amp;#160;&amp;#160; var startTime = DateTime.Now;              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime currentTime;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while (!fileFound &amp;amp;&amp;amp; !timeElapsed)               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentTime = DateTime.Now;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan span = currentTime.Subtract(startTime); &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; timeElapsed = span.TotalMilliseconds &amp;gt; timeOutMs; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileFound = System.IO.File.Exists(filePath);              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Threading.Thread.Sleep(1000);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return fileFound; &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;}&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;And here is the new generic implementation :&lt;/p&gt;  &lt;table border=&quot;5&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;580&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;570&quot;&gt;         &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;public static bool WaitForSynchrone(Func&amp;lt;bool&amp;gt; function, int timeOutMs)              &lt;br /&gt;{               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var actionReturnedTrue = false;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var timeElapsed = false; var startTime = DateTime.Now;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime currentTime;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while (!actionReturnedTrue &amp;amp;&amp;amp; !timeElapsed)               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentTime = DateTime.Now;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan span = currentTime.Subtract(startTime);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; timeElapsed = span.TotalMilliseconds &amp;gt; timeOutMs;               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; actionReturnedTrue = function();               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Threading.Thread.Sleep(1000);               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return actionReturnedTrue;               &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;          &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;public void WaitFile()              &lt;br /&gt;{               &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; WaitForSynchrone(() =&amp;gt; File.Exists(&amp;quot;C:\myfile.txt&amp;quot;), 10000);               &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;So, now, we have a new function&amp;#160; &lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;WaitForSynchrone&lt;/font&gt; that take 2 arguments :&lt;/p&gt;  &lt;ul&gt;   &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;- Func&amp;lt;bool&amp;gt; function&lt;/font&gt; : A function that returns a boolean&lt;/p&gt;    &lt;p&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;- &lt;/font&gt;&lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;int timeOutMs : &lt;font face=&quot;Trebuchet MS&quot;&gt;A timeout to prevent freezing !!&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;   &lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/ul&gt; &lt;font face=&quot;Courier New&quot;&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;     &lt;p&gt;&lt;font size=&quot;2&quot;&gt;And we use it thanks to lambda expression for the first argument :&lt;/font&gt;&lt;/p&gt;      &lt;ul&gt;       &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font face=&quot;Courier New&quot;&gt;- &lt;/font&gt;&lt;font face=&quot;Courier New&quot;&gt;() =&amp;gt; File.Exists(&amp;quot;C:\myfile.txt&amp;quot;)&amp;#160;&amp;#160; : &lt;/font&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;This is a function that takes no arguments and returns and boolean according to the left part of the expression&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;       &lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/ul&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;So now, we can use &lt;font size=&quot;2&quot; face=&quot;Courier New&quot;&gt;WaitForSynchrone&lt;/font&gt; for many other purpose instead of violating the DRY principle = ‘Do Not Repeat yourself ‘.&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;/font&gt;&lt;font size=&quot;2&quot; face=&quot;Trebuchet MS&quot;&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;       &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;&lt;/p&gt;   &lt;/font&gt;&lt;/font&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/5631186998749588856/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/5631186998749588856' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5631186998749588856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5631186998749588856'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/12/how-to-implement-generic-waiting-for.html' title='How to implement a generic “waiting for” function with C#'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-7325846861722885144</id><published>2010-11-25T10:30:00.003+01:00</published><updated>2010-11-29T08:11:35.140+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="LE"/><category scheme="http://www.blogger.com/atom/ns#" term="Lean"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>Agile Grenoble 2010 – 10 Messages que j’ai retenu</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiN660YVm5oUKk-eE4lE7CFlX28JXcjlkry_UJqh7DU2utJUlvGzJQeQ5fvLIljVf6qU_RK-Z_ljeyOQHaeNuwoCbnIZlj0c0hCsK1rsgjGEhL1B9rkndBVqXdF2yPeAuLxTkSsRm-CzYA/s1600-h/ag2010_logoheader%5B4%5D.png&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;ag2010_logoheader&quot; border=&quot;0&quot; alt=&quot;ag2010_logoheader&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNgQ-LlfwikBut17LZY3PNxDfNtCYu3bBscwmNTBmy9WL0MddBVWhCFxzp856H9yRuX6C6n2fAuf2LePPhg2-q-JEBmqc4NqrEZsDYey64EaE1BCrCW909u5HYNzk98vUq5JSnBz6Z2Lc/?imgmax=800&quot; width=&quot;807&quot; height=&quot;98&quot; /&gt;&lt;/a&gt;   &lt;/span&gt;&lt;/p&gt;    &lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Nombre de WTF par minute = métrique représentant la qualité du code”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Aslak Hellesoy  -  WTF = What the fuck&lt;/em&gt;&lt;/p&gt;  &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;  &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Loi de Little : Moins on en fait à la fois, plus on va vite”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Hervé Lourdin, Cyril Mégard&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large; &quot;&gt;&lt;b&gt;“Il faut garder du mou pour absorber la variabilité”&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;- Hervé Lourdin, Cyril Mégard&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“L’Agilité est un long voyage. Elle évolue depuis la fin des années 90 et va continuer à évoluer”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Claude Aubry       – Laurent Bossavit&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Le TDD dans le Legacy Code, c’est possible et bénéfique”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Bernard Huguet, Cyrille Roy, Johan Martinsson, Luc Jeanniard ;o)&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“La programmation fonctionnelle permet de résoudre des problèmes de façon élégante et efficace”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Emmanuel Gaillot&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Bonjour Mr Orsier, je vous apporte le cahier des charges (un énorme classeur) – c’est presqu’ … le définitif”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Rémy Sanlaville, Bruno Orsier&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Il faut commencer le dev le plus tôt possible pour obtenir du feedback rapidement”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;– Alexandre Boutin&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“Portfolio agile : synchroniser les releases pour être réactif au changement”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;- Jean Dupuis, Jean-François Jagodzinski&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;_&lt;/em&gt;&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;“&#39;jcQualitystreet #agilegrenoble: On est loin mais on attend des tweets et du feedback! @NicoRuffel @claudeaubry @agilex @LucJeanniard @jfjago @calton13”&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; &lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;– Jean Claude GROSJEAN via Twitter !&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt;_&lt;/p&gt;    &lt;p align=&quot;center&quot;&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p align=&quot;center&quot;&gt;Il y a très certainement d’autres messages importants mais c’est la loi de ce genre d’événement, il faut faire des choix, on ne peut pas tout voir, tout entendre, tout retenir … Rendez-vous en 2011 !&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Le programme complet est sur &lt;a href=&quot;http://agile-grenoble.org/&quot;&gt;http://agile-grenoble.org/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/7325846861722885144/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/7325846861722885144' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7325846861722885144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7325846861722885144'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/11/agile-grenoble-2010-10-messages-que-jai.html' title='Agile Grenoble 2010 – 10 Messages que j’ai retenu'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNgQ-LlfwikBut17LZY3PNxDfNtCYu3bBscwmNTBmy9WL0MddBVWhCFxzp856H9yRuX6C6n2fAuf2LePPhg2-q-JEBmqc4NqrEZsDYey64EaE1BCrCW909u5HYNzk98vUq5JSnBz6Z2Lc/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-8440179770806603159</id><published>2010-09-30T11:54:00.001+02:00</published><updated>2010-09-30T13:38:58.039+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><category scheme="http://www.blogger.com/atom/ns#" term="XP"/><title type='text'>Tester unitairement du “Legacy Code” : un exemple</title><content type='html'>&lt;style type=&quot;text/css&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ol{margin:0;padding:0}p{margin:0}.c15{color:#000099;font-size:11pt;text-decoration:underline;font-family:arial}.c0{color:#000000;font-size:8pt;font-family:courier new}.c1{line-height:1.0;text-indent:0pt;direction:ltr}.c9{color:#134f5c;font-size:8pt;font-family:courier new}.c4{color:#000000;font-size:11pt;font-family:arial}.c2{color:#0000ff;font-size:8pt;font-family:courier new}.c6{line-height:1.0;text-indent:36.0pt;direction:ltr}.c17{color:#0000ff;font-size:11pt;font-family:arial}.c7{color:#38761d;font-size:8pt;font-family:courier new}.c14{color:#000000;font-size:14pt;font-family:arial}.c16{background-color:#e06666}.c5{font-weight:bold}.c12{background-color:#ffffff}.c13{background-color:#b6d7a8}.c10{margin-left:36.0pt}.c8{font-style:italic}.c3{background-color:#ea9999}.c18{background-color:#6aa84f}.c11{margin-left:108.0pt}&lt;/style&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;(Note au utilisateur de GoogleReader : Pour une raison inconnue, les couleurs ne sortent pas … lisez plutôt &lt;a href=&quot;   http://luc-jeanniard.blogspot.com/2010/09/tester-unitairement-du-legacy-code-un.html&quot;&gt;&lt;u&gt;ici&lt;/u&gt;&lt;/a&gt;)&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Je souhaite vous montrer dans ce billet un exemple d’ajout de test unitaire dans du legacy code. Du legacy code, c’est du code non testé automatiquement. Je travaille tous les jours sur du code non couvert par des tests automatiques alors capitaliser en ajoutant petit à petit des tests est un réel enjeu pour éviter les régressions.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c14 c5&quot;&gt;Le Problème&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Voici une classe développée il y a presque 10 ans pour dessiner des annotations sur un graphique. Il se trouve que dans certaines&amp;#160; rares conditions, l’annotation sort du graphique et ceci ne fait pas propre lors de son impression. Nous avons donc souhaité corriger ce défaut.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;TSKRAnnotDrawer = &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;class&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;private&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; FAnnotList: TList;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; FSquaring: TSquaringType;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; FHorizontalMaille: Real;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; FVerticalMaille: Real;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;Sort;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; GetAnnot(Index: Integer): PAnnotRec;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; FindCorrespondingSquaringRectangle(aRect: TRect;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c10&quot;&gt;&lt;span class=&quot;c0&quot;&gt;X, Y: Integer; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c10&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; SquaringRow, SquaringCol: Integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;CalculateSquaringRectanglesNumber(aRect: TRect; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c10&quot;&gt;&lt;span class=&quot;c0&quot;&gt;W, H: Integer; var SquaringWidth, SquaringHeight: Integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; FindFreeSpace(SquaringRow, SquaringCol,&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c11&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringWidth, SquaringHeight: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c11&quot;&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; SquaringFreeRow, SquaringFreeCol: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c11&quot;&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; UpOrDown:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Boolean): Boolean;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; TestIfItIsInTheGraphic(row, col, &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c11&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringWidth, SquaringHeight: Integer): Boolean;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; TestIfTheSpaceIsFree(row, col, &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6 c11&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringWidth, SquaringHeight: Integer): Boolean;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; UpdateFSquaring(row, col, SquaringWidth, SquaringHeight: Integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;public&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; PeakAnnotation: TSKRPeakAnnotationPrefs;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; EventAnnotation: TSKREventAnnotationPrefs;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; Create;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; Destroy; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;override&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; ClearList;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; AddToList(aAnnot: TAnnotRec);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; Draw(Canvas: TCanvas3D; arect: TRect);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Nous allons nous intéresser à la méthode “Draw”. Après investigation, l’erreur provient du calcul de la hauteur de la première annotation. En effet, la ‘font size’ est assignée après le calcul de la hauteur du texte : voir ci-dessous le texte en rouge.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; TSKRAnnotDrawer.Draw(Canvas: TCanvas3D; aRect: TRect);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;i, Width, Height: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;UpOrDown: Boolean;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;w, h: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;AnnotationPrefs: TSKRAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;row, col: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringRow, SquaringCol: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringWidth, SquaringHeight: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;SquaringFreeRow, SquaringFreeCol, XFree, YFree, YFreeTemp: Integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;assert(EventAnnotation &amp;lt;&amp;gt; nil);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;assert(PeakAnnotation &amp;lt;&amp;gt; nil);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;// sort annotation according time&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;Sort;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;Width := 0;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;Height := -1;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//initializing the squaring array.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;for &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;row := 0 to Pred(SquaringSize) &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;do &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;// Iterate&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;for &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;col := 0 to Pred(SquaringSize) &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;do &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;// Iterate&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FSquaring[row, col] := True;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;// for&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;c9&quot;&gt;// for&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;for &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;i := 0 to Pred(FAnnotList.Count) &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;do&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;with &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;GetAnnot(i)^ do&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;Typ = 0 &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AnnotationPrefs := EventAnnotation&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AnnotationPrefs := PeakAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpOrDown := AnnotationPrefs.AutoUpDown = apUp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;AnnotationPrefs.Orientation = aoOblique then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//We take the size of the rectangle projection on a vertical axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := round(Sin(Pi / 4) * (&lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;Canvas.TextWidth(Text)&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//and for W the size of the rectangle projection on the horizontal axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; W := round(Cos(Pi / 4) * (Canvas.TextWidth(Text) + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;if AnnotationPrefs.Orientation = aoVertical then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;W := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;//Horizontal&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;H := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; W := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := H + 4;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;AnnotationPrefs.AutoUpDown = apAuto &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Canvas.Font.Name := AnnotationPrefs.Font.name;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c5 c3&quot;&gt;Canvas.Font.Size := AnnotationPrefs.Font.Size&lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;c0 c16 c5&quot;&gt; //INTERVIENT TROP TARD&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;AnnotationPrefs.LinkType = ltNone &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c8&quot;&gt;... 6 lines&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c8&quot;&gt;... 30 lines&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DrawAnnotation(Canvas, Text, Point(XFree, YFree),&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XFree, AnnotationPrefs, UpOrDown, Width, Height, X, Y, aRect);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;La correction est triviale, il suffit de remonter l’affectation de la font size avant la première utilisation du Canvas.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Mais comment tester ce que l’on souhaite modifier?&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c14 c5&quot;&gt;Le cheminement vers le test unitaire&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Ma première idée fut d’instancier la classe et appeler la méthode &lt;/span&gt;&lt;span class=&quot;c4 c8&quot;&gt;Draw &lt;/span&gt;&lt;span class=&quot;c4&quot;&gt;dans un test unitaire. En effet, le constructeur ne prend pas de paramètre alors ça paraissait facile. Ensuite, il a fallu ajouter des assertions à mon test et là les ennuis commençaient. En effet, je n’avais aucune envie de vérifier le rendu sur le graphique (via le Canvas) car je ne savais pas comment m’y prendre.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Donc je suis reparti de zéro afin d’isoler mon problème. J’ai suivi les étapes suivantes :&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;1- Extraction de la partie de code problèmatique&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Je ne prend pas de risque à ce niveau là et je fais confiance au compilateur pour m’indiquer les éventuels problèmes.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;TSKRAnnotDrawer.getTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aCanvas: TCanvas3D;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aAnnotationPrefs: TSKRAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aText: string;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var oTextHeight, oTextWidth: integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;AnnotationPrefs.Orientation = aoOblique then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//We take the size of the rectangle projection on a vertical axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := round(Sin(Pi / 4) * (&lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;Canvas.TextWidth(Text)&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//and for W the size of the rectangle projection on the horizontal axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; W := round(Cos(Pi / 4) * (Canvas.TextWidth(Text) + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;if AnnotationPrefs.Orientation = aoVertical then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;W := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;//Horizontal&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;W := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; H := H + 4;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;AnnotationPrefs.AutoUpDown = apAuto &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Canvas.Font.Name := AnnotationPrefs.Font.name;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c5 c3&quot;&gt;Canvas.Font.Size := AnnotationPrefs.Font.Size&lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;c0 c5 c16&quot;&gt; //INTERVIENT TROP TARD&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Là, ça devient plus simple de tester cette fonction mais celle-ci n’est pas publique et changer l’API, c’est à dire le contrat de la classe, à des fins de tests n’est pas élegant. En effet, cette méthode n’a pas d’intéret pour l’utilisateur de la classe.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;2- Extraction de la méthode vers une classe spécifique&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;En ayant en tête les principes &lt;/span&gt;&lt;span class=&quot;c15&quot;&gt;&lt;a href=&quot;http://www.google.com/url?q=http%3A%2F%2Fbutunclebob.com%2FArticleS.UncleBob.PrinciplesOfOod&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNE2BBU1N297_uiIbercLbIqPyZUEA&quot;&gt;SOLID&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;c4&quot;&gt; et plus particulièrement celui qui dit qu’une classe ne doit avoir qu’une responsabilité, je n’ai pas d’état d’âme à créer une classe pour isoler ma méthode:&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;TTextPixelSizeHelper = &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;class&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;public&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;class procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;GetTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; const aCanvas: TCanvas3D;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; const aAnnotationPrefs: TSKRAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; const aText: string;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; var oTextHeight, oTextWidth: integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;class procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;TTextPixelSizeHelper .getTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aCanvas: TCanvas3D;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aAnnotationPrefs: TSKRAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aText: string;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var oTextHeight, oTextWidth: integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; ... idem ...&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Je ne prend toujours pas de risque et je fais confiance au compilateur pour les éventuelles erreurs de refactoring. Je n’ai changé aucun comportement.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;La méthode Draw peu maintenant utiliser cette nouvelle classe :&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;procedure&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; TSKRAnnotDrawer.Draw(Canvas: TCanvas3D; aRect: TRect);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;...&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;for &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;i := 0 to Pred(FAnnotList.Count) &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;do&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;with &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;GetAnnot(i)^ do&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;Typ = 0 &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AnnotationPrefs := EventAnnotation&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AnnotationPrefs := PeakAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpOrDown := AnnotationPrefs.AutoUpDown = apUp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c13&quot;&gt;TTextPixelSizeHelper.GetTextHeightAndWidth(Canvas, AnnotationPrefs, Text, H, W);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c8&quot;&gt;... &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DrawAnnotation(Canvas, Text, Point(XFree, YFree),&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; XFree, AnnotationPrefs, UpOrDown, Width, Height, X, Y, aRect);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Au passage, nous avons diminué la &lt;/span&gt;&lt;span class=&quot;c15&quot;&gt;&lt;a href=&quot;http://www.google.com/url?q=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCyclomatic_complexity&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNEzGj4AZHFFt4kqR6H3iVWUANE4jQ&quot;&gt;complexité cyclomatique&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;c4&quot;&gt; de la fonction et facilité sa compréhension.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;3- Ecriture d’un test qui échoue&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Le principe du test est d’appeler deux fois de suite la fonction ‘GetTextHeightAndWidth’&amp;#160; avec le même texte et de vérifier qu’elle donne deux fois le même résultat.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;__________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;TSKRAnnotDrawerTest.testPeakNamesMightBePrintedBeOutisdeOfTheChartArea;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;const&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; TEXT1_TO_DRAW = &#39;TestPeakAnnot&#39;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; TEXT2_TO_DRAW = TEXT1_TO_DRAW;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; PEAK_ANNOTATION_TYPE = 1;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;var&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; chart: TOrlandoChart;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; form: TForm;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; canvas: TCanvas3D;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; peak_annotation_prefs: TSKRPeakAnnotationPrefs;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; text1_height_result, text2_height_result: integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; text1_width_result, text2_width_result: integer;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160; peak_annotation_prefs := TSKRPeakAnnotationPrefs.Create;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;form := TForm.Create(nil);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;chart := TOrlandoChart.Create(form);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;chart.ParentWindow := form.Handle;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;canvas := chart.Canvas;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;try&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; canvas.Font.Size := 4;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; assert(canvas.Font.Size &amp;lt;&amp;gt; peak_annotation_prefs.Font.size, &#39;Font size must be different to show the defect problem&#39;);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; TTextPixelSizeHelper.GetTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6&quot;&gt;&lt;span class=&quot;c0&quot;&gt;canvas, peak_annotation_prefs, TEXT1_TO_DRAW, &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6&quot;&gt;&lt;span class=&quot;c0&quot;&gt;text1_height_result, text1_width_result);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; TTextPixelSizeHelper.GetTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6&quot;&gt;&lt;span class=&quot;c0&quot;&gt;canvas, peak_annotation_prefs, TEXT2_TO_DRAW,&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6&quot;&gt;&lt;span class=&quot;c0&quot;&gt;text2_height_result, text2_width_result);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; CheckEquals(text1_height_result, text2_height_result, &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1 c10&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&#39;calling twice the function with same text should provide the same Height&amp;#160; result!&#39;);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; CheckEquals(text1_width_result, text2_width_result,&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c6&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&#39;calling twice the function with same text should provide the same Width result!&#39;);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;finally&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; peak_annotation_prefs.Free;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; chart.Free;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; form.free;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;_________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR0Ozx8cDvKom5CMB976PI6bhW1-Dk9n6aqhAA2ECJusuv1NFBthrjXUgBYxX8tT2AubheaOuU23jV025zFkVJBvT5oYDCNhq_n8b6xDLei86dmBye0sR6WEKN60x7jCzkWwzjgdZoB3E/s1600-h/red%5B4%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;red&quot; border=&quot;0&quot; alt=&quot;red&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglNQquuuD10xjg649GzExuDx3UkaOecaY1HNYG01FNqdxmvqhNxwNC6IdZzk4MK3P38Ua_nWcmyvwFfGoNO0tMzXtjNZ_o6cdD2GJEfdE_JzwX8AWlAKFQ-s3X4zg_9CEy7oQW0vgjhq8/?imgmax=800&quot; width=&quot;735&quot; height=&quot;315&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;4- Correction du bug&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;La correction conciste à déplacer quelques lignes de code afin d’assigner la “font size” du canvas avant de s’en servir:&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;_________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;procedure &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;TTextPixelSizeHelper.getTextHeightAndWidth(&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aCanvas: TCanvas3D;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aAnnotationPrefs: TSKRAnnotation;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; const aText: string;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var oTextHeight, oTextWidth: integer);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;AnnotationPrefs.AutoUpDown = apAuto &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Canvas.Font.Name := AnnotationPrefs.Font.name;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c5 c18&quot;&gt;Canvas.Font.Size := AnnotationPrefs.Font.Size;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0 c5&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2 c5&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0 c5&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;&amp;#160;&amp;#160; if &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;AnnotationPrefs.Orientation = aoOblique then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//We take the size of the rectangle projection on a vertical axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := round(Sin(Pi / 4) * (&lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;Canvas.TextWidth(Text)&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt; + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c7&quot;&gt;//and for W the size of the rectangle projection on the horizontal axis&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; W := round(Cos(Pi / 4) * (Canvas.TextWidth(Text) + Canvas.TextHeight(Text)));&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;if AnnotationPrefs.Orientation = aoVertical then&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;W := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;else &lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;//Horizontal&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;begin&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; H := Canvas.TextHeight(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c0 c3&quot;&gt;W := Canvas.TextWidth(Text);&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&amp;#160;&amp;#160; H := H + 4;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c2&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;c0&quot;&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;_________________________________________________________________&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c0&quot;&gt;&lt;/span&gt;&amp;#160;&lt;span class=&quot;c0&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4 c5&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtqcM0zjU4mtdaotPrayK8PARGkxTvx0nScMvoK8HzNMGfsD0WNFtJwCXrehXxkYa3vRYHt6qKbFtVnvmc-2vx8KUSyGkE7XULEbnbbnjcGyEgyUU9G1QBu-VHcQelg4BAo-vvMHtakhI/s1600-h/green%5B5%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;green&quot; border=&quot;0&quot; alt=&quot;green&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZT41zV0KcmFLJZjqZEmJZ-_FaS2KBJOABPnHbYDa-CpMru3_QIHJx-uk9Gty2s6i2FuFQ9E9ciaiES2sHRMoyrXwyw2zAQVq4m9ytOkvU4bu8cT7JWioiaSBFyPZsu03YUh-Dq5Qh4Yk/?imgmax=800&quot; width=&quot;712&quot; height=&quot;267&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&amp;#160;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;La barre est verte! Donc place au refactoring si nécéssaire.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c14 c5&quot;&gt;Conclusion&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c5 c14&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Tester du legacy code peut décourager bon nombre de développeurs. Ce n’ai pas très compliqué mais ça demande une petite gymnastique intellectuelle. Tout m’a semblé plus facile après quelques essais et la lecture du bien connu livre de &lt;/span&gt;&lt;span class=&quot;c15&quot;&gt;&lt;a href=&quot;http://www.google.com/url?q=http%3A%2F%2Fwww.amazon.fr%2FWorking-Effectively-Legacy-Michael-Feathers%2Fdp%2F0131177052&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFnLD-biOGQfCsmkuqz-jGp7TJ1Mw&quot;&gt;Michael C. Feathers “Working Effectively with Legacy Code”&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;c4&quot;&gt; . Ce n’ai pas toujours possible à un coût raisonnable alors dans notre équipe, nous ne nous demandons pas une obligation de résultat.&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;Avec quelques amis développeurs Grenoblois, nous allons présenter une session dédiée à ce sujet sur du vrai code lors de la conférence &lt;/span&gt;&lt;span class=&quot;c15&quot;&gt;&lt;a href=&quot;http://www.google.com/url?q=http%3A%2F%2Fagile-grenoble.org%2Fprogramme&amp;amp;sa=D&amp;amp;sntz=1&amp;amp;usg=AFQjCNFnwYqYpWPOISKjpxqeoBMFaR6puw&quot;&gt;Agile Grenoble 2010&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;c4&quot;&gt;; venez nous voir ;o) !&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  &lt;p class=&quot;c1&quot;&gt;&lt;span class=&quot;c4&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/8440179770806603159/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/8440179770806603159' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8440179770806603159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8440179770806603159'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/09/tester-unitairement-du-legacy-code-un.html' title='Tester unitairement du “Legacy Code” : un exemple'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglNQquuuD10xjg649GzExuDx3UkaOecaY1HNYG01FNqdxmvqhNxwNC6IdZzk4MK3P38Ua_nWcmyvwFfGoNO0tMzXtjNZ_o6cdD2GJEfdE_JzwX8AWlAKFQ-s3X4zg_9CEy7oQW0vgjhq8/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-7965460252176128351</id><published>2010-09-02T07:12:00.001+02:00</published><updated>2010-09-02T07:12:31.367+02:00</updated><title type='text'>Les vacances sont finies !</title><content type='html'>&lt;p&gt;&lt;img style=&quot;margin: 0px 15px 0px 0px; display: inline&quot; align=&quot;left&quot; src=&quot;data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhISERIRExESEBQWFRYUFxQREhgWFxkVFxYWFRQYGx4aJyYfFx0vGhUWIi8gLycuLDI4IR8xNTAqNSYrLCkBCQoKDgwOGg8PGi0kHyIuLDUyNSw0NS0qLDQ0KiwuNDQ1My0sLjUsKjIpNDUtLC42KSw0LDQuKi0sLCk1Ki4pKf/AABEIAFMAfQMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAABgUHAQMEAgj/xABFEAABAwICBQYIDAUFAQAAAAABAAIDBBEFIQYSMWGREyJRVHGhBxZBQlKBscEUIzJEcnSCkpSis9EVNGLh8EVjo7LxJP/EABoBAAIDAQEAAAAAAAAAAAAAAAADBAUGAgH/xAAvEQABAwIEBQIEBwAAAAAAAAABAAIDBBEFEiExQVFhgaFx0QYiM7ETFSMyUmKR/9oADAMBAAIRAxEAPwC3sExoVPL2BbyUzoTvIYx1/wA6krJW0C+f/XpP0YE1IQsWRZZXPW18ULdeWRkTfSkcGjiV6ASbBC32RZQEenNI/KKUTG17M7SPLbo9h2ELXLpW7zYwPpEn2WUWeqjgcWSGxHC2qkx0ssguAmOyLKqsZ8I1ayaSNvJRhp5vxdyWkXabkm+XsKn9E9K56kxa7hmdVwDWi5Dczu6U0StIBHFKkidGPmTtZFkvY7pK+CXk2sY4aodc3vnfo7FxR6cu86Fp7Hke4qe2jmc0OaN1CdVRtOUlN1kWS7BpvEflRvb2WcPce5SlLj0EmTZW36Hc099rpb6eVn7mlMbNG7YrusiyyhITViyyhYCEJW0C+f8A16T9GBNEkgaC4kADMkmwCVtAv9Q+vSfowLhx/GjM8tabRtOQ9Ijzj7kiecRNud1FqqltOy53Oyi9PfCfLA4xU0ZY2w/+l7CWkkbGXGqCNl3cPKqvrcSkndyksr5nHznuLuF9g3BWaR5FC1+h9NJctaYXelCdXi35J4K1wn4kgpQGyxW/s3fz79lHpcaY3SVtuoSTTVLo3B7CWuGYIVgaO6UNnAY+zZe53Zv3f4FSt0OqI82FtQ3dzH8DkfUVDF5Y/VcHRPHmvBa7v2q6xCkw7H480LwJBsdj6Eb2+3haOlropNY3A9FYOmGH3a2cDNnNf9AnI+p2fYXLq8Gsvx2p0PDuLXA/9QorR/StsreQqLXI1dZ2xwIsQ79//T36CwGDEhAbnaAT5WgazD92994Kw8cE1I80tQLObt1F+HMJlaA9mdqZdMv5n7Dfa5QanNMv5n7Dfa5Qa3FN9FvosXP9R3qhCEKQkruoMcmh+Q829F2beHk9Vk3YPpPHNZjvi5OgnI9h93tSGhRJ6SOXhY81IiqHx+itZYCgNFcbMrTE83e0XB8rm7M94y7t6nws9LG6Jxa5XUbxI3MEj6PSubT4qWtc4/C5bBg1nG8MAyA2nNQmvL1Sr/DuUxglUYqbFJBmWVj3W6bR05smamqGyMa9hu1wBB3FUeIOs4aJM1CypN3E6JB15eqVf4dyNeXqlX+HcrDQq38Qckr8mh5lV5ry9Uq/w7lpqqcyN1ZKGpkb0PpSR37FYFbiUUIvJI2P6RzPYNpSvifhEY24hj1v6pOaPU0ZnuTGOcTdoQ3Bo7/KTfpuket0JvnDBXQn0TTuezgTrDituhFbN/EqSKUc+OR0d87lhie4A3zy8nRcrZimlU89w+RxHojms4Db61Ctyfyg5r7g6zSQQQNUW6MldCtmewNnOa219SO+9rLTUeDVRbZ7jlP8t/f/AFWJp1jETKzk3u1TybDcjLMu8o2bFGxyhwu0hw6Wm47koYhUPncHyvdI4NDdZxudUXsLnbtK5WMew3Y4g7jYq9pcUjDQx2llVVvw7VMcXtGYdNfG/wB0+ISlT6SzMyeBIN4seIy7lLUuk0LvlExn+oZcR/ZXDKiN4uCs7JBJGbOCl0LzHIHC7SHDpBuO5ek9JUno1Lq1UW8lvFpVhBVPhWIj+IUkLTnyl3buY+w9/BWwFQYiQZRbkriiBEfdIGGRF1HjAGZ+EzHhDAfcoTRnSl1MdR13xE3sNrT5S33j/C36CNv/ABAEAg1sg/4YLpL0p0cdSSkWJicSY3bvRO8d+3soauPMLnZWDCm+u03pmDmuMxtezBbiXWt3lKeK+EGZ9wwiEf7ebvvH3AJVxxxELyDY83MfSaoKnxpwyeNbeMj+xUBlM0C41VxQwQy6zE9kwz1z3EkkknaSbk9pK5yVzQ4jG7Y4Dc7JdATbWWqp4oYx+kB2QhCF4pKEIQhCFrdTtO7sXt7wNpA7TZcc2Lxt2EvO7ZxTI3vabsJCi1MdPILTAH1W+Nj2G7HEH+k2P911s0mnDS27SdgdYXHDI8Et1WJvfl8kdA95Uph+ETubCGwyEyD4uzDz8z8k7Cr2iqpXEteVhcXoqaOz4Ad+O3v5TH4N6R0uJQuzOpryuO4NIuftObxV5hLGgeh4oYSX2dPJYvI2ADYwbhc3PlPqTOFxM/O7RQIm5W6pW0C+f/XpP0YEx1tDHMwxyND2naD7R0HelvQI/wA/9ek/RgTVdJTUh6SeDON1HOynBkncGlnKyWAs9riBawvqgi54hUfiOGS08himifC8ea9tj2jpG8ZL6suuTE8JgqGcnPFHM3okaHW3i+w7wlGIcFMp6oxaEXC+VV6ZIRsJHYbK7sY8CVHJcwSS0x6L8qzg7nfmSlX+BGtZfkpaeYfSdG7gQR+ZLMZVkyriPGyRG4hIPPPrz9q9DFZfS/KP2U9UeDHE2baN7t7Hxu9jrridoPiI+Y1PqiJ9i4ydFKFVyf5UccUl9PuH7LW6tkO17uNvYpiPQPEXbKGo9bNX22UhS+CjE3/NxHvkljHcCT3IDOi8dVc3+Uok3259qFZ2HeAud2c9VFGOiJrpDxdqgd6c8F8EuHU9nOjdUuHlqDrD7gs3iCuxGSoj6yJuxuqZ0a0Mq65wEER1L2Mr+bG3p53nHcLlfRGjWDfBKWCm1+U5NgbrWtc5km2dtqkI2NaA1oDQBYACwA6B0L1dOazKqyepdLpwWVgIugLtRkmYvolRySue+nje4nMkG64vEeg6rFwKEIQjxHoOqxcCjxHoOqxcChCEI8R6DqsXAo8R6DqsXAoQhCPEeg6rFwKPEeg6rFwKEIQjxHoOqxcCjxHoOqxcChCEI8R6DqsXAo8R6DqsXAoQhCPEeg6rFwKPEeg6rFwKEIQvTNCaEEH4LFwKeqSINY1rRYAAABCEIX//2Q==&quot; /&gt;Je vous ai proposé il y a quelques semaines un &lt;a href=&quot;http://luc-jeanniard.blogspot.com/2010/07/sondage.html&quot;&gt;&lt;u&gt;sondage&lt;/u&gt;&lt;/a&gt; pour connaitre vos motivations à me suivre sur ce blog. Vous êtes près de 70 abonnés aux &lt;a href=&quot;http://feeds.feedburner.com/blogspot/fgrG&quot;&gt;&lt;u&gt;flux RSS&lt;/u&gt;&lt;/a&gt; et je n’ai eu que 13 réponses à ce jour. Je ne vous cache pas ma déception!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Voici mes motivations à écrire :&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Partager mes connaissances&lt;/li&gt;    &lt;li&gt;Obtenir du feedback sur ma façon de voir les choses&lt;/li&gt;    &lt;li&gt;Consigner ce que j’apprends&lt;/li&gt;    &lt;li&gt;M’entrainer à écrire, art qui se perd sans pratiquer&lt;/li&gt;    &lt;li&gt;Me faire connaitre un peu&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;u&gt;Vous pouvez m’aider de deux façons :&lt;/u&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;En répondant au sondage qui ne comporte qu’une question à choix multiple &lt;a href=&quot;http://luc-jeanniard.blogspot.com/2010/07/sondage.html&quot;&gt;&lt;u&gt;ICI&lt;/u&gt;&lt;/a&gt; : 30 secondes montre en main.&lt;/li&gt;    &lt;li&gt;En me donnant du feedback car les commentaires des billets sont souvent aussi intéressant que les billets eux-mêmes.&lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/7965460252176128351/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/7965460252176128351' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7965460252176128351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7965460252176128351'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/09/les-vacances-sont-finies.html' title='Les vacances sont finies !'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-8389448315958304900</id><published>2010-07-29T21:30:00.002+02:00</published><updated>2010-07-29T21:38:59.330+02:00</updated><title type='text'>Sondage</title><content type='html'>&lt;iframe src=&quot;http://spreadsheets.google.com/embeddedform?formkey=dDRHZ09LNjNGSjhFZE9YQm14Y3BKQUE6MQ&quot; width=&quot;760&quot; height=&quot;585&quot; frameborder=&quot;0&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot;&gt;Loading...&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/8389448315958304900/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/8389448315958304900' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8389448315958304900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/8389448315958304900'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/07/sondage.html' title='Sondage'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-5222773901526339288</id><published>2010-06-30T23:06:00.001+02:00</published><updated>2010-06-30T23:26:24.879+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><title type='text'>CARA – Grenoble : Rétrospective des Dojos 2009-2010</title><content type='html'>&lt;p align=&quot;left&quot;&gt;Lundi 28 Juin 2010 se tenait la dernière séance des Dojos du CARA pour cette année. Nous l’avons consacré à une rétrospective afin de nous améliorer pour l’année prochaine. J’ai eu le plaisir d’être facilitateur et voici le compte-rendu :&lt;/p&gt;  &lt;p&gt;Nous étions 6 participants présents et plusieurs amis Agilistes nous ont envoyé leurs entrées.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhW2Q5Ea6it-yrQ_WnSQI_rB6NixWFjf4Xwb6BjlWJ17YxWJNSk9axGYemTisk2tyWaInOqKgprWBe9sP_i9Mc-CQBgF2e7r5O_78zjL95jAXbi3MjLSHD6pO3euCXKEHvrCwjRjMTDAMY/s1600-h/Picture%20007%5B5%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 007&quot; border=&quot;0&quot; alt=&quot;Picture 007&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjowkf-hST-oFu7DZjS1Qjn8c11RWXDE5JHnh7TnL5IDkhwXLlIVrJZ-OQJ0nqInBolY9hOi2eDa91Rbqu4E-qazY9L1kg2oWLgwNeu8OpjixmfJRtCJgC_wFvSWxtSSm08Xzf_atG7uP8/?imgmax=800&quot; width=&quot;409&quot; height=&quot;308&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Voici le plan :&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP-BHSol_XzX9OD0bPFMP2ih3ZF6SordSGUseK2Ljg59sp7ZlBlw9t1qw9PpN2Q3U9NRikaRa0plYGHy0r9u9v6oT9-TVWDIqMKMaJopnIJ-CzX988JMqZq9RCegH7NVJ5Z4Vnye1xJuU/s1600-h/Picture%20003%5B17%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 003&quot; border=&quot;0&quot; alt=&quot;Picture 003&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLjBUeb56lt_4ZGgobrSk52W3R0Q5294Z0L-N5tlms1wWE5oTXE6KON-oGdH_VJK6QAdERihpQKgIp2arLr_j8Seujt3jaje_Udn0_AdQwGxMBRJG-QSz8K07U4h_g_JbuoveeesdOWIk/?imgmax=800&quot; width=&quot;368&quot; height=&quot;336&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En guise de check-in pour se mettre dans l’ambiance : Mr Face pour décrire son état d’esprit !&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimzMN598uS32Aj1QpoXg_o6pOxwXfzKSxAKyadDozn0mnWcjNFAHwd148UtdQG-yiHZFQisqQbmxsyg4g7c218zW4q4Myr0aRQFJ-Kj4NfbFkwq_Us4YcWk6C5x6u3y9hBsNuxWoMCyzE/s1600-h/Picture%20003%5B9%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 003&quot; border=&quot;0&quot; alt=&quot;Picture 003&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-ZOBVsx6rjoweIbAfPArjgenX-d3zQPWrzrVckRozvwIoI1hK6ukw707XlaU3fq_f-aHXjW3oKHSE8rZ4pDZN3mHPWxEv9tkBkFwr8mo1qfzmceSAnBwfVLwS1fcLQQQw9IeNE20s5rQ/?imgmax=800&quot; width=&quot;389&quot; height=&quot;212&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Puis nous avons fais une BrainStorming afin de rassembler&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;les points qui ont bien marché et que nous voulons conserver (+) &lt;/li&gt;    &lt;li&gt;les points qui ont moins bien marché et que nous voudrions améliorer (-) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nous avons ensuite regroupé en thèmes tous les points afin d’en choisir deux à améliorer :&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFIde9a5GSEqfueW9xR8CXVGtywgQmZENrANxU99BS5W4TGkbuUo0imCDby_QfPp4WQIB-psN0-ZaIgBz0uzuK61JO5GsEzHbSOl2KmnIO7Ef6mPefRwTu0ztTueLU7FbrPYnbQtHVYJw/s1600-h/Picture%20005%5B30%5D.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px&quot; title=&quot;Picture 005&quot; border=&quot;0&quot; alt=&quot;Picture 005&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikxf4atRlYPgmM2EcvAdy6S27x48oRQmYfc8Wu24hyphenhyphenbvLCJJHeEU1x0T3fK59tYQR6dSES26bG3SmgTW64ukULB-b1LRBqD-D-G-xFoLJOx1UVf6jsomm_GaQxyLlc401Z1JpJsrf7Xno/?imgmax=800&quot; width=&quot;758&quot; height=&quot;868&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjx47hC3lZyX5fkrinMMCKrsd9lsg26Bdx-tkT2yQ1sClsAQxFUf4z1-FqrN3xn2htPrXaXBo7kyvBLaC0SajRWCIUunvywbPvAi1pnXN51oHbSR_Fj1sv2F0fl4eVBBd-N9NgwYa85O0/s1600-h/Picture%20006%5B26%5D.jpg&quot;&gt;&lt;img style=&quot;border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px&quot; title=&quot;Picture 006&quot; border=&quot;0&quot; alt=&quot;Picture 006&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdmUl9sPyRobYYjDaNJz3TQ90uaR4N6Q3Inlr000qQWgTITaYbWLLwL5oFayc69UIgC6Jz17bQSi6SkFhrunqls_RAt27ONpupHS3d8Rc7AncGiIU_6AdyyyG87bcsqCA9kQIWADOd8T8/?imgmax=800&quot; width=&quot;755&quot; height=&quot;763&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1qQXa9X1BEdfbynJAOMr32obWCgCgfo615Pr8jREV5QOzyo2rIrFetKIlB76KUSqaggzE0Jkb-mS7_OTpTiYRqPSZFGUK1XSyixXLHqdHokpjy-7uwu2LjsJu9dWcIqmuy7kkzyDK_qk/s1600-h/Picture%20002%5B4%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 002&quot; border=&quot;0&quot; alt=&quot;Picture 002&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9rqWfOA5wwl40lJEPjsjkEm7L_KvttbNUaoj4rCu4ODZoRfQljywerRdpweY6g03BrvGas5iLewsYyskQQCmOvdCHESn8NVJRlDHQqa1Iy8sUa1V_VOlB8PAdGgU5UqXfh0nawqwtpus/?imgmax=800&quot; width=&quot;419&quot; height=&quot;315&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160; Donc en point positifs, nous pouvons noter :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;la qualité des échanges avec une confiance de haut niveau. &lt;/li&gt;    &lt;li&gt;la variété des sujets abordés &lt;/li&gt;    &lt;li&gt;la qualité des dojos lorsqu’ils sont préparés &lt;/li&gt;    &lt;li&gt;la localisation de la salle &lt;/li&gt;    &lt;li&gt;la permutation des animateurs &lt;/li&gt;    &lt;li&gt;la mise en pratique des principes de programmation /TDD &lt;/li&gt;    &lt;li&gt;le travail sur du code de production &lt;/li&gt;    &lt;li&gt;… (jetez un oeil sur les post-its) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Nous avons voté et les deux sujets choisis pour amélioration sont :&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;&lt;em&gt;La gestion du temps &lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;      &lt;li&gt;&lt;strong&gt;&lt;em&gt;Travailler sur du code réel&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Voici les fruits de nos réflexions sur ces deux thèmes :&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL3H453VSTQhQKrQdLd_5seZQDYLf3OUuzKakvuHc2GNQ04mhbedqQ1eFuNw6lDi1UqIUDGgpTey6Zmx3xEqKpkZ5X4Wwa7Cd1rKkK1NEqnkqDpvA3IMGV92_jQTzo4g3-X3oIAS4w7-8/s1600-h/Picture%20008%5B8%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 008&quot; border=&quot;0&quot; alt=&quot;Picture 008&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG26gjmAdTV9LZsNVI_PPjQhBbJUKgo4gMMT0f0-twwKRsWGow55MPsmE65JsZQByyBtv2Cg4VqciKB-3zblLP04Rn5crBc1S30a0_mvA1-VqIx0OcAPjQ9i2ZPmbPPurIoAK4ZYqUBhU/?imgmax=800&quot; width=&quot;641&quot; height=&quot;772&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Bon, ça nécessite des petites explications :&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Pour gagner un peu de temps lors des séances, nous avons estimé que les rétrospectives de 30 minutes / 2 heures n’étaient pas une bonne utilisation de notre temps. C’est pourquoi nous allons les réduire à 10 minutes en commençant par le ROTI. Nous pourrons expliquer notre choix et en particulier les notes extrêmes. Les Post-its ne seront plus un passage obligatoire! Nous déciderons également lors de ces 10 min si le sujet doit être poursuivi ou non. &lt;/li&gt;    &lt;li&gt;Nous n’avons pas été très fort sur le démarrage des Dojos à 12h. Nous avons régulièrement commencé 15 ou 20 minutes en retard. Plusieurs causes sont à l’origine de cette dérive dont le fait qu’il ne soit pas évident de quitter son lieu de travail avant 12h et que nous avons eu plusieurs soucis d’utilisation du projecteur. Nous avons donc décidé de commencer à l’heure prévue quoi qu’il arrive; cette heure de début fera l’objet d’un sondage (12h, 12h10, 12h15, 12h20 ?). Nous rédigerons également un document de trouble shooting du projecteur. (Je vois deux actions sans propriétaire! … qui s’en occupe?) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Le fait de travailler sur du code réel / legacy code plutôt que sur des sujets très simples fait l’unanimité. Nous aimerions donc travailler sur une même base de code pendant plusieurs séances avec comme fil conducteur le fait de s’améliorer sur la prise en main de legacy code (code non testé). &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nous aurions bien poursuivi sur d’autres thèmes mais la time-box était terminée. Nous avons identifier le besoin de discuter sur le “recrutement” de nouveaux participants. Nous pouvons le faire via le groupe de discution : &lt;a href=&quot;http://groups.google.fr/group/cara-dojo&quot;&gt;http://groups.google.fr/group/cara-dojo&lt;/a&gt; . (entrée perso : les séances planifiées sur jours tournants ne satisfont au final pas grand monde; il serait bien qu’on en discute également.)&lt;/p&gt;  &lt;p&gt;Nous avons conclu par un ROTI pour noter la qualité du temps investi pour l’année des Dojos et pour cette rétrospective: 0 – J’aurais mieux fais de rester chez moi –&amp;gt; 5 – J’ai très bien investi mon temps&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOjOZ7v-7_ZzPizmK3KUmZoqBlkYrNZLN6hIVnFG_DgWO8VWJ3OcoO6oSePKifCHpWL8QWcxFFYOZeXPkFURfstnR7dp7uUBKGXDEG9JBWOx4Fb25sZi_ymf5DRzFXIhdYjQzfiiUZhtg/s1600-h/Picture%20009%5B8%5D.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto&quot; title=&quot;Picture 009&quot; border=&quot;0&quot; alt=&quot;Picture 009&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrsZypdz442rrVHtGa6TSTBbW-o_z0takEgN_PZGANACCWZexEoaKG4afpUrH_vxx5yYzdpbvfEwJbIFMcTzCijzmPQ2U5LMafrQxq9letXcTG4Oi5gypolkjWBXZ9qDybU9nvNxWcqqw/?imgmax=800&quot; width=&quot;331&quot; height=&quot;365&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Merci à tous pour votre participation aux dojos!&lt;/p&gt;  &lt;p&gt;Luc&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/5222773901526339288/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/5222773901526339288' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5222773901526339288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5222773901526339288'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/06/cara-grenoble-retrospective-des-dojos.html' title='CARA – Grenoble : Rétrospective des Dojos 2009-2010'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjowkf-hST-oFu7DZjS1Qjn8c11RWXDE5JHnh7TnL5IDkhwXLlIVrJZ-OQJ0nqInBolY9hOi2eDa91Rbqu4E-qazY9L1kg2oWLgwNeu8OpjixmfJRtCJgC_wFvSWxtSSm08Xzf_atG7uP8/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-466674923953808126</id><published>2010-06-07T08:56:00.001+02:00</published><updated>2010-06-07T08:56:44.507+02:00</updated><title type='text'>Test Scrum sur Scrum.org</title><content type='html'>&lt;p&gt;&lt;img style=&quot;display: inline; margin: 0px 20px 0px 0px&quot; src=&quot;http://www.scrum.org/storage/thumbnails/4824870-4281725-thumbnail.jpg?__SQUARESPACE_CACHEVERSION=1268609606637&quot; align=&quot;left&quot; /&gt;Scrum.org propose un nouveau cadre de formation et certification. La certification Scrum est validée par un test de 50 questions sélectionnées au hasard dans une liste. Il faut obtenir 75%&amp;#160; de bonnes réponses pour obtenir la certification!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;J’ai fais le test, certaines questions ne sont pas évidentes. Voici mon résultat :&lt;/p&gt;  &lt;p&gt;_____________________________&lt;/p&gt;  &lt;p&gt;41 bonnes réponses sur 50, soit 82%&lt;/p&gt;  &lt;p&gt;33 minutes&lt;/p&gt;  &lt;p&gt;_____________________________ &lt;/p&gt;  &lt;p&gt;Faites le test !&amp;#160; &lt;a href=&quot;http://www.scrum.org/scrumopen/&quot;&gt;http://www.scrum.org/scrumopen/&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/466674923953808126/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/466674923953808126' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/466674923953808126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/466674923953808126'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/06/test-scrum-sur-scrumorg.html' title='Test Scrum sur Scrum.org'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2339907693673616464</id><published>2010-03-31T16:17:00.001+02:00</published><updated>2010-03-31T16:44:38.501+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="Communication"/><category scheme="http://www.blogger.com/atom/ns#" term="Développement personnel"/><title type='text'>Une rétrospective pas comme les autres</title><content type='html'>&lt;p&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Lundi 30 mars 2010 se tenait l&#39;étape &lt;a href=&quot;http://xpday.agile-swiss.org/index.php?page=le-programme-2010&quot;&gt;Suisse des XP Days 2010&lt;/a&gt;. La session que j&#39;ai le plus aimé fut &lt;/p&gt;  &lt;p&gt;&amp;quot;Apprenez les techniques de coaching avec le magicien d&#39;Oz&amp;quot; de &lt;i&gt;&lt;a href=&quot;http://www.agilefairytales.com/index.html&quot;&gt;Portia Tung&lt;/a&gt;&lt;/i&gt; et &lt;i&gt;&lt;a href=&quot;http://blog.nayima.be/&quot;&gt;Pascal Van Cauvenberghe&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Cette session avait pour but de nous faire découvrir le Co-Coaching au travers d&#39;un Jeu. En deux mots, le co-coaching permet à deux personnes de s&#39;améliorer mutuellement en travaillant chacune leur tour sur un problème. Le jeu, quant à lui permet d&#39;acquérir des techniques simple de coaching autour du questionnement, de l&#39;observation de l&#39;écoute et du feedback.&amp;#160; &lt;br /&gt;En pratique, il faut trois joueurs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Dorothy (le coaché) &lt;/li&gt;    &lt;li&gt;Le coach &lt;/li&gt;    &lt;li&gt;L&#39;Observateur &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Les trois joueurs réfléchissent à un problème qui leur tient à cœur personnellement&lt;/p&gt;  &lt;p&gt;Puis trois cycles vont se succéder afin que chaque joueur puisse s&#39;entraîner dans chaque rôle.&lt;/p&gt;  &lt;p&gt;Le coach va tout d&#39;abord questionner Dorothy avec des questions ouvertes (pas de réponse par oui ou par non), des questions de contrôle pour caractériser le problème puis avec des questions de vérification pour être certain que le coach et le coaché se comprennent bien. Puis, le coach va demander à Dorothy de se mettre dans la peau d&#39;un personnage et de décrire ce qu&#39;il ferait. Ceci permet de changer d&#39;état d&#39;esprit sur son problème et d&#39;imaginer des solutions non intuitives.&lt;/p&gt;  &lt;p&gt;&lt;img height=&quot;164&quot; src=&quot;http://docs.google.com/File?id=d2kh2gr_153dxjbf9vn_b&quot; width=&quot;532&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Par exemple : Arthur, si tu es Lion, c&#39;est à dire courageux et courtois, que ferais-tu pour solutionner ton problème &lt;/p&gt;  &lt;p&gt;Arthur, si tu es Singe Volant, c&#39;est à dire pratique et prêt à aider, que ferais-tu? &lt;/p&gt;  &lt;p&gt;De cette façon, Arthur, le coaché va trouver des solutions à ses problème.&lt;/p&gt;  &lt;p&gt;Enfin, l&#39;observateur commente ce qu&#39;il a vu et entendu pour que tout le monde puisse progresser!&lt;/p&gt;  &lt;p&gt;Seule Portia Tung peut expliquer le jeu dans les règles de l&#39;art alors je vous invite à assister à l&#39;une de ses présentations avec Pascal Van Cauvenberghe!&lt;/p&gt;  &lt;p&gt;Le jeu peut être téléchargé sur &lt;a href=&quot;http://www.agilefairytales.com/games.html#YBR&quot;&gt;Agile Fairy Tales&lt;/a&gt; : &lt;a href=&quot;http://www.agilefairytales.com/dist/The-Yellow-Brick-Road-2-0.zip&quot;&gt;http://www.agilefairytales.com/dist/The-Yellow-Brick-Road-2-0.zip&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Jai profité de ce que j&#39;ai appris lors de cette session pour voir comment je pouvais l&#39;appliquer en interne dans mon entreprise et je me suis dis pourquoi pas la rétrospective de sprint! Ca tombait bien, il y avait 3 participants. D&#39;où la rétrospective pas comme les autres ...&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Le plan&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;10h30&amp;#160; - 10h45 :&amp;#160; Introduction / Check-in&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Présentation du plan &lt;/li&gt;    &lt;li&gt;Si vous aviez été un animal, qu&#39;auriez vous été? &lt;/li&gt; &lt;/ul&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Voici les réponses des 3 participants ! Nous avons bien rigolé !   &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;&lt;i&gt;Un hibou &lt;/i&gt;car je n&#39;ai pas beaucoup été présent (Vacance, support chez un client, 5 jours avec l&#39;équipe en 2 fois) &lt;/li&gt;      &lt;li&gt;&lt;i&gt;Un singe car j&#39;ai changer plusieurs fois d&#39;activité (Développement de User Story, Support, Enquête sur problème de build)&lt;/i&gt; &lt;/li&gt;      &lt;li&gt;&lt;i&gt;Un âne car nous avons échoué plusieurs User Stories alors que nous avions largement le temps de finir. &lt;/i&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;10h30&amp;#160; - 11h40 :&amp;#160; Le jeu de &amp;quot;La Route de Brique Jaune&amp;quot; expliqué brièvement ci-dessus&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous avons pris 10 minutes pour expliquer le jeu et pour que chaque participant identifie le problème sur lequel il voulait travailler&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Voici les problèmes choisis&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;Je crains que nous ayons d&#39;autres problèmes tels que celui que j&#39;ai du investiguer ce sprint &lt;/li&gt;      &lt;li&gt;On a cru que toutes les User Stories étaient finies mais à la fin du sprint il y avait plusieurs grains de sables qui ont fait que seule la moitié des User Stories ont pu être montré. &lt;/li&gt;      &lt;li&gt;Des tests automatisés se sont mis à échouer sans que l&#39;on comprenne pourquoi &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous avons effectué 3 tours de jeu de 10 minutes et chacun a pris son rôle très au sérieux. De vraies idées d&#39;actions ont été trouvées par les coachés!   &lt;p&gt;11h40&amp;#160; - 11h55 :&amp;#160; Débriefing et choix des actions&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Nous avons ensemble fait le tour des actions potentielles et finalement l’équipe les a toutes adopté!&lt;/p&gt;  &lt;p&gt;11h55&amp;#160; - 12h00 :&amp;#160; ROTI / Conclusion&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; En fin de rétrospective, il est bien d&#39;obtenir un feedback sur la qualité du temps investi. Tous les participants ont voté pour la note maximale (0-J&#39;aurais mieux fais de rester chez moi --&amp;gt; 5-J&#39;ai vraiment bien fait de venir)&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;5 + &lt;/li&gt;      &lt;li&gt;5 ++&amp;#160;&amp;#160;&amp;#160; Nous avons identifié des solutions à nos problèmes qui ne seraient pas sorties dans une rétrospective plus classique. &lt;/li&gt;      &lt;li&gt;5+ &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt; &lt;b&gt;   &lt;br /&gt;&lt;/b&gt;  &lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Merci à &lt;a href=&quot;http://www.agilefairytales.com/index.html&quot;&gt;&lt;b&gt;Portia&lt;/b&gt;&lt;/a&gt;&lt;a href=&quot;http://www.agilefairytales.com/index.html&quot;&gt; &lt;/a&gt;&lt;a href=&quot;http://www.agilefairytales.com/index.html&quot;&gt;&lt;b&gt;Tung&lt;/b&gt;&lt;/a&gt;&lt;b&gt; et &lt;/b&gt;&lt;a href=&quot;http://blog.nayima.be/&quot;&gt;&lt;b&gt;Pascal Van &lt;/b&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.nayima.be/&quot;&gt;&lt;b&gt;Cauvenberghe&lt;/b&gt;&lt;/a&gt;&lt;b&gt; &lt;/b&gt;de m&#39;avoir fait découvrir le Co-Coaching à travers le jeu de &amp;quot;la route de la brique jaune&amp;quot;&lt;/p&gt;  &lt;p&gt;Merci à l&#39;Equipe d&#39;avoir joué le jeu !    &lt;br /&gt;Le co-coaching est très facile à mettre en place et un outil très efficace pour progresser.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2339907693673616464/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2339907693673616464' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2339907693673616464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2339907693673616464'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/03/une-retrospective-pas-comme-les-autres.html' title='Une rétrospective pas comme les autres'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-7423165438005312840</id><published>2010-02-24T10:57:00.001+01:00</published><updated>2010-02-24T11:52:40.417+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>Que contient la vélocité?</title><content type='html'>&lt;p&gt;&lt;b&gt;Qu&#39;est ce que la vélocité&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;La vélocité est un indicateur de Scrum permettant d&#39;obtenir de la visibilité. Elle mesure l&#39;effort en points qu&#39;une équipe peut réaliser sprint après sprint. Donc à partir d&#39;un Product Backlog où les fonctionnalités sont estimées en points, on peut obtenir une idée du contenu du produit à une date donnée. L&#39;équipe se sert également de sa vélocité pour savoir à quelle quantité de travail elle peut s&#39;engager.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Doit-elle contenir les points provenant des défauts et besoins techniques?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Pour moi, la vélocité contient seulement les points des &amp;quot;user stories&amp;quot;; les défauts et besoins techniques n&#39;en font pas partie. Plusieurs fois, j&#39;ai rencontré des équipes qui souhaitaient intégrer à la vélocité les points des défauts et besoins techniques pour avoir plus de précision sur le nombre de points qu’elle est capable de réaliser tout type d’éléments de backlog confondus. Pourquoi pas mais il faut être très vigilant car la vélocité doit représenter la capacité d&#39;une équipe à ajouter de la valeur à un produit or si aucune distinction n&#39;est faite quant à la provenance des points, une équipe peut avoir une vélocité presque constante et ne pas ajouter de valeur au produit.&amp;#160; &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Ma façon de penser vient d&#39;être renforcée par le Tweet d&#39;&lt;a href=&quot;http://testobsessed.com/&quot;&gt;&lt;u&gt;Elisabeth Hendrickson&lt;/u&gt;&lt;/a&gt; alias @testobsessed: &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;lt;&amp;lt; Thinking: Giving bug fixes velocity pts artificially inflates the number and creates a dangerous illusion of progress. &amp;gt;&amp;gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Je vous suggère de lire les billets suivants qui traitent de la même problématique:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://www.agilex.fr/2009/05/la-velocite-des-bugs/&quot;&gt;&lt;u&gt;La vélocité des bugs&lt;/u&gt;&lt;/a&gt;&amp;#160;&amp;#160; d&#39;Alexandre Boutin &lt;/li&gt;    &lt;li&gt;&lt;a href=&quot;http://www.aubryconseil.com/post/Le-graphique-de-v&amp;eacute;locit&amp;eacute;&quot;&gt;&lt;u&gt;Le graphique de vélocité&lt;/u&gt;&lt;/a&gt;&amp;#160; de Claude Aubry &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Ma Conclusion&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Intégrer l&#39;effort des défauts et besoins techniques à la vélocité oui mais en gardant l&#39;information de la provenance des points avec un graphique tel que celui-ci :&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/_bU50U2LL0AI/S4T39511zgI/AAAAAAAADL4/Jzc2L4pccO4/s1600-h/image%5B10%5D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px&quot; height=&quot;297&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/_bU50U2LL0AI/S4T3-dJwayI/AAAAAAAADL8/sC4gRmSCtXY/image_thumb%5B6%5D.png?imgmax=800&quot; width=&quot;495&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ou encore pour y voir plus clair sans lunette ;o), tiré de &lt;a href=&quot;http://clubagile.org/wp-content/uploads/2009/11/AT2009-PourPasserLaCrise.pdf&quot;&gt;&lt;u&gt;« Pour passer la crise, rembourser votre dette technique »&lt;/u&gt;&lt;/a&gt; - Freddy Mallet / Rémy Sanlaville - cf. p55&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/_bU50U2LL0AI/S4UE9JSqrzI/AAAAAAAADMA/8MM_Is2T760/s1600-h/image%5B6%5D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px&quot; height=&quot;375&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/_bU50U2LL0AI/S4UE97DrlwI/AAAAAAAADME/DDbOusq4LtQ/image_thumb%5B4%5D.png?imgmax=800&quot; width=&quot;495&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/7423165438005312840/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/7423165438005312840' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7423165438005312840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7423165438005312840'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/02/que-contient-la-velocite.html' title='Que contient la vélocité?'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_bU50U2LL0AI/S4T3-dJwayI/AAAAAAAADL8/sC4gRmSCtXY/s72-c/image_thumb%5B6%5D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-5592457312807811971</id><published>2010-02-05T07:31:00.001+01:00</published><updated>2010-02-05T10:32:56.101+01:00</updated><title type='text'>Coup de gueule contre mon assurance</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJ_VwPo0yUr9epuBFX_-ZlG4DEp2T_Z5pYHuNKYObVjIPTH5dTb4B_M6HLJL1EOeBrdP8iETLFfJnsLRiQrXs13PdAGrGUMONkOYk_U7bBzMVjnFCfco8fSokkjDscOuUvBE0e5Dib51L/s1600-h/images.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 143px; height: 107px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJ_VwPo0yUr9epuBFX_-ZlG4DEp2T_Z5pYHuNKYObVjIPTH5dTb4B_M6HLJL1EOeBrdP8iETLFfJnsLRiQrXs13PdAGrGUMONkOYk_U7bBzMVjnFCfco8fSokkjDscOuUvBE0e5Dib51L/s200/images.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5434689419678284178&quot; /&gt;&lt;/a&gt;&lt;p&gt;Rien à voir avec l’Agilité ni même la productivité.&lt;/p&gt; &lt;p&gt;En discutant avec mon assureur de mon contrat d’assurance habitation, j’ai  découvert que le consommateur que je suis se fait une fois de plus avoir. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;En effet, voici un exemple qui explique mon mécontentement:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Mr Dupont est propriétaire d’un T5 et paye un contrat d’assurance immobilier  (pour les murs)  de 200 euros  &lt;/li&gt;&lt;li&gt;Mr Durand, locataire de Mr Dupont souscrit un contrat d’assurance habitation  pour son mobilier (le contenu de l’appartement) à 200 euros. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;--&gt; L’assureur empoche 400 euros pour assurer l’immobilier + le  mobilier.&lt;/p&gt; &lt;p&gt;Maintenant considérons que Mr Dupont habite le bien en question et demande à  son assureur d’assurer son appartement pour l’immobilier + le mobilier. Son  contrat s’élève alors à 200 euros.&lt;/p&gt; &lt;p&gt;--&gt; L’assureur empoche seulement 200 euros pour assurer l’immobilier + le  mobilier.&lt;/p&gt; &lt;p&gt;Cherchez l’erreur! Je n’ai pas hésité à challenger mon assureur pour obtenir  des explications et il a fini par me dire qu’en générale, propriétaire et  locataire ne se parlent pas à propos des montants des contrats d’assurance et  que le système profitait de cela.&lt;/p&gt; &lt;p&gt;Avez-vous déjà remarqué cela avec votre assureur?&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/5592457312807811971/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/5592457312807811971' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5592457312807811971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5592457312807811971'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/02/coup-de-gueule-contre-mon-assurance.html' title='Coup de gueule contre mon assurance'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJ_VwPo0yUr9epuBFX_-ZlG4DEp2T_Z5pYHuNKYObVjIPTH5dTb4B_M6HLJL1EOeBrdP8iETLFfJnsLRiQrXs13PdAGrGUMONkOYk_U7bBzMVjnFCfco8fSokkjDscOuUvBE0e5Dib51L/s72-c/images.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2614728198128260494</id><published>2010-01-19T17:15:00.001+01:00</published><updated>2010-01-19T17:15:30.145+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="Communication"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>Le Café des Scrum Masters</title><content type='html'>&lt;p&gt;Il y a quelques temps, je trouvais que les échanges entre les Scrum Masters de notre entreprise étaient trop limités. Ceci était selon moi dommage car nous étions relativement livrés à nous même. Les succès n’étaient pas partagés et les difficultés non échangées… Pas terrible, non?&lt;/p&gt;  &lt;p&gt;J’ai alors eu envi de créer un espace d’échange informel avec tous les Scrum Masters de tous les projets soit 5 personnes. Je me suis dis qu’autour d’un café, ceci permettrait une discussion plus décontractée. &lt;/p&gt;  &lt;p&gt;Voici ci dessous l’e-mail que j’ai envoyé à mes collègues pour que cet espace puisse devenir réalité : &lt;/p&gt;  &lt;p&gt;&lt;em&gt;____________________________________________&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style=&quot;display: inline; margin: 0px 20px 5px 0px&quot; src=&quot;http://t3.gstatic.com/images?q=tbn:vc0fdXmlfcCn3M%3Ahttp://api.ning.com/files/5E34YnFH7PNWtWD1Jg7nZNVwXoKjJv*IRO-U3bwFWcdQCFMvxO1UPPSYwULZV8nFL1IeeMMsLBqeZCVJmyjuHzTh8lSu4uvs/cafe.jpg&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Chers collègues Scrum Masters,      &lt;br /&gt;J&#39;aimerais organiser un espace d&#39;échange entre les Scrum Masters de notre site. Un tel espace nous permettrait de partager&amp;#160; nos expériences, de trouver des réponses à nos questions, de synchroniser nos actions et d&#39;avoir une vue globale de nos projets et besoins. Aujourd&#39;hui, le lien entre les équipes est assez faible bien qu&#39;amélioré grâce aux &lt;a href=&quot;http://blog.developpez.com/bruno-orsier/p8008/developpement-agile/scrum-et-les-journees-labo/&quot;&gt;journées labo&lt;/a&gt;; alors le challenge, c&#39;est d&#39;améliorer ces liens entre les Scrum Masters et de progresser ensemble sur notre rôle qui est vital pour le succès de l&#39;application de Scrum.       &lt;br /&gt;Je vous propose un café pris ensemble une fois par semaine sur un créneau d’une heure, le Vendredi par exemple. Si un autre format vous semblerait meilleur, n&#39;hésitez pas à proposer!       &lt;br /&gt;Alors, partant? Sinon, qu’est ce qui vous bloque? Et quelles seraient vos propositions pour répondre à ce challenge?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;____________________________________________&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Les réponses ont toutes été favorables alors très vite notre première rencontre a été planifiée. Voici les sujets que nous avons abordé pendant les quatre premières rencontres:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Comment partager les bonnes pratiques issues des rétrospectives? &lt;/li&gt;    &lt;li&gt;Comment être facilitateur d’une rétrospective alors que l’on est développeur dans la même équipe? &lt;/li&gt;    &lt;li&gt;Discussion subjective sur la qualité de nos produits. &lt;/li&gt;    &lt;li&gt;Discussion sur le découpage des “user stories” et évaluation en heure &lt;/li&gt;    &lt;li&gt;Débat sur l’utilité d’une méta-rétrospective pour les Scrum Masters d’un même projet. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Des vraies actions sont issues de ces discussions; on peut donc dire que le ROTI (Return On Time Invested) est bon. &lt;/li&gt;    &lt;li&gt;La durée retenue est de 1/2 heure; ceci permet de se focaliser sur un seul sujet. &lt;/li&gt;    &lt;li&gt;Le coté informel est confortable; il n’y a pas d’obligation de résultat. &lt;/li&gt;    &lt;li&gt;C’est un excellent exercice de construction d’équipe (Team Building). &lt;/li&gt; &lt;/ol&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2614728198128260494/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2614728198128260494' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2614728198128260494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2614728198128260494'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/01/le-cafe-des-scrum-masters.html' title='Le Café des Scrum Masters'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-1491625590439276140</id><published>2010-01-10T09:47:00.001+01:00</published><updated>2010-01-10T09:51:59.431+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Développement personnel"/><category scheme="http://www.blogger.com/atom/ns#" term="Efficacité"/><category scheme="http://www.blogger.com/atom/ns#" term="Gestion du temps"/><category scheme="http://www.blogger.com/atom/ns#" term="GTD"/><title type='text'>GTD présenté par David Allen en personne</title><content type='html'>&lt;p&gt;En cette journée froide et neigeuse, je vous propose une vidéo de David Allen enregistrée chez Google:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div class=&quot;wlWriterEditableSmartContent&quot; id=&quot;scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:3aa6df2b-92dc-4abe-ae30-f1d42fb6730c&quot; style=&quot;padding-right: 0px; display: block; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px auto; width: 425px; padding-top: 0px&quot;&gt;&lt;div id=&quot;9d4ce32f-101a-4b69-a30b-8c6c9b437b44&quot; style=&quot;margin: 0px; padding: 0px; display: inline;&quot;&gt;&lt;div&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=Qo7vUdKTlhk&quot; target=&quot;_new&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz7_p-ncPrZQpJl75U7Q59FdCK8wUavLTfEaD0gahrr-4XjrZwOssWyev2AlbQmuc5J8_4ytYzMBBbKRM4yTuIs9zRPZye-Z8y7zVw5VayobzjstXH6JzqFXbo5CqzaEZ_s-HFdWhTGpc/?imgmax=800&quot; style=&quot;border-style: none&quot; galleryimg=&quot;no&quot; onload=&quot;var downlevelDiv = document.getElementById(&#39;9d4ce32f-101a-4b69-a30b-8c6c9b437b44&#39;); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/Qo7vUdKTlhk&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/Qo7vUdKTlhk&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/1491625590439276140/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/1491625590439276140' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/1491625590439276140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/1491625590439276140'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/01/gtd-presente-par-david-allen-en.html' title='GTD présenté par David Allen en personne'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-2152954176010399918</id><published>2010-01-06T12:59:00.001+01:00</published><updated>2010-01-06T12:59:03.424+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><title type='text'>Résultat enquête de satisfaction Agile Tour 2009</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioyzQhTuROsuc-VIbHTFr66HYrTcmbZh0iGmzXd6HEFmaESUU2QluAbse1sF3ke1uOvu9P6i_6pejWaslqcOX8GDkBjLcoltSkjMuytRKkRos6n4prBRKnJCEpUncrVf71KerjSyDxyxY/s1600-h/image%5B14%5D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 20px 0px 0px; border-right-width: 0px&quot; height=&quot;60&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemwYHD_X1mnzEHJqaITaWy3KW_433EgY6OFZ_PQCep113uSK9vi1EkQd6OP-UhEbsQkbORF27PrFtYS0Fr4Vl4uRvTJp_yv3nq3IJSTMXVBwfo6VKn_VdQgrq8lvqZhUwFxz62jHygSU/?imgmax=800&quot; width=&quot;83&quot; align=&quot;left&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://my.opera.com/jfjago/blog/&quot;&gt;&lt;u&gt;Jean-François&lt;/u&gt;&lt;/a&gt; vient de publier le résultat de &lt;a href=&quot;http://clubagile.org/evenements/conferences-2009/&quot;&gt;&lt;u&gt;l’enquête de satisfaction de l’Agile Tour 2009 à Grenoble.&lt;/u&gt;&lt;/a&gt; Merci à toi Jean-François et à toutes les personnes qui se sont dévouées pour extraire les informations de l’enquête!&lt;/p&gt;  &lt;p&gt;Lors de cet événement, j’ai co-animé avec &lt;a href=&quot;http://pyxis-tech.com/blog/author/emignot/&quot;&gt;&lt;u&gt;Eric Mignot&lt;/u&gt;&lt;/a&gt; la session &lt;strong&gt;&lt;em&gt;&lt;a href=&quot;http://clubagile.org/wp-content/uploads/2009/09/La_gestion_des_defauts_et_besoins_non_fonction-1.pdf&quot;&gt;&lt;u&gt;« La gestion des défauts et besoin non fonctionnels avec Scrum »&lt;/u&gt;&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;. C’était une première pour moi et je dois dire que j’ai dû canaliser une certaine appréhension! A la fin de notre session, j’étais satisfait et n’avais pas de regret alors mon challenge personnel était réussi.&lt;/p&gt;  &lt;p&gt;Je n’ai pas eu beaucoup de feedback après la session alors la question que je me posais - “notre session a t-elle plu au public” - était restée sans véritable réponse. L’enquête révèle à mon agréable surprise que notre session arrive 5 ème / 17 au classement des sessions préférées! Donc je suis content et un peu fière quant même!&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLH987y7kAuCJ9Gq2T2ms3j3o2y494Cr4Ad9YmL8z-uRZH6cUIit37xgKzx-cfSxDrY1cKvBjtdOh-y35yeMBM9nRdGivvT5134XScxEmXvdwffP4dUJkCOpGiUxgCdF1joSxzcIK_3co/s1600-h/image%5B10%5D.png&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px&quot; height=&quot;410&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMHnB3a93ZruCG4PlKvfHA7Skw-b9Qerb1bAQkG3GEv48mttKrgmjmrh9OKddpqEMBmAFC1_MdREGJHh5N97viLJyMywz8MVmWr_MxQGDGZkq1RCcjFt-xV2Jy-hJuimHx9Qla-Fmu9DY/?imgmax=800&quot; width=&quot;542&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Bravo à Rémy Sanlaville et Freddy Mallet qui décrochent le pompon derrière nos invités de renommée internationale pour leur session « Pour passer la crise, rembourser votre dette technique ». Je dois dire que cette session m’a également beaucoup plu.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/2152954176010399918/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/2152954176010399918' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2152954176010399918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/2152954176010399918'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/01/resultat-enquete-de-satisfaction-agile.html' title='Résultat enquête de satisfaction Agile Tour 2009'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemwYHD_X1mnzEHJqaITaWy3KW_433EgY6OFZ_PQCep113uSK9vi1EkQd6OP-UhEbsQkbORF27PrFtYS0Fr4Vl4uRvTJp_yv3nq3IJSTMXVBwfo6VKn_VdQgrq8lvqZhUwFxz62jHygSU/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-7818133355625514104</id><published>2010-01-03T15:14:00.001+01:00</published><updated>2010-01-03T15:40:21.505+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="Développement personnel"/><category scheme="http://www.blogger.com/atom/ns#" term="Efficacité"/><title type='text'>La liste des blogs que je suis</title><content type='html'>&lt;p&gt;&lt;img style=&quot;display: inline; margin: 0px 20px 0px 0px&quot; height=&quot;89&quot; src=&quot;http://www.noname.fr/veille/images/icone-rss.jpg&quot; width=&quot;89&quot; align=&quot;left&quot; /&gt;Voilà environ 3 ans que j’utilise Google Reader pour suivre tous les blogs que j’ai sélectionné au fil du temps. Cet outil me fait gagner un temps précieux en m’apportant l’information plutôt qu’en allant la chercher sur chaque blog de façon individuelle. Google Reader fait partie de la &lt;a href=&quot;http://luc-jeanniard.blogspot.com/2009/05/10-outils-pour-booster-son-efficacite.html&quot;&gt;&lt;u&gt;liste de mes outils qui ne me séparent jamais&lt;/u&gt;&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Pour cette nouvelle année, j’ai décidé de vous offrir cette liste! Elle est composée de plus de 60 blogs quasiment tous dédiés à l’Agilité + un petit nombre au développement personnel. Certains sont en français et d’autres en anglais. Je pense que les acteurs les plus connus du domaine ont leur blog dans ma liste. Si vous en connaissez d’autres, faites-nous en profiter!&lt;/p&gt;  &lt;p&gt;La liste est au format &lt;a href=&quot;http://fr.wikipedia.org/wiki/Outline_Processor_Markup_Language&quot;&gt;&lt;u&gt;OPML&lt;/u&gt;&lt;/a&gt; et peut être importée par les agrégateurs de flux tels que Google Reader.&lt;/p&gt;  &lt;p&gt;Pour télécharger ma liste cliquez &lt;a href=&quot;http://www.box.net/shared/yq9oppyknj&quot;&gt;&lt;u&gt;ici&lt;/u&gt;&lt;/a&gt; !&lt;/p&gt;  &lt;p&gt;Bonne lecture.&lt;/p&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/7818133355625514104/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/7818133355625514104' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7818133355625514104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/7818133355625514104'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2010/01/la-liste-des-blogs-que-je-suis.html' title='La liste des blogs que je suis'/><author><name>Luc</name><uri>http://www.blogger.com/profile/05547869273484286745</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtZguEpHX4H6932Z5YY86up3cR-Emc7Eiw069Lw0YLhMiZxhF6yxMemMCZZi4Uhk4-FS-vunK7pyDFvNhbvg2vFgeW5i7a1l07mgWyD4q7LRBLCpYMblS56fyGZvnT7w/s220/portrait.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-3821497768182635292</id><published>2009-12-30T13:20:00.001+01:00</published><updated>2009-12-31T09:33:17.912+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Développement personnel"/><category scheme="http://www.blogger.com/atom/ns#" term="Efficacité"/><category scheme="http://www.blogger.com/atom/ns#" term="Gestion du temps"/><title type='text'>La puissance du “Time Boxing”</title><content type='html'>&lt;p&gt;&lt;img style=&quot;display: inline; margin-left: 0px; margin-right: 0px&quot; src=&quot;http://t2.gstatic.com/images?q=tbn:F6q2dw6OrEECEM:http://litemind.com/wp-content/uploads/2008/01/time-boxing.jpg&quot; align=&quot;left&quot; /&gt;&lt;/p&gt;  &lt;p&gt;Limiter une activité dans le temps peut paraître frustrant. En effet, si je suis entrain de faire quelque chose et qu’un foutu timer sonne … le premier reflexe sera de le faire taire et de continuer sans se préoccuper du temps qui passe. Agir ainsi est se priver de la puissance d’un tel outil! &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;Contraindre une activité en temps à y consacrer permet de devenir plus efficace&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ce qui aura le plus de valeur est abordé en premier &lt;/li&gt;    &lt;li&gt;La concentration est améliorée car nous voulons un résultat dans le temps fixé &lt;/li&gt;    &lt;li&gt;La motivation est améliorée car toutes les boîtes de temps sont des défis à gagner &lt;/li&gt;    &lt;li&gt;Le perfectionnisme avec le bien connu adage “Le mieux est l’ennemi du bien” est limité &lt;/li&gt;    &lt;li&gt;Les travaux exploratoires, qui par définition peuvent ne pas aboutir rapidement, sont maîtrisés &lt;/li&gt;    &lt;li&gt;Les tâches rébarbatives deviennent plus agréables car limitées dans le temps &lt;/li&gt;    &lt;li&gt;Les gros travaux peuvent être découpés en objectifs atteignables dans des temps limités; ceci évite la procrastination –&amp;gt; Fort lien avec le GTD &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;&lt;font size=&quot;3&quot;&gt;Comment utiliser le time-boxing&lt;/font&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Convenir d’un temps pertinent, seul ou en équipe pour les réunions, en fonction de l’importance de la tâche à accomplir &lt;/li&gt;    &lt;li&gt;Activer un timer visible à tout moment de tous &lt;/li&gt;    &lt;li&gt;Lorsque le temps imparti est terminé, décider activement si un temps supplémentaire doit être accordé. Il convient de juger si cela en vaut la peine et si le focus doit être redressé pour privilégier ce qui a le plus de valeur &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;Quand utiliser le time-boxing&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Pour la gestion des e-mails. Ex : 15 minutes en arrivant le matin &lt;/li&gt;    &lt;li&gt;Pour la lecture d’articles &lt;/li&gt;    &lt;li&gt;Pour les recherches exploratoires ou plusieurs voies sont ouvertes &lt;/li&gt;    &lt;li&gt;Pour l’essai d’un outil &lt;/li&gt;    &lt;li&gt;Pour les réunions. Souvent, on peut arriver à un résultat pertinent rapidement en se focalisant sur l’objectif à atteindre &lt;/li&gt;    &lt;li&gt;Pour le ‘Social networking’. Ex : 10 minutes par jour &lt;/li&gt;    &lt;li&gt;Pour l’écriture de billet sur un blog. Cette fois-ci, je me suis donné 45 minutes! &lt;/li&gt;    &lt;li&gt;Pour le Daily Scrum meeting.&amp;#160; :o) &lt;/li&gt; &lt;/ul&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/3821497768182635292/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/3821497768182635292' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/3821497768182635292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/3821497768182635292'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2009/12/la-puissance-du-time-boxing.html' title='La puissance du “Time Boxing”'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-5384674279559647829</id><published>2009-12-30T09:43:00.001+01:00</published><updated>2010-01-10T09:51:59.432+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Développement personnel"/><category scheme="http://www.blogger.com/atom/ns#" term="Efficacité"/><category scheme="http://www.blogger.com/atom/ns#" term="Gestion du temps"/><category scheme="http://www.blogger.com/atom/ns#" term="GTD"/><title type='text'>Caddie / Coach GTD - Getting Things Done – (V2)</title><content type='html'>&lt;h5&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgux_WsBC9DExEnaZ_mfCav-xIIqY1wLQhIx0AKdh3p3d1WJs9iqpOU_RcxVjdg1igypkL4VLIGZf1-RfFlI7zNGqkPxF9ftUl-7ZN24RnlUEf9VFmpOUg2q3ch-UTJnrMbmAI5XMdwOBXc/s1600-h/main_caddie_bib_base_photo.jpg&quot;&gt;&lt;img style=&quot;display: inline; margin-left: 0px; margin-right: 0px&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgux_WsBC9DExEnaZ_mfCav-xIIqY1wLQhIx0AKdh3p3d1WJs9iqpOU_RcxVjdg1igypkL4VLIGZf1-RfFlI7zNGqkPxF9ftUl-7ZN24RnlUEf9VFmpOUg2q3ch-UTJnrMbmAI5XMdwOBXc/s200/main_caddie_bib_base_photo.jpg&quot; align=&quot;left&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/h5&gt;  &lt;p&gt;Il y a un an environ, j&#39;ai adopté la méthode d&#39;organisation GTD - Getting Things Done - de David Allen. Un mois plus tard, j&#39;avais fais le point &lt;a href=&quot;http://luc-jeanniard.blogspot.com/2009/01/getting-things-done-gtd-retour.html&quot;&gt;&lt;u&gt;ici même&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Depuis, notre entreprise a développé une initiative permettant de s&#39;améliorer, d&#39;apprendre et développer ses compétences: le &lt;a href=&quot;http://blog.developpez.com/bruno-orsier/p8092/developpement-agile/mise-en-place-du-caddying/#more8092&quot;&gt;&lt;u&gt;CADDYING&lt;/u&gt;&lt;/a&gt;. Plusieurs volontaires se sont proposés pour travailler sur des sujets techniques tels que le Lean Software Development, les tests &amp;quot;Agiles&amp;quot;, la programmation fonctionnelle, etc. Alors je me suis dis pourquoi pas un peu de développement personnel! Le GTD m&#39;a tellement apporté que je trouvais dommage de ne pas en faire profiter mes collègues! Je me suis proposé comme Caddy et rapidement 4 joueurs ont voulu tenter l&#39;expérience.&lt;/p&gt;  &lt;p&gt;Le principe que j&#39;ai retenu est basé sur 4 étapes principales:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Une prise de contact avec auto-évaluation sur 10 points que la méthode permet d&#39;améliorer : 10&#39;&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Respecter ses rendez-vous&lt;/li&gt;      &lt;li&gt;Trouver un document en moins de 2 minutes&lt;/li&gt;      &lt;li&gt;Ranger un document en moins de 2 minutes&lt;/li&gt;      &lt;li&gt;Faire tout ce qui doit être fait en temps et en heure&lt;/li&gt;      &lt;li&gt;Avoir l&#39;esprit libéré pour se concentrer sur sa tâche en cours&lt;/li&gt;      &lt;li&gt;Ne pas réapprendre les choses&lt;/li&gt;      &lt;li&gt;Ne pas oublier ses idées et projets&lt;/li&gt;      &lt;li&gt;Avoir une vue claire sur ses projets à cours terme&lt;/li&gt;      &lt;li&gt;Avoir une vue claire sur ses projets à moyen terme&lt;/li&gt;      &lt;li&gt;Avoir une vue claire sur ses projets à long terme&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;Voici mon évaluation sur ces 10 points:&lt;/p&gt;  &lt;p&gt;&lt;img height=&quot;561&quot; src=&quot;http://docs.google.com/File?id=d2kh2gr_140fn5wqpc6_b&quot; width=&quot;718&quot; /&gt;&lt;/p&gt;  &lt;ul&gt;&lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;Une explication des principes GTD à l&#39;aide d&#39;un logigramme : 15&#39;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img src=&quot;http://docs.google.com/File?id=d2kh2gr_139hk5xc9c7_b&quot; /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mise en pratique immédiate en rassemblant tout ce qui n&#39;est pas à sa place et création des listes : 3h&lt;/li&gt; &lt;/ul&gt;  &lt;ul&gt;   &lt;li&gt;Suivi régulier de 15&#39; à 30&#39; chaque semaine pour affiner la pratique de GTD&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Le fait d&#39;être Caddie sur ce sujet m&#39;a permis de me perfectionner et de tirer encore plus partie de la méthode. En particulier, j&#39;ai progressé sur la mise en forme de mes projets en formulant mieux mes objectifs et en identifiant les premières étapes atteignables pour que ceux-ci avancent - parfois lentement - mais sûrement!&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://blog.developpez.com/bruno-orsier/&quot;&gt;&lt;u&gt;Bruno&lt;/u&gt;&lt;/a&gt; a remarqué que je n&#39;utilise plus mon agenda Filofax pour la gestion des listes au profit d&#39;Evernote sur iPhone et m&#39;a demandé les raisons que voici:&lt;/p&gt;  &lt;blockquote&gt;&lt;i&gt;Le Filofax est un outil qui fonctionne très bien. Il a fais mon affaire pendant 1 année. Néanmoins, ce support avait pour MOI quelques inconvénients:&lt;/i&gt;&lt;/blockquote&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;&lt;i&gt;Mes listes devenaient vite brouillon car je n&#39;écris pas très bien&lt;/i&gt;&lt;/li&gt;      &lt;li&gt;&lt;i&gt;Le support, bien que petit prend un peu de place et pèse dans ma sacoche&lt;/i&gt;&lt;/li&gt;      &lt;li&gt;&lt;i&gt;Lors de la revue hebdo, il n&#39;était pas possible de déplacer un élément d&#39;une liste à une autre.&lt;/i&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;blockquote&gt;&lt;i&gt;Lorsque que je me suis procuré un iPhone, j&#39;ai rapidement cherché si un outil gratuit existait pour GTD puisque la pub dit qu&#39;il y a une application pour presque tout! Cette application est &amp;quot;Evernote&amp;quot;. Combinée à l&#39;agenda de l&#39;iPhone, j&#39;ai tout ce qu&#39;il me faut. En effet, &lt;/i&gt;&lt;a href=&quot;http://www.evernote.com/&quot;&gt;&lt;i&gt;&lt;u&gt;&amp;quot;Evernote&amp;quot;&lt;/u&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt; dispose d&#39;une synchronisation sur le net, de client pour PC et une version mobile pour iPhone. Après 3 mois d&#39;utilisation, je peux dire que les inconvénients cités ci-dessus sont levés.&lt;/i&gt;&lt;/blockquote&gt;  </content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/5384674279559647829/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/5384674279559647829' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5384674279559647829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/5384674279559647829'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2009/12/caddie-coach-gtd-getting-things-done-v2.html' title='Caddie / Coach GTD - Getting Things Done – (V2)'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgux_WsBC9DExEnaZ_mfCav-xIIqY1wLQhIx0AKdh3p3d1WJs9iqpOU_RcxVjdg1igypkL4VLIGZf1-RfFlI7zNGqkPxF9ftUl-7ZN24RnlUEf9VFmpOUg2q3ch-UTJnrMbmAI5XMdwOBXc/s72-c/main_caddie_bib_base_photo.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-6792958976722940763</id><published>2009-12-09T08:27:00.025+01:00</published><updated>2009-12-09T14:49:48.710+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="SCRUM"/><category scheme="http://www.blogger.com/atom/ns#" term="XP"/><title type='text'>3 questions de Dragos Dreptate, Responsable R&amp;D Logiciel</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot;   style=&quot;  ;font-family:Verdana;font-size:13px;&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span style=&quot;font-size:85%;&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Dragos, &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial; white-space: pre; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Responsable R&amp;amp;D Logiciel, &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Verdana; white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;envisage le passage aux Méthodes Agiles et à se titre se renseigne et se documente sur la question. Je lui ai proposé de partager mon expérience en répondant à quelques-unes de ses interrogations car être Agile, c&#39;est aussi savoir partager sa connaissance. Dragos a accepté la démarche alors que nous ne nous connaissions pas! C&#39;est un signe de confiance &quot;à priori&quot; que je salut; c&#39;est une valeur très importante.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Voici le contenu de nos premiers échanges:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;[Dragos] &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Ma première question va dans la direction du recrutement. Il est clair, la qualité des membres de l’équipe est primordiale, bonne communication, team player et excellence technique s’imposent. La question : &lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Comment faire pour être sur que la personne qu’on recrute est « agile » ?&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;[Luc]&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Chez nous, voici les étapes que nous mettons en oeuvre pour recruter:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Rédaction d&#39;une annonce qui souligne les points essentiels sur le contexte de notre entreprise et les valeurs que nous recherchons chez notre futur collaborateur.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Nous organisons une session de tests avec une douzaine de candidats où nous décrivons plus précisément notre entreprise. Puis il y a deux heures de tests écris sur des points techniques, logiques, d&#39;Anglais. Ces tests ne sont pas très difficiles et nous permettent de faire un premier filtre.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les 3-4 candidats que nous estimons les meilleurs sont reçus en entretien individuel pour apprendre à mieux les connaître et découvrir leurs motivations et aspirations.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Puis nous avons expérimenté une mise en situation dans une équipe sur une &quot;journée accélérée&quot; afin de mieux évaluer les aptitudes des candidats à travailler en équipe. Ce fut assez intéressant pour tester la capacité d&#39;adaptation des candidats!&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;u&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Quelques pistes:&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;http://www.cio.com/article/print/478106&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;http://www.agilex.fr/2009/01/recrutement-agile/&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;[Dragos] &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: small; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;La deuxième question s’attaque aux problèmes de test. L’activité de test est intégrée au sprint. Les méthodes agiles essaient de diminuer le temps alloué a cette activité en accordant plus d’attention a la qualité du design et du codage, en gros a tout ce que tienne de l’ingénierie logiciel, pour produire un meilleur code avec moins défauts. C’est bien, mais parfois pas suffisant. Nos clients, des grands laboratoires pharmaceutiques, utilisent notre application scientifique en phase de recherche de nouveaux médicaments. Une étape très sensible et coûteuse. Nous sommes soumis à des réglementations strictes concernant la qualité logicielle et sommes certifiés ISO9001. Mais au delà des  certifications, la qualité du livrable est un engagement très fort que nous avons envers nos clients. Actuellement la phase de test a lieu après la fin du développement et consiste dans de plans de test « statiques », quasiment manuels, de tests qui s’appuient sur de spécifications détaillés écrites après la fin du codage. Très peu de tests unitaires. Et enfin la question : &lt;/span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Connaisez-vous des outils de test &quot;agiles&quot;, permettant de créer des tests automatisés adaptés aux logiciels avec beaucoup d’IHM et beaucoup d’intervention de l’utilisateur dans les scenarios d’usage ?&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;[Luc]&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Avant de répondre à la question j&#39;aimerais revenir sur la notion de test dans un contexte Agile. Tout d&#39;abord, pour fixer le périmètre de mes propos, je vais m&#39;appuyer sur deux méthodes Agiles complémentaires : SCRUM pour la gestion du projet et XP (ExtrêmeProgramming) pour les pratiques de développement. Dans ces méthodes, tout est itératif et incrémental car on recherche le feedback en permanence. Plus tôt est le retour sur les problèmes tels que les défauts où incompréhensions des besoins utilisateurs, moins cher coûtera la correction ou l&#39;adaptation. De ce fait, les tests sont quotidiennement nécessaires à mesure que le développement évolue. Ces méthodes ne diminuent pas le temps alloué aux tests mais au contraire l&#39;augmente. Le principe, c&#39;est de ne pas dire qu&#39;une fonctionnalité est terminée tant qu&#39;elle n&#39;est pas testée et le but recherché est de terminer des fonctionnalités dans les sprints (2-3 semaines). En d&#39;autres termes, on ne repousse pas la phase de tests à la traditionnel Release Candidate pour y trouver des défauts qui prendront plusieurs semaines à corriger. A chaque fin d&#39;itération, on doit avoir un incrément de produit potentiellement livrable au client donc entièrement validé et de qualité irréprochable. Alors évidement, on ne plus se permettre de dérouler des plans de tests pendant des jours entiers alors il faut changer les pratiques de test.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Il y a plusieurs types de tests à considérer:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;img src=&quot;http://docs.google.com/drawings/image?id=sEfAQq4isqHGtXmj1lhCCzA&amp;amp;w=267&amp;amp;h=267&amp;amp;rev=46&amp;amp;ac=1&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les tests unitaires sont écris pendant le développement et se situes au niveau des classes. Idéalement il faut pratiquer le TDD (Test Driven Development) où on écrit toujours un test unitaire avant d&#39;ajouter du code pour une fonctionnalité. De cette façon, on ne développe que ce qui est nécessaire (pas de provision ni de code mort) et ceci permet de faire émerger un design qui soit testable avec peu de couplage, etc. Je vous propose de lire le &lt;/span&gt;&lt;a href=&quot;http://bruno-orsier.developpez.com/tutoriels/TDD/pentaminos/index.php&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Tutoriel de Bruno&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les tests d&#39;intégration sont également écris par les développeurs pour s&#39;assurer que les classes fonctionnent bien ensemble.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les tests fonctionnels testent les critères d&#39;acceptation de la fonctionnalité. Il est largement préférable de les automatiser car plus les projets grossissent, plus dérouler l&#39;ensemble des tests fonctionnels en fin d&#39;itération devient long et pénible. Sur des petits projets, il peut être acceptable de garder ces tests manuels. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Au final, il n&#39;est pas anormal de passer les 2/3 du temps de développement à écrire des tests. Pour que le feedback soit rapide, il faut respecter la pyramide pour la répartition des tests. Les tests unitaires doivent être nombreux et couvrir un maximum de cas possibles. Ils doivent également être très rapides pour pouvoir être exécutés par tous les développeurs, tout le temps, pour vérifier que rien n&#39;a été cassé. Il est très important de comprendre qu&#39;automatiser ces tests permettra d&#39;avoir des tests joués tous les jours. En effet, toutes les nuits, un système d&#39;intégration continue doit construire l&#39;application de A à Z (compilation, setup, etc) et exécuter tous les tests (unitaires, intégrations, fonctionnels). Ainsi, chaque matin, les équipes ont une vue claire sur l&#39;état du projet. Si un test n&#39;est pas passé, la priorité sera de le réparer.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Quand on travail sur une base de code non couverte par des tests, il faut apprendre à ajouter de la fonctionnalité en ajoutant des tests. Cela peut-être difficile mais plein de techniques existes pour isoler et modulariser la base de code. A ce sujet, je vous recommande la bible en la matière : &lt;/span&gt;&lt;span style=&quot;font-family:Arial, Helvetica, sans-serif;&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://www.amazon.fr/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Working Effectively With Legacy Code&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Concernant les tests d&#39;IHM, la pratique nous a montré que les tests manipulant  les IHM sont souvent fragiles. En découplant bien la présentation des données, il est plus efficace de tester la couche juste en dessous. Ceci dit, nous utilisons pour nos projets en C# le framework de tests NUnit avec &lt;/span&gt;&lt;a id=&quot;krwj&quot; href=&quot;http://nunitforms.sourceforge.net/&quot; title=&quot;NUnitForms&quot; style=&quot;color: rgb(85, 26, 139); &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;NUnitForms&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;. Pour les applications Web, il y a &lt;/span&gt;&lt;a id=&quot;poqy&quot; href=&quot;http://seleniumhq.org/&quot; title=&quot;Selenium&quot; style=&quot;color: rgb(85, 26, 139); &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Selenium&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; (que je ne connais pas). Je vous propose de lire le billet suivant : &lt;/span&gt;&lt;a href=&quot;http://blog.octo.com/demarches-de-tests-fonctionnels&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;http://blog.octo.com/demarches-de-tests-fonctionnels&lt;/span&gt;&lt;/a&gt;&lt;a href=&quot;http://blog.octo.com/demarches-de-tests-fonctionnels/&quot; style=&quot;color: rgb(85, 26, 139); &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Les tests d&#39;IHM coûtent cher par rapport à des tests plus bas niveau donc nous nous en servons pour vérifier qu&#39;il n&#39;y a pas de bug mais nous comptons principalement sur des tests plus bas niveau pour couvrir l&#39;application et traiter le maximum de cas. &lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Il faut aussi donner de l&#39;importance aux tests exploratoires. Ils permettent de challenger le logiciel sur toutes les couches et ne sont pas automatisables. Ce sont des tests structurés mais pas prédéfinis.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify;margin-top: 0px; margin-right: 0cm; margin-bottom: 0px; margin-left: 0cm; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot;font-family:Arial, sans-serif;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: justify;margin-top: 0px; margin-right: 0cm; margin-bottom: 0px; margin-left: 0cm; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;[Dragos]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;J’ai pu trouver pas mal d’informations sur les points forts et les bénéfices que les méthodes agiles apportent mais il me manque une meilleure vue sur les risques  engendrés par l’adoption de ces méthodes et sur leurs points faibles en général. &lt;i&gt;P&lt;/i&gt;&lt;i&gt;ouvez-vous m’en dire plus à ce sujet ?&lt;/i&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: normal; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;b&gt;[Luc]&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Voici quelques points à considérer lors d&#39;un passage à Scrum/XP:&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium; &quot;&gt;- Scrum, de part sa nature itérative et empirique, ne permet pas de s&#39;engager sur les trois points suivant en même temps&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Contenu du produit&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Qualité du produit.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Délais&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Le plus souvent, c&#39;est le contenu qui est adaptable car chacun sait qu&#39;une grosse partie des fonctionnalités d&#39;un logiciel ne sont jamais ou très peu utilisé. Donc c&#39;est le jeu, le Product Owner doit faire des choix de priorité en permanence.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les chefs de projets et les représentants de la QA doivent changer de rôle pour laisser les équipes s&#39;auto-organiser. Ils peuvent devenir ScumMaster (facilitateur), Product Owner si ils connaissent bien le métier, expert-technique ou ne pas trouver leur nouvelle place.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les Testeurs ne peuvent plus travailler comme avant. Je vous recommande le livre &lt;/span&gt;&lt;a href=&quot;http://www.amazon.fr/Agile-Testing-Practical-Guide-Testers/dp/0321534468&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&quot;Agile Testing: A Practical Guide for Testers and Agile Teams&quot;&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;. Ceci dit, personne en ma connaissance ne regrette l&#39;époque cycle en V avec des campagnes de tests de plusieurs semaines.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Les équipes, avant de devenir productives, vont traverser plusieurs étapes donc il ne faut pas changer ces équipes trop souvent car le processus peut prendre plusieurs années.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Forming (création de l&#39;équipe)&lt;/span&gt;&lt;/div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Storming (turbulence)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Norming (harmonisation)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;white-space: normal; &quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space:pre&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;-&gt; Performing (performance)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;- Il n&#39;est pas toujours évident d&#39;insérer les contraintes non fonctionnelles telles que l&#39;Architecture et les Performances aux Product BackLog. Les ProductOwners ne sont pas toujours les personnes adaptées pour fournir des critères sur ces points. Le danger, c&#39;est de considérer certains points trop tardivement.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;i&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;Chers lecteurs, si vous avez des compléments d&#39;information à partager, n&#39;hésitez pas! Si un échange sur un point particulier vous intéresse, contactez-moi!&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/6792958976722940763/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/6792958976722940763' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/6792958976722940763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/6792958976722940763'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2009/12/3-questions-de-dragos-dreptate.html' title='3 questions de Dragos Dreptate, Responsable R&amp;D Logiciel'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-135320003538037575.post-1783176388895144976</id><published>2009-09-04T06:07:00.007+02:00</published><updated>2009-12-30T09:56:16.969+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agilité"/><category scheme="http://www.blogger.com/atom/ns#" term="XP"/><title type='text'>Un test vert sans avoir été rouge sent mauvais (V2)</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5YUzyrTTyy18b5O-Jt5jaIFme8sA-h1DiETpr4s57B2v0IxYCy4ShobcO8HsszrL8hXqFWvXDfl0jDZYJb9_VlYT-ibscHIX3piH6Niw8CWwg2K5sB0-A9nW4jUlDat01RzqqW2mlliqE/s1600-h/images.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 105px; height: 136px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5YUzyrTTyy18b5O-Jt5jaIFme8sA-h1DiETpr4s57B2v0IxYCy4ShobcO8HsszrL8hXqFWvXDfl0jDZYJb9_VlYT-ibscHIX3piH6Niw8CWwg2K5sB0-A9nW4jUlDat01RzqqW2mlliqE/s200/images.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5377460132202743682&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot;  style=&quot; ;font-family:&#39;Times New Roman&#39;;&quot;&gt;&lt;div   style=&quot;margin-top: 6px; margin-right: 6px; margin-bottom: 6px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;   background-color: rgb(255, 255, 255); min-height: 1100px; counter-reset: __goog_page__ 0; line-height: normal; font-family:Verdana;font-size:10pt;&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold; &quot;&gt;Contexte&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Dans un contexte Agile,  le développement dirigé par les tests (TDD) est incontournable. Ces tests sont le plus souvent unitaires ou d&#39;intégrations car ils aident à construire l&#39;application et couvrent les fonctionnalités existantes en apportant un feedback très rapide. La règle de base du TDD est l&#39;application du cycle RED / GREEN / REFACTOR. Donc on code d&#39;abord le test puis on le fait passer rapidement et enfin on remanie le code si besoin pour éliminer les duplications et améliorer le design. &lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;Un test vert sans avoir été rouge ne sent pas très bon&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Un test qui est vert sans passer par l&#39;étape rouge doit interpeller le développeur. En effet, rien ne prouve alors qu&#39;il teste ce qu&#39;il doit tester. Plusieurs scénarios peuvent amener à ce cas :&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;ul style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Le cas que je m&#39;apprête à coder est déjà couvert donc mon test passe immédiatement&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Je code le test après avoir développé la fonctionnalité; ce n&#39;est plus du TDD et on passe son temps à douter de la pertinence de ses tests.&lt;/li&gt;&lt;li style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Mon test ne teste pas ce qu&#39;il devrait tester&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;Dans tous les cas, si le test est vert immédiatement, on doit se poser des questions. Au minimum, Il faut faire une contre vérification pour s&#39;assurer de sa pertinence. C&#39;est très simple, il suffit de modifier volontairement le code &quot;under test&quot;. &lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Donc pour qu&#39;un test ait de la valeur il doit nécessairement passer par l&#39;étape rouge.&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;Et les tests fonctionnels alors?&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Les tests fonctionnels servent à tester les &quot;user stories&quot; dans leur globalité en vérifiant que les critères d&#39;acceptance sont bien remplis. Ces tests ou recettes peuvent être exécutés manuellement et l&#39;oeil averti du testeur permet de vérifier que la fonctionnalité est conforme aux attentes du client.  Le problème c&#39;est que sur des projets de taille conséquente, cette approche n&#39;est pas viable car le feedback à beaucoup trop long. A mes débuts de développeur, un des projets sur lesquels j&#39;ai travaillé nécessitait 2 jours de tests  à plusieurs personnes. Autant dire que lorsque qu&#39;une régression était découverte, le sprint était compromis.&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;La solution est donc d&#39;automatiser les tests fonctionnels. Oui MAIS! Mais alors attention aux tests qui seront verts sans passer par l&#39;étape rouge! Pour factoriser la vérification de critères, mon équipe avait développé un module spécialisé. Ce module a parfaitement bien fonctionné pendant plusieurs mois. Un jour, ce module a du être modifié pour prendre en compte un changement d&#39;architecture. Puis de nouveaux tests fonctionnels ont été ajoutés à la liste. Ces nouveaux tests ainsi que tous les autres étaient verts pendant plusieurs mois ... mais notre module ne testait plus une bonne partie des critères...&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-bottom: 0px; &quot;&gt;Un test vert sans avoir été rouge ne peut pas apporter la confiance recherchée et doit interpeller le développeur.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://luc-jeanniard.blogspot.com/feeds/1783176388895144976/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/135320003538037575/1783176388895144976' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/1783176388895144976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/135320003538037575/posts/default/1783176388895144976'/><link rel='alternate' type='text/html' href='http://luc-jeanniard.blogspot.com/2009/09/un-test-vert-sans-avoir-ete-rouge-sent.html' title='Un test vert sans avoir été rouge sent mauvais (V2)'/><author><name>Luc Jeanniard</name><uri>http://www.blogger.com/profile/05594669936873850633</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5YUzyrTTyy18b5O-Jt5jaIFme8sA-h1DiETpr4s57B2v0IxYCy4ShobcO8HsszrL8hXqFWvXDfl0jDZYJb9_VlYT-ibscHIX3piH6Niw8CWwg2K5sB0-A9nW4jUlDat01RzqqW2mlliqE/s72-c/images.jpg" height="72" width="72"/><thr:total>2</thr:total></entry></feed>