<?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:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;Ak8NR3Y7fSp7ImA9WxNVGE8.&quot;"><id>tag:blogger.com,1999:blog-37306137</id><updated>2009-10-29T16:08:16.805+01:00</updated><title>From Java to Java EE (through C# .NET)</title><subtitle type="html">This blog is dedicated to all Java (and C# nowadays) developers. I'm trying try to present my everyday problems I encounter developing complicated systems and my solutions to these problems. Java EE topics are also covered (JMS, JAAS, JCE, TIBCO EMS, Tomcat, etc.) This blog extends it's subject range also to Agile Software Development methodologies like Scrum and XP (eXtreme Programming).</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.bielu.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>123</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><link rel="self" href="http://feeds.feedburner.com/FromJavaToJavaEe" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;C08CRng_eip7ImA9WxNXE00.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-535842915964543183</id><published>2009-09-29T13:56:00.002+02:00</published><updated>2009-09-30T11:11:07.642+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T11:11:07.642+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Server timeout for maven release:perform or site:deploy</title><content type="html">I just wanted to release a piece of software I'm working on when I encountered a wall. Big, high and not very talkative wall - read timeout. I thought maybe the configuration of the server (and Web DAV) I described in &lt;a href="http://blog.bielu.com/2008/02/maven-artifactory-continuum.html"&gt;this post&lt;/a&gt; has changed? No way - everything is like it was. The only thing that has changed is Maven version from 2.0.9 to 2.2.1 (where you don't have to define DAV extension in the &lt;tt&gt;build&lt;/tt&gt; part).&lt;br /&gt;
&lt;br /&gt;
Fortunately I also had my old environment where it worked (I meanMmaven 2.0.9). I noticed that the full build takes over 2 minutes while on the new Maven I get the timeout after 1 minute and few seconds. This way I realized that maybe increasing the timeout value will help. &lt;b&gt;IT DID!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So how to do this? It's simple - just add:&lt;br /&gt;
&lt;pre&gt;&amp;lt;servers&amp;gt;
  &amp;lt;server&amp;gt;
    &amp;lt;id&amp;gt;someId&amp;lt;/id&amp;gt;
    &amp;lt;username&amp;gt;blahblah&amp;lt;/username&amp;gt;
    &amp;lt;password&amp;gt;blahblah&amp;lt;/password&amp;gt;
    &amp;lt;configuration&amp;gt;
      &amp;lt;timeout&amp;gt;120000&amp;lt;/timeout&amp;gt; &amp;lt;!-- your timeout in milliseconds --&amp;gt;
    &amp;lt;/configuration&amp;gt;
  &amp;lt;/server&amp;gt;
  ...
&lt;/pre&gt;in the &lt;tt&gt;MAVEN_HOME/conf/settings.xml&lt;/tt&gt; file and restart your Maven task.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-535842915964543183?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/o3qerJhFTvg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/535842915964543183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=535842915964543183" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/535842915964543183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/535842915964543183?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/server-timeout-for-maven-releaseperform.html" title="Server timeout for maven &lt;code&gt;release:perform&lt;/code&gt; or &lt;code&gt;site:deploy&lt;/code&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkUHSXc6fSp7ImA9WxNQGEU.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3318641365087670956</id><published>2009-09-22T08:46:00.006+02:00</published><updated>2009-09-25T16:17:18.915+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T16:17:18.915+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><title>My daily WTF</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s1600-h/wtf.png" imageanchor="1" title="Error: Your password must be different from the 12 previous passwords."&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s800/wtf.png" width="460" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;I was just slapped but web application: "Your password must be different from the 12 previous passwords".&lt;br /&gt;
&lt;br /&gt;
Very "secure" (obscure) system forcing me to have my original password (of value "password") plus additional 12 passwords of values "password1", "password2", etc. On the other hand there is no other policy requiring me to have at least one digit or capital letter. The only one is that my new password has to be different than 12 that I had before.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;big&gt;WTF?&lt;/big&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3318641365087670956?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/VoXJU2hDL3Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3318641365087670956/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3318641365087670956" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3318641365087670956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3318641365087670956?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/my-daily-wtf.html" title="My daily WTF" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s72-c/wtf.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C04HRno4eip7ImA9WxNXE00.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8316139242882196325</id><published>2009-09-20T20:13:00.003+02:00</published><updated>2009-09-30T11:12:17.432+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T11:12:17.432+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Add-in Express™ - a great tool for tiny price</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.add-in-express.com"&gt;&lt;img src="http://www.add-in-express.com/images/2007/adx-ie/index/index.png" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Add-in Express™&lt;/div&gt;&lt;/div&gt;I recently had to develop Internet Explorer plugin that had had to be compatible with versions 6, 7 and 8 of this browser. I searched the net a bit and I found a lot of solutions to do this. The best (if not the only one) solution is to implement &lt;a href="http://en.wikipedia.org/wiki/Browser_Helper_Object"&gt;Browser Helper Object (BHO)&lt;/a&gt;. The problem with doing it manually is that it was designed by Microsoft which means that even if implementing it is easy you have to store zillions of information in the Windows registry to make your application work. This, on the other hand, is not that easy as you have to know exactly what and where to store, how to generated COM classes' GUIDs, and if it's not enough this kind of work is not testable or debugable.&lt;br /&gt;
&lt;br /&gt;
Of course, it's easy to find some ready solutions with demo how to register all objects, etc. Another problem with this is that all the documentation from MS or from opensource community is pretty old and irrelevant. For example some example plugins I found worked out-of-the-box, however I had some special needs that were not addressed and that I couldn't find any documentation for.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Let's try the other way&lt;/b&gt;&lt;br /&gt;
In the previous paragraphs I forgot to mention that the software I was up to develop had to be delivered in two days (I mean the demo showing that it's possible to develop such plugin at all). This way I didn't have time to dig into the COM docs and BHO registration options. I found &lt;a href="http://www.add-in-express.com"&gt;Add-in Express™&lt;/a&gt; plugins for Visual Studio. My obvious choice was &lt;a href="http://www.add-in-express.com/programming-internet-explorer/"&gt;Add-in Express™ 2009 for Internet Explorer® and Microsoft® .net&lt;/a&gt; (AE4IE).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Benefits&lt;/b&gt;&lt;br /&gt;
With this tool I achieved more in 5 minutes than with Microsoft and opensource documentation in two days. It's not an exaggeration if I say that every developer is able to create at least working skeleton of IE plugin in 15 minutes. AE4IE has excellent documentation and is extremely easy to use. ROI is obvious and very quick as this tool gives a great quality for the price it costs.&lt;br /&gt;
&lt;br /&gt;
With AE4IE templates for Visual Studio you not only create plugins in 5 minutes. This tool also creates the whole project structure as well as the Setup project that enables your users installing the plugins in the user-friendly manner. &lt;b&gt;And it takes only few clicks!!!&lt;/b&gt; I love it.&lt;br /&gt;
&lt;br /&gt;
It saves a lot of time and hard work of digging into MS documentation or reading (and buying) books on BHO/COM subjects.&lt;br /&gt;
&lt;br /&gt;
Another good point is that developers are given pure Microsoft API such as &lt;a href="http://www.add-in-express.com/purchase/index.php"&gt;IWebBrowser2&lt;/a&gt; - this way you gain full power over your plugin and don't have to worry about COM specification and Windows registry configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What about the support&lt;/b&gt;&lt;br /&gt;
Add-in Express™ team replies and solves problems very quickly and professionally. There is a special &lt;a href="http://www.add-in-express.com/forum/"&gt;forum&lt;/a&gt; where you can find answers for many real-life questions and find solutions to common problems.&lt;br /&gt;
&lt;br /&gt;
Extremely useful thing is also having a &lt;a href="http://www.add-in-express.com/creating-addins-blog/"&gt;technical blog&lt;/a&gt; of Add-in Express™ team where they present new features and explain how to solve advanced issues (e.g. with sharing data between COM objects).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;
I'm very happy with this tool and would recommend it to every small or big company that has to develop IE plugin. You will never do what they did for such a small amount of &lt;a href="http://www.add-in-express.com/purchase/index.php"&gt;money&lt;/a&gt;. The whole purchasing procedure takes 5 minutes and after another 15 minutes you have your plugin ready. The only remaining thing to do is to implement the business logic. How cool is that?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DISCLAIMER:&lt;/b&gt; I have no business connections with Add-in Express™ company and my review is not a commercial break&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8316139242882196325?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/71Gza6QpQ50" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8316139242882196325/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8316139242882196325" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8316139242882196325?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8316139242882196325?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/add-in-express-great-tool-for-tiny.html" title="Add-in Express™ - a great tool for tiny price" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s72-c/splash_visualvm.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DE8NRng_eSp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-666122256449932441</id><published>2009-07-23T10:00:00.001+02:00</published><updated>2009-07-23T10:14:57.641+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T10:14:57.641+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="deadlock" /><title>Visual VM - a great Java tool you were waiting for!</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="https://visualvm.dev.java.net/"&gt;&lt;img src="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s400/splash_visualvm.gif" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) VisualVM&lt;/div&gt;&lt;/div&gt;I planned to publish this post some months ago but unfortunately I was too busy to do so. I'm still busy :) but I can write couple of sentences about &lt;a href="https://visualvm.dev.java.net/"&gt;VisualVM&lt;/a&gt; - a VISUAL (no surprise) tool for monitoring Java applications. If you had to monitor state of your Java systems you probably already know &lt;a href="http://openjdk.java.net/tools/svc/jconsole/"&gt;JConsole&lt;/a&gt; - a JMX console to you Java stuff. Of course, you can just connect to JVM's JMX services and monitor almost every aspect of VM but the way data is not presented in a very friendly manner. Some differences between VisualVM and JConsole are described in &lt;a href="http://www.javaworld.com/community/node/1289"&gt;this article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, VisualVM is an absolutely GREAT tool to monitor Java apps. You are able to see all threads (with possible deadlocks), memory state (heap and stack), profiling information on CPU and memory utilization, etc. VisualVM has pluggable architecture and you can find many useful addins to it including JConsole plugins. This way you will be able to use only on tool and get rid of JConsole (which is a great tool too).&lt;br /&gt;&lt;br /&gt;More details and full-blown tutorial can be found here: &lt;a href="http://www.taranfx.com/blog/?p=930"&gt;http://www.taranfx.com/blog/?p=930&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More advanced topics are described here: &lt;a href="http://blog.grovehillsoftware.com/2009/05/visualvm-and-cutting-method-calls-by.html"&gt;http://blog.grovehillsoftware.com/2009/05/visualvm-and-cutting-method-calls-by.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-666122256449932441?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/qakRxzBK6_s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/666122256449932441/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=666122256449932441" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/666122256449932441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/666122256449932441?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/visual-vm-java-tool-you-were-waiting.html" title="Visual VM - a great Java tool you were waiting for!" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s72-c/splash_visualvm.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkUHRXs-fSp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-870335549200894652</id><published>2009-07-16T22:33:00.002+02:00</published><updated>2009-07-23T09:30:34.555+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T09:30:34.555+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Présentation de Scrum pour Riviera JUG</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://picasaweb.google.com/stephane.epardaud/15Juillet2009SophiaAntipolisSoireeAgile#5358974518412214258"&gt;&lt;img src="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s800/IMG_9276.JPG" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Riviera JUG&lt;/div&gt;&lt;/div&gt;Hier, j'ai présente Scrum exclusivement pour &lt;a href="http://rivierajug.org/"&gt;Riviera Java User Group&lt;/a&gt; dans le Mistral Auditorium d'Amadeus. Mon public, environs 120 personnes est venu de Sophia Antipolis, Antibes et de région de Nice en général. Selon le retour que j'ai reçu après ma &lt;a href="http://rivierajug.org/xwiki/bin/download/Main/Evenements/rivierajug%2D20090715%2Dprzemyslaw%2Dscrum.pdf"&gt;présentation&lt;/a&gt;, elle était un grand succès. Maintenant j'attends les réponses de participant  au sujet de la création et la participation dans Riviera Agile User Group. J'espère ce groupe sera bientôt crée et nous pourrons réunir régulièrement et présenter nos idées et échanger nos expériences a'propos d'agile.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Si vous êtes intéresses par la projet comme Riviera Agile User Group, vous pouvez me contacter. &lt;br /&gt;&lt;br /&gt;Si vous êtes (ou vous travaillez pour) une société qui pourrait financer les réunions mensuels (nous aurons besoin de la salle de conférence, des boissons et snacks environs 200-400 EUR) , je serai ravi de le savoir. Cela serait une bonne promotion pour vous car les méthodes agile gagnent plus en plus de la popularité ici au sud de France - vous serez bien VISIBLE si vous décidez de nous aider.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La résume de la dernière présentation, aussi que les slides et les photos vous pouvez trouve &lt;a href="http://rivierajug.org/xwiki/bin/view/Blog/Bilandu15juillet2009"&gt;ici&lt;/a&gt;.J'espere que la video va apparaitre bientot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-870335549200894652?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/wCloufaacHc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/870335549200894652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=870335549200894652" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/870335549200894652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/870335549200894652?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/presentation-de-scrum-pour-riviera-jug.html" title="Présentation de Scrum pour Riviera JUG" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s72-c/IMG_9276.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkUGQn07fyp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2303749315530640847</id><published>2009-07-16T21:11:00.004+02:00</published><updated>2009-07-23T09:30:23.307+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T09:30:23.307+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Scrum presentation for Riviera JUG</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://picasaweb.google.com/stephane.epardaud/15Juillet2009SophiaAntipolisSoireeAgile#5358974518412214258"&gt;&lt;img src="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s800/IMG_9276.JPG" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Riviera JUG&lt;/div&gt;&lt;/div&gt;Yesterday I presented Scrum exclusively for &lt;a href="http://rivierajug.org"&gt;Riviera Java User Group&lt;/a&gt; in Amadeus' Mistral Auditorium. My audience was about 120 people from Sophia Antipolis, Antibes and Nice area in general. According to the feedback I received the &lt;a href="http://rivierajug.org/xwiki/bin/download/Main/Evenements/rivierajug%2D20090715%2Dprzemyslaw%2Dscrum.pdf"&gt;presentation&lt;/a&gt; was a big success and now I'm waiting for the answers from attending people whether they are interested in creating and participating to Riviera Agile User Group. I hope we will create such initiative shortly and will be able to meet regularly presenting ideas, thoughts and experiences on agile subjects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If you are interested in open initiative such as Riviera Agile User Group please contact me.&lt;br /&gt;&lt;br /&gt;If you are (or work for) a company that would like to sponsor such monthly events (we will need conference room, some beverages and snacks i.e. 200 - 400 EUR) I would love to know about it. It will be a great marketing for you as the agile methods gain more and more popularity here in southern France - you will be very VISIBLE if you decide to help us.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Summary of the last meeting, slides and pictures can be found &lt;a href="http://rivierajug.org/xwiki/bin/view/Blog/Bilandu15juillet2009"&gt;here.&lt;/a&gt; I hope the video will follow shortly too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2303749315530640847?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/U_F_Ib40Kqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2303749315530640847/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2303749315530640847" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2303749315530640847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2303749315530640847?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/scrum-presentation-for-riviera-jug.html" title="Scrum presentation for Riviera JUG" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s72-c/IMG_9276.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;Ak8AR3o8fyp7ImA9WxJWFU8.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3741244881939371438</id><published>2009-06-20T22:12:00.001+02:00</published><updated>2009-06-20T22:14:06.477+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-20T22:14:06.477+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="team" /><title>Half-dead project saved! Thank you - Direct Communication</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://agilesoftwaredevelopment.com/files/big_picture.jpg"&gt;&lt;img src="http://agilesoftwaredevelopment.com/files/big_picture.jpg" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Przemyslaw Bielicki&lt;/div&gt;&lt;/div&gt;In my &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/direct-communication-agile-platform-part-1-draft-title"&gt;previous post&lt;/a&gt; I shortly described the half-dead project in an over-waterfall company me and my team had to save three months before production. In this part I will show you how direct (instead of discrete) communication with customer or good Product Owner in general can help saving almost dead projects.&lt;br /&gt;&lt;br /&gt;As I described earlier me and my team had a lot of problems with the systems we had to integrate - technical issues were present but they were not dominant, even taking into account the fact that the team was not experienced in .NET and T-SQL stuff.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customer saved our project&lt;/b&gt;&lt;br /&gt;After some time struggling with technical issues we finally were contacted by the person who knew how the product should behave. This person (let me call her Product Owner - PO) had all acceptance tests in her mind and knew exactly how to help us understand the product. PO was in fact our client - to be completely clear, the product we were delivering was either win-win or lose-lose so we &lt;b&gt;had&lt;/b&gt; to cooperate and the success was our mutual goal.&lt;br /&gt;&lt;br /&gt;PO was remotely available (although in the same time zone) but that was not a problem for us at all - we exchanged tons of emails and some phone calls and that was perfectly sufficient.&lt;br /&gt;&lt;br /&gt;We were working like this for over two months and we delivered every single customer's request to the product. After the development phase our software had to pass the certification phase which, in fact, was couple-hour testing process in production. Our PO was present there and was helping other clients with testing (yes, there were other clients eventually using our product). &lt;br /&gt;&lt;br /&gt;I could risk a claim that it was a huge success because we just found couple of minor issues that were not even concerning the software but insufficient or incomplete data in our production databases. Everybody is sure that what saved the project and what really caused it to be such success was direct contact and constant help from our PO. As I wrote in one of my previous posts, namely &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/customer-team-member-way-winning-together"&gt;Customer Team Member - a way to winning together&lt;/a&gt; having customer as your team member is usually really good and efficient idea.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fool's gold?&lt;/b&gt;&lt;br /&gt;There are also (of course) problems with such attitude - the most "popular" one is the problem with actually having a customer. But even if you have a customer, how would you encourage him/her to be involved in the project (they usually aren't, especially at the beginning of the project)? It may depend on the actual contract i.e. how you define success or whether customer gain something by helping you - to know which contract best suits your current situation please refer to Peter Stevens' article: &lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts"&gt;10 Contracts for your next Agile Software Project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It saved us - it can save You&lt;/b&gt;&lt;br /&gt;To summarize, from my experience every time I worked with customer that was involved in the project I produced software with the highest business value (at that time). Every time I worked directly with involved customer I delivered the product that everybody treated as theirs, everybody was the owner - that's very cool feeling. This has also real business effect - satisfied customer is more likely to come back to your company. You gain credibility working together with your customers e.g. by showing them that you really work hard to meet their needs and to bring the best business value reducing costs. That usually pays off.&lt;br /&gt;&lt;br /&gt;So, my final advice here for you would be to take some effort and time and look for a GOOD Product Owner. When you find her then start bombing her with emails, phone calls, whatever that can help your team deliver the product with highest possible business value.&lt;br /&gt;&lt;br /&gt;What are your experiences with working directly with customers? Are they positive or negative? How would you improve thing in your project - could customer's involvement help?&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3741244881939371438?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/r9zlChcl92A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3741244881939371438/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3741244881939371438" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3741244881939371438?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3741244881939371438?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/06/half-dead-project-saved-thank-you.html" title="Half-dead project saved! Thank you - Direct Communication" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkIFQnc-eSp7ImA9WxJXFkw.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2012982946908859391</id><published>2009-06-10T09:19:00.002+02:00</published><updated>2009-06-10T09:21:53.951+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T09:21:53.951+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><title>The Vendor Client Relationship (In Real World Situations)</title><content type="html">&lt;embed width="480" height="340" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://www.youtube.com/v/R2a8TRSgzZY&amp;hl=en&amp;fs=1&amp;showinfo=0"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;ROTFL&lt;br /&gt;&lt;br /&gt;Copied from &lt;a href="http://www.codesqueeze.com/the-vendor-client-relationship-in-real-world-situations/"&gt;{codesqueeze}&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2012982946908859391?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/m2ZlzmZwVxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2012982946908859391/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2012982946908859391" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2012982946908859391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2012982946908859391?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/06/vendor-client-relationship-in-real.html" title="The Vendor Client Relationship (In Real World Situations)" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D08HQ3w9fCp7ImA9WxNQFk0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-202765341607024941</id><published>2009-05-20T08:00:00.003+02:00</published><updated>2009-09-22T09:50:32.264+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T09:50:32.264+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Sysinternals (Process Explorer) saved my a**</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://bielu.com/blog/procexp.jpg"&gt;&lt;img src="http://bielu.com/blog//procexp.jpg" style="margin-right: 5px; width: 300px;" /&gt;&lt;/a&gt;&lt;/div&gt;After deploying our .NET system in production functionally speaking everything was OK. However, after couple of days we saw our processes consuming more than 80% of the CPU of some pretty powerful servers - and we were not computing any nuclear or medical killer stuff. Something was wrong - but what?&lt;br /&gt;
&lt;br /&gt;
At this moment I recalled using free &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx"&gt;Sysinternals&lt;/a&gt; tool from Microsoft to see what's deep inside my operating system (in runtime, of course).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What really happened?&lt;/b&gt;&lt;br /&gt;
I started &lt;a hre="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; belonging to the Sysinternals suite, found my process and looked at it's runtime properties: &lt;div style="float: left"&gt;&lt;a href="http://bielu.com/blog/props.jpg"&gt;&lt;img src="http://bielu.com/blog/props.jpg" style="margin-right: 5px; width: 300px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
What I saw was the increasing number of TCP/IP connections (because used connections were not closed/returned to the pool properly). After some time spent on monitoring the process I noticed that this pattern is stable and each request caused the number of connections to database grow - until the process reached max and OS couldn't handle this process any more. Of course I fixed this issue wit one or two lines of code because it was a "little" problem (as usual) that appeared to have a big impact on the operating software.&lt;br /&gt;
&lt;br /&gt;
I think wouldn't be able to discover this issue so quickly without using Sysinternals. Why? Because my colleagues were trying to investigate and fix this issue for some time before me. They didn't know &lt;a hre="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; tool :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-202765341607024941?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/BhbRktlxlF4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/202765341607024941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=202765341607024941" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/202765341607024941?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/202765341607024941?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/sysinternals-process-explorer-saved-my.html" title="Sysinternals (Process Explorer) saved my a**" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CkcEQXY7eip7ImA9WxJRFk4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-5370763589432424579</id><published>2009-05-18T09:00:00.000+02:00</published><updated>2009-05-18T09:00:00.802+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T09:00:00.802+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="team" /><title>Direct communication as a half-dead project saver: When you start in an over-waterfall company</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.flickr.com/photos/clagnut/252185030/"&gt;&lt;img src="http://farm1.static.flickr.com/85/252185030_616b864353.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://www.flickr.com/photos/clagnut/"&gt;clagnut@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;At the end of year 2008 our team was given a project that was critical from the $$ point of view. We had to deliver the project by the end of March 2009 in order to avoid huge fees from our customer. The problem was that the project we got was being developed by different team in different location and the quality of the existing solution was at least questionable. It turned out that the whole old team left the company and our small commando squad had to save the day. I just have to mention that the company we all worked for was a pure-waterfall monster.&lt;br /&gt;&lt;br /&gt;You know, agile books are fun to read, but how do you start it if you happen to be a developer in a pure waterfall company on an impossible project? I went through it and going to show what worked well for us. I will tell how we were able to get an impossible project apply the agile principles and survive.&lt;br /&gt;&lt;!--break--&gt;&lt;br /&gt;&lt;b&gt;A bit of a history&lt;/b&gt;&lt;br /&gt;The company I used to work for sometime didn't know/use Agile methods. Everything there was pure waterfall i.e. there was a marketing that defined what it wanted (previously negotiated the contract i.e. feature list with the customer), then it passed the specification docs to product definition team that was in charge of designing the solution, finding ALL possible problems and answering ALL possible questions. Then after couple of months the technical specifications were passed to the development team that... started everything all over again. I mean that the development team usually found documents received from product definition team useless - it's not my opinion, rather my conclusion after talks with many friend-developers. Some docs like protocol specifications or conversion specs were REALLY useful but they were vast minority.&lt;br /&gt;&lt;br /&gt;Anyway, when developers started working on the project it usually took just few classes to find some blocking issues that had not been predicted/designed in the docs. "How it's possible?" "They were supposed to find ALL possible problems and answer ALL possible questions". Well, they were supposed to but it was IMPOSSIBLE to do so. Even perfectly prepared and thoroughly checked documentation will not replace direct communication channels.&lt;br /&gt;&lt;br /&gt;The project I'm going to describe was quite different - there was no documentation, no specification but more so there was not a single person understanding the problem. This was a real shocker for the company used to work in an "ordered" and "predictable" way.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Project&lt;/b&gt;&lt;br /&gt;In short we had to develop an unknown communication protocol to connect the two unknown existing systems. And the time we were given was pretty much estimated as we already knew all the guts and gears in this system. Ah - I forgot about some pretty "unimportant" detail: the test database for the test system was located around 1000 km from our desks and the VPN connection was not yet established. So, for couple of weeks we were just having a pretty "black box" environment - it was not so bad though because we had some time to learn how to compile given sources (still, this was the time when we were supposed to be developing software).&lt;br /&gt;&lt;br /&gt;&lt;b&gt; What did we have?&lt;/b&gt;&lt;br /&gt;We had the documentation for the protocol we had to implement with examples (requests and responses). The documentation was not very useful, though because it was designed for people who knew this protocol before. This documentation was not explaining many concepts - it was assuming the reader's knowledge on quite high level - unfortunately we were GREEN.&lt;br /&gt;We also had some stored procedures (in our unreachable database) that were supposed to contain business logic and they were supposed to work already - we were told that they require just small changes. Basically we had to develop a part that had to receive the requests, parse and process it and invoke already existing stored procedure with transformed parameters – we knew that we would also modify or create completely new stored procedures from scratch.&lt;br /&gt;&lt;br /&gt;When we eventually got to know what to do we knew that we had to implement hotel availability (3 different request/responses) and booking (couple of quite complex transaction flows) messages. The availability part was supposed to be 100% ready (this way we could focus only on booking) - we just had to test it and confirm (probably do some small fixes).&lt;br /&gt;&lt;br /&gt;To summarize: we had some germ of the C# code, fully functional stored procedures in T-SQL (MS SQL server) that required some significant rework and proprietary ASCII format specification. I also have to mention that neither of the team members was C# or T-SQL expert (I put it as delicate as possible).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finally @Work&lt;/b&gt;&lt;br /&gt;After some time of investigation we knew how the frontend and backend work but we still couldn't test the system because we had no database. When it was ready we established a test environment and we finally was able to integrate the whole system. We were able to start this machinery and inject some requests. We were even receiving some responses - but at this moment we had completely no idea whether these responses were correct or not.&lt;br /&gt;&lt;br /&gt;Here is the moment we started communicating directly with our customer who started testing delivered system in test environment and giving us feedback. If you ask why we didn’t communicate with them earlier I would answer that we had nothing to show them as the test environment was unreachable for developers. If we couldn’t show them anything we weren’t able to get any feedback. That sucked…&lt;br /&gt;&lt;br /&gt;I will leave the details of our communication process with customer for the next post.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lessons learned so far&lt;/b&gt;&lt;br /&gt;We took over the project in a rush and were just given a source codes from the previous team – which wasn’t the first class anyway (I mean the code). There was no unit tests, no continuous integration environment, no single product backlog but we started creating those artefacts. And you know what – this was the best decision we could make - we took as much as we could from the agile world in this project. &lt;br /&gt;&lt;br /&gt;The main problem that was probably the root cause of all other issues was lack of communication. Before starting contacting directly with customer (who became our product owner, in fact) this was the worst part of the project because we not only didn’t know what to do but also we had no one who could verify our assumptions. Lack of communication was very visible and the deadlines were getting closer. We were really thinking that we will be late with such pace and information flow (or rather lack of it). We knew that with such level of uncertainty agile practices - especially open and effective communication - could help us saving our jobs.&lt;br /&gt;&lt;br /&gt;In the next part I will explain how we solved our communication problems, how agile practices helped keep the project on track and keep the number of bugs close to zero as well as how the whole project finished. Stay tuned!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feedback&lt;/b&gt;&lt;br /&gt;Do you recall such situation in your own project(s)? What was the solution that worked for your team? I'm really curious your opinions and thoughts.&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-5370763589432424579?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/78IKlar-LK8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/5370763589432424579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=5370763589432424579" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5370763589432424579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5370763589432424579?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/direct-communication-as-half-dead.html" title="Direct communication as a half-dead project saver: When you start in an over-waterfall company" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE8DRXY8fyp7ImA9WxJRFUg.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3621912492800003850</id><published>2009-05-15T20:36:00.004+02:00</published><updated>2009-05-17T11:34:34.877+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-17T11:34:34.877+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="po polsku" /><title>Niezły kawałek muzyki</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://towary.art.pl/"&gt;&lt;img src="http://towary.art.pl/dolne-miasto-ost/img/album.jpg" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;/div&gt;This post will be in Polish but don't worry it won't be about Java or technology at all. Anyway, if you want to listen to some really good music (one of the artist - Piotr Czerski - is my friend from university and some really wasting parties ;) visit this website: &lt;a href="http://towary.art.pl"&gt;http://towary.art.pl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mam nadzieję, że Groszek się nie obrazi jeśli skopiuję post z jego &lt;a href="http://mmorfe.blogspot.com/"&gt;bloga&lt;/a&gt; - nic lepszego i tak nie wymyślę na temat nowiuteńkiej płyty grupy "Towary Zastępcze" pt. "Dolne Miasto" bo o tym będzie ten wpis. Przesłuchałem tę płytę już dzisiaj dwa razy i jestem bardzo &lt;i&gt;kontent&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A oto co do powiedzenia ma na temat płyty Groszek (ze wszystkim się w stu procentach zgadzam):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Na płytę składa się dwanaście zaśpiewanych wierszy, opowiadających strzępy tragicznej historii dziewczyny z Grand Hotelu. Szczególną uwagę zwraca strona internetowa towary.art.pl promująca album, na której możemy wcielić się w rolę detektywa prowadzącego śledztwo. Oglądając kolejne fragmenty video i podążając właściwym tropem, z pewnością uda nam się zdobyć odpowiedzi na trzy pytania, co pozwoli ściągnąć album w formacie mp3 za darmo z sieci. Wytrwali mogą również odnaleźć prawdziwego mordercę i dotrzeć do kolejnych bonusów.&lt;br /&gt;&lt;br /&gt;Album dostępny jest również w bardziej namacalnej postaci. W atrakcyjnej cenie można nabyć akta sprawy, w których jednym z dowodów jest płyta. Doskonały pomysł na nietuzinkowy prezent i wsparcie twórczości artystów. Gorąco polecam!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ja też polecam - kawał dobrej roboty i muzyki!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3621912492800003850?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/lvWs1Crjg6c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3621912492800003850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3621912492800003850" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3621912492800003850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3621912492800003850?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/niezy-kawaek-muzyki.html" title="Niezły kawałek muzyki" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUcARHo4eyp7ImA9WxJQE0s.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3696232397458449146</id><published>2009-05-15T15:13:00.004+02:00</published><updated>2009-05-26T21:44:05.433+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T21:44:05.433+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>Java Concurrency Bugs/Programmer's Errors</title><content type="html">Alex Miller has been posting very interesting &lt;a href="http://tech.puredanger.com/category/bug/"&gt;series&lt;/a&gt; on Java concurrency bugs (or pitfalls programmers could fall into). Especially interesting is the last post: &lt;a href="http://tech.puredanger.com/2009/05/13/java-concurrency-bugs-5-inconsistent-synchronization/"&gt;Inconsistent synchronization&lt;/a&gt;. This post is most probably inspired by the problems Alex discovered in &lt;a href="http://tech.puredanger.com/2009/05/13/hibernate-concurrency-bugs/"&gt;Hibernate statistics&lt;/a&gt; and I am pretty proud I was able to find possible concurrency issues reading the code. Anyway, I was not able to fully and correctly solve those issues.&lt;br /&gt;&lt;br /&gt;The conclusion for me is that I thought about "magic" solution instead of the correct one i.e. I suggested that declaring a integer field as &lt;code&gt;volatile&lt;/code&gt; would solve the issue. In fact it would but the "correct" solution to this problem is using &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html"&gt;AtomicInteger&lt;/a&gt; from &lt;code&gt;java.util.concurrent.atomic&lt;/code&gt; package.&lt;br /&gt;&lt;br /&gt;Another conclusion is to remember to keep bombarding your Java code with &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; - it can find many many Java issues in your code (not only related to concurrency).&lt;br /&gt;&lt;br /&gt;The rest of the Alex's series (so far) is here:&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/02/02/java-concurrency-bugs-concurrentmodificationexception/"&gt;Java Concurrency Bugs #4: ConcurrentModificationException&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/30/java-concurrency-bugs-atomic/"&gt;Java Concurrency Bugs #3 - atomic + atomic != atomic&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/28/java-concurrency-bugs-synchronize-object/"&gt;Java Concurrency Bugs #2 - what to synchronize on&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/27/java-concurrency-bugs-mutable-statics/"&gt;Java Concurrency Bugs #1 - mutable statics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy you Java Concurrency Issues ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3696232397458449146?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/LceA8WL1Yf4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3696232397458449146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3696232397458449146" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3696232397458449146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3696232397458449146?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/java-concurrency-bugsprogrammers-errors.html" title="Java Concurrency Bugs/Programmer's Errors" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0cGSHo7eip7ImA9WxJSFE8.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2783029348547603225</id><published>2009-05-04T11:00:00.002+02:00</published><updated>2009-05-04T11:23:49.402+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T11:23:49.402+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Fun soft: regex checker</title><content type="html">I'm not a regular expressions expert but I use them often - as probably most of software developers. Before using them I want to be sure my regexes are written correctly and they will serve their purposes. I wrote very small command-line app for doing the check for me :) As a first input user provides the regex to check, then the user can type all texts to check against previously given regex until she types 'q' or 'exit' (for which program exits). Enjoy!&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;package com.bielu;&lt;br /&gt;&lt;br /&gt;import java.io.Console;&lt;br /&gt;&lt;br /&gt;public class RegexTester {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Console in = System.console();&lt;br /&gt;    if (in == null) {&lt;br /&gt;      System.err.println("Cannot obtain system console - exiting application");&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    System.out.print("Enter regex to test: ");&lt;br /&gt;    String regex = in.readLine();&lt;br /&gt; &lt;br /&gt;    while (true) {&lt;br /&gt;      System.out.printf("Type value to match with given regex '%s': ", regex);&lt;br /&gt;      String string = in.readLine();&lt;br /&gt;  &lt;br /&gt;      if (string.equalsIgnoreCase("q") || string.equalsIgnoreCase("exit")) {&lt;br /&gt;        break;&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;      if (string.matches(regex)) {&lt;br /&gt;        System.out.printf("'%s' matches '%s' regex\n", string, regex);&lt;br /&gt;      } else {&lt;br /&gt;        System.out.printf("'%s' does NOT match '%s' regex\n", string, regex);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2783029348547603225?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/tyY8nyqUtgA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2783029348547603225/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2783029348547603225" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2783029348547603225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2783029348547603225?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/fun-soft-regex-checker.html" title="Fun soft: regex checker" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;Ck4ARn07cCp7ImA9WxJTGEs.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3336353899517220004</id><published>2009-04-27T21:09:00.008+02:00</published><updated>2009-04-27T21:35:47.308+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-27T21:35:47.308+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CSM" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="certificate" /><title>Certified Scrum Master Training in Gdańsk</title><content type="html">&lt;center&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s1600-h/scrum.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 97%;" src="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s400/scrum.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329451370456430066" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div style="text-align: justify;"&gt;I hope you already know that a cool company that is definitely one generation ahead than their competitors (at least as far as the way they work is concerned) called &lt;a href="http://spartez.com"&gt;Spartez&lt;/a&gt; organizes the first &lt;a href="http://spartez.com/eng/csmtraining.html"&gt;CSM Training&lt;/a&gt; in northern Poland, namely in &lt;a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=gdansk&amp;ie=UTF8&amp;z=11&amp;iwloc=A"&gt;Gdańsk&lt;/a&gt;. The training will be led by famous &lt;a href="http://www.crisp.se/henrik.kniberg"&gt;Henrik Kniberg&lt;/a&gt; from whose book my adventure with real Scrum began. It is really a PITTY I will not be there :(&lt;br /&gt;&lt;br /&gt;But anyway - if you live somewhere in the central, eastern or northern Europe this training is definitely worth taking. I took CSM course in Zurich last week led by Angela Druckman and am very satisfied. This training is really worth it's price (or even more because I think the training is quite cheap).&lt;br /&gt;&lt;br /&gt;Don't waste your time and sign up for this &lt;a href="http://spartez.com/eng/csmtraining.html"&gt;CSM session&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3336353899517220004?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/wih9EkKIJMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3336353899517220004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3336353899517220004" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3336353899517220004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3336353899517220004?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/certified-scrum-master-training-in.html" title="Certified Scrum Master Training in Gdańsk" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s72-c/scrum.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0QNRH8-eCp7ImA9WxJTEkw.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-6286527861871001503</id><published>2009-04-17T16:00:00.016+02:00</published><updated>2009-04-20T10:16:35.150+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T10:16:35.150+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="final" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>The power of the final keyword - updated</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.flickr.com/photos/data_op/2735704097/"&gt;&lt;img src="http://farm4.static.flickr.com/3227/2735704097_cab90bcd07.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://www.flickr.com/photos/data_op/"&gt;Okko Pyykkö@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;These two articles of Alex Miller:&lt;ul&gt;&lt;li&gt;&lt;a href="http://tech.puredanger.com/2008/11/26/final-java/"&gt;A final bit of advice&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://tech.puredanger.com/2008/11/26/jmm-and-final-field-freeze/"&gt;JMM and final field freeze&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;clearly explain why using &lt;code&gt;final&lt;/code&gt; fields in concurrent programs is extremely powerful and safe (thread-safe).&lt;br /&gt;&lt;br /&gt;Take a look a this simple example:&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class SomeClass implements Runnable {  &lt;br /&gt;    private final LinkedHashMap map;&lt;br /&gt;      &lt;br /&gt;    public SomeClass(LinkedHashMap copiedMap) {&lt;br /&gt;        map = copiedMap;&lt;br /&gt;        preProcessMap();&lt;br /&gt;    }  &lt;br /&gt;     &lt;br /&gt;    private void preProcessMap() {&lt;br /&gt;        //some non-trivial and not-so-short computations&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // A read method  &lt;br /&gt;    public Object get(Object key) {  &lt;br /&gt;        return map.get(key);  &lt;br /&gt;    }  &lt;br /&gt;     &lt;br /&gt;    public void run() {&lt;br /&gt;        //assume that in this method only &lt;br /&gt;        //unsynchronized read operations on map may occur&lt;br /&gt;        //any unsynchronized write operation is not thread-safe&lt;br /&gt;    }&lt;br /&gt;    // etc...  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;      LinkedHashMap map = // map creation&lt;br /&gt;      // map initialization&lt;br /&gt;      new Thread(new SomeClass(map)).start();&lt;br /&gt;      // etc.&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;UPDATE:&lt;/b&gt;&lt;br /&gt;I preserved the original version of the code but after some thoughts and thanks to some comments (thank you dear readers) I conclude that this example is not 100% correct. Before &lt;code&gt;Thread.start()&lt;/code&gt; could be started the object has to be fully initialized and initialization will be completed only AFTER the &lt;code&gt;SomeClass&lt;/code&gt; object is created. This way &lt;code&gt;final&lt;/code&gt; keyword doesn't add any value there. On the other hand I meant this piece of code: &lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class Main {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;      LinkedHashMap map = // map creation&lt;br /&gt;      // map initialization&lt;br /&gt;      final ExecutorService service = Executors.newFixedThreadPool(1);&lt;br /&gt;      service.submit(new SomeClass(map));&lt;br /&gt;      // etc.&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;In such case I'm pretty sure you cannot assume that e.g. second processor (in a multi-core platform) will wait before executing newly scheduled task until the object of class &lt;code&gt;SomeClass&lt;/code&gt; is fully initialized, right? Correct me if I'm wrong because I feel have some mess in my brain now ;)&lt;br /&gt;&lt;b&gt;End of UPDATE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Whatever happens in the &lt;code&gt;preProcessMap()&lt;/code&gt; method you can be sure that &lt;code&gt;LinkedHashMap&lt;/code&gt; will be copied and preprocessed BEFORE starting the &lt;code&gt;run()&lt;/code&gt; method by the new thread. This way any READ (get) operation on this map in all threads will be safe and will operate on completely and correctly initialized &lt;code&gt;map&lt;/code&gt; object.&lt;br /&gt;&lt;br /&gt;If only you remove &lt;code&gt;final&lt;/code&gt; keyword from &lt;code&gt;LinkedHashMap&lt;/code&gt; declaration you cannot be sure our previous assumption. It may happen that the thread will be started BEFORE copying the map and if in &lt;code&gt;run()&lt;/code&gt; method you process this map in any way you may get NPE.&lt;br /&gt;&lt;br /&gt;Let me use a bottle metaphor :) For me &lt;code&gt;final&lt;/code&gt; keyword is like the guarantee that you closed the bottle of whisky before passing it to your crazy friend who likes juggling them. If you ensure that the bottle is closed (final) before passing it to your friend you can be sure he will not spill any of the precious whisky on the floor. On the other hand if you start passing the bottle to him while trying to close it you're not sure whether it's fully closed while he starts juggling it or not. It may be closed 100% of time when you meet in your place but when you go to your other friend's party he may spill very expensive whisky and break the bottle in the same time (test and production environments metaphor this time). &lt;br /&gt;Conclusion? Close the bottle before giving it to anybody else.&lt;br /&gt;&lt;br /&gt;I will not be original and simply copy Alex Miller's advice:&lt;br /&gt;&lt;blockquote&gt;Final fields are ever so important and useful. Whenever possible, strive to make your fields final. One tip for this is to enable a Save Action in Eclipse (or your IDE of choice) that automatically attempts to make fields final if possible so you can’t forget!&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-6286527861871001503?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/mpgd6SG9b1s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/6286527861871001503/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=6286527861871001503" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html" title="The power of the &lt;code&gt;final&lt;/code&gt; keyword - &lt;b&gt;updated&lt;/b&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total></entry><entry gd:etag="W/&quot;Ck8CRXw4fip7ImA9WxVUGU0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8371336367696894319</id><published>2009-03-24T14:13:00.001+01:00</published><updated>2009-03-24T14:21:04.236+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T14:21:04.236+01:00</app:edited><title>Why Object-Oriented languages rock?</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s800/IMG_0422.jpg"&gt;&lt;img src="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s800/IMG_0422.jpg" style="margin-right: 5px; width: 250px;" /&gt;&lt;/a&gt;&lt;/div&gt;I loved coming back from using &lt;a href="http://en.wikipedia.org/wiki/Transact-SQL"&gt;T-SQL&lt;/a&gt; to C# or Java like I loved the view from the picture (view from the &lt;a href="http://maps.google.fr/?ie=UTF8&amp;ll=43.487801,6.890488&amp;spn=0.170625,0.30899&amp;t=h&amp;z=12"&gt;l'Esterel's mountains&lt;/a&gt; towards Cannes). Of course, SQL-like languages are very powerful and when you do some complicated computations that need many requests to the underlying relational database, this choice may be the right one. At least, as far as the performance is concerned.&lt;br /&gt;&lt;br /&gt;If we leave performance concerns behind we still have the language itself. So, what did I miss in this language? I was thinking of enumerating things that I didn't like but after some thinking I conclude that I just missed object-orientation in general.&lt;br /&gt;&lt;br /&gt;But what it means? Let's see... I was not able to use any design pattern (e.g. &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;Factory&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Strategy_design_pattern"&gt;Strategy&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;Decorator&lt;/a&gt;) and I needed them very badly! Instead of using design patterns I had to add many ugly &lt;tt&gt;if&lt;/tt&gt;s.&lt;br /&gt;&lt;br /&gt;Another thing I missed was abstraction i.e. I wasn't able to create abstract stored procedure and then implement specialized subprocedures. In T-SQL everything you can do is to add some more &lt;tt&gt;if&lt;/tt&gt;s :) This language is strongly data-oriented which is maybe good but it's not sufficient IMHO.&lt;br /&gt;&lt;br /&gt;Yes - it's very vague but it doesn't make sense to compare stored procedures with OO constructs. T-SQL is just yet another language I've learnt and used after many years of writing Java/C++ code and I just wanted to express my feelings.&lt;br /&gt;&lt;br /&gt;I don't know what are perspectives for such SQL languages like T-SQL or &lt;a href="http://en.wikipedia.org/wiki/PL_SQL#Similar_languages"&gt;PL/SQL&lt;/a&gt; but I think they should evolve in an object-oriented way. It would be much easier to write stored procedures/classes in e.g. Java, test them and then deploy on the server. This would be a win-win situation. We would gain performance by having stored code invoked directly on the SQL server while we will still be able to use OO constructs and profit from unit tests, design patterns, etc.&lt;br /&gt;&lt;br /&gt;Maybe there already are such languages but I just don't know them (most of them are procedural languages) - if you know some let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8371336367696894319?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/SYhSbVa2nQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8371336367696894319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8371336367696894319" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8371336367696894319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8371336367696894319?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/03/why-object-oriented-languages-rock.html" title="Why Object-Oriented languages rock?" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s72-c/IMG_0422.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;D0IGQHs4fCp7ImA9WxVWGUU.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7801982523873019715</id><published>2009-03-02T10:16:00.001+01:00</published><updated>2009-03-02T10:18:41.534+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T10:18:41.534+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="unit testing" /><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="maintenance" /><title>Everybody Needs ... Unit Tests</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/fridlund/2194911895/"&gt;&lt;img src="http://farm3.static.flickr.com/2313/2194911895_a621109592.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/fridlund/"&gt;Lotus72@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;i&gt;... please remember people, no matter who you are, and whatever you do to live, thrive and survive, there are still some things that make us all the same: you, me, him, them - everybody, everybody!&lt;/i&gt; - this is a fragment of Blues Brothers' "Everybody Need Somebody" song. Nothing to do with software development but when you change the next line of this song from "Everybody needs somebody" to "Everybody needs Unit Tests" it becomes closer to software development.&lt;br /&gt;&lt;br /&gt;I intentionally used lyrics of this song to keep everyone's attention (just a little bit) to this post. If you are familiar with TDD and unit test your code you can disregard it - I'd like to address this post to all software engineers/developers/programmers/etc. that DO NOT unit test their code.&lt;br /&gt;&lt;br /&gt;In this post I will try (again) to convince all software developers that still don't unit test their code that it's right thing to do and it's damn simple.&lt;br /&gt;&lt;h2&gt;Assume that Agile software development is wrong, really wrong&lt;/h2&gt;&lt;br /&gt;You don't have to be the fan of Agile movement - you can even think it's stupid, immature and doesn't help software development at all. Maybe you're right, maybe not - it's rather a question of taste. You don't have to use or like Scrum, you may think that XP is crazy and an overkill - you have right to think so. I can understand everything but PLEASE do unit test your code! Forget about Agile, forget about processes and methodologies - just unit test your code.&lt;br /&gt;&lt;br /&gt;I just took over another project that is quite complex (of course it is!) but has NO SINGLE unit test (or any test at all). More so, there is no documentation of any kind. Yes I can read the code and see what it does - that's simple but how the hell I could know it does what it should do? How could I know it's not a mistake made by the developer who created this creature?&lt;br /&gt;&lt;br /&gt;This code lacks Unit Test, but fortunately day after day I add more and more and I'm more confident this piece of software works.&lt;br /&gt;&lt;h2&gt;Unit Testing once again&lt;/h2&gt;&lt;br /&gt;If you want to know something more about unit testing check out &lt;a href="http://agilesoftwaredevelopment.com/tags/unittesting"&gt;our previous articles&lt;/a&gt;. I will just recapitulate the most important, in my opinion, qualities of unit testing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;unit tests document internal and external architecture of the software system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests help you and other developers to immediately see whether code "improvements" broke already existing code&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests help making your software bug-free - all issues should be addressed by writing a failing test first&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests together with &lt;a href="http://agilesoftwaredevelopment.com/tags/codecoverage"&gt;code coverage&lt;/a&gt; tools improve quality of your software&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests can be used as a presentation platform - you can present hard to visualise issues using unit testing green bar - green means that it works&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests significantly improve team confidency in progress - if all the tests pass it means that all features implemented so far work and nobody broke the system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests improve efficiency - you don't have to perform laborious manual tests again and again after code changes, just start unit tests and watch the red/green bar&lt;/li&gt;&lt;br /&gt;&lt;li&gt;already there but so important that worth reminding - unit tests work as a DOCUMENTATION (auxiliary or main one)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;I'm open for your propositions&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I hope I convinced you to start writing unit tests - if you don't like or believe in Agile movement it's OK. &lt;b&gt;Unit Testing is just an obligatory practice of every decent software developer.&lt;/b&gt; If you do unit test it doesn't mean you're good one but if you don't unit test you're a poor developer (I mean it).&lt;br /&gt;&lt;br /&gt;I wonder when unit testing will be taught obligatory at every decent university. It does so many good and is so simple - people, please - write unit tests!&lt;br /&gt;&lt;br /&gt;If you have any ideas how to convince every developer that unit testing is right thing to do I'm open for suggestions.&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7801982523873019715?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/3XYtHUBo3_w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7801982523873019715/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7801982523873019715" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7801982523873019715?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7801982523873019715?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/03/everybody-needs-unit-tests.html" title="Everybody Needs ... Unit Tests" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C08ASXs7fCp7ImA9WxJTEU4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7785329299781449246</id><published>2009-02-16T08:00:00.001+01:00</published><updated>2009-04-19T11:04:08.504+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T11:04:08.504+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="collections" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>Synchronized collections in Java 5+</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/swamibu/1182138940/"&gt;&lt;img src="http://farm2.static.flickr.com/1406/1182138940_b0b36d843d.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/swamibu/"&gt;Swamibu@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;You probably encountered problem of which collection to use while writing concurrent applications. Which implementation to use when you have N concurrent writers and M concurrent readers? I will try to shortly answer this question on simple example. &lt;br /&gt;&lt;br /&gt;The code below presents usage of different collection implementations while having 16 concurrent writer threads and 100 concurrent reader threads. At the same time writer threads modify the collection i.e. add new elements and reader threads iterate through actual collection state and operate on its elements.&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class ConcurrentCollectionsTest {&lt;br /&gt; public static final int READERS_COUNT = 100;&lt;br /&gt; public static final int COLLECTION_SIZE = 5000;&lt;br /&gt; public static final int WRITERS_COUNT = 16;&lt;br /&gt;&lt;br /&gt; static volatile int readExceptionCount = 0;&lt;br /&gt;  static CountDownLatch latch;&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;  Map&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt; map = &lt;br /&gt;    new LinkedHashMap&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;  map.put("ArrayList", &lt;br /&gt;      new ArrayList&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  map.put("Synchronized ArrayList", &lt;br /&gt;      Collections.synchronizedCollection(&lt;br /&gt;        new ArrayList&amp;lt;String&amp;gt;()));&lt;br /&gt;&lt;br /&gt;  map.put("ConcurrentLinkedQueue", &lt;br /&gt;      new ConcurrentLinkedQueue&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  map.put("CopyOnWriteArrayList", &lt;br /&gt;      new CopyOnWriteArrayList&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  for (Entry&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt; e: map.entrySet()) {&lt;br /&gt;   Collection&amp;lt;String&amp;gt; collection = e.getValue();&lt;br /&gt;   latch = new CountDownLatch(READERS_COUNT + WRITERS_COUNT);&lt;br /&gt;   readExceptionCount = 0;&lt;br /&gt;&lt;br /&gt;   long start = System.currentTimeMillis();&lt;br /&gt;   for (int i = 0; i &amp;lt; WRITERS_COUNT; ++i) {&lt;br /&gt;    Thread t = new Thread(new Writer(collection));&lt;br /&gt;    t.start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   for (int i = 0; i &amp;lt; READERS_COUNT; ++i) {&lt;br /&gt;    Thread t = new Thread(new Reader(collection));&lt;br /&gt;    t.start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   latch.await();&lt;br /&gt;   System.out.println("-----------------");&lt;br /&gt;   System.out.println("Stats for [" + e.getKey() + "]:");&lt;br /&gt;   System.out.printf("Collection's size: %d\n", collection.size());&lt;br /&gt;   System.out.printf("ConcurrentModificationException count [read]: %d\n", readExceptionCount);&lt;br /&gt;   System.out.printf("Duration: %d\n\n", System.currentTimeMillis() - start);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;static class Reader implements Runnable {&lt;br /&gt; private final Collection&amp;lt;String&amp;gt; collection;&lt;br /&gt;&lt;br /&gt; Reader(Collection&amp;lt;String&amp;gt; col) {&lt;br /&gt;  this.collection = col;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   for (Iterator&amp;lt;String&amp;gt; i = collection.iterator(); i.hasNext();) {&lt;br /&gt;    // additional computing operation just to consume some time&lt;br /&gt;    String t = i.next() + "_added";&lt;br /&gt;    if (t.length() &gt; 10 &amp;&amp; i.hasNext()) {&lt;br /&gt;     i.next();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  } catch (ConcurrentModificationException e) {&lt;br /&gt;   readExceptionCount++;&lt;br /&gt;  }&lt;br /&gt;  latch.countDown();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class Writer implements Runnable {&lt;br /&gt; private final Collection&amp;lt;String&amp;gt; collection;&lt;br /&gt;&lt;br /&gt; Writer(Collection&amp;lt;String&amp;gt; col) {&lt;br /&gt;  this.collection = col;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   for (int i = 0; i &lt; COLLECTION_SIZE; ++i) {&lt;br /&gt;    collection.add(Thread.currentThread().getName() &lt;br /&gt;        + System.currentTimeMillis());&lt;br /&gt;   }&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   // ignore&lt;br /&gt;  }&lt;br /&gt;  latch.countDown();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Results on my machine (numbers can vary on different hardware but problems/conclusions will be the same):&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [ArrayList]:&lt;br /&gt;Collection's size: 77038&lt;br /&gt;ConcurrentModificationException count [read]: 17&lt;br /&gt;Duration: 1047 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [Synchronized ArrayList]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 4&lt;br /&gt;Duration: 1141 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [ConcurrentLinkedQueue]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 0&lt;br /&gt;Duration: 1046 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [CopyOnWriteArrayList]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 0&lt;br /&gt;Duration: 14344 ms&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;&lt;tt&gt;ArrayList&lt;/tt&gt; (unsurprisingly) doesn't work at all - there is 17 ConcurrentModificationException on read attempt and what is more unacceptable this collection is in unpredictable state i.e. it's size should be 80000 instead of 77038 - it means that many items were not stored by the writer threads.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;Synchronized ArrayList&lt;/tt&gt; works better i.e. its state is correct but still you need additional synchronization in order to get rid of ConcurrentModificationException while iterating through it.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;ConcurrentLinkedQueue&lt;/tt&gt; works best in this case and does not add any performance penalties.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;CopyOnWriteArrayList&lt;/tt&gt; is the worst in this case because &lt;i&gt;traversal operations &lt;b&gt;does not&lt;/b&gt; vastly outnumber mutations&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The last conclusion would be to perform such test before deciding which implementation works best in your particular case. Also, read javadoc carefully to see implications and suggested use cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7785329299781449246?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/zJJ_ocCkTfw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7785329299781449246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7785329299781449246" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7785329299781449246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7785329299781449246?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2008/12/java-concurrency-is-easy-synchronized.html" title="Synchronized collections in Java 5+" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;C08CQ385eSp7ImA9WxJTEU4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7125286559264521616</id><published>2009-02-09T08:00:00.004+01:00</published><updated>2009-04-19T11:04:22.121+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T11:04:22.121+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="synchronizers" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>Java synchronizers - Semaphore</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/matthewblack/133659535/"&gt;&lt;img src="http://farm1.static.flickr.com/46/133659535_22633467d9.jpg?v=0" style="margin: 0px 5px 5px 0px; width: 250px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/matthewblack/"&gt;matthewblack@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;In this part I will present good-old semaphore that was finally introduced in Java 5. Semaphores are applicable in many different cases. One of them is the case when you have limited number of resources that can be accessed at the same time (imagine that you have 5 printers and 100 employees who print their documents - possibly all at the same time). Users have to wait for their turn - however order in which they requested the resource is not important (someone can wait couple of turns while someone else can get the resource many times turn after turn).&lt;br /&gt;&lt;br /&gt;The code below shows this "metaphor" with 3 printers and 5 employees:&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class SemaphoreTest {&lt;br /&gt; public static void main(String[] args) throws InterruptedException {&lt;br /&gt;  Semaphore sem = new Semaphore(3);&lt;br /&gt;  Thread[] t = new Thread[5];&lt;br /&gt;  &lt;br /&gt;  for (int i = 0; i &lt; t.length; i++) {&lt;br /&gt;   t[i] = new Thread(new Task(sem));&lt;br /&gt;   t[i].start();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  Thread.sleep(10000);&lt;br /&gt;  &lt;br /&gt;  for (int i = 0; i &lt; t.length; i++) {&lt;br /&gt;   t[i].interrupt();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static final class Task implements Runnable {&lt;br /&gt;  private final Semaphore sem;&lt;br /&gt;&lt;br /&gt;  private Task(Semaphore sem) {&lt;br /&gt;   this.sem = sem;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void run() {&lt;br /&gt;   try {&lt;br /&gt;    while (true) {&lt;br /&gt;     if (sem.tryAcquire() == true) {&lt;br /&gt;      System.out.printf("%s acquired semafore - %d\n", Thread.currentThread().getName(), sem.availablePermits());&lt;br /&gt;      sem.release();&lt;br /&gt;     } else {&lt;br /&gt;      System.out.printf("%s could not acquire semafore\n", Thread.currentThread().getName());&lt;br /&gt;     }&lt;br /&gt;     Thread.sleep(1000);&lt;br /&gt;    }&lt;br /&gt;   } catch (InterruptedException e) {&lt;br /&gt;    Thread.currentThread().interrupt();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The program above terminates automatically after about 10 seconds from start.&lt;br /&gt;&lt;br /&gt;Results (one of the infinite number of possible results) on my machine:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;Thread-0 acquired semafore - 1&lt;br /&gt;Thread-3 could not acquire semafore&lt;br /&gt;Thread-4 could not acquire semafore&lt;br /&gt;Thread-2 could not acquire semafore&lt;br /&gt;Thread-1 acquired semafore - 0&lt;br /&gt;Thread-3 acquired semafore - 1&lt;br /&gt;Thread-0 acquired semafore - 1&lt;br /&gt;Thread-4 acquired semafore - 0&lt;br /&gt;Thread-2 could not acquire semafore&lt;br /&gt;Thread-1 acquired semafore - 0&lt;br /&gt;Thread-0 acquired semafore - 1&lt;br /&gt;Thread-3 acquired semafore - 0&lt;br /&gt;Thread-2 acquired semafore - 1&lt;br /&gt;...&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;As you can see each thread at some point acquires the semaphore and accesses requested resources. &lt;b&gt;Be careful&lt;/b&gt; though because when the number of consumers/producers vastly outnumbers semaphore's permits starvation is very likely (i.e. some of the threads will never have an opportunity to enter the critical section). You can even spot it on the presented listing where &lt;tt&gt;Thread-2&lt;/tt&gt; cannot acquire semaphore twice while &lt;tt&gt;Thread-0&lt;/tt&gt; is "lucky" and always gets it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7125286559264521616?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/Ahi3xWNaMnI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7125286559264521616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7125286559264521616" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7125286559264521616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7125286559264521616?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/01/java-concurrency-is-easy-how-and-when.html" title="Java synchronizers - &lt;b&gt;Semaphore&lt;/b&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;DUUEQXw8cCp7ImA9WxVQGEw.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-1073681524721128270</id><published>2009-02-05T08:00:00.000+01:00</published><updated>2009-02-05T08:00:00.278+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-05T08:00:00.278+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><category scheme="http://www.blogger.com/atom/ns#" term="principles" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Seven Principles of Lean Software Development</title><content type="html">&lt;a&gt;Lean Software Development&lt;/a&gt; has its roots in &lt;a href="http://www.amazon.com/Toyota-Production-System-Beyond-Large-Scale/dp/0915299143/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1232395191&amp;sr=8-1"&gt;Toyota Production System&lt;/a&gt; and it helps software organizations optimize their processes and production methods in order to deliver their products to the market much faster and with better quality. Lean movement can be considered as a new development method that tries to identify and eradicate all problems and "disabilities" of old methodologies like &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;Waterfall&lt;/a&gt;. Lean puts main focus on people and communication - if people who produce the software are respected and they communicate efficiently, it is more likely that they will deliver good product and the final customer will be satisfied.&lt;br /&gt;&lt;br /&gt;Lean Software Development subsequently gave birth to &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development#Agile_methods"&gt;Agile Software Development methods&lt;/a&gt; and its main branches like &lt;a href="http://en.wikipedia.org/wiki/Scrum_(development)"&gt;Scrum&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Crystal_Clear_(software_development)"&gt;Crystal Clear&lt;/a&gt;. For many people who know the subject Agile is just another word for Lean or Lightweight.&lt;br /&gt;&lt;br /&gt;In one of the most popular books on Lean subject, namely &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt;, Mary and Tom Poppendieck explain how to implement Lean by following seven principles - principles that are some kind of Lean commandments:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-eliminate-waste"&gt;&lt;b&gt;Eliminate Waste&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Provide market and technical leadership&lt;/i&gt; - your company can be successful by producing innovative and technologically advanced products but you must understand what your customers value and you know what technology you're using can deliver&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Create nothing but value&lt;/i&gt; - you have to be careful with all the processes you follow i.e. be sure that all of them are required and they are focused on creating value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Write less code&lt;/i&gt; - the more code you have the more tests you need thus it requires more work and if you're writing tests for features that are not needed you are simply wasting time&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-create-knowledge"&gt;&lt;b&gt;Create Knowledge&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Create design-build teams&lt;/i&gt; - leader of the development team has to listen to his/her members and ask smart questions encouraging them to look for the answers and to get back with encountered problems or invented solutions as soon as possible&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Maintain a culture of constant improvement&lt;/i&gt; - create environment in which people will be constantly improving what they are working on - they should know that they are not and should not be perfect - they always have a field to improve and they should do it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Teach problem-solving methods&lt;/i&gt; - development team should behave like small research institute, they should establish hypotheses and conduct many rapid experiments in order to verify them&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-build-quality"&gt;&lt;b&gt;Build Quality In&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Synchronize&lt;/i&gt; - in order to achieve high quality in your software you should start worrying about it before you write single line of working code - don't wait with synchronization because it will hurt&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Automate&lt;/i&gt; - automate testing, building, installations, anything that is routine, but do it smartly, do it in a way people can improve the process and change anything they want without worrying that after the change is done the software will stop working&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Refactor&lt;/i&gt; - eliminate code duplication to ZERO - every time it shows up refactor the code, the tests, and the documentation to minimize the complexity&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-defer-commitment"&gt;&lt;b&gt;Defer Commitment&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Schedule Irreversible Decisions at the Last Responsible Moment&lt;/i&gt; - you should know where you want to go but you don't know the road very well, you will be discovering it day after day - the most important thing is to keep the right direction&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Break Dependencies&lt;/i&gt; - components should be coupled as loosely as possible to enable implementation in any order&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Maintain Options&lt;/i&gt; - develop multiple solutions for all critical decisions and see which one works best&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/optimize-the-whole"&gt;&lt;b&gt;Optimize the Whole&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Focus on the Entire Value Stream&lt;/i&gt; - focus on winning the whole race which is the software - don't optimize local inefficiencies, see the whole and optimize the whole organization&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Deliver a Complete Product&lt;/i&gt; - teams need to have great leaders as well as great engineers, sales, marketing specialists, secretaries, etc. - they together can deliver great final products to their customers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-deliver-fast"&gt;&lt;b&gt;Deliver Fast&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Work in small batches&lt;/i&gt; - reduce projects size, shorten release cycles, stabilize work environment (listen to what your velocity tells you), repeat what's good and eradicate practices that creates obstacles&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Limit work to capacity&lt;/i&gt; - limit tasks queue to minimum (one or two iterations ahead is enough), don't be afraid of removing items from the queue - reject any work until you have an empty slot in your queue&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Focus on cycle time, not utilization&lt;/i&gt; - put in your queue small tasks that cannot clog the process for a long time - reduce cycle time and have fewer things to process in your queue&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/respect-people"&gt;&lt;b&gt;Respect People&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Train team leaders/supervisors&lt;/i&gt; - give team leaders the training, the guidance and some free space to implement lean thinking in their environment&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Move responsibility and decision making to the lowest possible level&lt;/i&gt; - let your people think and decide on their own - they know better how to implement difficult algorithms and apply state-of-the-art software frameworks&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i style="color: green;"&gt;Foster pride in workmanship&lt;/i&gt; - encourage passionate involvement of your team members to what and how they do&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If this brief introduction to Lean Software Development is still not enough for you I strongly recommend buying and reading Poppendiecks' book &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-1073681524721128270?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/N4Iwwxw5Vxg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/1073681524721128270/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=1073681524721128270" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/1073681524721128270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/1073681524721128270?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/02/seven-principles-of-lean-software.html" title="Seven Principles of Lean Software Development" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkcEQXw6eip7ImA9WxVQFUg.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-760787367680930914</id><published>2009-02-02T08:00:00.006+01:00</published><updated>2009-02-02T08:00:00.212+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-02T08:00:00.212+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="deadlock" /><title>Deadlock while terminating JVM - how to avoid it</title><content type="html">Quite recently I was implementing some very small command line tool in Java. In order to clean and release all resources in case user presses &lt;tt&gt;Ctrl+C&lt;/tt&gt; I added &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)"&gt;shutdown hooks&lt;/a&gt;. Unfortunately by mistake I added:&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;System.exit(0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;line within the shutdown hook and my application couldn't close. When I used &lt;a href="http://java2jee.blogspot.com/2008/11/java-concurrency-is-easy-video-tutorial_27.html"&gt;jps and jstack&lt;/a&gt; I saw a deadlock on &lt;tt&gt;exit()&lt;/tt&gt; method? WTF - I thought - I assumed that this method tries to forcibly close the JVM. You now know what was the problem?&lt;br /&gt;&lt;br /&gt;If you read &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exit(int)"&gt;documentation&lt;/a&gt; carefully you should know :)&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;If this method is invoked after the virtual machine has begun its shutdown sequence then if shutdown hooks are being run this method will block indefinitely. If shutdown hooks have already been run and on-exit finalization has been enabled then this method halts the virtual machine with the given status code if the status is nonzero; otherwise, it blocks indefinitely. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;This explains everything.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt; - never invoke &lt;tt&gt;System.exit()&lt;/tt&gt; from shutdown hooks and READ javadoc even if you're absolutely sure you know Java well...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-760787367680930914?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/qFoxqaWjqOk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/760787367680930914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=760787367680930914" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/760787367680930914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/760787367680930914?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/01/deadlock-while-terminating-jvm.html" title="Deadlock while terminating JVM - &lt;small&gt;how to avoid it&lt;/small&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;D0IEQ30-cCp7ImA9WxVQFE0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7751004490533330510</id><published>2009-01-31T13:36:00.000+01:00</published><updated>2009-01-31T13:38:22.358+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-31T13:38:22.358+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><category scheme="http://www.blogger.com/atom/ns#" term="principles" /><category scheme="http://www.blogger.com/atom/ns#" term="waste" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Seven Principles of Lean Software Development - Eliminate Waste</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/mdu2boy/2636531326/"&gt;&lt;img src="http://farm4.static.flickr.com/3121/2636531326_40301c2c52.jpg?v=0" style="margin-right: 5px; width: 180px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/mdu2boy/"&gt;Phil Romans@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;Peter Stevens in his &lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/mastering-recession-lean-agile-and-scrum"&gt;newest post&lt;/a&gt; advices how to deal with current crisis using Lean methodologies. One of his advice is to eliminate wastes, not costs. I totally agree with it, more so it is one of the most important (at least for me) principles of Lean Software Development.&lt;br /&gt;&lt;br /&gt;Software development organizations should always strive to produce the best products and to deliver only features that are of paramount importance to their customers. They should always try to develop those 20% of functionalities that represent 80% of the value. This need is more vivid and desired during such global business conditions. This could apply to all types of enterprises - you should eliminate all unnecessary steps and waiting periods; you should strive to get the value as soon as possible and to get only pure value without any waste.&lt;br /&gt;&lt;br /&gt;In this post I will try to explain "Eliminate Waste" principle from &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Provide market and technical leadership&lt;/b&gt;&lt;br /&gt;Your company can be successful by producing innovative and technologically advanced products. Important thing here is that you understand what your customers value and you know what technology you're using can deliver.&lt;br /&gt;&lt;br /&gt;You don't necessarily have to invent something that is new and unknown. Note that the richest companies just replicate good ideas adding just few features that are unique and that satisfy customers (e.g. Google Mail, JIRA issue tracker).&lt;br /&gt;&lt;br /&gt;You can be the market and technical leader by improving existing ideas and fitting them so that the final product will attract more customers.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create nothing but value&lt;/b&gt;&lt;br /&gt;You have to be careful with all the processes you follow. Be sure that all of them are required and they are focused on creating value. &lt;br /&gt;&lt;br /&gt;If you are e.g. creating lots of documents that have been always produced but nobody really  knows why and you are pretty sure nobody reads them - it sounds like waste you have to eliminate. Another example of waste is when you have to wait for a long time for some other department or team to answer your questions or uncertainties and this waiting period always stops you from moving forward. Waiting is the most apparent and obvious waste - though it is not always easy to eliminate.&lt;br /&gt;&lt;br /&gt;You should measure your process cycle efficiency and strive to keep improving it - it will probably never be perfect but it can be constantly getting better and better.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Write less code&lt;/b&gt;&lt;br /&gt;This advice is quite aggressive and when you work in old-fashioned waterfallish organization saying that you should limit the features in your system to only those that are absolutely necessary and deliver value can be perceived as some kind profanation. Well.... it's not.&lt;br /&gt;&lt;br /&gt;The more code you have the more tests you need thus it requires more work and if you're writing tests for features that are not needed you are simply wasting time. If you don't have tests (is it possible?) it's even worse - there is bugs in a code that is not used and they will appear in the least predictable moment. I personally remove a lot of code when I take over some projects. I focus on the required features and remove all stuff that I "may need in the future". The rule is simple: if you need it, add it - if you don't need it right now, remove it. Another argument standing for writing less code is that usually with less code the overall complexity is lower and the code base is easier to understand thus maintain and support.&lt;br /&gt;&lt;br /&gt;Last thing - the easiest way to identify unnecessary code is to use &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/code-coverage-against-unused-code"&gt;code coverage tool&lt;/a&gt;. More details can be found at the provided link.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Eliminate Waste&lt;/b&gt;&lt;br /&gt;I hope pieces of advice given above will make it easy to understand how to put "Eliminate Waste" principle, which is the most important one IMHO, in practice. If you need more detailed description with more examples and more sophisticated explanation you should definitely go to &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;PS. Six remaining principles described earlier can be found here:&lt;ol&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/respect-people"&gt;Respect People&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-deliver-fast"&gt;Deliver Fast&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/optimize-the-whole"&gt;Optimize the Whole&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-defer-commitment"&gt;Defer Commitment&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-build-quality"&gt;Build Quality In&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-create-knowledge"&gt;Create Knowledge&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7751004490533330510?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/RAtwTANTXnU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7751004490533330510/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7751004490533330510" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7751004490533330510?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7751004490533330510?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/01/seven-principles-of-lean-software_31.html" title="Seven Principles of Lean Software Development - Eliminate Waste" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0QBRXo9eSp7ImA9WxVSE0Q.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-4115154249664598936</id><published>2009-01-07T18:48:00.002+01:00</published><updated>2009-01-08T08:22:34.461+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-08T08:22:34.461+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge" /><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><category scheme="http://www.blogger.com/atom/ns#" term="principles" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Seven Principles of Lean Software Development - Create Knowledge</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/jcrojas/63960796/"&gt;&lt;img src="http://farm1.static.flickr.com/27/63960796_3147684e63.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/jcrojas/"&gt;J.C.Rojas@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;"There is no fool like an old fool" says popular international proverb. One of the meanings of this proverb is that people can make mistakes but they should learn from them. You are not a fool if you make mistake but you become one if you make the same mistake again. It simply means that you're not learning.&lt;br /&gt;&lt;br /&gt;The same rules apply to the software development teams - it's much easier to work in an environment that encourages you to learn and to create knowledge. Why should you create knowledge? Well, the best way to learn something is to make mistakes by yourself but it wouldn't be wise to let all the engineers invent the wheel all over again. It's much better to teach them about what we already know, what works and what doesn't. It's much better and safer (yet a bit less effective) to learn from someone else's mistakes.&lt;br /&gt;&lt;br /&gt;In this post I will try to explain "Create Knowledge" principle from &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create design-build teams&lt;/b&gt;&lt;br /&gt;It is essential that the architecture of the software you're building is easily "splittable" into logical modules that can be implemented by cross-functional teams. These teams should be provided with appropriate leadership and be encouraged to engage themselves in the project and provide intensive feedback. My translation of this is that leader of the development team has to listen to his/her members and ask smart questions encouraging them to look for the answers and to get back with encountered problems or invented solutions as soon as possible. These teams should be encouraged by the leaders to share early and often, to fail fast, and to learn constantly.&lt;br /&gt;&lt;br /&gt;It is pretty easy to imagine the contrary i.e. team members just waiting for others to fail noting every mistake and using it during 360 degree yearly evaluation. It must not happen! Team members have to teach each and help other. They should install some Wiki and put there whatever they think will be needed in the future. They should encourage each other to experiment and not to be afraid of failures - failures are great as long as you learn something from them. The last thing, though, you can learn from your failures is not to try again. Failures should be accepted by applaud - the team would know then which way they cannot go and invest in - it can save some money.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Maintain a culture of constant improvement&lt;/b&gt;&lt;br /&gt;As a leader you must create such environment in which people will not be blaming each other for writing crappy code or designing crappy class or package structures. You must create environment in which people will be constantly improving what they are working on. People should also know that they are not and should not be perfect - they always have a field to improve and they should do it.&lt;br /&gt;&lt;br /&gt;You as a leader must know that even if everything works fine there is always places that could be improved - encourage your team to identify such places and fix them. Such "place" can be a policy or practice, not necessarily source code, that makes development cumbersome or is basically not necessary and doesn't improve the overall results.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Teach problem-solving methods&lt;/b&gt;&lt;br /&gt;Your team should not only learn and teach each other - they should be able to solve all kinds of problems in a structured way e.g. &lt;a href="http://en.wikipedia.org/wiki/Shewhart_cycle"&gt;Plan Do Check Act&lt;/a&gt;. Development team should often behave like small research institute, they should establish hypotheses and conduct many rapid experiments in order to verify them. Your team should also produce concise and valuable documentation keeping up to date knowledge base of what works and what doesn't.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Create Knowledge&lt;/b&gt;&lt;br /&gt;I hope pieces of advice given above will make it easy to understand how to put "Create Knowledge" principle in practice. If you need more detailed description with more examples and more sophisticated explanation you should definitely go to &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;PS. Five principles described earlier can be found here:&lt;ol&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/respect-people"&gt;Respect People&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-deliver-fast"&gt;Deliver Fast&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/optimize-the-whole"&gt;Optimize the Whole&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-defer-commitment"&gt;Defer Commitment&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-build-quality"&gt;Build Quality In&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-4115154249664598936?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/fIUhtvOjw3k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/4115154249664598936/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=4115154249664598936" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/4115154249664598936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/4115154249664598936?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/01/seven-principles-of-lean-software.html" title="Seven Principles of Lean Software Development - Create Knowledge" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkYGQH89fip7ImA9WxVTEUk.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7249759656893652763</id><published>2008-12-24T19:42:00.000+01:00</published><updated>2008-12-24T19:42:01.166+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-24T19:42:01.166+01:00</app:edited><title>Year 2008 in a nutshell</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/foxypar4/2153422313/"&gt;&lt;img src="http://farm3.static.flickr.com/2087/2153422313_e36f17fdfb.jpg?v=0" style="margin: 0px 5px 5px 0px; width: 250px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/foxypar4/"&gt;foxypar4@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;Christmas and New Year is coming so it's time for some summary. I've never done this before but this year was quite awesome and I have something to be proud and loud.&lt;br /&gt;&lt;br /&gt;Let's start from January when I moved from my &lt;a href="http://maps.google.pl/maps?f=q&amp;hl=pl&amp;geocode=&amp;q=gdynia&amp;sll=52.025459,19.204102&amp;sspn=9.266214,19.775391&amp;ie=UTF8&amp;z=11&amp;g=gdynia&amp;iwloc=addr"&gt;hometown&lt;/a&gt; to the glamorous French Riviera i.e Cote d'azur (yes, the sea here is pretty much azure).&lt;br /&gt;&lt;br /&gt;I accomplished some cool stuff at work and one that I can share with you is the new generation hotel search engine - &lt;a href="http://labs.amadeus.com/walbrowser/"&gt;Wallaby&lt;/a&gt; (which is working but still in beta phase).&lt;br /&gt;&lt;br /&gt;In 2008 I started interesting in the theory of Agile Software Development (after few years of using it) which resulted in inviting me to contributing to the &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt; blog. It was a huge challenge for me as I've never been a good or even decent writer (especially in my native language - Polish) but it appeared to be kind of success. I have on my account some pretty cool posts that appeared to be big hits like these (each of the following posts was visited more than 5k times):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/can-unit-testing-be-waste"&gt;Can unit testing be a waste?&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/videos/test-driven-development-basic-tutorial"&gt;Video tutorial: Test Driven Development in practice&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/they-arent-gonna-read-it"&gt;Developers Aren't Gonna Read It&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/i-know-it-doesnt-work-its-done-story-about-definition-done"&gt;"I know it doesn't work but it's done" - a story about the definition of done&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And the best posts were written pretty spontaneously in less than thirty minutes without any preparation. Just some kind of a thunder in my brain that triggered my grey matter to work - that was just it.&lt;br /&gt;&lt;br /&gt;I'd like to thank Artem for inviting me to become a regular contributor - it was a good decision for me to join ASD. I hope I will keep at least the same level of inventiveness next year :)&lt;br /&gt;&lt;br /&gt;During 2008 I've read over 18 technical books and I shortly &lt;a href="http://java2jee.blogspot.com/search/label/book%20review"&gt;reviewed&lt;/a&gt; some of them on my &lt;a href="http://java2jee.blogspot.com"&gt;private blog&lt;/a&gt;.&lt;br /&gt;More on numbers in 2008: my FeedBurner account shows quite an increase (260% from 25 to 65 - and counting) of regular readers of my private blog - that's cool. Thank you readers!&lt;br /&gt;&lt;br /&gt;Last but not least submitting my old and fresh posts to DZone gave my private blog a lot of visibility and doing this I increased number of visits by 1000% from ~930 to over 9K in just one month (I will not be able to keep these numbers but it anyway shows me that what I write is interesting and a lot of people like it). This is also thanks to ASD blog which gave me more visibility.&lt;br /&gt;&lt;br /&gt;And now some conclusions. As I wrote earlier I moved to southern France in January 2008 and this was caused mostly by my previous employer - Intel - who simply laid off our team at the end of 2007. My friends who I worked with at Intel opened their own company and I was supposed to be their partner  but I decided to move to France with my wife. And this was one of the best decisions we made in our life.&lt;br /&gt;&lt;br /&gt;We live in a great place, have awesome friends and every week we do some cool stuff like skiing, hiking or just visiting some beautiful places like &lt;a href="http://java2jee.blogspot.com/2008/07/postcard-from-monaco.html"&gt;Monaco&lt;/a&gt; or &lt;a href="http://java2jee.blogspot.com/2008/07/postcard-from-eze-and-sainte-agns.html"&gt;Eze&lt;/a&gt;. And this is much more important that money that I could earn staying in Poland.&lt;br /&gt;&lt;br /&gt;I learned a lot during year 2008, the Sun hasn't burnt out my brain (yet) and consider it pretty awesome year privately as well as professionally. And I hope next year will be even better - but even if it will be a bit worse it will still be awesome :) &lt;small&gt;Yes - I'm the optimist.&lt;/small&gt; I'm not going to reveal my professional plans for the next year but I will probably share with you the results in 365 days.&lt;br /&gt;&lt;br /&gt;As this is my last post this year I'd like to wish all the people around the World:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;b style="font-size: 25pt;"&gt;Merry Christmas&lt;br /&gt;and&lt;br /&gt;Happy New Year 2009&lt;/b&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7249759656893652763?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/B1t7WhkAXJA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7249759656893652763/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7249759656893652763" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7249759656893652763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7249759656893652763?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2008/12/year-2008-in-nutshell.html" title="Year 2008 in a nutshell" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0QNQng_fSp7ImA9WxVSE0Q.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-1652663155513525286</id><published>2008-12-17T14:00:00.001+01:00</published><updated>2009-01-08T08:23:13.645+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-08T08:23:13.645+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="quality" /><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><category scheme="http://www.blogger.com/atom/ns#" term="principles" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>Seven Principles of Lean Software Development - Build Quality In</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/waytru/1074105352/"&gt;&lt;img src="http://farm2.static.flickr.com/1281/1074105352_f0c591e410.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/waytru/"&gt;WayTru@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;I was doing a quick research for this article using Google trying to find arguments standing for the claim that "quality is expensive". I was trying to find some resources saying that care for quality in the early stages of the software projects doesn't make sense and doesn't pay - I find it very difficult and I cannot share with you any reasonable links (maybe except for &lt;a href="http://java2jee.blogspot.com/2008/05/quality-doesnt-suck.html"&gt;this one&lt;/a&gt; which refers to another post saying that "Quality Sucks").&lt;br /&gt;&lt;br /&gt;What does it mean? It means that software people know that quality is very important. Why then quality of software products sucks in more cases than it rocks?&lt;br /&gt;&lt;br /&gt;In many big corporations following &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;waterfall model&lt;/a&gt; there is a special team named QA (Quality Assurance). This team's responsibility is (not surprisingly) to assure appropriate level of quality in the software product. This is fine, this is perfectly OK, except that QA is considered as a separate activity. This is the "Verification" or "Testing" box in the waterfall model diagram.&lt;br /&gt;The biggest problem with this attitude is that QA team gets the product &lt;b&gt;after&lt;/b&gt; it has been implemented and this is the root cause of all evil. QA is considered as something separate - we first do the product and then we care about the quality. This way of thinking is wrong. You should care about quality from the day one, before you write a single line of code.&lt;br /&gt;&lt;br /&gt;Software teams should "build quality in" their products and QA should not be considered as a separate activity. Quality Assurance should be constant process of improving the product - QA activities and people should be involved in the development of the product &lt;b&gt;during&lt;/b&gt; the development, not after when the developers are moved to another projects or even teams.&lt;br /&gt;&lt;br /&gt;In this post I will try to explain "Build Quality In" principle from &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book. I will present few practices that will help your team build software with quality built in.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Synchronize&lt;/b&gt;&lt;br /&gt;In order to achieve high quality in your software you should start worrying about it before you write single line of working code. It means that you should &lt;a href="http://agilesoftwaredevelopment.com/videos/test-driven-development-basic-tutorial"&gt;write test first&lt;/a&gt; and use all the frameworks that will facilitate your test suite (e.g. use &lt;a href="http://agilesoftwaredevelopment.com/videos/test-driven-development-mock-objects"&gt;mock objects&lt;/a&gt;). Track your &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/code-coverage-against-unused-code"&gt;code coverage&lt;/a&gt; - don't be too anal about it because 100% code coverage should not be the goal of your software but use it as an indicator to see which parts of you system should be tested more. And use all other tools that you feel are necessary to test your software thoroughly - &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/when-unit-testing-not-enough"&gt;unit testing is very often not enough&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Reduce partially done work - tasks that are 90% done usually takes another 90% of total time to finish - keep focused on one task and make it complete, then you can go to the next one. Try not putting defects on a list - stop and fix them the moment you discover them. Known bugs residing in your software will cause more defects in the future - don't allow this to happen (however &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/issue-tracking-fits-agile"&gt;issue tracking system&lt;/a&gt; can be sometimes useful e.g. for collecting requests from your customers).&lt;br /&gt;&lt;br /&gt;Integrate your code as soon and as extensively as possible - commit your changes to CVS, SVN, etc. at least once a day and ensure all the tests give you green light. Don't wait with synchronization because it will hurt - you will spend more time on integration than on development. And you will get frustrated.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Automate&lt;/b&gt;&lt;br /&gt;Even the best engineers make mistakes - you cannot avoid it - they are not robots (that may make mistakes too, btw.). Eliminate risk of mistakes by automating everything that is routine-work. Almost everything that is a repetitive work can be automated. And you should do this as soon and as early as possible - the best is to have continuous integration engine &lt;b&gt;before&lt;/b&gt; committing a single line of code.&lt;br /&gt;&lt;br /&gt;You should &lt;i&gt;automate testing, building, installations, anything that is routine&lt;/i&gt;, but do it smartly, do it in a way people can improve the process and change anything they want without worrying that after the change is done the software will stop working. Automate in order to make people feel comfortable improving the software, tests, installation process, etc. by changing whatever they feel is necessary.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Refactor&lt;/b&gt;&lt;br /&gt;Code in your software product should be as clean and as simple as possible. You can easily &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/how-ensure-code-quality"&gt;ensure it&lt;/a&gt; using static code analysers - they really work and can be a &lt;b&gt;real&lt;/b&gt; pain in the ass for &lt;i&gt;lousy&lt;/i&gt; developers (that's good because they will learn how to write clean code and follow the conventions).&lt;br /&gt;&lt;br /&gt;Eliminate code duplication to ZERO - every time it shows up &lt;a href="http://agilesoftwaredevelopment.com/blog/jurgenappelo/fruits-of-pain"&gt;re&lt;/a&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/refactoring-in-action"&gt;factor&lt;/a&gt; the code, the tests, and the &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/they-arent-gonna-read-it"&gt;documentation&lt;/a&gt; to minimize the complexity. Using modern IDEs it's pretty simple and gives developers fun.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Build Quality In&lt;/b&gt;&lt;br /&gt;I hope pieces of advice given above will make it easy to understand how to put "Build Quality In" principle in practice. If you need more detailed description with more examples and more sophisticated explanation you should definitely go to &lt;a href="http://www.poppendieck.com/ilsd.htm"&gt;"Implementing Lean Software Development - from Concept to Cash"&lt;/a&gt; book.&lt;br /&gt;&lt;br /&gt;PS. Four principles described earlier can be found here:&lt;ol&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/respect-people"&gt;Respect People&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-deliver-fast"&gt;Deliver Fast&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/optimize-the-whole"&gt;Optimize the Whole&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/seven-principles-lean-software-development-defer-commitment"&gt;Defer Commitment&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-1652663155513525286?l=blog.bielu.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/iGT5xglAnV8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/1652663155513525286/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=1652663155513525286" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/1652663155513525286?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/1652663155513525286?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2008/12/seven-principles-of-lean-software.html" title="Seven Principles of Lean Software Development - Build Quality In" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry></feed>
