<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nicolas Lecrique - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/author/nicolas-lecrique/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Tue, 10 Jan 2012 15:39:06 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>Nicolas Lecrique - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Extreme programming : retour d&#8217;expérience</title>
		<link>https://blog.infine.com/extreme-programming-retour-dexperience-1780?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extreme-programming-retour-dexperience</link>
					<comments>https://blog.infine.com/extreme-programming-retour-dexperience-1780#respond</comments>
		
		<dc:creator><![CDATA[Nicolas Lecrique]]></dc:creator>
		<pubDate>Tue, 10 Jan 2012 14:00:12 +0000</pubDate>
				<category><![CDATA[Agilité]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[experience]]></category>
		<category><![CDATA[extreme]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[retour]]></category>
		<category><![CDATA[XP]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=1780</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span> Intro SCRUM, Extreme Programming (XP), Lean-management, le développement agile, c’est tendance ! Objectifs : améliorer la réactivité, la qualité et le coût du logiciel avec en ligne de mire la sacro-sainte satisfaction client. J’ai participé, pendant deux ans, à un projet réalisé « from scratch » en suivant une méthodologie agile : l’Extreme programming. En tant que développeur (sur &#8230;</p>
<p>The post <a href="https://blog.infine.com/extreme-programming-retour-dexperience-1780">Extreme programming : retour d’expérience</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span><h2><strong>Intro</strong></h2>
<p>SCRUM, Extreme Programming (XP), Lean-management, le développement agile, c’est tendance !</p>
<p>Objectifs : améliorer la réactivité, la qualité et le coût du logiciel avec en ligne de mire la sacro-sainte satisfaction client.</p>
<p>J’ai participé, pendant deux ans, à un projet réalisé « from scratch » en suivant une méthodologie agile : l’Extreme programming. En tant que développeur (sur les deux ans), et « coach XP » (sur les six derniers mois).  L’objectif du projet était le développement d’une application de trading « in-house » dans une banque d’investissement, la taille de l’équipe a varié au cours de ces deux ans de 3 à 7 (manager compris).</p>
<p>Ce post a pour but d’expliquer les pour et les contre de cette méthode tel que je l’ai vécu.</p>
<p><span id="more-1780"></span></p>
<h2><strong>L’extreme programming</strong></h2>
<p>Sans chercher à être exhaustif (wikpedia est ton ami), voici les grands principes XP :</p>
<ul>
<li><strong>Pair-programming</strong> : on code à deux devant un PC, le codeur et le reviewer. les rôles s&#8217;inversant régulièrement. On change de binôme à chaque tâche.</li>
<li> <strong>TDD</strong> (Test driven development) : chaque méthode, chaque portion de code est systématiquement testée <span style="text-decoration: underline">avant</span> d’être codée.</li>
<li><strong>KISS</strong> (Keep It Simple, Stupid) : On cherche toujours la solution la plus simple sans anticiper les besoins futures (pêché mignon du développeur ?).</li>
<li><strong>Refactoring</strong> : On cherche en permanence à avoir le code le plus propre possible</li>
<li> <strong>Itérations courtes</strong> : le cycle développement-release est très court (1 semaine à 1 mois)</li>
</ul>
<h2><strong>Les plus</strong></h2>
<ul>
<li><strong>Un code clean</strong> : Non seulement l’XP via ses principes favorise une plus grande qualité de code, mais j’irai plus loin : il l’impose ! En effet, le TDD dans du code spaghettis, dupliqué, du code mort…c’est sinon impossible, franchement pénible. Idem pour le refactoring, très cher s’il n’est pas fait suffisamment tôt.</li>
<li><strong>Agilité</strong> : Je vous entends « Il est malin le type, c’est l’objectif ! ». Ok, mais c’est un objectif atteint. Le client peut changer d’avis et ses priorités comme de chemise (et il ne s’en prive pas).</li>
<li><strong>L’équipe te rend plus fort</strong> : Grace au pair-programming, les développeurs montent rapidement en compétence. Pour le développeur, c’est l’opportunité de se former grâce au reste de l’équipe. Se former sur l’application bien sur, mais aussi sur tout ce qu’on peut apprendre à observer un autre développeur à l’oeuvre.</li>
<li><strong>Interchangeabilité</strong> : XP refuse la spécialisation, chaque développeur doit maîtriser l’ensemble de l’application. C’est possible en associant sur chaque développement un « sachant » et un « ignorant » sur la partie concernée. C’est clairement un luxe pour le manager étant donné le turnover dans la plupart des projets informatiques. Les mauvaises langues parleront de développeur « jetable », mais pour le projet, c’est un plus.</li>
</ul>
<h2><strong>Les moins</strong></h2>
<ul>
<li><strong>Dites au revoir à votre « Touch »</strong> : Si vous aimez utiliser vos raccourcis « custom », vos conventions de nommage, vos patterns, vos lib. Bref ! VOTRE façon de coder : Oubliez ! vous allez coder la moitié du temps sur un autre PC, et quelqu’un d’autre codera sur le votre. L’uniformisation des l’environnement, des outils et des pratiques est par conséquent obligatoire. C’est positif pour le projet, mais l’effort d’adaptation est réel.</li>
<li><strong>Explications, négociations, compromis :</strong> Développer à deux, ce n’est pas naturel. Il faut en permanence argumenter, expliquer son cheminement de pensée. Quand au reviewer, il doit rester concentrer sans le clavier, challenger chaque décision,  être force de proposition et chasser chaque bug ou coquille, il doit enfin être patient s’il maitrise mieux le sujet sans chercher à « attraper » le clavier. Il faut aussi veiller à garder un équilibre, le plus timide ou le plus junior ne devant pas se faire « manger ». Bref, c’est formateur, le code écrit est meilleur, mais je suis convaincu que c’est plus exigent que de coder seul.</li>
<li><strong>Le TDD, ce n’est pas sexy : </strong>Je suis fermement convaincu de l’intérêt du TDD (limitation des bugs et des régressions, refactoring sure, spécification, code découplé), mais il faut avouer qu’écrire des centaines de tests et avoir la (fausse ?) impression d’aller deux fois moins vite, c’est parfois rébarbatif.</li>
<li><strong>Pas de petit chef</strong> : Le pair-programming, l’absence de spécialisation et la volonté en XP d’aller vers l’essentiel (le code) limite quelque part les responsabilités du développeur. Dans une équipe classique, chaque développeur deviendra probablement référent sur certains domaines, participera à des réunions, et prendra en charge certaines responsabilités.  En XP, le manager manage, les codeurs codent (PS : si c’est tout ce que vous aimez, vous pouvez passer cela dans la rubrique plus), et nul n’est indispensable.</li>
</ul>
<p>Avant de conclure, quelques remarques inclassables, ni en plus, ni en moins</p>
<h2><strong>L&#8217;extreme programming, à prendre ou a laisser.</strong></h2>
<p>Je ne vois pas les différentes pratiques de l’XP comme une boîte à outil où l’on prend et on jette en fonction des envies. Les différentes pratiques se complètent et se renforcent mutuellement.</p>
<ul>
<li>Pour livrer très fréquemment, il faut pouvoir valider une version très rapidement, d’où le TDD. (Si vous voulez tester l’application de fond en comble tous les 15 jours à la main, ce sera sans moi).</li>
<li>Prendre systématiquement la solution la plus simple en négligeant le refactoring, c’est la porte ouverte au code spaggeti et autres rustines.</li>
<li>Faire du refactoring fréquemment sans couverture de tests unitaires, c’est l’assurance de régressions.</li>
<li>Refactorer, c’est bien plus sûr avec une deuxième paire d’yeux.</li>
</ul>
<p>Bien sur, ça n’est pas vrai pour tout,  le TDD n’a pas attendu l’XP pour exister.</p>
<h2><strong>N’est pas XP qui veut</strong></h2>
<p>Tout projet n’est pas adapté à l’XP. Il faut un client accessible et prêt à s’investir et des développeurs ouverts aux pratiques XP. Il faut enfin que le manager soit convaincu par la méthode et à l’écoute des développeurs (accepter les coûts donnés par des développeurs et les dépassements inévitables par exemple).</p>
<p>L’environnement de développement est également primordial. Framework de tests unitaires, de mocking, outils de refactoring, d’analyse statique de code, de couverture de tests, usine de build…Tous ces outils « nice-to-have » dans un autre projet deviennent plus ou moins indispensables en XP. En conséquence,  un projet C++ ou dans un langage web est sans doute moins adapté à l’XP qu’un projet Java ou .NET.</p>
<h2><strong>Conclusion</strong></h2>
<p>Au final, même si j’ai la critique un petit peu facile par nature, je me range plutôt du côté des « pro-XP / pro-agiles » .Le projet auquel j’ai participé est à mon avis un succès, mais il est important de noter qu’il correspond en tous points au « contexte idéal » décrit ci-dessus.</p>
<p>Quant aux objectifs mentionnés au début du post (améliorer la réactivité, la qualité et le coût du logiciel), les deux premiers sont clairement atteints. Pour le troisième,  c’est la question à 1 Milliard.</p>
<p>Ce qui est sûr, c’est que l’on est très loin d’un coût multiplié par quatre. Certes on code deux fois plus (TDD), et à un instant donné, la moitié de l’équipe ne code pas (elle ne dort pas non plus). Mais cela est compensé par des bugs à fixer en moins, un code de meilleur qualité, une montée en compétence plus rapide et un scope correspondant exactement au besoin client. Est-ce que c’est « surcompensé » ou « sous-compensé », là est le vrai débat. Mon intuition c’est que le gain est négatif dans un premier temps (un an, peut-être deux) puis positif par la suite.</p>
<p>Voilà pour ma vision de l’Extreme programming, à prendre pour ce que c’est, un avis basé sur une expérience mais certainement pas une vérité.</p><p>The post <a href="https://blog.infine.com/extreme-programming-retour-dexperience-1780">Extreme programming : retour d’expérience</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/extreme-programming-retour-dexperience-1780/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</title>
		<link>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable</link>
					<comments>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427#comments</comments>
		
		<dc:creator><![CDATA[Nicolas Lecrique]]></dc:creator>
		<pubDate>Wed, 09 Feb 2011 14:05:24 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[Dispose]]></category>
		<category><![CDATA[IDisposable]]></category>
		<category><![CDATA[lock]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[RAII]]></category>
		<category><![CDATA[using]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=427</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> Détecter les deadlocks en C# / .NET grâce au pattern IDisposable Si vous êtes développeur en environnement multithread, alors vous vous êtes déjà posé cette question : Où est ce deadlock ? ! Bien sûr, ce deadlock est non-reproductible, il survient chez l’utilisateur, et l’on peut passer des heures à le chercher. Sans jamais être sur &#8230;</p>
<p>The post <a href="https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427">Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><h1>Détecter les deadlocks en C# / .NET grâce au pattern IDisposable<br />
</h1>
<p>Si vous êtes développeur en environnement multithread, alors vous vous êtes déjà posé cette question : Où est ce deadlock ? !</p>
<p>Bien sûr, ce deadlock est non-reproductible, il survient chez l’utilisateur, et l’on peut passer des heures à le chercher. Sans jamais être sur d’avoir trouvé LE deadlock qui pose problème !</p>
<p>Vous trouverez dans ce post un exemple de lock qui a pour objectif de</p>
<ol>
<li>Pouvoir détecter les deadlocks</li>
<li>Proposer une syntaxe claire et concise</li>
<li> Ajouter un overhead minimum en terme de performance à la syntaxe lock C# classique</li>
</ol>
<h2>Petit rappel : qu’est-ce  qu&#8217;un deadlock ?</h2>
<p>Un deadlock (interblocage dans sa version française que personne n’utilise) est la situation dans laquelle 2 threads s’attendent mutuellement. Cas concret :</p>
<ol>
<li>Un thread T1 acquiert une ressource R1</li>
<li>Un thread T2 acquiert une ressource R2</li>
<li>T1 demande la ressource R2</li>
<li>T2 demande la ressource R1</li>
</ol>
<p>Avec un schéma :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg" class="fancyboxgroup" rel="gallery-427"><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-431" src="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg" alt="" width="800" height="600" srcset="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg 960w, https://blog.infine.com/wp-content/uploads/2010/12/deadlock1-300x225.jpg 300w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>Exemple de code provoquant un deadlock</p>
<pre class="brush: csharp; title: ; notranslate">

void CreateDeadLock()
{
   Object R1 = new object();
   Object R2 = new object();

   Thread T1 = new Thread(delegate() { Work(R1, R2); });
   Thread T2 = new Thread(delegate() { Work(R2, R1); });

   T1.Start();
   T2.Start();
}

void Work(Object acquire, Object demand)
{
   lock (acquire)//T1 take R1 and T2 take R2
   {
      Thread.Sleep(1000);//To ensure that the ressources are taken
      lock (demand)
      {
      }
    }
}

</pre>
<p>NB : Bien sûr, les situations réelles sont souvent plus compliquées, impliquant par exemple plus de 2 threads ou des locks implicites (écriture dans un fichier…).</p>
<p><span id="more-427"></span></p>
<h2>Le lock C#</h2>
<p>Quand en C# on écrit la syntaxe suivante :</p>
<pre class="brush: csharp; title: ; notranslate">

lock (ressource)
{
}

</pre>
<p>Il se passe en fait à peu près ça :</p>
<pre class="brush: csharp; title: ; notranslate">

Object temp = ressource;
Monitor.Enter(temp);
try
{
}
finally
{
   Monitor.Exit(temp);
}

</pre>
<p>Monitor.Enter acquière le lock, Monitor.Exit le relâche, Le block try-finally est là pour s&#8217;assurer que la ressource sera libérée même en cas d&#8217;exception. Quant à la référence &#8220;temp&#8221;, il garantit que c&#8217;est bien l&#8217;objet acquis qui sera libéré (l&#8217;utilisateur ne peut pas la modifier l&#8217;objet vers lequel &#8220;temp&#8221; pointe).</p>
<h1>Prévenir les deadlocks avec un Timeout</h1>
<p>Le principe pour prévenir les deadlocks implique l’introduction d’un timeout avec un log ou une levée d’exception dans le cas ou le thread échoue à acquérir la ressource demandée.</p>
<p>Voici un exemple de code résolvant le problème.</p>
<pre class="brush: csharp; title: ; notranslate">

if (Monitor.TryEnter(ressource, 10000))
{
   try
   {
      //Work
   }
   finally
   {
      Monitor.Exit();
   }
}
else
{
   // Log, stack trace display...
   throw new TimeoutException(&quot;Lock acquiring failed&quot;);
}

</pre>
<p>Dans une application avec de nombreux locks, vous conviendrez que cette syntaxe est plus lourde et moins lisible que le lock classique.</p>
<p>Plus grave, elle laisse la possibilité « d’oublier » la libération de la ressource puisque celle-ci incombe au programmeur à chaque utilisation (sisi, ça peut arriver !).</p>
<h1>Une solution plus « User-friendly »</h1>
<p>L’objectif est de garder le bénéfice du timeout, tout en bénéficiant d’une syntaxe plus concise et claire.</p>
<p>L’idée ici est d’utiliser un Pattern bien connu des programmeurs C++, mais moins des développeurs C# ou JAVA, le principe RAII (Ressource Acquisition Is Initialization).</p>
<h2>Le principe RAII</h2>
<p>En C++, il y a un moyen simple de s’assurer qu’une ressource sera toujours libérée à la sortie d’une méthode, c’est de l’encapsuler dans un objet créé sur la pile, et de la libérer dans le destructeur de cet objet. En effet, lorsque la méthode se termine (que ce soit par return ou exception), le destructeur de l’objet est appelé et la ressource toujours libérée.</p>
<p>En C# cependant, on ne peut pas appliquer directement cet idiome. En effet :</p>
<p>-L’appel du destructeur d’une classe n’est pas déterministe (il est réalisé par le Garbage Collector)</p>
<p>-Les structures, équivalent C# des objets créé sur la pile en C++, ne peuvent pas avoir de destructeur.</p>
<h2>Implémentation du lock par l’utilisation du pattern IDisposable</h2>
<p>Pour contourner cette limitation du langage, on peut utiliser le pattern IDisposable.</p>
<p>Voici une première implémentation :</p>
<pre class="brush: csharp; title: ; notranslate">

public class LockCookie : IDisposable
{
private const int TIMEOUT = 10000;
private Object _ressource;

public LockCookie(Object ressource)
{
   if (Monitor.TryEnter(ressource, TIMEOUT))
   {
      _ressource = ressource;
   }
   else
   {
      // Log, stack trace display...
      throw new TimeoutException(&quot;Lock acquiring failed&quot;);
   }
}

public void Dispose()
{
   if (_ressource != null)
   {
      Monitor.Exit(_ressource);
   }
}

}

</pre>
<p>Et son utilisation :</p>
<pre class="brush: csharp; title: ; notranslate">

using (new LockCookie(ressource))
{
   //Work
}

</pre>
<p>Avec ce pattern, une seule ligne permet d’acquérir la ressource, la libération est systématique à l’accolade fermante (même en cas d’exception) et le traitement en cas d’échec n’est pas dupliqué.</p>
<p>CQFD ? Pas tout à fait. Même si l’on peut se satisfera de cette solution dans la plupart des cas, elle créé un overhead non négligeable : il y a création d’objet à chaque acquisition de la ressource (et qui dit création d’objet dit également plus de travail pour le Garbage Collector !).</p>
<h2>Optimisation de la solution</h2>
<p>Eliminons tout de suite une première piste : transformer notre classe LockCookie en type struct n’optimise pas la solution. Pourquoi ? Parce qu’à l’accolade fermante du using, la méthode Dispose de l’interface IDisposable est appelée, et appeler une méthode d’interface à partir d’un type struct implique un boxing.</p>
<p>Une autre piste consiste à faire de notre classe LockCookie l’objet même de synchronisation. Voici le code qui en résulte.</p>
<pre class="brush: csharp; title: ; notranslate">

public class LockCookie : IDisposable
{
private const int TIMEOUT = 10000;
private bool _ressourceAcquired;

public LockCookie Get()
{
   _ressourceAcquired = Monitor.TryEnter(this, TIMEOUT);
   if (!_ressourceAcquired)
   {
      throw new TimeoutException(&quot;Lock acquiring failed&quot;);
   }
   return this;
}

public void Dispose()
{
   if (_ressourceAcquired)
   {
      //NB : the 2 next lines must be in is order to prevent _ressourceAcquired
      //to be set to true by Get() then reset by this call to dispose
      _ressourceAcquired = false;
      Monitor.Exit(this);
   }
}

}

</pre>
<p>Et son utilisation :</p>
<pre class="brush: csharp; title: ; notranslate">
//For instance, ressource is a class field : LockCookie _ressource = new LockCookie();
using (_ressource.Get())
{
   //Work
}
</pre>
<p>L’utilisation est sans doute un peu moins évidente, mais aucun objet n’est créé et la libération de la ressource reste implicite et systématique.</p>
<p>Sur le plan des performances, un lock classique coûte selon mes tests 40 ns (40 milliardièmes de secondes), avec la première solution (avec création d’objet), le coût monte à 50 ns, soit un overhead de 25%, la seconde solution descent à 44 ns, soit un overhead de 10%. Le code des tests de performances sont disponibles en bas de l’article.</p>
<h3>Conclusion</h3>
<p>Ces 2 solutions apportent une réponse centralisée et efficace aux problèmes liés aux acquisitions de ressources en général et aux deadlocks en particulier. Le coût en terme de performance peut paraître important à certains, mais gardons à l’esprit que le temps d’acquisition d’un lock est souvent négligeable en comparaison du temps ou un thread est effectivement bloqué en l’attente d’une ressource. Je suis par ailleurs curieux de connaître d’éventuelles améliorations ou corrections que vous pourriez apporter.</p>
<p>Code d&#8217;analyse de la performance :</p>
<p>void TestPerf()<br />
{<br />
   TestPerf(ClassicLock,&#8221;ClassicLock&#8221;);<br />
   TestPerf(LockCookieCreation,&#8221;LockCookieCreation&#8221;);<br />
   TestPerf(LockCookieGet,&#8221;LockCookieGet&#8221;);<br />
}</p>
<p>public static void ClassicLock(){ lock (_lockObject) { }  }<br />
public static void UseLockCookie(){using (new LockCookie(ressource)){ } }<br />
public static void UseLockCookie() { using (ressource.Get()) { } }</p>
<p>public delegate void TestPerfDelegate();<br />
public static void TestPerf(TestPerfDelegate testPerfDelegate, string testName)<br />
{<br />
   const long nbIteration = 10000000;//10 millions times<br />
   const long nanoSecCoeff = 1000000;//1 ms contains 1 million ns</p>
<p>   Stopwatch stopwatch = new Stopwatch();<br />
   GC.Collect();//Prevent from garbage collection during loop<br />
   stopwatch.Start();<br />
   for (int i = 0; i < nbIteration; i++)
   {
      testPerfDelegate();
   }
   stopwatch.Stop();
   double ellapsedNanoSec = (double)(stopwatch.ElapsedMilliseconds * nanoSecCoeff) / nbIteration;
   Console.WriteLine(testName.PadRight(50) + ellapsedNanoSec);
}

}
[/sourcecode]
</p><p>The post <a href="https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427">Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Exemple d&#8217;option dans la vie quotidienne : l&#8217;option SNCF</title>
		<link>https://blog.infine.com/exemple-doption-dans-la-vie-quotidienne-loption-sncf-115?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=exemple-doption-dans-la-vie-quotidienne-loption-sncf</link>
					<comments>https://blog.infine.com/exemple-doption-dans-la-vie-quotidienne-loption-sncf-115#comments</comments>
		
		<dc:creator><![CDATA[Nicolas Lecrique]]></dc:creator>
		<pubDate>Wed, 03 Nov 2010 12:00:56 +0000</pubDate>
				<category><![CDATA[Finance]]></category>
		<category><![CDATA[call]]></category>
		<category><![CDATA[dérivé]]></category>
		<category><![CDATA[option]]></category>
		<category><![CDATA[pricing]]></category>
		<category><![CDATA[put]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=115</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span> Peut-être avez vous déjà utilisé les “options SNCF” pour les billets de train, qui vous permettent de “réserver” un billet pendant un certain temps sans l’acheter directement. Et bien son fonctionnement est quasiment identique à une option au sens financier du terme ! Voici ses caractéristiques : Le sous-jacent : C’est le billet de train, c’est &#8230;</p>
<p>The post <a href="https://blog.infine.com/exemple-doption-dans-la-vie-quotidienne-loption-sncf-115">Exemple d’option dans la vie quotidienne : l’option SNCF</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span><p>Peut-être avez vous déjà utilisé les “options SNCF” pour les billets de train, qui vous permettent de “réserver” un billet pendant un certain temps sans l’acheter directement. Et bien son fonctionnement est quasiment identique à une option au sens financier du terme !</p>
<p>Voici ses caractéristiques :</p>
<ul>
<li><em>Le sous-jacent</em> : C’est le billet de train,      c’est le produit que vous récupérerez si vous exercez l’option.</li>
<li><em>Le type</em> : L’option vous donne droit      d’acheter le billet, c’est donc une option d&#8217;achat (<em>Call </em>en anglais)</li>
<li><em>Le style</em> : Vous pouvez récupérer le      billet n’importe quand jusqu&#8217;à une certaine date, il n’y a pas de date      précise, c’est donc une option américaine</li>
<li><em>La quotité</em> : C’est le nombre de billets      que vous aurez en exerçant l’option (nombre de sous-jacents par option)</li>
<li><em>La maturité</em> : C’est la durée de validité      de l’option, si vous avez 1 mois pour acheter vos billets, la maturité de      l’option est 1 mois.</li>
<li><em>Le strike</em> : C’est le prix du billet de      train si vous décidez d’exercer l’option.</li>
</ul>
<p>On retrouve donc dans l&#8217;option SNCF les caractéristiques d’une option en finance.</p>
<p>Il y a cependant une différence de taille, l’option SNCF est gratuite, mais comme rien n’est gratuit en finance, la problématique réside dans la détermination du “juste prix” d’une option donnée.</p>
<p>Pour les options SNCF, vous pouvez vous dire, c’est gratuit, je ne m’engage à rien, l’option me garantit un prix, et vous posez cette option.</p>
<p>Maintenant, imaginons que la SNCF décide de faire payer ces options. Si celle-ci coûte 1€, alors vous en déduisez que l’option est toujours intéressante&#8230;mais si l’option coûte 2 € ? 5 € ?</p>
<p>Quel est le prix à partir duquel vous déciderez de ne plus acheter cette option ?</p>
<p>Si vous arrivez à déterminer ce prix, alors vous avez “pricé” l’option !</p>
<p>Voyons en détail les critères qui permettent de déterminer le &#8220;bon prix&#8221;.<br />
<span id="more-115"></span></p>
<ul>
<h3><strong>La moneyness</strong></h3>
</ul>
<p>Ce terme barbare désigne une notion plutôt simple, celle qui a le plus d’impact sur le prix de l’option.</p>
<ul>
<li>Si le strike de l’option (le prix du billet garanti par l’option) est inférieur au prix actuel du billet, l&#8217;option est dite &#8220;in-the-money&#8221;. Par exemple, si le billet coûte 30€, et que l’option vous permet d’acheter ce billet à 20 €, alors l’option vaudra au minimum 10 €. Ces 10 € (<em>prix du sous jacent &#8211; strike</em>) sont également appelés “valeur intrinsèque” de l’option.</li>
<li>Si le prix du billet est identique dans les 2 cas ( strike = prix du sous-jacent ), alors l’option est “at-the-money”, la valeur intrinsèque de l&#8217;option est nulle.</li>
<li>Si enfin le prix du billet est plus grand dans le cas de l’option qu’en achetant directement le billet, alors l’option est dite “out-the-money”. Autrement dit, il faudrait-être fou pour exercer l’option immédiatement, la valeur intrinsèque de l&#8217;option est négative.</li>
</ul>
<p>Le 1er critère du prix d’une option est donc le rapport entre prix du sous-jacent et strike de l’option.</p>
<ul>
<h3><strong>La      maturité</strong></h3>
</ul>
<p>Prenons l’exemple d’un voyage prévu dans 3 mois. L&#8217;idéal pour vous est d’attendre au maximum avant d’acheter le billet. Si l’option vous oblige à acheter vos billet d’ici une semaine, l &#8216;option n&#8217;est pas vraiment utile, mais si elle vous permet d’acheter le billet dans 2 mois et demi, l’option devient beaucoup plus intéressante. En conséquence, le prix d’une option augmente avec sa maturité.</p>
<p>NB: ceci est vrai pour une option américaine, comme l&#8217;option SNCF, c’est également très souvent le cas pour une option européenne, mais pas systématiquement.</p>
<ul>
<h3><strong>La      volatilité</strong></h3>
</ul>
<p>Voici 2 exemples pour comprendre ce qu&#8217;est la volatilité et son influence sur le prix d&#8217;une option. Prenons le cas du trajet entre “petit-village” et “la gare au milieu de la campagne”.</p>
<p>Hypothèse 1 : le train n’est jamais plein, vous trouverez toujours une place.</p>
<p>Hypothèse 2 : le prix du billet est toujours de 20€.</p>
<p>Si une option sur ce trajet possède un strike de 20, cette option ne sera pas intéressante puisque vous pourrez à tout moment acheter votre billet au même prix. Personne ne voudra payer pour une option qui ne sert à rien, son prix sera 0. Nous somme ici dans le cas où la volatilité du sous-jacent est nulle, son prix ne bouge jamais.</p>
<p>Prenons maintenant le cas du trajet “Paris-Nice le 15 août ”.</p>
<p>Hypothèse 1 : le train n’est jamais plein non plus (hypothèse hasardeuse, mais admettons).</p>
<p>Hypothèse 2 : Le prix du billet augment lorsque le train est presque plein (beaucoup plus crédible).</p>
<p>Vous voulez vous baigner ce week-end, mais seulement s’il fait beau !</p>
<p>Le billet coûte aujourd’hui 50€, mais personne ne sait comment le prix du billet évoluera tout au long de la semaine. S’il les prévisions météo deviennent mauvaises, le prix tombera peut-être à 30€, si elles sont bonnes, le prix pourrait bien être de 100€ Jeudi !</p>
<p>Nous sommes ici dans le cas ou le prix du sous-jacent est très volatile. Dans ce cas, une option qui vous garanti un prix fixe (60 € par exemple) est beaucoup-plus intéressante, car elle peut dans certain cas vous faire économiser 40 €, et s’il ne fait pas beau, alors vous n’exercez pas l’option. On peut comprendre ainsi que le prix de l’option augmente lorsque la volatilité du sous-jacent augmente.</p>
<h3><strong>Conclusion</strong></h3>
<p>On a pu voir ici 3 paramètres importants pour déterminer le prix d’une option, il en existe d’autres pour lesquels le parallèle est moins évident avec l’option SNCF (les taux d’intérêt par exemple), nous les verrons dans un prochain post. Nous verrons également  comment ces paramètres interviennent quantitativement pour fixer le prix d’une option.</p><p>The post <a href="https://blog.infine.com/exemple-doption-dans-la-vie-quotidienne-loption-sncf-115">Exemple d’option dans la vie quotidienne : l’option SNCF</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/exemple-doption-dans-la-vie-quotidienne-loption-sncf-115/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
