<?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>Pyxis blog &#187; ernst perpignand</title>
	<atom:link href="http://pyxis-tech.com/blog/author/eperpignand/feed/" rel="self" type="application/rss+xml" />
	<link>http://pyxis-tech.com/blog</link>
	<description>Pyxis blog</description>
	<lastBuildDate>Thu, 29 Jul 2010 20:20:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>3 days with Greg Young</title>
		<link>http://pyxis-tech.com/blog/2010/06/03/3-days-with-greg-young/</link>
		<comments>http://pyxis-tech.com/blog/2010/06/03/3-days-with-greg-young/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 21:29:27 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Développement logiciel]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[formation]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/2010/06/03/3-days-with-greg-young/</guid>
		<description><![CDATA[
			
				
			
		
Last week Pyxis hosted an intensive three days immersion into Greg Young’s Applied DDD course. This course is amazingly packed with tips and tricks on how to come up with an architecture that delivers business value customers have come to expect from their investments in software systems. Powered by Greg’s energetic tone, this course challenged [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F06%2F03%2F3-days-with-greg-young%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F06%2F03%2F3-days-with-greg-young%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><a><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" border="0" alt="IMG_2720" align="left" src="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/IMG_2720_thumb.jpg" width="244" height="184" /></a>Last week Pyxis hosted an intensive three days immersion into <a href="http://codebetter.com/blogs/gregyoung/">Greg Young</a>’s Applied DDD course. This course is amazingly packed with tips and tricks on how to come up with an architecture that delivers business value customers have come to expect from their investments in software systems. Powered by Greg’s energetic tone, this course challenged my assumptions of how software should be designed and I would recommend it to anyone interested in architecture innovations surrounding Domain Driven Design. Following is an overview of the topics we’ve tackled during the training. </p>
<h4>DDD recap</h4>
<p>The first day was spent refreshing some of the fundamental but often misunderstood concepts of <a href="http://domainlanguage.com/ddd/index.html">Domain Driven Design</a>. We were reminded that Strategic Design is essential while embarking on a Domain Driven Design project as we must make sure that the value we get out from it is well worth the effort. Notions such as Bounded Contexts and Core Domain allow highly knowledgeable teams to focus on value added development work while leaving less crucial aspects of the software to others.</p>
<p>Another topic that stroke a chord with me was Greg’s presentation of Aggregates and the role the play in well crafted software systems. Aggregates exist to provide transaction boundaries around the behaviors of domain objects. Aggregate roots provide the sole entry point to this grouping of domain behaviors and encapsulate validation logic as well as invariant consistency inside the aggregate.</p>
<h4>CQRS</h4>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/EventSourcing.jpg"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" border="0" alt="EventSourcing" align="left" src="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/EventSourcing_thumb.jpg" width="272" height="196" /></a>We spent the second day learning about Command Query Responsibility Segregation and Event Sourcing. CQRS is different then Command Query Separation (Bertrand Meyer) which advocates that methods that change state should be separated from functions that return value. CQRS takes the same principle and applies it to the whole architecture. In this style of design some objects (write model) represents the commands the domain respond to and other objects (read model) handles the queries and their results. Having separate models for these concerns brings a lot of benefits that I will bring up in later posts. </p>
<h5>The write model</h5>
<p>It’s common OO knowledge that objects should be designed around behaviors in a domain. Having a dedicated write model consisting of aggregates that define transaction boundaries around the behaviors in the domain focuses work on the most valuable part of the system. This is the place to maximize the return on the work of your most skilled developers aided by domain experts.</p>
<h5>The read model</h5>
<p>The query side doesn’t have a domain as it’s mostly straightforward boilerplate code. The preferred implementation of a read model is having request DTOs going through a thin query layer that projects directly off of a data source. This is way simpler that using the domain model to do the same. This way pre-fetched paths and optimizing ORMs queries are avoided.</p>
<h5>Event Sourcing </h5>
<p>Event sourcing can be seen as a way to “standardize” thus reduce the cost of implementing separated read and write models. The basic idea is that all domain can be modeled as receiving commands that and producing associated events. These events can be stored as a log of what happened in the system and also be used to update the read model.</p>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/IMG_2717.jpg"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" border="0" alt="IMG_2717" align="left" src="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/IMG_2717_thumb.jpg" width="244" height="184" /></a> While exposing concurrency issues and ways to handle them Greg showed us a merging algorithm that’s quite simple and clever. Probably, the only piece of code Greg would ever write with a Goto statement as you can see in the picture.</p>
<h4>Fine tuning the architecture</h4>
<p>The third day was spent analyzing the properties of this architecture and how it could be fine tuned to produce low latency, high availability and high reliability systems. Most notably <a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/20/cqrs-and-cap-theorem.aspx">CQRS architecture can used to get around</a> <a href="http://www.julianbrowne.com/article/viewer/brewers-cap-theorem">CAP theorem</a> issues which states that you can’t guarantee all three <strong>C</strong>onsistency, <strong>A</strong>vailability and <strong>P</strong>artitionability in one system. Look <a href="http://guysblogspot.blogspot.com/2008/09/cap-solution-proving-brewer-wrong.html">here</a> for another treatment on how to get around CAP.</p>
<p>All these architecture talks made me realize that using DDD and CQRS is a lot of work. And it’s no wonder that they should be applied to core domains. Now most companies I’ve worked with deal with multiple domains such as Sales, Security, Insurance, etc&#8230; And it would have been difficult to single out the one that constitutes their core domain. But every company must have a core domain otherwise it would not have a competitive advantage. Turns out a lot of companies derive their competitive advantage from their business process that integrate all of the domains they deal with. This is the place their core domain reside and that’s where <a href="http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf">Sagas</a> help.</p>
<h4>Pyxis source of high quality technical learning</h4>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/IMG_2719.jpg"><img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;margin-left: 0px;border-left-width: 0px;margin-right: 0px" border="0" alt="IMG_2719" align="right" src="http://pyxis-tech.com/blog/wp-content/uploads/2010/06/IMG_2719_thumb.jpg" width="244" height="184" /></a> All in all, these three days were packed with useful technical knowledge and eye opening discussions with an expert in his craft. The participants enjoyed the learning experience in Pyxis’ agile environment where they got a close up look at our facilities supporting agile teams. Pyxis is proud to have sponsored this event and is dedicated to bringing high quality technical training to the public.</p>
<p>Other technical trainings :</p>
<ul>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/scrum-developer-dotnet/">Professional Scrum Developer (.NET)</a> </li>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/modelisation-agile/">Agile Modeling</a> </li>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/ddd/">Domain-Driven Design (DDD)</a> </li>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/tdd/">Test-Driven Development (TDD)</a> </li>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/pratiques-dutilisabilite/">Usability Practices</a> </li>
<li><a href="http://www.pyxis-tech.com/en/services/formation/liste-de-cours/specifications-executables/">Executable Specifications with GreenPepper</a> </li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/06/03/3-days-with-greg-young/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My presentation at the Toronto Code Camp 2010</title>
		<link>http://pyxis-tech.com/blog/2010/05/04/vs2010_and_scrum_at_toronto_codecamp/</link>
		<comments>http://pyxis-tech.com/blog/2010/05/04/vs2010_and_scrum_at_toronto_codecamp/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:31:15 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Nouvelles et Événements]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/?p=3156</guid>
		<description><![CDATA[
			
				
			
		
I had a blast meeting new people and sharing experiences writing software. I especially liked Barry Gervin’s keynote on successful product management and Todd Anglin’s talk on HTML5. 
As for me, I did and introductory talk on Scrum and Visual Studio 2010 briefly touching on some of the content of the Professional Scrum Developer course. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F05%2F04%2Fvs2010_and_scrum_at_toronto_codecamp%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F05%2F04%2Fvs2010_and_scrum_at_toronto_codecamp%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>I had a blast meeting new people and sharing experiences writing software. I especially liked Barry Gervin’s keynote on successful product management and Todd Anglin’s talk on HTML5. </p>
<p>As for me, I did and introductory talk on <a href="http://www.slideshare.net/eperpignand/scrum-in-vs2010">Scrum and Visual Studio 2010</a> briefly touching on some of the content of the Professional Scrum Developer course. The training has already started in several countries around the globe: Brazil, Australia and US. I’ll be teaching the <a href="http://pyxis-tech.com/en/services/formation/liste-de-cours/scrum-developer-dotnet/">Montreal edition</a> that’s coming in June 7th. It’s going to be awesome!</p>
<h5>About the Professional Scrum Developer Course</h5>
<p>The Scrum Developer course is a unique and intensive five-day experience for software developers. The course guides teams on how to turn product requirements into potentially shippable increments of software using the Scrum framework, Visual Studio 2010, and modern software engineering practices. Attendees will work in self-organizing, self-managing teams using a common instance of Visual Studio Team Foundation Server 2010 to achieve this goal. </p>
<p>Course attendees are prepared to take an assessment at course completion and then become Certified Professional Scrum Developers.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/05/04/vs2010_and_scrum_at_toronto_codecamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated Unit Tests as documentation</title>
		<link>http://pyxis-tech.com/blog/2010/03/24/automated-unit-tests-as-documentation/</link>
		<comments>http://pyxis-tech.com/blog/2010/03/24/automated-unit-tests-as-documentation/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 10:00:16 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Développement logiciel]]></category>
		<category><![CDATA[Syndicated posts]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/?p=2529</guid>
		<description><![CDATA[
			
				
			
		
Introduction
In our quest to produce quality software and our relentless use of automated unit tests in our development activities, we’ve come to realize they possess other virtues as well. One of those being they stand as a documentation of the system being developed. I’ve taught this idea in several agile and TDD courses. In this [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F03%2F24%2Fautomated-unit-tests-as-documentation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F03%2F24%2Fautomated-unit-tests-as-documentation%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<h3>Introduction</h3>
<p>In our quest to produce quality software and our relentless use of automated unit tests in our development activities, we’ve come to realize they possess other virtues as well. One of those being they stand as a documentation of the system being developed. I’ve taught this idea in several agile and TDD courses. In this blog I want to give you an example of how that may be. I’m purposely not discussing executable specifications and Behaviour Driven Development as it would make this blog too long. My goal is to show how using some convention and Visual Studio 2010 can go a long way in cranking up your unit tests another notch.</p>
<h3>Documentation of API usage</h3>
<p>One clever use of unit tests is for learning a new API or even a new language. Writing several assertions to validate our understanding and assumptions about an API usage is very rewarding as the feedback is rapid and progress towards a goal is constantly measured. These learning tests may be kept around to document the assumptions made that constitute the basis of our solution. Here is an example of a learning test for the <code>Character.IsWhiteSpace()</code> method of the BCL.</p>
<p><code><br />
[TestMethod]<br />
[Description(@"White spaces are the following characters: ' ', '\t', '\n', '\r'")]<br />
public void May_be_a_white_space()<br />
{<br />
&nbsp;&nbsp;Assert.IsTrue(char.IsWhiteSpace(' '));<br />
&nbsp;&nbsp;Assert.IsTrue(char.IsWhiteSpace('\n'));<br />
&nbsp;&nbsp;Assert.IsTrue(char.IsWhiteSpace('\t'));<br />
&nbsp;&nbsp;Assert.IsTrue(char.IsWhiteSpace('\r')); </p>
<p>&nbsp;&nbsp;Assert.IsFalse(char.IsWhiteSpace('A'));<br />
&nbsp;&nbsp;Assert.IsFalse(char.IsWhiteSpace('+'));<br />
}<br />
</code></p>
<p>A test can also document how to use the classes we create in our solutions. The following is an example of such a test. In our chess software, this unit test documents the way of obtaining a chess piece which is to call the <code>NewPiece()</code> factory method and passing it a color (either <code>Color.White</code> or <code>Color.Black</code>) and a Kind (such as <code>Kind.Pawn</code>) as arguments.</p>
<p><code><br />
[TestMethod]<br />
[Description("A chess piece consists of a kind and a color that are specified when the piece is created")]<br />
public void Should_retain_its_color()<br />
{<br />
&nbsp;&nbsp;Piece pawn = Piece.NewPiece(Color.Black, Kind.Pawn);<br />
&nbsp;&nbsp;Assert.IsTrue(pawn.IsBlack);<br />
&nbsp;&nbsp;Assert.IsFalse(pawn.IsWhite); </p>
<p>&nbsp;&nbsp;pawn = Piece.NewPiece(Color.White, Kind.Pawn);<br />
&nbsp;&nbsp;Assert.IsTrue(pawn.IsWhite);<br />
&nbsp;&nbsp;Assert.IsFalse(pawn.IsBlack);<br />
}<br />
</code></p>
<h3>Documentation of behaviours</h3>
<p>Unit tests document behaviours of our code. Test classes should  be given names that provide context for all the test methods they contain.</p>
<p><code><br />
[TestClass]<br />
public class When_displaying_a_board<br />
{<br />
&nbsp;&nbsp;[TestMethod]<br />
&nbsp;&nbsp;public void A_black_queen_should_show_as_Q()<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;…<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;…<br />
}<br />
</code></p>
<p>Test methods should also be named in such a way that the behaviour they validate is evident.</p>
<p><code><br />
[TestMethod]<br />
[Description("The board is displayed on 8 lines with blacks pieces on line 8 and 7 and white pieces on lines 1 and 2")]<br />
public void It_should_show_all_pieces_in_their_initial_position()<br />
{<br />
&nbsp;&nbsp;Assert.AreEqual(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"RNBQKBNR".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"PPPPPPPP".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"........".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"........".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"........".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"........".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"pppppppp".Line() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;"rnbqkbnr".Line(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;board.ToString()<br />
&nbsp;&nbsp;);<br />
}<br />
</code></p>
<p>Notice that, instead of writing comments, I’m using the Description attribute to tie the behaviour being tested with some requirement or specification of the system. Personally, I’m not doing anything fancy with these descriptions, but you can imagine using a pattern that would provide more traceability in your environment as in the following.</p>
<p><code><br />
[TestMethod]<br />
[Description("US 234: Black pawns are shown as P, white pawns are shown as p")]<br />
public void A_white_pawn_should_show_as_p()<br />
{<br />
&nbsp;&nbsp;Piece whitePawn = Piece.NewPiece(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color.White,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kind.Pawn);<br />
&nbsp;&nbsp;Assert.AreEqual("p", whitePawn.ToString());<br />
}<br />
</code></p>
<h3>Documentation of design specifications</h3>
<p>Now comes the fun part! Because of the thought we’ve put in selecting meaningful names when the tests are executed in Visual Studio we get a result screen that looks like this.</p>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-naming.png"><img src="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-naming.png" alt="Explicit names" width="581" height="273" class="alignnone size-full wp-image-2532" /></a> </p>
<p>Notice how combining our test class and method names reads like a phrase that documents the design of our software. If we group the results by Description, we get a list of all the requirements of our software.</p>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-specifications.png"><img src="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-specifications.png" alt="descriptions as specifications" width="812" height="329" class="alignnone size-full wp-image-2530" /></a></p>
<p>If we expand one of the requirements, we see all the tests that validate it so we can trace back to the code that implements it.</p>
<p> <a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-pawns.png"><img src="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/TADoc-pawns.png" alt="traceability" width="616" height="98" class="alignnone size-full wp-image-2531" /></a></p>
<h3>Conclusion</h3>
<p>I hope I’ve convinced you that tests can serve as documentation using simple tricks, conventions and tooling you may already have at your disposal. Because this documentation is embedded in code it has a lot more chance of being maintained as the code evolves. These techniques require agreement amongst team members but they foster good practices of choosing explicit names and tying development work with planning activities for traceability purposes.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/03/24/automated-unit-tests-as-documentation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coding and Debugging in Bubbles</title>
		<link>http://pyxis-tech.com/blog/2010/03/12/coding-and-debugging-in-bubbles/</link>
		<comments>http://pyxis-tech.com/blog/2010/03/12/coding-and-debugging-in-bubbles/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 19:45:06 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Développement logiciel]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/?p=2420</guid>
		<description><![CDATA[
			
				
			
		
A new concept for the modern IDE, Code Bubbles allows developers to see and work different fragments of code as one unit. Debugging sessions can be associated with those units save and retrieved later for continued work. Quite impressive! It’s really a departure from the IDEs we’ve been using so far. Of course, this is [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F03%2F12%2Fcoding-and-debugging-in-bubbles%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F03%2F12%2Fcoding-and-debugging-in-bubbles%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/800px-Bubble_brokenchopstick.jpg"><img src="http://pyxis-tech.com/blog/wp-content/uploads/2010/03/800px-Bubble_brokenchopstick-300x164.jpg" alt="" width="300" height="164" class="alignleft size-medium wp-image-2422" /></a>A new concept for the modern IDE, <a href="http://www.cs.brown.edu/people/acb/codebubbles_site.htm">Code Bubbles</a> allows developers to see and work different fragments of code as one unit. Debugging sessions can be associated with those units save and retrieved later for continued work. Quite impressive! It’s really a departure from the IDEs we’ve been using so far. Of course, this is not mainstream yet. Nevertheless,  I would like to try something like that and it would probably be interesting to have the equivalent in the .Net space.</p>
<p>I have to wonder though, what the impact will be on Object Oriented Programming and encapsulation if developers are lead to think of their code as fragments of functionality scattered in their code base…</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/03/12/coding-and-debugging-in-bubbles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FizzBuzz à la façon LINQ</title>
		<link>http://pyxis-tech.com/blog/2010/02/15/fizzbuzz-a-la-facon-linq/</link>
		<comments>http://pyxis-tech.com/blog/2010/02/15/fizzbuzz-a-la-facon-linq/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 13:24:21 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Développement logiciel]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/?p=2173</guid>
		<description><![CDATA[
			
				
			
		
Dernièrement mes collègues et moi exécutions le Kata FizzBuzz dans le cadre de notre Dojo pratiques d’ingénierie. L’objectif était de pratiquer le développement piloté par les tests. Je dois avouer que ce fut fort amusant et la solution à laquelle nous sommes arrivés est tout à fait adéquate et présente un modèle objet élégant qui [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F02%2F15%2Ffizzbuzz-a-la-facon-linq%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F02%2F15%2Ffizzbuzz-a-la-facon-linq%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><img src="http://pyxis-tech.com/blog/wp-content/uploads/2010/02/ClassDiagram1-300x276.png" alt="Modèle" width="300" height="276" class="alignleft size-medium wp-image-2177" />Dernièrement mes collègues et moi exécutions le Kata FizzBuzz dans le cadre de notre Dojo pratiques d’ingénierie. L’objectif était de pratiquer le développement piloté par les tests. Je dois avouer que ce fut fort amusant et la solution à laquelle nous sommes arrivés est tout à fait adéquate et présente un modèle objet élégant qui résoud le problème.  </p>
<p>La séquence FizzBuzz est générée par la méthode CountTo de la classe FizzBuzz. Cette dernière utilise un ensemble de règles qui vérifient si elles s’appliquent et transforment, le cas échéant, l’entier question soit en “Fizz”, “Buzz” ou “FizzBuzzz”.</p>
<p><code>class FizzBuzz<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;private readonly IRule[] _rules = new IRule[] {<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FizzBuzzRule(),<br />
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new BuzzRule(),<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FizzRule()<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}; </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private readonly IRule _defaultRule = new NumberRule(); </p>
<p>   &nbsp;&nbsp;&nbsp;&nbsp; public string[] CountTo(int upperBound)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var sequence = new List(); </p>
<p>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (var n in NumbersUpTo(upperBound))<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sequence.Add(Interpret(n));<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return RespondWith(sequence);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static IEnumerable NumbersUpTo(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ( int i = 1; i &lt;= n; i++)<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield return i;<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private string Interpret(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach (var rule in _rules)<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rule.Applies(n)) return rule.Apply(n);<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return _defaultRule.Apply(n);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private string[] RespondWith(List result)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result.ToArray();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code><br />
La classe FizzRule est un exemple d’implémentation d’une rèlge.</p>
<p><code>class FizzRule : IRule<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;public bool Applies(int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ShouldSayFizz(number);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static bool ShouldSayFizz(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return IsDivisibleByThree(n) || ContainsThree(n);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static bool IsDivisibleByThree(int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number % 3 == 0;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static bool ContainsThree(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n.ToString().Contains("3");<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public string Apply(int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return SayFizz();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static string SayFizz()<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Fizz;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private const string Fizz = "fizz";</p>
<p>}<br />
</code></p>
<p>Plus tard, je me suis demandé de quoi aurait l’air la solution si j’utilisais les fonctionnalités du langage C# 3.0 telles que LINQ, les expressions lambda et les méthodes d’extension. Avec notre batterie de tests comme garde-fou je me suis lancé dans une session de refactorisation au bout de laquelle je suis arrivé à la solution que je présente plus loin.</p>
<p>Les premières pistes que je choisis d’explorer sont les méthodes que Resharper suggère de changer en méthodes statiques. En fait, les méthodes statiques me font toujours penser à des méthodes utilitaires qui en général sont très réutilisables. C’est le cas par exemple des méthodes <code>IsDivisibleByThree </code> et <code>ContainsThree </code>de la classe <code>FizzRule </code>plus haut. Je les rassemble donc dans la classe <code>IntExtensions </code> après avoir introduit un peu de généricité pour qu’elles soient utilisables également dans la classe <code>BuzzRule</code>.</p>
<p><code>public static class IntExtensions<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;public static bool Contains(this int n, int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n.ToString().Contains(number.ToString());<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public static bool IsDivisibleBy(this int number, int dividend)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number % dividend == 0;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code><br />
Avec ces modifications, la méthode <code>ShouldSayFizz </code>se lit comme suit:</p>
<p><code>private static bool ShouldSayFizz(int n)<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;return n.IsDivisibleBy(3) || n.Contains(3);<br />
} </code><br />
Je suis content car la lisibilité du code n’en souffre pas. Je m’attaque de la même façon à la méthode <code>NumbersUpTo </code>de la classe <code>FizzBuzz</code>. J’en fais une méthode d’extension que je rajoute à la classe <code>IntExtensions</code>. Je prends le soin de renommer la méthode <code>FirstNumbers </code>pour une meilleure lisibilité du code client qui se lira </p>
<p><code>foreach(int number in n.FirstNumbers()) { … }</code></p>
<p>Cela me rappelle mon cours d’analyse et la série des n premiers nombres entiers… En fouillant un peu dans MSDN, je retrouve comment générer une suite d’entiers grâce à la classe <code>Ennumerable</code> et je modifie mon implémentation en conséquence. J’obtiens le résultat suivant</p>
<p><code>public static class IntExtensions<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;public static IEnumerable FirstNumbers(this int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Enumerable.Range(1, n);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public static bool Contains(this int n, int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return n.ToString().Contains(number.ToString());<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public static bool IsDivisibleBy(this int number, int dividend)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number % dividend == 0;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code><br />
Avec ces méthodes utilitaires hors de la classe <code>FizzRule</code>, la responsabilité de celle-ci devient plus évidente et je la simplifie pour arriver au résultat suivant</p>
<p><code>class FizzRule : IRule<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;public const string Fizz = "fizz";<br />
    &nbsp;&nbsp;&nbsp;&nbsp;private const int Three = 3;</p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public bool AppliesTo(int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return number.IsDivisibleBy(Three) ||  number.Contains(Three);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;public string Apply(int number)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Fizz;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code><br />
Une bonne chose de faite! Je tourne mon attention vers la classe <code>FizzBuzz</code>. Même si j’ai sorti la génération des nombres entiers hors de cette classe, elle a encore trop de responsabilités:  maintenir la liste des règles FizzBuzz, appliquer les règles qui conviennent, formater le résultat. C’est une violation évidente du principe de responsabilité unique (<a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single Responsibility Principle</a>) de l’oncle Bob. Je décide donc séparer tout ce qui touche à la transformation FizzBuzz dans une classe à part. Les règles et tranformations FizzBuzz sont maintenant rendues dans la classe <code>FizzzBuzzExtensions</code>. J’ai changé l’implémentation pour utiliser LINQ étant donné que le résultat est plus compacte et tout de même très lisible.</p>
<p><code>static class FizzBuzzExtensions<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;internal static IEnumerable AsFizzBuzzSequence (this IEnumerable sequence)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sequence.Select(numeral =&gt; Transform(numeral));<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static string Transform(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return FirstRuleThatApliesTo(n).Apply(n);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static IRule FirstRuleThatApliesTo(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Rules.First(r =&gt; r.AppliesTo(n));<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;private static readonly IRule[] Rules = new IRule[] {<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FizzBuzzRule(),<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new BuzzRule(),<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new FizzRule(),<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new NumberRule()<br />
    &nbsp;&nbsp;&nbsp;&nbsp;};<br />
} </code></p>
<p>L’astuce d’encapsuler cette fonctionnalité en arrière d’une méthode d’extension facilite grandement la lecture de la classe <code>FizzBuzz </code>qui devient </p>
<p><code>class FizzBuzz<br />
{<br />
    &nbsp;&nbsp;&nbsp;&nbsp;public string[] CountTo(int n)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return RespondWith(n.FirstNumbers().AsFizzBuzzSequence());<br />
    &nbsp;&nbsp;&nbsp;&nbsp;} </p>
<p>    &nbsp;&nbsp;&nbsp;&nbsp;internal static string[] RespondWith(IEnumerable result)<br />
    &nbsp;&nbsp;&nbsp;&nbsp;{<br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result.ToArray();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</code><br />
Séparer ainsi les responsabilités dans différentes classes a grandement augmenté la clareté du design. De plus l’utilisation de LINQ et des méthodes d’extension fait en sorte que le code est très compacte quoique très expressif. À vous d&#8217;en jugez. Voyez-vous d&#8217;autres pistes d&#8217;améliorations ?</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/02/15/fizzbuzz-a-la-facon-linq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Coaching Session</title>
		<link>http://pyxis-tech.com/blog/2010/01/29/a-coaching-session/</link>
		<comments>http://pyxis-tech.com/blog/2010/01/29/a-coaching-session/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 18:51:26 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Coaching]]></category>

		<guid isPermaLink="false">http://pyxis-tech.com/blog/?p=1990</guid>
		<description><![CDATA[
			
				
			
		
Following is a conversation I had with a new Scum Master that had me thinking about how coaching works. It&#8217;s not about telling people what to do but allowing them to figure out what needs to bo done. One powerful tool to do just that is changing perspectives. Reliving the facts as they happened but [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F01%2F29%2Fa-coaching-session%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2010%2F01%2F29%2Fa-coaching-session%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Following is a conversation I had with a new Scum Master that had me thinking about how coaching works. It&#8217;s not about telling people what to do but allowing them to figure out what needs to bo done. One powerful tool to do just that is changing perspectives. Reliving the facts as they happened but from a different angle may generate insights that open new opportunities for the coachee. Below is the conversation as I remember it. I hope it generates some insights for you as well.</p>
<p><strong>SM:</strong> So what do you think about the sprint planning the other day ?</p>
<p><strong>Coach:</strong> Well one thing I noticed, and I did mention it on the spot, the team was about to bend some process improvement rules they agreed on implementing during the last retrospective. Your role as a Scrum Master is to make sure that the team follows its own process so that they may inspect and adapt it if need be. If the team partially implements the process in some cases and fully in some others, than interpretation of the results is more difficult and it will be harder to see what to improve next. You want to be careful when introducing changes to a process so that you know what you will be inspecting in the end.</p>
<p><strong>SM:</strong> Well you are right. Sticking to our decision not to include big or unclear stories in the sprint made us realize that we were accepting to tackle underspecified functionality. No wonder our estimates were off and we were not able to complete all the stories in the sprint.</p>
<p><strong>Coach:</strong> Good. But what about you ? What do you think about the sprint planning meeting ?</p>
<p><strong>SM:</strong> Well, one thing that bugs me is that team members don’t participate in the process.</p>
<p><strong>Coach:</strong> Oh? What do you mean ?</p>
<p><strong>SM:</strong> I mean they don’t seem to care or are not motivated. For instance, in our Scrum Masters group we thought it would be a good idea to let developers take turn at the Scrum Master’s role in the daily meeting so that they realize what we are dealing with. When I asked my team if one of them would like to take my place I had to wait for a long time before someone reluctantly offered to conduct the daily.</p>
<p><strong>Coach:</strong> So you want them to feel what it’s like to wear your shoes ?</p>
<p><strong>SM:</strong> It’s not that. It’s just that team members are not getting involved. You witnessed what happened at the sprint planning meeting. When I asked them if they were able to commit on delivering the sprint backlog, I didn’t get an answer.</p>
<p><strong>Coach:</strong> Well your organisation has a culture in which developers have been told what to do, when and how to do things. The change to self organisation is not going to happen overnight.</p>
<p><strong>SM:</strong> I know. That’s why I want them to get involved in the process but they don’t want to get onboard.</p>
<p><strong>Coach:</strong> And why do you think the don’t want to get onboard ?</p>
<p><strong>SM:</strong> I don’t know. And that’s why I’m asking you this because I’m running out of ideas.</p>
<p><strong>Coach:</strong> So… What are you doing that’s impeding them from getting involved in the process ?</p>
<p><strong>SM:</strong> I’m not sure I understand the question… What do you mean ?</p>
<p><strong>Coach:</strong> When you are not getting the response you’re expecting from others it’s often useful to consider that you are the one causing them to act the way they do. This empowers you to make some changes instead of waiting for others to change their behaviour.</p>
<p><strong>SM:</strong> I’m not following you at all…</p>
<p><strong>Coach:</strong> Ok. So let’s go back to that sprint planning meeting. Remember how the room was laid out and where everyone was sitting. You remember ?</p>
<p><strong>SM:</strong> Yeah…</p>
<p><strong>Coach:</strong> Let’s say you take John’s place. What do you see ?</p>
<p><strong>SM:</strong> I’m really not sure where you want to go with this… But the only thing I see is that the monitor is too far away and its difficult to read.</p>
<p><strong>Coach:</strong> Well that’s something to consider. And what are you doing in the meantime ?</p>
<p><strong>SM:</strong> I’m updating the backlog and moving stuff around.</p>
<p><strong>Coach:</strong> And how do you think John is perceiving this given the organisational culture ?</p>
<p><strong>SM:</strong> I see… So we should probably use index cards that team members will be able to play with and update themselves.</p>
<p><strong>Coach:</strong> Good! That way you solve two problems. By giving the team access to the sprint backlog you allow them to grasp more fully and own its content. They’ll probably feel more comfortable committing to it at the end.</p>
<p><strong>SM (not really listening anymore):</strong> I can even update the backlog in the tool afterwards so that the flow is not interrupted. Thank you. That’s a great idea!</p>
<p><strong>Coach:</strong> Well you know it wasn’t my idea. It’s yours. You just had to change your perspective on things.</p>
<p><strong>SM (already leaving):</strong> Good. I’ll let you know how it turns out. Talk to you soon.</p>
<p><strong>Coach (to himself):</strong> I’m not really sure what he saw exactly, but changing his perspective really allowed him to find new ideas on how to tackle this issue. This coaching stuff really works… I should blog this…</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2010/01/29/a-coaching-session/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comment une équipe Agile fait-elle pour s&#8217;assurer que les composants logiciels développés par différents membres vont s&#8217;arrimer entre eux?</title>
		<link>http://pyxis-tech.com/blog/2008/08/12/comment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles/</link>
		<comments>http://pyxis-tech.com/blog/2008/08/12/comment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 00:11:31 +0000</pubDate>
		<dc:creator>ernst perpignand</dc:creator>
				<category><![CDATA[Agile]]></category>

		<guid isPermaLink="false">http://8.17.172.187:10010/blog/2008/08/12/comment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles/</guid>
		<description><![CDATA[
			
				
			
		
Lors d&#8217;une journée portes ouvertes organisée par Pyxis pour rencontrer des candidats potentiels, plusieurs d&#8217;entre eux ont manifesté leur intérêt pour les méthodes Agiles dont la popularité ne cesse de grandir. Toutefois, quand nous leur avons présenté les fondements des méthodes Agiles âˆ’ à savoir qu&#8217;une équipe Agile valorise plus les personnes et les interactions [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2008%2F08%2F12%2Fcomment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fpyxis-tech.com%2Fblog%2F2008%2F08%2F12%2Fcomment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>Lors d&#8217;une journée portes ouvertes organisée par Pyxis pour rencontrer des candidats potentiels, plusieurs d&#8217;entre eux ont manifesté leur intérêt pour les méthodes Agiles dont la popularité ne cesse de grandir. Toutefois, quand nous leur avons présenté les fondements des méthodes Agiles âˆ’ à savoir qu&#8217;une équipe Agile valorise plus les personnes et les interactions que les processus et outils, un logiciel fonctionnel qu&#8217;une documentation exhaustive, une collaboration avec le client que la négociation d&#8217;un contrat, une adaptation au changement que le respect d&#8217;un plan préétabli âˆ’, nous avons semblé prendre à contre-pied les façons de faire élaborées pour contrer le manque de professionnalisme causant la déroute d&#8217;un bon nombre de projets informatiques qu&#8217;un scepticisme très sain les a poussés à poser quelques questions pertinentes. L&#8217;une d&#8217;entre elles était la suivante : comment, sans processus et documentation, peut-on espérer que les composants développés par différents membres d&#8217;une équipe s&#8217;arrimeront correctement entre eux?</p>
<p>Ce n&#8217;est certes pas la question la plus importante lorsque l&#8217;on pense au développement logiciel en mode Agile, toutefois s&#8217;y attarder quelques instants nous révèle certaines caractéristiques fondamentales de nos pratiques que nous avons tendance à négliger à force de les appliquer machinalement. Faire cet exercice est intéressant car, en prétendant faire table rase des façons de faire traditionnelles, nous devons par la même occasion indiquer comment les méthodes alternatives proposées abordent les problématiques auxquelles sont confronté les méthodes traditionnelles. Sans aucune prétention méthodologique, nous allons tout d&#8217;abord nous intéresser à la manière traditionnelle d&#8217;assurer la cohérence des différents composants d&#8217;un logiciel pour ensuite montrer comment, à partir des valeurs du manifeste Agile mentionné plus haut (c.-à-d. fondements des méthodes Agiles), une équipe Agile réussit à atteindre le même objectif. Nous laisserons au lecteur le soin de juger de l&#8217;efficacité de chacune des approches.</p>
<h3>Méthodes traditionnelles</h3>
<p>Dans le but d&#8217;assurer la cohérence du logiciel développé, les méthodes traditionnelles s&#8217;appuient sur un processus rigoureux dont chacune des étapes utilise les résultats fournis par l&#8217;étape précédente et complète entièrement toutes les activités prévues pour valider les résultats qui seront fournis à l&#8217;étape subséquente. C&#8217;est l&#8217;approche classique des méthodes dites en cascade. L&#8217;expérience ayant montré que les coûts associés à la détection et à la correction des erreurs grandissent avec le degré d&#8217;implantation du logiciel, ces méthodes tentent d&#8217;en minimiser les impacts en précisant dans le moindre détail le travail à réaliser avant de procéder à l&#8217;étape suivante. Ainsi, en début de projet, tous les éléments requis sont recueillis, analysés et documentés dans le but de circonscrire le système. Par la suite, un design élaboré est conçu et validé théoriquement par rapport à l&#8217;ensemble des éléments requis. C&#8217;est généralement à cette étape que l&#8217;équipe s&#8217;attaque à l&#8217;arrimage des différents composants du logiciel. Ce design est alors expliqué dans un document d&#8217;architecture qui servira de référence pour les prochaines étapes d&#8217;implémentation, de tests et de déploiement. Ainsi, l&#8217;étape de design élaboré joue un rôle clé dans ce type de processus car beaucoup d&#8217;efforts intellectuels sont déployés pour arriver à l&#8217;architecture la plus complète, la plus cohérente et la mieux documentée possible. Le document d&#8217;architecture joue également un rôle crucial en étant le principal outil sur lequel l&#8217;équipe s&#8217;appuie pour s&#8217;assurer de la cohérence du logiciel.</p>
<p>Voilà pour les méthodes traditionnelles. Maintenant, comment les méthodes Agiles font-elles pour s&#8217;assurer de la cohérence du logiciel? D&#8217;entrée de jeu, rappelons que le rejet de processus, d&#8217;outils et de documentation comme nous le percevons à la lecture du manifeste Agile semble être une recette pour une tour de Babel. Effectivement, sans ces moyens de contrôle, comment espérer garder la cohérence?</p>
<h3>Méthodes Agiles</h3>
<p>Lorsqu&#8217;on leur pose cette question, les experts Agiles nuancent presque systématiquement leurs propos en disant que les méthodes Agiles n&#8217;excluent pas tout processus et toute documentation mais plutôt privilégient d&#8217;autres moyens tels l&#8217;interaction entre les différents partis et un logiciel fonctionnel. À mon sens, cette réponse, quoique juste, laisse beaucoup à désirer car elle ne fait qu&#8217;éviter la question. Nous ne savons toujours pas comment ces interactions assurent l&#8217;arrimage des différents modules qui composent le logiciel sur lequel les équipes Agiles mettent tant l&#8217;accent. Et si les méthodes Agiles s&#8217;en remettent de toute façon à des processus et à de la documentation lorsque le besoin se fait sentir, alors pourquoi tout cet engouement pour ces soi-disant nouvelles approches? Devant l&#8217;insistance des sceptiques, les experts fournissent souvent en guise de réponse la réplique suivante : les équipes Agiles misent beaucoup sur la communication face à face.</p>
<h4>Communication face à face</h4>
<p>En général, les membres d&#8217;une équipe Agile se rencontrent fréquemment pour faire le point sur l&#8217;avancement du projet. Dans le cadre de SCRUM par exemple, la mêlée quotidienne fournie l&#8217;occasion idéale pour que les problèmes d&#8217;incohérence soient exposés et les personnes concernées avisées. Ces dernières pourront par la suite s&#8217;attaquer à la résolution du problème de la manière qui convient. De plus, les fins d&#8217;itération fournissent une autre occasion à l&#8217;équipe de démontrer ce qui à été accompli et de réorienter les activités de développement en se basant sur ce qui a été appris. Précisons que ces occasions utilisent l&#8217;un des canaux de communication les plus riches, à savoir l&#8217;échange face à face qui, contrairement à la documentation écrite, favorise la participation de tous les membres de l&#8217;équipe. Par ailleurs, les développeurs d&#8217;une équipe agile improvisent fréquemment des séances de modélisation autour d&#8217;un tableau qui enrichit d&#8217;avantage la communication en permettant la visualisation des modèles évoqués. Cette communication est constante tout au long du projet et garde une certaine cohésion au sein de l&#8217;équipe.</p>
<h4>Modélisation Agile</h4>
<p>Pourtant, il y a un hic. Si l&#8217;échange face à face est le canal de communication le plus riche, il est aussi le plus volatile. Ce qui est convenu lors de ces rencontres, s&#8217;il n&#8217;est pas pérennisé dans un document quelconque, risque de ne pas survivre au-delà de la mémoire ou du départ des participants qui y étaient présents. De plus, en absence totale de documentation, l&#8217;arrivée de nouveaux membres dans l&#8217;équipe exige la reprise de ces conversations qui à la longue deviennent ennuyeuses. À cet égard, les principes de la modélisation Agile fournissent des pistes de solution quant à la production, à la conservation et à la mise à jour des modèles élaborés lors de ces rencontres. Et là, il faut tout de même faire attention de ne pas retomber dans les mêmes pièges des méthodes traditionnelles à savoir que le document est roi et unique détenteur de vérité.</p>
<p>Mais ne sommes-nous pas retournés à la case départ? Si nous faisons abstraction des autres avantages des méthodes Agiles et que nous nous concentrons uniquement sur la façon d&#8217;assurer la cohérence du logiciel, nous retrouvons-nous seulement avec plus de communication face à face et une manière plus légère de documenter? Est-ce suffisant pour garder le tout cohérent? À mon avis, c&#8217;est loin d&#8217;être certain et, heureusement, c&#8217;est là que les pratiques d&#8217;ingénierie Agiles viennent à la rescousse.</p>
<h4>Pratiques d&#8217;ingénierie Agiles</h4>
<p>En valorisant plus un logiciel fonctionnel qu&#8217;une documentation exhaustive, les  équipes Agiles déploient beaucoup d&#8217;efforts pour s&#8217;assurer que tel est bien le cas en adoptant les pratiques d&#8217;ingénierie ci-dessous.</p>
<h5>Tests automatisés</h5>
<p>Habituellement écrits par les développeurs, ces tests vérifient que le code se comporte tel qu&#8217;il était prévu. On parle de la stratégie Â« tester en premier Â» lorsque les tests sont écrits avant le code qu&#8217;ils sont supposés valider. Cette stratégie est privilégiée pour les tests unitaires, qui vérifient le bon fonctionnement du code en isolation des systèmes externes tels qu&#8217;un serveur d&#8217;applications ou une base de données. Lorsque les tests sont écrits après le code, on parle de la stratégie Â« tester en dernier Â» qui est plus appropriée pour les tests fonctionnels ou d&#8217;intégration. Dans les deux cas, le fait que ces tests soient automatisés donne la possibilité à l&#8217;équipe de s&#8217;assurer de l&#8217;intégrité du logiciel à n&#8217;importe quel moment, et ce, à faible coût. De plus, cette batterie de tests constitue un filet de sécurité protégeant contre d&#8217;éventuelles défectuosités qui risquent d&#8217;être introduites par des modifications insouciantes apportées pour implémenter de nouvelles fonctionnalités requises. Par ailleurs, les tests automatisés, surtout lorsqu&#8217;ils sont écrits en premier, constituent une documentation toujours à jour du logiciel puisqu&#8217;en quelque sorte ils en spécifient le comportement. Finalement, on encourage chaque développeur à fournir avec ses modifications l&#8217;ensemble des tests validant leur comportement.</p>
<h5>Intégration continue</h5>
<p>Afin de minimiser les coûts d&#8217;assemblage du logiciel, les équipes Agiles ont l&#8217;habitude d&#8217;en automatiser complètement le processus. Pour profiter au maximum de cette automatisation, les tests de développeurs mentionnés plus haut sont également inclus dans ce processus de telle sorte qu&#8217;avec une ligne de commande il est possible de s&#8217;assurer de l&#8217;intégrité du logiciel avant de soumettre les modifications au dépôt central de code source. Toutefois, cela ne s&#8217;arrête pas là. Ce processus est exécuté sur un serveur d&#8217;intégration à chaque fois que des modifications sont soumises au dépôt de code source afin de valider l&#8217;intégrité du logiciel dans un environnement qui se rapproche de celui dans lequel il sera déployé. Par la suite, un indicateur de réussite est transmis aux membres de l&#8217;équipe qui sont ainsi informés en permanence de l&#8217;état de santé du logiciel. L&#8217;équipe a alors les outils en place pour s&#8217;engager à toujours maintenir le système en bonne santé en vérifiant le résultat du processus d&#8217;assemblage avant de soumettre les modifications au dépôt central et en corrigeant immédiatement les problèmes d&#8217;intégration qui sont révélés sur le serveur d&#8217;intégration. L&#8217;ensemble de ces pratiques constituent le mode d&#8217;intégration continue.</p>
<h5>Propriété collective du code</h5>
<p>Dans une équipe qui met en oeuvre les tests automatisés de développeurs et l&#8217;intégration continue, il arrive souvent qu&#8217;un développeur fasse échouer un test qu&#8217;il n&#8217;a pas écrit. Une modification est donc requise soit au test, soit au code associé à ce test car l&#8217;un ou l&#8217;autre ne correspond plus aux nouvelles règles d&#8217;affaires codifiées par les modifications. Ce test qui échoue a un impact sur l&#8217;échéance du projet car le développeur ne peut pas intégrer ces modifications au dépôt central étant donné qu&#8217;elles vont faire échouer le processus d&#8217;assemblage automatisé. Pour minimiser l&#8217;impact, les équipes Agiles pratiquent la propriété collective du code, qui permet à un développeur de modifier n&#8217;importe quelle partie du code même s&#8217;il n&#8217;en est pas l&#8217;auteur. Bien sûr, la batterie de tests existante rend possible cette appropriation du code d&#8217;autrui, et le développeur est encouragé à rajouter autant de tests qu&#8217;il faut pour préciser et valider sa compréhension du code en question.</p>
<h5>La programmation en binôme</h5>
<p>Une pratique Agile qui aide beaucoup à la propriété collective du code est la programmation en binôme. Cette pratique veut qu&#8217;il y ait toujours deux développeurs à travailler sur une partie du code. Par exemple, le développeur ayant fait échouer un test qu&#8217;il n&#8217;a pas écrit peut se faire accompagner par l&#8217;auteur original du code pour s&#8217;assurer que la logique initiale ne soit pas complètement dénaturée si ce n&#8217;est pas nécessaire. Cette pratique favorise également la dissémination de la connaissance du logiciel puisque les paires formées ne sont pas statiques. Chaque développeur a donc la possibilité d&#8217;apprendre plusieurs parties du code en compagnie de ceux qui les ont conçues tout en enrichissant les fonctionnalités du logiciel.</p>
<h3>Conclusion</h3>
<p>La synergie existant entre ces pratiques décuple leurs effets sur la production de code de qualité et, exception faite de la programmation en binôme, il est rare de voir une équipe Agile adopter l&#8217;une d&#8217;elles sans les autres. La raison en est fort simple : l&#8217;ensemble de ces pratiques permet de livrer de nouvelles fonctionnalités itération après itération tout en s&#8217;assurant de la bonne santé du logiciel. Dans le cas qui nous intéresse, une équipe Agile investirait sans doute dans l&#8217;écriture de plusieurs tests d&#8217;intégration qui démontreraient le bon comportement des différents modules. Ces tests seraient inclus dans un processus d&#8217;assemblage automatisé de façon à révéler toute anomalie au niveau de l&#8217;intégration des modules. Ce processus d&#8217;assemblage serait exécuté en mode d&#8217;intégration continue réduisant ainsi au minimum le temps de réaction de l&#8217;équipe qui s&#8217;engagerait à toujours maintenir le logiciel en bonne santé. Chaque membre de l&#8217;équipe aurait le droit de corriger toute partie défectueuse du logiciel et pourrait compter sur l&#8217;aide d&#8217;un coéquipier pour le faire. Alors, la prochaine fois qu&#8217;on vous demandera comment une équipe Agile, sans documentation et ni processus lourd, s&#8217;assure de la cohérence des modules développés par différents membres de l&#8217;équipe, vous pourrez répondre : tout simplement en s&#8217;assurant en permanence que les modules fonctionnent bien entre eux.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://pyxis-tech.com/blog/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://pyxis-tech.com/blog/2008/08/12/comment-une-equipe-agile-fait-elle-pour-s-assurer-que-les-composantes-logicielles-developpees-par-differents-membres-d-une-equipe-vont-s-arrimer-entre-elles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
