<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://blogpro.toutantic.net/wp-atom.php">
	<title type="text">Aurélien Pelletier</title>
	<subtitle type="text">Web,Open source, Agile, Architecture, Java</subtitle>

	<updated>2012-02-20T22:32:03Z</updated>

	<link rel="alternate" type="text/html" href="http://blogpro.toutantic.net" />
	<id>http://blogpro.toutantic.net/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.3.1">WordPress</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/aurelienpelletier" /><feedburner:info uri="aurelienpelletier" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°14 – Agile subway map]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/NMJ-0RK-wfA/" />
		<id>http://blogpro.toutantic.net/?p=920</id>
		<updated>2012-02-20T22:32:03Z</updated>
		<published>2012-02-20T22:32:03Z</published>
		<category scheme="http://blogpro.toutantic.net" term="architecture" />		<summary type="html"><![CDATA[A Web Developers&#8217; View of Play Framework 2.0: With Play, the Back button just works [...]  Play doesn&#8217;t fight HTTP or the browser [...]  As a Java EE developer, PHP and Rails developers have been laughing at us for years La &#8230; <a href="http://blogpro.toutantic.net/2012/02/20/des-tweets-et-des-plus-n14-agile-subway-map/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/' rel='bookmark' title='Des tweets et des plus n°9 – Developeronomics'>Des tweets et des plus n°9 – Developeronomics</a></li>
</ol>]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2012/02/20/des-tweets-et-des-plus-n14-agile-subway-map/">&lt;p&gt;&lt;a href="http://guide.agilealliance.org/subway.html"&gt;&lt;img class="aligncenter size-full wp-image-921" title="agile subway Map" src="http://blogpro.toutantic.net/wp-content/uploads/2012/02/agileMetroMap.png" alt="" width="752" height="421" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://java.dzone.com/articles/play-framework-20-peter-hilton"&gt;A Web Developers&amp;#8217; View of Play Framework 2.0&lt;/a&gt;&lt;/strong&gt;: With Play, the Back button just works [...]  Play doesn&amp;#8217;t fight HTTP or the browser [...]  As a Java EE developer, PHP and Rails developers have been laughing at us for years&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.aubryconseil.com/post/La-pratique-Definition-de-pret-pour-une-story"&gt;La pratique &amp;#8220;Définition de prêt pour une story&amp;#8221;&lt;/a&gt;&lt;/strong&gt;: Une story non prête n&amp;#8217;est pas acceptée dans un sprint qui commence&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://quietlyamused.org/blog/2012/02/19/on-naming/"&gt;On Naming&lt;/a&gt;&lt;/strong&gt;:  The challenge is that the coder is holding two conversations at once, one with the compiler/interpreter and one with the future maintainer&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://danwebb.net/2011/5/28/it-is-about-the-hashbangs"&gt;It&amp;#8217;s About The Hashbangs&lt;/a&gt;&lt;/strong&gt;: Directly addressable content is what makes web apps better than desktop apps. It’s certainly not the UIs.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/' rel='bookmark' title='Des tweets et des plus n°9 – Developeronomics'&gt;Des tweets et des plus n°9 – Developeronomics&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/NMJ-0RK-wfA" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2012/02/20/des-tweets-et-des-plus-n14-agile-subway-map/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2012/02/20/des-tweets-et-des-plus-n14-agile-subway-map/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2012/02/20/des-tweets-et-des-plus-n14-agile-subway-map/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°13 – Polyglot Persistence]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/FKowfH9dtqA/" />
		<id>http://blogpro.toutantic.net/?p=912</id>
		<updated>2012-02-10T12:22:34Z</updated>
		<published>2012-02-10T12:22:34Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[Polyglot Persistence: using multiple data storage technologies, chosen based upon the way data is being used by individual applications. Why store binary images in relational database, when there are better  storage systems Less Process, More Discipline :The key to agile methods is this: You &#8230; <a href="http://blogpro.toutantic.net/2012/02/10/des-tweets-et-des-plus-n13-polyglot-persistence/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2012/02/10/des-tweets-et-des-plus-n13-polyglot-persistence/">&lt;p&gt;&lt;a href="https://plus.google.com/u/0/105491774632943898513/posts/NTtB2FeqtAQ"&gt;&lt;img class="aligncenter size-full wp-image-907" title="i am your father" src="http://blogpro.toutantic.net/wp-content/uploads/2012/01/imayourfather.jpeg" alt="" width="402" height="209" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://martinfowler.com/articles/nosql-intro.pdf"&gt;Polyglot Persistence&lt;/a&gt;&lt;/strong&gt;: using multiple data storage technologies, chosen based upon the way data is being used by individual applications. Why store binary images in relational database, when there are better  storage systems&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.softwarequalityconnection.com/2012/01/less-process-more-discipline/"&gt;Less Process, More Discipline&lt;/a&gt;&lt;/strong&gt; :The key to agile methods is this: You may have less process, but you must have more discipline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.8thlight.com/uncle-bob/2012/02/01/Service-Oriented-Agony.html"&gt;Service Oriented Agony&lt;/a&gt;&lt;/strong&gt;: Unfortunately this is a huge violation of the Single Responsibility Principle — or its big brother the Common Closure Principle. These principles tell us to group together things that change together, and keep apart things that change for different reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://java.dzone.com/articles/how-create-maintainable"&gt;How to Create Maintainable Acceptance Tests&lt;/a&gt;&lt;/strong&gt;: Prefer to test your application via the service layer or at worst the servlet layer; only test on the UI level if you really have to and only as little as possible for UI is much more brittle (and also difficult to test)&lt;br /&gt;
The more you want to test the more you have to pay for it in the terms of maintenance effort. Usually you decide so that you cover the part(s) of the application where the most risk is – the best thing is to do cost-benefit evaluation.&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/FKowfH9dtqA" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2012/02/10/des-tweets-et-des-plus-n13-polyglot-persistence/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2012/02/10/des-tweets-et-des-plus-n13-polyglot-persistence/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2012/02/10/des-tweets-et-des-plus-n13-polyglot-persistence/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°12 – Mega Busted]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/infq1uHwHSo/" />
		<id>http://blogpro.toutantic.net/?p=902</id>
		<updated>2012-01-25T20:26:03Z</updated>
		<published>2012-01-25T20:26:03Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[The GitHub Job Interview: You come up with a cool idea of an open-source project. This becomes your company&#8217;s development sandbox. Candidates are asked to then contribute to the project in some way Languages, Verbosity, and Java: &#8220;A little redundancy in &#8230; <a href="http://blogpro.toutantic.net/2012/01/25/des-tweets-et-des-plus-n12-mega-busted/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blogpro.toutantic.net/2004/11/10/code-search-tools/' rel='bookmark' title='Code Search tools'>Code Search tools</a></li>
</ol>]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2012/01/25/des-tweets-et-des-plus-n12-mega-busted/">&lt;!-- start insertion by YouTube Brackets, robertbuzink.nl --&gt;&lt;span class="youtube"&gt;&lt;object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/1_hP5FVlZlk"&gt; &lt;param name="movie" value="http://www.youtube.com/v/1_hP5FVlZlk" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;/object&gt;&lt;/span&gt;&lt;!-- end Youtube Brackets insertion --&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.gigantt.com/2011/12/github-job-interview.html"&gt;The GitHub Job Interview&lt;/a&gt;&lt;/strong&gt;: You come up with a cool idea of an open-source project. This becomes your company&amp;#8217;s development sandbox. Candidates are asked to then contribute to the project in some way&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.informit.com/articles/article.aspx?p=1824790"&gt;Languages, Verbosity, and Java&lt;/a&gt;&lt;/strong&gt;: &amp;#8220;A little redundancy in a language is a good thing. It&amp;#8217;s important for readability.&amp;#8221; Joshua Bloch&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.allthingsdistributed.com/2012/01/amazon-dynamodb.html"&gt;Amazon DynamoDB&lt;/a&gt;&lt;/strong&gt;: A number of outages at the height of the 2004 holiday shopping season can be traced back to scaling commercial technologies beyond their boundaries&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.nytimes.com/2012/01/25/opinion/friedman-average-is-over.html"&gt;Average Is Over&lt;/a&gt;&lt;/strong&gt;:  the reason we have such stubbornly high unemployment and sagging middle-class incomes today is largely because of the big drop in demand because of the Great Recession, but it is also because of the quantum advances in both globalization and the information technology revolution&lt;/p&gt;
&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blogpro.toutantic.net/2004/11/10/code-search-tools/' rel='bookmark' title='Code Search tools'&gt;Code Search tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/infq1uHwHSo" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2012/01/25/des-tweets-et-des-plus-n12-mega-busted/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2012/01/25/des-tweets-et-des-plus-n12-mega-busted/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2012/01/25/des-tweets-et-des-plus-n12-mega-busted/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°11 – Geeks win]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/1M0EonL7ybs/" />
		<id>http://blogpro.toutantic.net/?p=865</id>
		<updated>2012-01-08T17:34:43Z</updated>
		<published>2012-01-08T17:34:43Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[Shame driven development:  it was throwaway, one-use code so didn’t have any unit tests. I was embarrassed. [...] the only way to go fast, is to go well Cleaning a kitchen is a good metaphor for Refactoring: Neither would a cook accept that &#8230; <a href="http://blogpro.toutantic.net/2012/01/08/des-tweets-et-des-plus-n11-geeks-win/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2012/01/08/des-tweets-et-des-plus-n11-geeks-win/">&lt;p&gt;&lt;a href="https://plus.google.com/photos/102451193315916178828/albums/posts/5694023113460433314"&gt;&lt;img class="aligncenter size-full wp-image-898" title="geeks-vs-nongeeks-repetitive-tasks" src="http://blogpro.toutantic.net/wp-content/uploads/2012/01/geeks-vs-nongeeks-repetitive-tasks.png" alt="" width="800" height="570" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://java.dzone.com/articles/shame-driven-development"&gt;Shame driven development&lt;/a&gt;&lt;/strong&gt;:  it was throwaway, one-use code so didn’t have any unit tests. I was embarrassed. [...] the only way to go fast, is to go well&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.hanoulle.be/2010/04/cleaning-a-kitchen-a-good-metaphor-for-refactoring/"&gt;Cleaning a kitchen is a good metaphor for Refactoring&lt;/a&gt;&lt;/strong&gt;: Neither would a cook accept that I go into his kitchen and say: I want my steak half the price, can’t you not clean the kitchen today? In the software world we let people tell us, do it quick and dirty, you can clean up after, when we have the time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://perfcap.blogspot.com/2011/12/how-netflix-gets-out-of-way-of.html"&gt;How netflix get out of the way&lt;/a&gt;&lt;/strong&gt;: Who has junior engineers, graduate hires and interns writing code? We don&amp;#8217;t. We find that engineers who cost twice as much are far more than twice as productive, and need much less management overhead&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.clever-age.com/veille/blog/a-la-rencontre-d-une-architecture-meconnue-cqrs.html"&gt;CQRS&lt;/a&gt;&lt;/strong&gt;:  est un modèle d’architecture système qui sépare la partie lecture de données (query) de celle qui les modifie (command) de manière à produire un système extensible, distribuable, et fournir quelques avancées utiles qui rendent la maintenance du système moins pesante.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/1M0EonL7ybs" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2012/01/08/des-tweets-et-des-plus-n11-geeks-win/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2012/01/08/des-tweets-et-des-plus-n11-geeks-win/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2012/01/08/des-tweets-et-des-plus-n11-geeks-win/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Another Git branching model]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/A5utC8C2q8I/" />
		<id>http://blogpro.toutantic.net/?p=868</id>
		<updated>2012-01-02T21:39:32Z</updated>
		<published>2012-01-02T21:39:32Z</published>
		<category scheme="http://blogpro.toutantic.net" term="methode" /><category scheme="http://blogpro.toutantic.net" term="code" /><category scheme="http://blogpro.toutantic.net" term="gestion de projet" /><category scheme="http://blogpro.toutantic.net" term="git" />		<summary type="html"><![CDATA[We&#8217;ve switched to git at work a few month ago. Not an easy task but the rewards are worth the trouble. Our branching model was based on Git Flow because it&#8217;s well documented and gives you a structure to start with &#8230; <a href="http://blogpro.toutantic.net/2012/01/02/another-git-branching-model/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blogpro.toutantic.net/2011/08/05/des-tweets-et-des-plus-n%c2%b02-post-it-war/' rel='bookmark' title='Des tweets et des plus n°2 &#8211; Post It war'>Des tweets et des plus n°2 &#8211; Post It war</a></li>
</ol>]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2012/01/02/another-git-branching-model/">&lt;p&gt;We&amp;#8217;ve switched to git at work a few month ago. Not an easy task but the rewards are worth the trouble. Our branching model was based on &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;Git Flow&lt;/a&gt; because it&amp;#8217;s well documented and gives you a structure to start with DVCS. Well, after a few iterations it wasn&amp;#8217;t working as expected in our context. So we had to come up with our own workflow.&lt;/p&gt;
&lt;p&gt;I guess Git Flow works well on a clean code base with good test coverage. But on legacy code, where &lt;strong&gt;one feature means two regressions, a release branch is like the vietnam war&lt;/strong&gt;, you never know when you will get out of it. That was one of our main problem on subversion, we were creating release branch to go to production. And it would take forever to actually ship the code. Meanwhile all other development efforts remain stuck.&lt;/p&gt;
&lt;p&gt;I though that cheap branching and merging in git would solve our issue. But &lt;strong&gt;cheap merging is not enough, you also need to be able to easily pick what to merge&lt;/strong&gt;. And with Git Flow it&amp;#8217;s not easy to remove a feature from a release branch once it&amp;#8217;s there. Because a feature branch is started from develop it is bound by its parents commits to other features not yet in production. As a result, if you merge a feature without rebasing you always get more commits than wanted.&lt;/p&gt;
&lt;p&gt;So here is the workflow we use to solve those issues:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogpro.toutantic.net/wp-content/uploads/2012/01/anothergitflow.png"&gt;&lt;img class="aligncenter size-full wp-image-879" title="Another Git Flow" src="http://blogpro.toutantic.net/wp-content/uploads/2012/01/anothergitflow.png" alt="" width="585" height="1008" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;The main branches&lt;/h2&gt;
&lt;p&gt;We have three branches with an infinite lifetime based on the classical trio (dev/test/prod):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;master&lt;/li&gt;
&lt;li&gt;staging&lt;/li&gt;
&lt;li&gt;develop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Master is the same as in git flow:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We consider &lt;code&gt;origin/master&lt;/code&gt; to be the main branch where the source code of &lt;code&gt;HEAD&lt;/code&gt; always reflects a&lt;em&gt;production-ready&lt;/em&gt; state.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Staging is a bit like develop in Git Flow :&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;We consider &lt;code&gt;origin/develop&lt;/code&gt; to be the main branch where the source code of &lt;code&gt;HEAD&lt;/code&gt; always reflects a state with the latest delivered development changes for the next release. Some would call this the “integration branch”.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Develop is there for continuous integration, this is where we constanly merge all the changes to detect bugs and conflicts as soon as possible. The source code in the develop branch never reach a stable point where it is ready to be released. Instead only some feature branches reach a stable point. Those stable feature branches are merge into the staging branch. Since feature branches were created from master and not from develop we can pick individualy which one will be merge to staging. In fact this is the main point of this workflow:&lt;strong&gt; We can easily choose which features will go into production next. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To release the code to production we just merge staging into master.&lt;/p&gt;
&lt;h2&gt;Feature Branches&lt;/h2&gt;
&lt;p&gt;All work is done in feature branches which can be merge into&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;master for a quick fix in production&lt;/li&gt;
&lt;li&gt;staging for bug fixes&lt;/li&gt;
&lt;li&gt;develop constanly for continuous integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since we use github we usualy do a pull request to merge feature branches. We don&amp;#8217;t always follow the rules and commit on master and staging happens, they are merge back to staging and develop. The only place where we don&amp;#8217;t commit is develop &lt;img src='http://blogpro.toutantic.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /&gt;  (only merge commit)&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Git Flow was not working for us, but by creating feature branches from master instead of develop we gained the ability to easily choose which features we release next. This gave us much more flexibility and got us out of &amp;#8220;vietnam release branch&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Now I should tell about all the best practices to make this workflow really work, but I&amp;#8217;m lucky, &lt;a href="https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR"&gt;someone already wrote them down&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And you, what is your branching model ?&lt;/p&gt;
&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blogpro.toutantic.net/2011/08/05/des-tweets-et-des-plus-n%c2%b02-post-it-war/' rel='bookmark' title='Des tweets et des plus n°2 &amp;#8211; Post It war'&gt;Des tweets et des plus n°2 &amp;#8211; Post It war&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/A5utC8C2q8I" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2012/01/02/another-git-branching-model/#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2012/01/02/another-git-branching-model/feed/atom/" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2012/01/02/another-git-branching-model/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°10 – Tous bureaucrates]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/psFKn5k8PqE/" />
		<id>http://blogpro.toutantic.net/?p=849</id>
		<updated>2011-12-30T22:15:43Z</updated>
		<published>2011-12-30T22:15:43Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[Tous bureaucrates: Ainsi – et c’est la caractéristique principale d’une bureaucratie – la défense des territoires y devient un objectif plus important que l’intérêt général de l’entreprise, sa survie. Car ce rapport de force moyenâgeux entre services se superpose à la &#8230; <a href="http://blogpro.toutantic.net/2011/12/30/des-tweets-et-des-plus-n10-tous-bureaucrates/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2011/12/30/des-tweets-et-des-plus-n10-tous-bureaucrates/">&lt;!-- start insertion by YouTube Brackets, robertbuzink.nl --&gt;&lt;span class="youtube"&gt;&lt;object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/C46AbY7uAZs"&gt; &lt;param name="movie" value="http://www.youtube.com/v/C46AbY7uAZs" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;/object&gt;&lt;/span&gt;&lt;!-- end Youtube Brackets insertion --&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ppezziardi.wordpress.com/2011/12/23/tous-bureaucrates-featuring-benoit-poelvoorde-un-manifeste-pour-les-middle-managers/"&gt;Tous bureaucrates&lt;/a&gt;&lt;/strong&gt;: Ainsi – et c’est la caractéristique principale d’une bureaucratie – la défense des territoires y devient un objectif plus important que l’intérêt général de l’entreprise, sa survie. Car ce rapport de force moyenâgeux entre services se superpose à la traditionnelle séparation entre penseurs et faiseurs, autre caractéristique des bureaucraties&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://stackoverflow.com/questions/1995113/strangest-language-feature"&gt;Strangest language feature&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="" style="font-family:monospace;"&gt;JavaScript truth table:
&amp;nbsp;
''        ==   '&lt;span style=""&gt;0&lt;/span&gt;'           // false
&lt;span style=""&gt;0&lt;/span&gt;         ==   ''            // true
&lt;span style=""&gt;0&lt;/span&gt;         ==   '&lt;span style=""&gt;0&lt;/span&gt;'           // true
false     ==   'false'       // false
false     ==   '&lt;span style=""&gt;0&lt;/span&gt;'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
&amp;quot; \t\r\n&amp;quot; ==   &lt;span style=""&gt;0&lt;/span&gt;             // true&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="http://www.pole-emploi.org/file/mmlelement/pj/8c/5d/81/4f/r_et_a34etudes7076015330572461712.pdf"&gt;&lt;strong&gt;Les métiers de l’informatique&lt;/strong&gt;&lt;/a&gt;: En France, 77% des jeunes diplômés en informatique débuteraient ainsi leur entrée dans la vie professionnelle à partir d’une SSII, alors que seul 1 % de l’effectif des SSII quitterait l’entreprise pour cause de départ à la retraite (contre 10,4 % en moyenne)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.altaide.com/blog/la-penurie-de-developpeurs-va-til-amener-les-cabinets-de-recrutement-a-jeter-leponge/"&gt;LA PÉNURIE DE DÉVELOPPEURS&lt;/a&gt;&lt;/strong&gt;: Altaïde rencontre aussi depuis deux ans les pires difficultés à trouver des développeurs sur les technos du web et mobile. Trouver des développeurs PHP, Java, .Net, IOS, Androïd ou RoR, pour ne citer que ces technos les plus demandées, c’est une débauche de moyens et d’énergies énorme.&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/psFKn5k8PqE" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2011/12/30/des-tweets-et-des-plus-n10-tous-bureaucrates/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2011/12/30/des-tweets-et-des-plus-n10-tous-bureaucrates/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2011/12/30/des-tweets-et-des-plus-n10-tous-bureaucrates/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°9 – Developeronomics]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/x9iEzU4Emp4/" />
		<id>http://blogpro.toutantic.net/?p=840</id>
		<updated>2011-12-12T20:44:05Z</updated>
		<published>2011-12-12T20:44:05Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[The Rise of Developeronomics: We are only just beginning to understand how software is now the core function of every company, no matter what it makes or what service it actually provides. Why Play isn’t a Java web framework : The country that &#8230; <a href="http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/">&lt;p&gt;&lt;a href="http://blogpro.toutantic.net/wp-content/uploads/2011/12/webVSelectricity.jpg"&gt;&lt;img class="aligncenter size-full wp-image-844" title="webVSelectricity" src="http://blogpro.toutantic.net/wp-content/uploads/2011/12/webVSelectricity.jpg" alt="" width="320" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.forbes.com/sites/venkateshrao/2011/12/05/the-rise-of-developeronomics/"&gt;The Rise of Developeronomics&lt;/a&gt;&lt;/strong&gt;: We are only just beginning to understand how software is now the core function of every company, no matter what it makes or what service it actually provides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.lunatech-research.fr/archives/2011/11/29/why-playframework-is-not-java"&gt;Why Play isn’t a Java web framework&lt;/a&gt; :&lt;/strong&gt; The country that Play comes from is called the World-Wide Web&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.makinggoodsoftware.com/2010/01/27/types-of-programmer-or-%E2%80%9Cwhy-can%E2%80%99t-we-be-friends%E2%80%9D/"&gt;4 Types of programmer&lt;/a&gt;&lt;/strong&gt;: action heroes are mostly extreme agile developers, technical gurus, and junior developers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.objectmentor.com/articles/2007/07/17/testing-will-challenge-your-conventions"&gt;Testing Will Challenge Your Conventions&lt;/a&gt;&lt;/strong&gt;: “Clever” is dead. Clever is hard to refactor. Clever is hard to isolate, hard to internalize, hard to phrase in tests. One point of “obvious” is worth two hundred points of “clever”.&lt;strong&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/x9iEzU4Emp4" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2011/12/12/des-tweets-et-des-plus-n%c2%b09-%e2%80%93-developeronomics/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[L&#8217;architecte]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/jYUj2Y_uNZY/" />
		<id>http://blogpro.toutantic.net/?p=826</id>
		<updated>2011-12-08T22:08:23Z</updated>
		<published>2011-12-08T22:07:00Z</published>
		<category scheme="http://blogpro.toutantic.net" term="architecture" />		<summary type="html"><![CDATA[La tête dans les nuages Les mains dans le cambouis Les pieds sur la prod  La tête dans les nuages Pas parce qu&#8217;il s&#8217;intéresse au cloud, mais parce qu&#8217;il doit prendre de la hauteur et du recul pour analyser, synthétiser &#8230; <a href="http://blogpro.toutantic.net/2011/12/08/larchitecte/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2011/12/08/larchitecte/">&lt;p style="text-align: right;"&gt;&lt;strong&gt;La tête dans les nuages&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Les mains dans le cambouis&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Les pieds sur la prod&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt; La tête dans les nuages&lt;/h1&gt;
&lt;p&gt;Pas parce qu&amp;#8217;il s&amp;#8217;intéresse au cloud, mais parce qu&amp;#8217;il doit prendre de la hauteur et du recul pour analyser, synthétiser et savoir restituer des vues adaptés à chacun des acteurs d&amp;#8217;un projet. Il est le garant d&amp;#8217;une vision partagée et cohérente des objectifs métiers stratégiques jusqu&amp;#8217;aux déploiement des composants logiques sur des serveurs physiques ou virtuels.&lt;/p&gt;
&lt;h1&gt;Les mains dans le cambouis&lt;/h1&gt;
&lt;p&gt;L&amp;#8217;architecte qui ne code plus (pire n&amp;#8217;a jamais codé) a vite fait de s&amp;#8217;envoler dans les nuages et de perdre le contact avec la réalité. De la vue aérienne d&amp;#8217;un projet il doit pouvoir zoomer sur un composant logique, sa conception et la ligne de code. Seul un astro-architecte qui ne quitte jamais les stratosphères de sa cellule architecture et méthode peut retenir des technologies comme EJB1/2 ou JSF, qui en pratique sont inutilisables. Une technologie ou une architecture peut avoir toutes les qualités que l&amp;#8217;on voudra, si elle n&amp;#8217;est pas comprise et adopté par les développeurs ça n&amp;#8217;ira pas loin.&lt;/p&gt;
&lt;h1&gt;Les pieds sur la prod&lt;/h1&gt;
&lt;p&gt;Tan qu&amp;#8217;il n&amp;#8217;est pas entre les mains des utilisateurs un projet informatique ne produit aucune valeur. Et le passage obligé pour atteindre les utilisateurs c&amp;#8217;est la prod. Vous suivez à la lettre les recommandations du &lt;a href="http://www.12factor.net"&gt;site 12factors&lt;/a&gt; ? Super votre application est prête à être déployé dans le cloud. Dommage, ce qu&amp;#8217;attend votre prod c&amp;#8217;est un ear pour déployer sur webFear ! Pour que le succès d&amp;#8217;une application soit complet travailler en étroite collaboration avec les gens de la prod (Devops) et aussi important que de leur faire avec le métier (les méthodes agiles)&lt;/p&gt;
&lt;p&gt;Et chez vous il fait quoi l&amp;#8217;architecte (logiciel bien sûr) ?&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/jYUj2Y_uNZY" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2011/12/08/larchitecte/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2011/12/08/larchitecte/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2011/12/08/larchitecte/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Le meilleur code]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/19eRHZz6Gls/" />
		<id>http://blogpro.toutantic.net/?p=800</id>
		<updated>2011-12-05T18:30:13Z</updated>
		<published>2011-12-05T18:30:13Z</published>
		<category scheme="http://blogpro.toutantic.net" term="architecture" /><category scheme="http://blogpro.toutantic.net" term="code" /><category scheme="http://blogpro.toutantic.net" term="java" /><category scheme="http://blogpro.toutantic.net" term="kata" />		<summary type="html"><![CDATA[est celui dont on peut se passer J&#8217;aime bien cette citation &#8220;Le meilleur code est celui dont on peut se passer.&#8221; Le type qui va maintenir votre code C&#8217;est la clé d&#8217;une réalité difficile à accepter et encore plus à &#8230; <a href="http://blogpro.toutantic.net/2011/12/05/le-meilleur-code/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blogpro.toutantic.net/2005/02/13/code-et-commentaires/' rel='bookmark' title='Code et Commentaires'>Code et Commentaires</a></li>
<li><a href='http://blogpro.toutantic.net/2004/11/10/code-search-tools/' rel='bookmark' title='Code Search tools'>Code Search tools</a></li>
</ol>]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2011/12/05/le-meilleur-code/">&lt;p&gt;est celui dont on peut se passer&lt;/p&gt;
&lt;p&gt;J&amp;#8217;aime bien cette citation&lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="text-align: right;"&gt;&lt;strong&gt;&amp;#8220;Le meilleur code est celui dont on peut se passer.&amp;#8221;&lt;/strong&gt;&lt;br /&gt;
Le type qui va maintenir votre code&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;#8217;est la clé d&amp;#8217;une réalité difficile à accepter et encore plus à prouver : &lt;a href="http://haacked.com/archive/2007/06/25/understanding-productivity-differences-between-developers.aspx"&gt;un bon développeur peut être 100 fois plus productif qu&amp;#8217;un mauvais&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans &lt;a href="http://metaleks.net/programming/the-evolution-of-a-python-programmer"&gt;l&amp;#8217;évolution d&amp;#8217;un programmer python&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le débutant écrit une implémentation naïve,&lt;/li&gt;
&lt;li&gt;Celui qui connait le langage résout le problème en une ligne simple,&lt;/li&gt;
&lt;li&gt;L&amp;#8217;expert utilise tout simplement une librairie déjà existante.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mais il manque un type de développeur: celui qui trouve la solution pour &lt;a style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;" href="http://www.codinghorror.com/blog/2007/05/the-best-code-is-no-code-at-all.html"&gt;ne pas avoir à écrire ce code&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Illustration avec le Kata du game of life&lt;/h1&gt;
&lt;p&gt;&lt;a style="text-decoration: underline; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;" href="http://en.wikipedia.org/wiki/File:Gospers_glider_gun.gif"&gt;&lt;img class="alignleft size-full wp-image-812" style="border-style: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #eeeeee; margin-top: 0.4em;" title="Gospers_glider_gun" src="http://blogpro.toutantic.net/wp-content/uploads/2011/12/Gospers_glider_gun.gif" alt="" width="250" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lors du &lt;a href="http://paris-globaldayofcoderetreat.eventbrite.com"&gt;code retreat de ce week-end&lt;/a&gt; la 3eme itération avec &lt;a href="http://blog.piwai.info/"&gt;piwai&lt;/a&gt; m&amp;#8217;a permis  de trouver une illustration simple et concrète de ce précepte. (PRO tip: le pair programming est un moyen pour fabriquer des développeurs 10 fois plus productif à partir de deux développeurs normaux)&lt;br /&gt;
Le kata classique d&amp;#8217;une code retreat est le&lt;a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life"&gt; game of life&lt;/a&gt;, la spec tien en 4 règles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Any live cell with fewer than two live neighbours dies, as if caused by under-population.&lt;/li&gt;
&lt;li&gt;Any live cell with two or three live neighbours lives on to the next generation.&lt;/li&gt;
&lt;li&gt;Any live cell with more than three live neighbours dies, as if by overcrowding.&lt;/li&gt;
&lt;li&gt;Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Chaque itération dure 45min, en pratique il est difficile de finir dans ce temps, ce qui tombe bien car le but d&amp;#8217;un kata n&amp;#8217;est pas de finir mais d’expérimenter librement. Dans une approche TDD naïve on va commencer par implémenter un test permettant de valider la première règle, puis implémenter le code permettant qui permet de faire passer le test.&lt;/p&gt;
&lt;p&gt;Mais TDD ne veut pas pire pas de conception, bien au contraire, la première question à se poser est qu&amp;#8217;est qu&amp;#8217;on doit tester?&lt;/p&gt;
&lt;p&gt;Dans le cas du game of life on réalise très vite qu&amp;#8217;on à besoin de stocker l&amp;#8217;état des cellules dans 2 structures, une pour la génération actuelle, une autre pour la suivante. Si l&amp;#8217;on démarre toujours la génération suivante par une structure vide que l&amp;#8217;on va remplir en parcourant la structure actuelle il n&amp;#8217;est pas nécessaire d&amp;#8217;identifier les cellules à tuer: elles sont déjà toutes mortes dans la prochaine génération. Ce qui permet de ne pas se soucier de 2 règles sur 4.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ainsi&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Any live cell with fewer than two live neighbours dies, as if caused by under-population.&lt;/li&gt;
&lt;li&gt;Any live cell with two or three live neighbours lives on to the next generation.&lt;/li&gt;
&lt;li&gt;Any live cell with more than three live neighbours dies, as if by overcrowding.&lt;/li&gt;
&lt;li&gt;Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;strong&gt;Devient&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;All cell are dead in the next generation&lt;/li&gt;
&lt;li&gt;Any live cell with two or three live neighbours lives on to the next generation.&lt;/li&gt;
&lt;li&gt;Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;La complexité du problème a été divisée par deux&amp;#8230;&lt;/div&gt;
&lt;div&gt;En partant sur ces bases on a pu finir de manière relativement élégante en 30 min.&lt;/div&gt;
&lt;/div&gt;
&lt;div id="gist-1433426" class="gist"&gt;

        &lt;div class="gist-file"&gt;
          &lt;div class="gist-data gist-syntax"&gt;
              &lt;div class="highlight"&gt;&lt;pre&gt;&lt;div class='line' id='LC1'&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;gol&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC2'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC3'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC4'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.HashSet&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC5'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC6'&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Set&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC7'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC8'&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;World&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC9'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC10'&gt;	&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;world&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC11'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC12'&gt;	&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addLiveCell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC13'&gt;		&lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC14'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC15'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC16'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC17'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC18'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC19'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC20'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getX&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC21'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC22'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC23'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC24'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getY&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC25'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC26'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC27'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC28'&gt;	&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getNumberOfNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC29'&gt;		&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numberOfNb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC30'&gt;		&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;neighbour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC31'&gt;		&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;neighbour&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC32'&gt;			&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC33'&gt;				&lt;span class="n"&gt;numberOfNb&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC34'&gt;			&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC35'&gt;		&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC36'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC37'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numberOfNb&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC38'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC39'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC40'&gt;	&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getNumberOfNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC41'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getNumberOfNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getX&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;getY&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC42'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC43'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC44'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC45'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC46'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getX&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;getY&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC47'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC48'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC49'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC50'&gt;		&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC51'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC52'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC53'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC54'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC55'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC56'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC57'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC58'&gt;		&lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC59'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC60'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC61'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC62'&gt;	&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC63'&gt;		&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;newWorld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC64'&gt;		&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;neighbourCells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;();&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC65'&gt;		&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC66'&gt;			&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ifThreeOrTwoNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC67'&gt;				&lt;span class="n"&gt;newWorld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC68'&gt;			&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC69'&gt;			&lt;span class="n"&gt;neighbourCells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC70'&gt;		&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC71'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC72'&gt;		&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;neighbourCells&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC73'&gt;			&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ifThreeNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC74'&gt;				&lt;span class="n"&gt;newWorld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC75'&gt;			&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC76'&gt;		&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC77'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC78'&gt;		&lt;span class="n"&gt;world&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newWorld&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC79'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC80'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC81'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC82'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;ifThreeOrTwoNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC83'&gt;		&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numberOfNeighbour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNumberOfNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC84'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numberOfNeighbour&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;numberOfNeighbour&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC85'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC86'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC87'&gt;	&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;ifThreeNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC88'&gt;		&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numberOfNeighbour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNumberOfNeighbour&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC89'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;numberOfNeighbour&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC90'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC91'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC92'&gt;	&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isAlive&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC93'&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getkey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC94'&gt;	&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class='line' id='LC95'&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class='line' id='LC96'&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
          &lt;/div&gt;

          &lt;div class="gist-meta"&gt;
            &lt;a href="https://gist.github.com/raw/1433426/a618931b623ade02b91e1490d9657433994f4878/World.java" style="float:right;"&gt;view raw&lt;/a&gt;
            &lt;a href="https://gist.github.com/1433426#file_world.java" style="float:right;margin-right:10px;color:#666"&gt;World.java&lt;/a&gt;
            &lt;a href="https://gist.github.com/1433426"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;.
          &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Related posts:&lt;ol&gt;
&lt;li&gt;&lt;a href='http://blogpro.toutantic.net/2005/02/13/code-et-commentaires/' rel='bookmark' title='Code et Commentaires'&gt;Code et Commentaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://blogpro.toutantic.net/2004/11/10/code-search-tools/' rel='bookmark' title='Code Search tools'&gt;Code Search tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/19eRHZz6Gls" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2011/12/05/le-meilleur-code/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2011/12/05/le-meilleur-code/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2011/12/05/le-meilleur-code/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Aurélien Pelletier</name>
						<uri>http://blogpro.toutantic.net</uri>
					</author>
		<title type="html"><![CDATA[Des tweets et des plus n°8 &#8211; Yoda Conditions]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/aurelienpelletier/~3/Db3uIlhaWno/" />
		<id>http://blogpro.toutantic.net/?p=790</id>
		<updated>2011-12-02T10:10:47Z</updated>
		<published>2011-12-02T10:10:47Z</published>
		<category scheme="http://blogpro.toutantic.net" term="tweetsANDplus" />		<summary type="html"><![CDATA[Politics-Oriented Software Development: The code itself is the only document which may be relied upon in any way in order to find out how the software might actually behave under this or that set of circumstances. However, anyone actually saying so &#8230; <a href="http://blogpro.toutantic.net/2011/12/02/des-tweets-et-des-plus-n%c2%b08-yoda-conditions/">Continue reading <span class="meta-nav">&#8594;</span></a>
No related posts.]]></summary>
		<content type="html" xml:base="http://blogpro.toutantic.net/2011/12/02/des-tweets-et-des-plus-n%c2%b08-yoda-conditions/">&lt;p&gt;&lt;a href="http://cuteoverload.com/2011/09/06/well-this-looks-delectabuhls/"&gt;&lt;img class="aligncenter size-full wp-image-797" title="strawberryTurtle" src="http://blogpro.toutantic.net/wp-content/uploads/2011/12/strawberryTurtle.jpg" alt="" width="560" height="373" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.kuro5hin.org/story/2005/1/28/32622/4244"&gt;Politics-Oriented Software Development&lt;/a&gt;&lt;/strong&gt;: The code itself is the only document which may be relied upon in any way in order to find out how the software might actually behave under this or that set of circumstances. However, anyone actually saying so only reveals themselves as a troublemaker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ec.europa.eu/information_society/newsroom/cf/itemdetail.cfm?item_id=7366"&gt;Entreprise 2.0&lt;/a&gt;&lt;/strong&gt;: Within the companies, workers have little incentive to&lt;br /&gt;
share, as it is additional work with no clear benefits. Therefore, only the&lt;br /&gt;
minority of do-gooders, open source advocates who have an ideological bias&lt;br /&gt;
towards sharing knowledge, uses it&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.visionmobile.com/blog/2011/11/the-death-of-flash-8-years-in-the-making/"&gt;The death of Flash&lt;/a&gt;&lt;/strong&gt; : Apple decided not to adopt the Flash Platform because Flash would limit its ability to differentiate its devices&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html"&gt;Yoda Conditions&lt;/a&gt;&lt;/strong&gt; : Un véritable guide des bonnes pratiques du code legacy. A lire absolument!&lt;/p&gt;
&lt;p&gt;No related posts.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aurelienpelletier/~4/Db3uIlhaWno" height="1" width="1"/&gt;</content>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/</creativeCommons:license>
		<link rel="replies" type="text/html" href="http://blogpro.toutantic.net/2011/12/02/des-tweets-et-des-plus-n%c2%b08-yoda-conditions/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blogpro.toutantic.net/2011/12/02/des-tweets-et-des-plus-n%c2%b08-yoda-conditions/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blogpro.toutantic.net/2011/12/02/des-tweets-et-des-plus-n%c2%b08-yoda-conditions/</feedburner:origLink></entry>
	</feed>

