<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7922042537872033964</id><updated>2011-08-02T21:42:39.203+02:00</updated><category term='hibernate'/><category term='ant'/><category term='scrum'/><category term='agile'/><category term='java'/><category term='retrospective'/><category term='scrumbox'/><category term='flex'/><category term='bamboo'/><category term='spring'/><title type='text'>Committed to Excellence</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-8571013879543498465</id><published>2011-07-29T14:05:00.005+02:00</published><updated>2011-07-29T14:24:39.027+02:00</updated><title type='text'>Filtering Debug Steps in Eclipse</title><content type='html'>Have you grown tired of ending up in a Spring proxy while you're debugging? You know, not being able to just press F5 or step into a method and actually go into your own written code. Instead you see some class file without source of the generated proxy. It really hampers the debugging experience.&amp;nbsp;Sounds familiar?&amp;nbsp;To work around this you have to open the implementation class and put a breakpoint in the method you want to debug and press F8 (or Resume). This takes a lot of time, but I see a lot of developers do this ALL THE FREAKING TIME. There is a simple solution though, that nobody seems knows about. It is called 'step filters' in eclipse.&lt;br /&gt;&lt;br /&gt;Eclipse has support to skip specified packages while debugging and it is easy to use:&lt;br /&gt;&lt;br /&gt;1. Go to your eclipse preferences, and search on &lt;i&gt;step&lt;/i&gt;.&lt;br /&gt;2. Enable &lt;i&gt;Use Step Filters&lt;/i&gt;&lt;br /&gt;3. Add step filters. Try org.springframework.*&lt;br /&gt;&lt;br /&gt;And your done!&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-fQm2Qrb13bg/TjKeIPiM4XI/AAAAAAAAAqo/2JK1HQZfJoE/s1600/eclipse-debug-step-filtering-prefs.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" src="http://1.bp.blogspot.com/-fQm2Qrb13bg/TjKeIPiM4XI/AAAAAAAAAqo/2JK1HQZfJoE/s320/eclipse-debug-step-filtering-prefs.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You can enable and disable the Step filters in the preferences, simply click the button indicated below in the screenshot or by right clicking the background in the Debug view and select &lt;i&gt;Use Step Filters&lt;/i&gt;.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tPCvpDehp24/TjKeIYPaYnI/AAAAAAAAAqs/o-CSFV1KsIk/s1600/rightbuttondebug.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-tPCvpDehp24/TjKeIYPaYnI/AAAAAAAAAqs/o-CSFV1KsIk/s320/rightbuttondebug.png" width="237" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Easy to use, saves a lot of time, nuf' said, start using it.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-8571013879543498465?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/8571013879543498465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=8571013879543498465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8571013879543498465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8571013879543498465'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2011/07/have-you-ever-grown-tired-of-ending-up.html' title='Filtering Debug Steps in Eclipse'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-fQm2Qrb13bg/TjKeIPiM4XI/AAAAAAAAAqo/2JK1HQZfJoE/s72-c/eclipse-debug-step-filtering-prefs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-3560865929101965869</id><published>2011-01-13T14:12:00.000+01:00</published><updated>2011-01-13T14:12:16.673+01:00</updated><title type='text'>AnnotationXStreamMarshaller</title><content type='html'>The extended functionality of the AnnotationXStreamMarshaller from Spring oxm 1.5 is (since Spring WS 2.0) included in the super class XStreamMarshaller.&lt;br /&gt;&lt;br /&gt;This class can be used iso using XStream directly and is easily configurable in a spring context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-3560865929101965869?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/3560865929101965869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=3560865929101965869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/3560865929101965869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/3560865929101965869'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2011/01/annotationxstreammarshaller.html' title='AnnotationXStreamMarshaller'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-6632545965066744041</id><published>2010-03-30T08:01:00.000+02:00</published><updated>2010-03-30T08:01:48.503+02:00</updated><title type='text'>Awareness is key</title><content type='html'>One of the two readers of my last blog, even my girlfriend wouldn’t read a blog titled feelings, asked me to elaborate on what to do with this ‘tool’. I thought that would be obvious, but clearly isn’t.&lt;br /&gt;&lt;br /&gt;In this blog I’ll provide you with some examples how you could react actively on your feelings. After reading it, you should have a clear idea how to use your feelings, as a start sign for change.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Useless thoughts&lt;/b&gt;&lt;br /&gt;Think off the situation that you are working on an important project. Suddenly the boss enters the room and asks you to come to his office for a 1o1 meeting in 5 minutes. Your mind quickly tries to find a reason why he wants to talk to you. Where will the meeting be about? Why are you the only one invited? What have you been doing? What did you do wrong? &lt;br /&gt;&lt;br /&gt;As long as you don’t have the answers, you might feel uncertainty. If you are seeking the negative events that happened this week, you will feel uncomfortable or even worse.&lt;br /&gt;&lt;br /&gt;When you start noticing your own feelings, you have the option to do something. This is the moment to change the situation in which you are. If you are feeling uncomfortable, you might have forgotten to look at the positive reasons your boss wants to talk to you. This will help manage your feelings. But this is just one of the options. What would be the effect of replacing your search for negative reasons with one of the following questions?&lt;br /&gt;&lt;br /&gt;• Does my search of negative issues, help me with the upcoming meeting?&lt;br /&gt;• Can I possibly think of all the directions a possible discussion will head to?&lt;br /&gt;• Can I prepare for this meeting?&lt;br /&gt;• How can I find out where the meeting will be about?&lt;br /&gt;&lt;br /&gt;In the case of a mental situation you do not want to be in, ask yourself the following question:&lt;br /&gt;1) Notice the feelings you do not want to have&lt;br /&gt;2) Ask yourself the question: Do my current thoughts help me?&lt;br /&gt;3) Replace your thoughts with pragmatic ones&lt;br /&gt;&lt;br /&gt;So, you do notice your feelings, and you did decide your current thoughts aren’t helping you. Replacing your thoughts should be easy at this time. Just think of any thoughts that would help you like “I will ask my boss where the meeting is about”. &lt;br /&gt;&lt;br /&gt;I really want to think that I’m the only one that has these feelings, and everybody else directly asks their boss, what the topic of the meeting will be. Anyways… you might still get fired in the meeting, which brings me to the next example. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting fired&lt;/b&gt;&lt;br /&gt;Imaging your boss fires you. Can you imagine yourself crying like a little baby? I can’t, I haven’t had the pleasure to witness a crying baby. Thinking about what will happen to you and your partner, wife or guinea pig. Will you be able to keep paying your alimony bills? Will you have to sell your Ferrari? What will you do without a job? I can imagine thinking this will result in feeling hopeless. Or are you one of the persons who would blame others. Thinking this isn’t fair. You didn’t think about revenge did you? You might also notice you are getting mad.&lt;br /&gt;&lt;br /&gt;So that’s your sign! Step 1 is done, you noticed a feeling. Step 2: Do these thoughts help me? No. Step 3: What will help me? Loads of options come to mind. Beg for your job, update your CV, call your legal assistance, write your memoirs. Choose one and go for it!&lt;br /&gt;&lt;br /&gt;You can actually notice you are in a situation you do not want to be in, before noticing your feelings. &lt;br /&gt;&lt;br /&gt;The general pattern to successfully resolve your situation is:&lt;br /&gt;1) Notice the situation you do not want to be in&lt;br /&gt;2) Search for valuable actions&lt;br /&gt;3) Choose one and go for it&lt;br /&gt;&lt;br /&gt;I really hope you already do this, and I’m telling you nothing new. From practice I know that the persons, who do not take responsibility in there live, do not read my blog anyway. This means you already take responsibility and are always trying to make the best of things. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Awareness is key!&lt;/b&gt;&lt;br /&gt;Being aware of your feelings will help you resolve unwanted situations with bigger success, and perhaps personal growth. When you are practicing your awareness of your feelings, you might, from time to time, notice you are faster than you subconscious. Your feelings arrive after you already corrected your situation. Tell me when you notice this yourself.&lt;br /&gt;&lt;br /&gt;Next blog I might post about falling in love, and getting out of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-6632545965066744041?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/6632545965066744041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=6632545965066744041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/6632545965066744041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/6632545965066744041'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2010/03/awareness-is-key.html' title='Awareness is key'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-4597770018550380878</id><published>2010-03-16T23:42:00.003+01:00</published><updated>2010-03-17T10:04:33.001+01:00</updated><title type='text'>Feelings</title><content type='html'>Am I actually going to write something about feelings? I guess I do.&lt;br /&gt;&lt;br /&gt;Before I just state what I’m here to tell you, I want you to think about the following scenario. Imagine you are making pasta, and you hurt yourself cutting unions. You started to bleed just a little bit, and you feel it. The cutting of your finger, causes a signal to be send to your brain, and your brain interprets the signal, and provides you with pain; a feeling. &lt;br /&gt;&lt;br /&gt;Somewhat later, you find yourself picking up the metal spoon that you used to stir the pasta while it’s cooking. The spoon is too hot, and you notice this again by feeling pain. Again your hand sends a signal to your brain telling something is wrong. Your brain interpreted it and made sure you cannot ignore the signal by providing pain. &lt;br /&gt;&lt;br /&gt;Some would clame there is no need for interpretation by the brain, the signal is the feeling. I normally would clame the interpretation by the brain, is something that is fully automated, it happens subconsciously. Now and again I notice something, which made me think this. I notice some signal from my leg, and only after I look at it I see my leg is bleeding, and suddenly there is pain…&lt;br /&gt;&lt;br /&gt;Where is this pain good for? Why does our body provide us with a mechanism to feel pain? The reason may seem obvious. The situations, in which we experience pain, require immediate attention (action or change). Pain is a feeling most of us cannot ignore, so we act on it. We don’t have to think about that do we?&lt;br /&gt;&lt;br /&gt;Cut in finger -&gt; Signal to brain -&gt; Interpretation by brain -&gt; Feeling Pain -&gt; Change situation&lt;br /&gt;&lt;br /&gt;What about feelings that are not originated by a physical event. Let’s think about fear. To cook the pasta I boiled some water. When the pasta was ready I poured it into a colander in the kitchen sink. I did this pretty quickly and before I knew it, the cooking water splashed up, and almost hit me. Pretty soon after thinking what would have happened if the boiling water would have hit me, I noticed a sensation, which I call fear. Fear about burning myself to boiling water. I actually didn’t burn myself, but still felt a feeling. &lt;br /&gt;&lt;br /&gt;Where did this feeling came from, there was no physical event. I made it up. I thought of what would happen if… My brain was interpreting a scenario I was thinking of and gave me a corresponding feeling.&lt;br /&gt;&lt;br /&gt;In the rest of my pasta adventure, I made sure not to cut or burn myself again.&lt;br /&gt;&lt;br /&gt;Thinking of scenario -&gt; Interpretation by brain -&gt; Feeling Fear -&gt; Changed my reckless ways&lt;br /&gt;&lt;br /&gt;So how about it, what would you feel if somebody called you an asshole? What if I told you you’re an asshole. The signal is obvious. You can hear (or actually read) the word asshole. Your brain will interpret this word, and you will feel bad. Well, do you? Why don’t you? If your mother would say it, would you feel different? Your brain must be interpreting the word asshole in combination of loads of other memories and other inputs. Just to make my point even more obvious. What if your mother called you the biggest kanojo on the planet (over msn with no emoticons, and no prior relevant chat history). How do you feel then? I was of course hoping you don’t know this word. Your brain would do a lookup, and find nothing. No interpretation follows. Not enough data available, just like my bleeding leg example. So if this interpretation is actually going on inside your head, what can we do to influence this mechanism? &lt;br /&gt;&lt;br /&gt;Is this interpretation by the brain fully automated? Do we have any control over this interpretation?&lt;br /&gt;&lt;br /&gt;Let’s assume you cannot change the interpretation (which you actually can but I will not go into that atm). An easy thing to do, would be adding an extra step after noticing the feeling; check whether we agree with the interpretation. For example, if my girlfriend tells me my pasta taste like shit, I would feel bad. By now you should know this feeling is there to change the situation I’m in. Before I throw all the pasta away, I can check whether I agree with my girlfriend. Of course it tasted like shit and we ordered pizza. The observation here should be, I corrected the problem at hand, and used the feeling to my advantage. &lt;br /&gt;&lt;br /&gt;If my girlfriend called me an asshole, she probably has some kind of reason. It really doesn’t help that I’m feeling bad about it. The feeling bad should result in asking my girlfriend why she thinks this way about me. If I agree with her, I should correct the problem. If I don’t agree, I would probably still have to fix the problem one way or another (which I always do that’s why I have a girlfriend). The cool part about this is, whenever I start fixing the reasons why my feelings appeared, they seem to disappear (finish what you start).&lt;br /&gt;&lt;br /&gt;The feeling mechanism is nothing more than a simple system of notifying my conscious of a subconscious interpretation result.&lt;br /&gt;&lt;br /&gt;This sucks, doesn’t it? This cannot be right. Feeling mad, sad, lonely, bad, or any other feeling, cannot possibly be your own fault. Surely it’s not your responsibility to solve them. Somebody else made you mad, made you sad, treated you bad, dumped your sorry ass for the neighbor. It’s their fault! They should fix it! They made you mad, and now you’re allowed to go to the bar and drive home drunk! &lt;br /&gt;&lt;br /&gt;Some people really believe getting mad is something you cannot control and they think they can use it as an excuse to manipulate everything around them. This is just one of the ways to ruin your life. &lt;br /&gt;&lt;br /&gt;Imagine your kid is behaving badly (according to you), and doesn’t listen to you what you tell him to do (obviously girls listen to their parents). You get mad because he doesn’t stop; it apparently is your fault you get mad. You cannot control the kid. In this case getting mad actually worked. So getting mad does do something for you! I must be wrong, because getting mad clearly helped on its own. Would you still be mad at your kid? Or did you use getting mad as a tool (power, fear etc)? You controlled your kid by getting mad. You could have saved yourself all the feeling which came with being mad, if you just acted like you where mad. In any case, if the kid stops the bad behavior you have solved the problem and have no need to feel mad anymore. One could argue that appearing mad for a while could help the kid understand the severity of ‘agony’ he caused. The key word is appearing. You really do not need the feeling to be present.&lt;br /&gt;&lt;br /&gt;Feelings are a signal to change your situation. Use them to extend your rational thinking, and you'll have added a very succesful tool to your skillset. Or just ignore your feelings or use them as an excuse and join the dark side!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-4597770018550380878?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/4597770018550380878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=4597770018550380878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/4597770018550380878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/4597770018550380878'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2010/03/feelings.html' title='Feelings'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-8399572684118579027</id><published>2009-10-03T13:50:00.000+02:00</published><updated>2009-10-03T13:50:59.963+02:00</updated><title type='text'>Environment needs of a standard web project</title><content type='html'>This blog entry covers my thoughts about the environment needs of the projects I have worked on in the last 5 years. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Summary:&lt;/h2&gt;&lt;br /&gt;The &lt;b&gt;Development&lt;/b&gt; environment runs whatever the developer wants.&lt;br /&gt;The &lt;b&gt;Support&lt;/b&gt; environment provides version control and continues integration.&lt;br /&gt;The &lt;b&gt;Test&lt;/b&gt; environment runs the latest successful build deployed.&lt;br /&gt;The &lt;b&gt;Demo&lt;/b&gt; environment runs the latest stable build deployed.&lt;br /&gt;The &lt;b&gt;Acceptance&lt;/b&gt; environment runs either the same build as the production environment or the build that needs to be accepted. &lt;br /&gt;The &lt;b&gt;Production&lt;/b&gt; environment has the latest accepted build deployed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Development environment:&lt;/h2&gt;Development needs to be done. The one time i saw development being done directly to a server, i made sure it was the last time. Development needs to be done on the machine of the developer. In general I would suggest the development environment has no external dependencies what so ever, but in practice I have seen plenty projects where this is just to hard to be effective. At least try to minimize the external dependencies.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Support environment:&lt;/h2&gt;Do not start a project without having a version control system nor continuous integration solution. I will not even explain why... if you disagree please go away. The version control software doesn't need to be on the same (virtual)machine as the CI software.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Test environment:&lt;/h2&gt;After building a feature, committing it to version control, and check whether the build is successful, the feature should be tested. For feature testing we deploy the latest successful build to the Test environment. On this environment our testers perform their test.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Demo environment:&lt;/h2&gt;From time to time our clients want to demonstrate what has been developed. For demonstrations I would like to introduce the Demo environment. We have tried to demo on the acceptance environment, but usually there is a need to demonstrate a newer build then the one that's currently in production. I found that the acceptance environment is crucial for good software development, and it's state should always be as described above. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The Production and Acceptance environments:&lt;/h2&gt;Nobody will disagree if i say we need a Production environment. Some of you will already think that you must have an Acceptance environment also, and i agree. &lt;br /&gt;&lt;br /&gt;When we want to deploy a specific build to the production environment, we always deploy it to the acceptance environment first. Our acceptance environments are as similar to the production environment as we can make them. Deploying a build on this environment will serve as a deployment test, but more importantly, our client will have to do a complete acceptance test before we will deploy the build on the production environment. &lt;br /&gt;&lt;br /&gt;If any bugs are found on the production environment, I want to be able to reproduce the problem on the acceptance environment, with for example higher logging settings. In our setups this usually means restarting tomcat, which i do not want to do on the production environment.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Did I get it wrong?&lt;/h2&gt;I think you will not disagree with what you just read. In case you do think i got it wrong, please educate me by posting a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-8399572684118579027?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/8399572684118579027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=8399572684118579027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8399572684118579027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8399572684118579027'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2009/10/environment-needs-of-standard-web.html' title='Environment needs of a standard web project'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-8525726279214906354</id><published>2009-03-28T13:01:00.000+01:00</published><updated>2009-03-28T13:25:28.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='retrospective'/><title type='text'>Retrospective as a process tool</title><content type='html'>Yesterday I was part of a retrospective which trobbelled me in many ways. I consider the retrospective the most important meeting for any project. The main goal of any retrospective should be to ensure continuous improvement. In most cases this is done by encouraging all participants to share their own interpretation of what went wrong, and suggest solutions.&lt;br /&gt;&lt;br /&gt;This is really hard to accomplish. Can one really tell their own opinion as they see it? Should there be a (time-)limit to the time one presents their opinion? Should we allow a discussion about a person's personal opinion? What should we do with the ventilated opinions? How do we translate opinions into continuous improvement? How do we &lt;i&gt;ensure&lt;/i&gt; continuous improvement?&lt;br /&gt;&lt;br /&gt;Reading about retrospective thought me that any good retrospective should have a list of actions. Is it really that easy? Can we focus on achieving this list? Is the list the goal of the retrospective?&lt;br /&gt;&lt;br /&gt;As i mentioned before, the goal is to ensure continuous improvement. What is the time base for improvement? We should be improving compared to when? The last sprint? &lt;br /&gt;&lt;br /&gt;This particular retrospective was a very heavy retrospective mainly because of tree reasons;&lt;br /&gt;* The planned release did not happen&lt;br /&gt;* The sprint was extended 3 times, as was the release date&lt;br /&gt;* The sprint before this sprint did not have a retrospective&lt;br /&gt;&lt;br /&gt;The facilitators of this particular retrospective did a good job, the action list was quite impressive and i personally liked the outcome. What i didn't like was the pushing for a very short meeting. My feedback on this meeting can be summarized by the following sentence:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Individuals and interactions over processes and tools&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;This retrospective felt like a tool for the process, and imo didn't focus enough on individuals and interactions between them.&lt;br /&gt;&lt;br /&gt;If you ever facilitate a retrospective, make sure you think about the questions in this blogpost and try to answer them in a way you focus on individuals and interactions between them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-8525726279214906354?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/8525726279214906354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=8525726279214906354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8525726279214906354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8525726279214906354'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2009/03/retrospective-as-process-tool.html' title='Retrospective as a process tool'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-3826196759789786116</id><published>2008-12-12T10:50:00.000+01:00</published><updated>2008-12-12T11:17:40.660+01:00</updated><title type='text'>Envers on Devoxx</title><content type='html'>History or Audit logs on Hibernate&lt;br /&gt;&lt;br /&gt;You'll probably once wanted to create history for your information. If you are intrested in doing just this, you should look at Envers.&lt;br /&gt;&lt;br /&gt;Why should i look at Envers?&lt;br /&gt;1) Non invasive (no need to change your current code)&lt;br /&gt;2) Annotation driven&lt;br /&gt;3) will be included in the following Hibernate release&lt;br /&gt;&lt;br /&gt;Yesterday Adam Warski gave a very nice &lt;a href="http://www.devoxx.com/display/JV08/Envers+-+Easy+Entity+Versioning"&gt;presention about Envers on devoxx 2008&lt;/a&gt;. The presentation will be avialable on parleys.com in januari. I'll post the link when it's available.&lt;br /&gt;&lt;br /&gt;For now go strait to &lt;a href="http://www.jboss.org/envers/"&gt;Envers&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-3826196759789786116?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/3826196759789786116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=3826196759789786116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/3826196759789786116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/3826196759789786116'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2008/12/envers-on-devoxx.html' title='Envers on Devoxx'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-8936929225268919343</id><published>2008-09-24T16:19:00.000+02:00</published><updated>2009-03-20T08:54:44.552+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bamboo'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><title type='text'>Bamboo Build Details Ant Task</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;&lt;br /&gt;The code is now available as a google opensource project: &lt;a href="http://code.google.com/p/bamboo-ant-tasks/"&gt;http://code.google.com/p/bamboo-ant-tasks/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Any news about the ant task will be posted there, and/or on my personal blog: &lt;a href="http://daniel-rijkhof.blogspot.com"&gt;http://daniel-rijkhof.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: the compiled jar in the project repo, is compiled with java 1.6 as target.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What is it?&lt;/span&gt;&lt;br /&gt;I build an ant task to get status information about bamboo builds. The task is build for and tested on bamboo 1.2.4. The current features include:&lt;br /&gt;• Getting latest build number and latest build status (by build plan)&lt;br /&gt;• Getting the status from any build (by build plan and build number)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Why is it useful&lt;/span&gt;&lt;br /&gt;As a developer I want to have fully automated deployment on my environments. I can accomplish this with an Ant script. Our product is build on a bamboo build server. What stopped me?&lt;br /&gt;• Our bamboo server cannot access our environments&lt;br /&gt;• Bamboo does not provide direct links to the latest build artifacts (it does provide a redirect)&lt;br /&gt;• Bamboo does not provide me with status information about the latest build&lt;br /&gt;&lt;br /&gt;This ant task provides a way to fully automate deployment of the latest bamboo build, and add a sanity check to the automated deploy script (check if the build was successful).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usage:&lt;/span&gt;&lt;pre&gt;&amp;lt;property name=&amp;quot;buildplan&amp;quot; value=&amp;quot;&lt;span style="color:#A03030;"&gt;your-buildplan-name-goes-here&lt;/span&gt;&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;property name=&amp;quot;buildserver&amp;quot; value=&amp;quot;&lt;span style="color:#A03030;"&gt;http://bamboo.quintor.nl/&lt;/span&gt;&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;taskdef classpath=&amp;quot;&lt;span style="color:#A03030;"&gt;your-location-of/bamboo-ant-tasks.jar&lt;/span&gt;&amp;quot; classname=&amp;quot;GetBambooBuildDetails&amp;quot; name=&amp;quot;getBuildDetails&amp;quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&amp;quot;shortExample&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;getBuildDetails server=&amp;quot;${server}&amp;quot; buildplan=&amp;quot;${buildplan}&amp;quot; buildnumberProperty=&amp;quot;buildnumber&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;echo&amp;gt;buildnumber: ${buildnumber}&amp;lt;/echo&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;/pre&gt;&lt;br /&gt;You'll have to change the red lines to make it work on your own bamboo server.&lt;br /&gt;&lt;br /&gt;Don't forget to take a look at the example in the download package, where all parameters are used! In case there are any questions left, comment on this blog article. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Download:&lt;/span&gt; &lt;br /&gt;You can download the task here: &lt;a href="http://wired.corks.nl/static/mad/bamboo-ant-tasks.zip"&gt;bamboo-ant-tasks.zip&lt;/a&gt;&lt;br /&gt;The download contains the following:&lt;br /&gt;• The source code of the ant task&lt;br /&gt;• bamboo-ant-tasks.jar in the &lt;i&gt;/target/dist&lt;/i&gt; dir, which includes only the compiled task &lt;br /&gt;• Build script to build the jar&lt;br /&gt;• 2 examples &lt;i&gt;fullExample&lt;/i&gt; and &lt;i&gt;shortExample&lt;/i&gt;, showing how to use this task (see build.xml)&lt;br /&gt;&lt;br /&gt;The package is actually my eclipse project, so it will include .classpath and project files, and the ant.jar thats needed to compile.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update&lt;/span&gt;&lt;br /&gt;I fixed a bug found by Marcel; the ant task couldn't handle the status of an build that fixed previously failed build(s). &lt;br /&gt;&lt;br /&gt;The download contains the newest code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Quintor upgraded there bamboo server to 2.1.3, and the ant task wasn't compatible. I'ld like to thank Arjan van der Veen to fix it, by implementing a rss feed reader.&lt;br /&gt;&lt;br /&gt;We created a google code project for this ant task:&lt;br /&gt;&lt;a href="http://code.google.com/p/bamboo-ant-tasks/"&gt;http://code.google.com/p/bamboo-ant-tasks/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please leave a comment :Daniel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-8936929225268919343?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/8936929225268919343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=8936929225268919343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8936929225268919343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8936929225268919343'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2008/09/bamboo-build-details-ant-task.html' title='Bamboo Build Details Ant Task'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-4641318908377960542</id><published>2008-09-08T16:32:00.000+02:00</published><updated>2008-11-19T11:16:37.243+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrumbox'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Announcing project Scrumbox: Opensource Scrum project management tool.</title><content type='html'>At our company we do all our projects using Scrum. Scrum is an iterative incremental process of software development commonly used with agile software development. A lot of projects use for example JIRA for their issue tracking. JIRA just isn't the best tool when you work with Scrum. Don't get me wrong, JIRA is a great tool, just not the tool for the job. There are some JIRA plugins to generate burndown charts or scrumboards, they make life al little easyer. You can do lots of tricks like using versions for sprints or backlogs. But what about Epics or Themes? &lt;br /&gt;There are some other great software products out there build entirely around scrum, but they all are way to expensive (500$ per user/per year whoa!). &lt;br /&gt;&lt;br /&gt;So we decided to build are own tool, totally open source. This tool is going to be build in java and flex. The focus is to make the GUI as fast and intuitive as possible. Making use of flex's capabilities like dragging and dropping issues from the project backlog to a sprint backlog, or prioritizing the backlog by drag and drop. Also changing the state of an issue should be as simple as looking at the scrumboard and dragging and dropping it from the 'in progress' column to the 'resolved' column. &lt;br /&gt;&lt;br /&gt;So definitly keep and eye on &lt;a href="http://scrumbox.googlecode.com"&gt;http://scrumbox.googlecode.com&lt;/a&gt; and this blog for updates about the project. Anybody interesting in committing to this project should contact us..&lt;br /&gt;&lt;br /&gt;Project architecture:&lt;br /&gt;The backend will be build in java. Using Spring as IoC container and hibernate as ORM layer. As database we will use MySQL. Everything will be programmed TDD style using JUnit4 and EasyMock. We add a security layer with Spring security and build our project with ant.&lt;br /&gt;&lt;br /&gt;The frontend will be build in flex. Using Prana as IoC container. Later there might also be an AIR version (for offline work). We also built this project with ant.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;written by Marcel Panse&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-4641318908377960542?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/4641318908377960542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=4641318908377960542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/4641318908377960542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/4641318908377960542'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2008/09/announcing-project-scrumbox-opensource.html' title='Announcing project Scrumbox: Opensource Scrum project management tool.'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-2661285284469455294</id><published>2008-07-11T17:40:00.000+02:00</published><updated>2008-11-19T11:17:11.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile Development 'nadelen'</title><content type='html'>&lt;i&gt;written by Daniel Rijkhof&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This blog entry is a reply on an article that’s in Dutch, this is why the blog entry is in Dutch to.&lt;br /&gt;&lt;br /&gt;Vandaag las ik een &lt;a href="http://www.computable.nl/artikel/ict_topics/development/2380502/1277180/resultaat-telt-niet-het-proces.html"&gt;artikel&lt;/a&gt; over Agile Development op de site van computable. &lt;br /&gt;&lt;br /&gt;In dit artikel worden een aantal nadelen van AD genoemd, waar ik het niet mee eens ben. De nadelen die ik op de schop doe zijn:&lt;br /&gt;&lt;br /&gt;• In AD fungeren ontwikkelaars tegelijkertijd als informatie-analist, software-architect en tester&lt;br /&gt;• AD is alleen geschikt voor senior ontwikkelaars&lt;br /&gt;• Ontwikkelaars hebben te weinig skills&lt;br /&gt;• Het werk van de bureaucraten, moet worden gedaan door de specialisten.&lt;br /&gt;• Stakeholders worden niet tevoren gedwongen om hun eisen en verwachtingen te formuleren.&lt;br /&gt;• Planning en budget zijn moeilijk te bepalen&lt;br /&gt;• Belangrijke beslissingen op ad-hoc basis&lt;br /&gt;• Slecht doordachte architectuur en modellen, risico op spaghetti-code&lt;br /&gt;• Veel code weggegooid&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;De eerste drie&lt;/span&gt;&lt;br /&gt;De eerste drie nadelen komen voort uit de gedachte dat een team alleen ontwikkelaars mag bevatten van het zelfde niveau:&lt;br /&gt;&lt;br /&gt;• In AD fungeren ontwikkelaars tegelijkertijd als informatie-analist, software-architect en tester&lt;br /&gt;• AD is alleen geschikt voor senior ontwikkelaars&lt;br /&gt;• Ontwikkelaars hebben te weinig skills&lt;br /&gt;&lt;br /&gt;Is dit werkelijk een eigenschap van AD?&lt;br /&gt;&lt;br /&gt;Het Agile Manifesto is gebaseerd op een aantal &lt;a href="http://agilemanifesto.org/principles.html"&gt;principes&lt;/a&gt;. De toepasselijke principes voor deze nadelen zijn:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.&lt;br /&gt;• The best architectures, requirements, and designs emerge from self-organizing teams.&lt;br /&gt;• At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;De principes achter het Agile Manifesto zeggen niets over het samenstellen van een team! Mag je dan zelf bepalen wie er in je team komen? Zou het zo kunnen zijn dat het team zelf weet waar de gaten vallen binnen het team? Zouden de bovenstaande 3 principes, een basis vormen om daar achter te komen, en het probleem op te lossen? Ik denk het wel.&lt;br /&gt;&lt;br /&gt;Er is geen verplichting om een team te nemen waarin elk persoon dezelfde hoge kwaliteiten heeft. Er is geen regel in AD die zegt dat dit niet mag. Kan je een team samenstellen met requirements specialisten, architect(s), developer(s) en tester(s)? AD laat je hier vrij in. Als het werkt voor jou, doe het dan.&lt;br /&gt;&lt;br /&gt;De gedachte dat je alleen ontwikkelaars in je team hebt zitten, is niet correct, en daardoor vervallen deze drie nadelen. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Meer ‘nadelen’:&lt;/span&gt;&lt;br /&gt;• Het werk van de bureaucraten, moet worden gedaan door de specialisten.&lt;br /&gt;• Stakeholders worden niet tevoren gedwongen om hun eisen en verwachtingen te formuleren.&lt;br /&gt;&lt;br /&gt;Deze nadelen komen voort uit het idee, dat AD alles beschrijft dat in een bedrijf moet gebeuren om succesvol software te ontwikkelen. &lt;br /&gt;&lt;br /&gt;Het volgende agile principe geeft aan dat het de bedoeling is, zo snel en vaak mogelijk waardevolle software op te leveren:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Stel je voor dat stakeholders niet vertellen wat hun eisen en verwachtingen zijn. Wat moet er nu gedaan worden? Het is een AD noodzaak om te weten wat de stakeholders willen. Vervolgens willen we ook nog weten welke waarde de stakeholders aan hun eigen eisen toekennen, zodat ze zo snel mogelijk werkelijke waarde opgeleverd krijgen. Het nadeel dat ze niet gedwongen worden om hun eisen te formuleren, verwerp ik.&lt;br /&gt;&lt;br /&gt;Wie er achter de stakeholders aan gaat om te zorgen dat hun eisen bekent worden, wordt niet gespecificeerd door AD. Zou het een bureaucraat mogen heten? Niets in AD verwerpt dit. Zou het iemand in het team kunnen zijn? Ook dit wordt niet verworpen door AD.&lt;br /&gt;&lt;br /&gt;Zou deze ‘bureaucraat’ een specialist zijn op exact dit gebied? Zou dat toch eens mooi zijn!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Planning en budget zijn moeilijk te bepalen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Is dit nadelen toe te kennen aan AD? &lt;br /&gt;&lt;br /&gt;Mijn ervaring met non-AD projecten, is dat de planning nooit klopte, en het budget niet te bepalen was. De bedoeling van AD is, om zo snel en vaak mogelijk waardevolle software op te leveren. We kunnen dus kortere planningen maken, en budget voor vrij maken. Het is dan ook makelijker om een correcte planning te maken in vergelijking met non-AD projecten. Het los krijgen van budget is vast makelijker als jou planningen kloppen. Dit kan geen nadeel van AD zijn.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Belangrijke beslissingen op ad-hoc basis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Belangrijke beslissingen, zullen altijd gebeuren, en vrijwel nooit aangekondigd. Ik heb nog nooit gehoord dat een bedrijf een geweldige kans op een vergroting van de winst, heeft uitgesteld omdat er nog een planning vast stond. &lt;br /&gt;Flexibiliteit van het ontwikkel proces is dan ook gewenst, zodat er niet te veel waarde verloren gaat. &lt;br /&gt;&lt;br /&gt;Het volgende agile principe is de basis voor flexibiliteit:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In non-AD projecten, komt het voor dat er nog geen waarde opgeleverd is, en ook niet zal gebeuren in een korte tijd. In AD projecten word er elke iteratie waarde opgeleverd. Het verlies van waarde wordt geminimaliseerd door een korte iteratie tijd. Er is ook nog de optie, om de iteratie af te maken, waardoor er geen waarde verloren gaat, natuurlijk ten koste van een beetje tijd. &lt;br /&gt;&lt;br /&gt;Het volgende agile principe maakt mijn argument af:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Omgaan met ad-hoc beslissingen, gaat beter met AD projecten vergeleken met non-AD. Dit nadeel is wordt door AD zelfs niet gezien als nadeel, maar als een eigenschap van de business. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Slecht doordachte architectuur en modellen, risico op spaghetti-code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Het volgende agile principe zegt voldoende:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• Continuous attention to technical excellence and good design enhances agility.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In het geval dat dit nadeel toch voorkomt, dient het team zichzelf aan te passen. Zie weer het volgende agile principe:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;• At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Veel code weggegooid&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Het zou kunnen voorkomen dat er code is geschreven dat vervangen moet worden, of zelfs niet meer in gebruik is, en weg gehaald dient te worden. Als deze code is geschreven in een vorige AD iteratie, dan was deze code waardevol. Zie weer het volgende agile principe: &lt;br /&gt;&lt;span style="font-style:italic;"&gt;• Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In dit geval was de code ooit waardevol, en is het nodig om deze code aan te passen om de software nog waardevoller te maken. Waar is het nadeel? Ik zie het niet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Is AD perfect?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Niets is perfect. Wanneer ik AD vergelijk met de oudere manieren van software ontwikkeling, concludeer ik dat AD geweldig is, een stap richting perfectie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-2661285284469455294?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/2661285284469455294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=2661285284469455294' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/2661285284469455294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/2661285284469455294'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2008/07/agile-development.html' title='Agile Development &amp;#39;nadelen&amp;#39;'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-6089072557691539157</id><published>2007-07-06T11:12:00.000+02:00</published><updated>2008-12-11T20:56:01.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Code Complexity</title><content type='html'>&lt;i&gt;written by Daniel Rijkhof&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This blog entry is quick read summary about code complexity. It gives a definition of code complexity and several signs how to notice code complexity. It also provides a brief description how to measure code complexity and suggests a way to keep it low.&lt;br /&gt;Most of the concepts are taken from &lt;a href="http://www.structure101.com/"&gt;Structure 101&lt;/a&gt; help section.&lt;br /&gt;&lt;br /&gt;This blog entry is based upon my code complexity presentation for &lt;a href="http://www.greetz.com"&gt;www.greetz.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Definition of Code Complexity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Reg. Charney defines Code Complexity as:&lt;br /&gt;&lt;i&gt;the amount of effort needed to understand and modify the code correctly.&lt;/i&gt;&lt;br /&gt;see &lt;a href="http://www.linuxjournal.com/article/8035"&gt;http://www.linuxjournal.com/article/8035&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Excessive complexity: When is a code-base too complex?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Signs of Logical complexity:&lt;ul&gt;&lt;li&gt; part of the design is no longer fit for its purpose &lt;/li&gt;&lt;li&gt; unclear purpose &lt;/li&gt;&lt;li&gt; adding new features becomes harder than it should be &lt;/li&gt;&lt;/ul&gt;Signs of Structural complexity:&lt;ul&gt;&lt;li&gt; the code is hard to understand &lt;/li&gt;&lt;li&gt; changes have unexpected side effects &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The need to know about code complexity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Keeping track of code complexity helps to:&lt;ul&gt;&lt;li&gt; Predict (future) feature implementation times &lt;/li&gt;&lt;li&gt; prioritize areas of the code for structural refactoring &lt;/li&gt;&lt;/ul&gt;What happens if you don't manage complexity?&lt;br /&gt;&lt;b&gt;It will cost!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Manage complexity like debt&lt;/b&gt;&lt;br /&gt;Howard Cunningham 'Mr. Wiki' compared complexity with debt:&lt;br /&gt;&lt;i&gt;"Manage complexity like debt"&lt;/i&gt;&lt;br /&gt;skipping designs = borrowing money&lt;br /&gt;maintenance headaches = interest payments&lt;br /&gt;refactoring = repaying debt&lt;br /&gt;cannot refactor = cash-flow insolvency&lt;br /&gt;creating engineering policies = devising financial policies&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Andy Hunt extends the analogy concisely:&lt;br /&gt;&lt;i&gt;"Just like real debt, it doesn't take much to get to the point where you can never pay it back, where you have so many problems you can never go back and address them." &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What can we do? Measure Complexity!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Although we cannot specify the amount of effort needed. We can calculate a complexity index.&lt;br /&gt;&lt;br /&gt;This index enables us to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Compare projects&lt;/li&gt;&lt;li&gt;Monitor trends (getting more or less complex)&lt;/li&gt;&lt;li&gt;Discover which items at what level are causing the complexity. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Measuring Code Complexity &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Measure the complexity at every level of design breakout, method, class, package and&lt;br /&gt;high-level package (High level packages contain only other high-level packages or leaf packages).&lt;br /&gt;&lt;br /&gt;Measuring occurs by counting items and dependencies it immediately contains.&lt;br /&gt;&lt;br /&gt;Method complexity is usually calculated by cyclomatic complexity.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;About Cyclomatic complexity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What is Cyclomatic complexity?&lt;br /&gt;A measurement for the complexity of a peace of source code.&lt;br /&gt;What does it measure?&lt;br /&gt;The number of linearly independent paths through a peace source code.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity @ wikipedia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Calculating Cyclomatic Complexity&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;To calculate cyclomatic complexity build a graph that describes the control flow of the program. The nodes of the graph correspond to the commands of a program. A directed edge connects two nodes if the second command might be executed immediately after the first command.&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpYI/AAAAAAAAAAk/Mo6gAACgx8k/s1600-h/between2.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 228px;" src="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpYI/AAAAAAAAAAk/Mo6gAACgx8k/s320/between2.JPG" alt="" id="BLOGGER_PHOTO_ID_5084024558460577154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpZI/AAAAAAAAAAs/NEyxZe1T3O0/s1600-h/BeweenActivityDiagram1.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px; height: 177px;" src="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpZI/AAAAAAAAAAs/NEyxZe1T3O0/s320/BeweenActivityDiagram1.jpg" alt="" id="BLOGGER_PHOTO_ID_5084024558460577170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpaI/AAAAAAAAAA0/3ruTH19jt8M/s1600-h/BeweenActivityDiagram2.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 123px; height: 139px;" src="http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpaI/AAAAAAAAAA0/3ruTH19jt8M/s320/BeweenActivityDiagram2.jpg" alt="" id="BLOGGER_PHOTO_ID_5084024558460577186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;The number of linearly independent paths through the first method is 3, and the second is 2.&lt;br /&gt;&lt;br /&gt;In Structure 101, class, package and high-level package complexity is calculated by counting items and dependencies they immediately contain (screenshot from Structure 101 help):&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kO7SLMLX-WQ/Ro4WcExnpbI/AAAAAAAAAA8/C_k-JSLJ_HA/s1600-h/edges.JPG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kO7SLMLX-WQ/Ro4WcExnpbI/AAAAAAAAAA8/C_k-JSLJ_HA/s320/edges.JPG" alt="" id="BLOGGER_PHOTO_ID_5084025700921877938" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Design Tangles&lt;/b&gt;&lt;br /&gt;Design tangles are cyclic, package-level dependencies. Design Tangle Metric quantifies the amount of cyclic dependencies.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kO7SLMLX-WQ/Ro4YaUxnpcI/AAAAAAAAABE/oWW5O_fg7NI/s1600-h/chickenVsEgg.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_kO7SLMLX-WQ/Ro4YaUxnpcI/AAAAAAAAABE/oWW5O_fg7NI/s320/chickenVsEgg.JPG" alt="" id="BLOGGER_PHOTO_ID_5084027869880362434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Refactoring&lt;/b&gt;&lt;br /&gt;Defenition of Refactoring:&lt;br /&gt;improving the design of existing code.&lt;br /&gt;&lt;br /&gt;Always Refactor when adding new features to you code.&lt;br /&gt;&lt;br /&gt;Quote Chris Chedgey:&lt;br /&gt;&lt;i&gt;"You use personality, charisma, leadership and/or donuts to convince your team that henceforth, they will not add any more complexity debt to the code base. Now watch what happens..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I suggest reading Chris blog item: &lt;a href="http://chris.headwaysoftware.com/2006/10/reducing_comple.html"&gt;http://chris.headwaysoftware.com/2006/10/reducing_comple.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The need to Rebuild&lt;/b&gt;&lt;br /&gt;In some cases redesign and rebuild is faster then refactoring. The complexity index of the tipping point cannot be determined.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Future Vision&lt;/b&gt;&lt;br /&gt;Chris Chedgey says: "keep a lid on it"&lt;br /&gt;I agree!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Monitor complexity (Structure 101)&lt;/li&gt;&lt;li&gt;Keep complexity low (stay away from the need to rebuild)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Structure 101 Help see &lt;a href="http://www.structure101.com/"&gt;http://www.structure101.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity @ wikipedia&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Chris Chedgey blog entries:&lt;br /&gt;&lt;a href="http://chris.headwaysoftware.com/2006/09/complexity_over.html"&gt;http://chris.headwaysoftware.com/2006/09/complexity_over.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://chris.headwaysoftware.com/2006/10/reducing_comple.html"&gt;http://chris.headwaysoftware.com/2006/10/reducing_comple.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.linuxjournal.com/article/8035"&gt;&lt;br /&gt;http://www.linuxjournal.com/article/8035&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-6089072557691539157?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/6089072557691539157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=6089072557691539157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/6089072557691539157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/6089072557691539157'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2007/07/code-complexity.html' title='Code Complexity'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kO7SLMLX-WQ/Ro4VZkxnpYI/AAAAAAAAAAk/Mo6gAACgx8k/s72-c/between2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-2790302160403058827</id><published>2007-05-15T13:33:00.000+02:00</published><updated>2008-11-19T11:17:11.373+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Configuration of Environment Settings</title><content type='html'>&lt;i&gt;written by Daniel Rijkhof&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I get a lot of questions asking how I deal with configuring environment specific settings. I'll explain my solution here.&lt;br /&gt;&lt;br /&gt;The following solution depends on the Spring framework.&lt;br /&gt;&lt;br /&gt;1) have a separate package per environment (e.g. production, test, local)&lt;br /&gt;2) put a properties file in this directory (e.g. webapp.properties)&lt;br /&gt;3) configure the spring context&lt;br /&gt;4) set a system environment variable to choose your environment&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'll use the following packages:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;com.mad.project.env.junit&lt;br /&gt;com.mad.project.env.local&lt;br /&gt;com.mad.project.env.test&lt;br /&gt;com.mad.project.env.acceptance&lt;br /&gt;com.mad.project.env.production&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The webapp.properties files i'm using are simular to my junit.properties file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hibernate.schemaUpdate=true&lt;br /&gt;&lt;br /&gt;hibernate.dialect=org.hibernate.dialect.HSQLDialect&lt;br /&gt;hibernate.show_sql=false&lt;br /&gt;&lt;br /&gt;dataSource.driverClassName=org.hsqldb.jdbcDriver&lt;br /&gt;dataSource.url=jdbc:hsqldb:mem:test&lt;br /&gt;dataSource.username=sa&lt;br /&gt;dataSource.password=&lt;br /&gt;&lt;br /&gt;webapp.logDir=../logs/junit&lt;br /&gt;&lt;br /&gt;&lt;b&gt;env.dir=junit&lt;/b&gt;&lt;br /&gt;env.name=junit environment&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: the env.dir line is only present in my junit env properties file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The context:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;!-- Property Placeholder --&amp;gt;&lt;br /&gt; &amp;lt;bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&amp;gt;&lt;br /&gt;   &amp;lt;property name="order" value="1" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="locations"&amp;gt;&lt;br /&gt;     &amp;lt;list&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;classpath:com/venspro/payment/env/junit/junit.properties&amp;lt;/value&amp;gt;&lt;br /&gt;       &amp;lt;value&amp;gt;classpath:com/venspro/payment/env/${env.dir}/webapp.properties&amp;lt;/value&amp;gt;&lt;br /&gt;     &amp;lt;/list&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="ignoreResourceNotFound" value="true" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- Session Factory Bean --&amp;gt;&lt;br /&gt; &amp;lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="schemaUpdate" value="${hibernate.schemaUpdate}"/&amp;gt;&lt;br /&gt;   &amp;lt;property name="annotatedClasses"&amp;gt;&lt;br /&gt;     &amp;lt;list&amp;gt;&lt;br /&gt;       ...&lt;br /&gt;     &amp;lt;/list&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="hibernateProperties"&amp;gt;&lt;br /&gt;     &amp;lt;props&amp;gt;&lt;br /&gt;       &amp;lt;prop key="hibernate.dialect"&amp;gt;${hibernate.dialect}&amp;lt;/prop&amp;gt;&lt;br /&gt;       &amp;lt;prop key="hibernate.show_sql"&amp;gt;${hibernate.show_sql}&amp;lt;/prop&amp;gt;&lt;br /&gt;     &amp;lt;/props&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="dataSource" ref="dataSource" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--  Data Source Beans --&amp;gt;&lt;br /&gt; &amp;lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;Main DataSource&amp;lt;/description&amp;gt;&lt;br /&gt;   &amp;lt;property name="driverClassName" value="${dataSource.driverClassName}"/&amp;gt;&lt;br /&gt;   &amp;lt;property name="url" value="${dataSource.url}"/&amp;gt;&lt;br /&gt;   &amp;lt;property name="username" value="${dataSource.username}"/&amp;gt;&lt;br /&gt;   &amp;lt;property name="password" value="${dataSource.password}"/&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt; ...&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Take a close look at the propertyPlaceHolderConfigurer; there is a default configured, and one with an EL expression. If ${env.dir} is not specified, it will not find the properties file, and ignore this because of the ignoreResourceNotFound setting.&lt;br /&gt;&lt;br /&gt;The properties in the junit.properties file, are overwritten by any settings in the next properties file.&lt;br /&gt;&lt;br /&gt;The only thing left to do is specify the environment setting 'env.dir'. This can be done in several ways; in the servlet container configuration, or on the system environment, or as a parameter to the jvm (-Denv.dir=test).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-2790302160403058827?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/2790302160403058827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=2790302160403058827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/2790302160403058827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/2790302160403058827'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2007/05/configuration-of-environment-settings.html' title='Configuration of Environment Settings'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7922042537872033964.post-8528058998902855883</id><published>2006-04-18T14:33:00.000+02:00</published><updated>2008-11-19T11:17:11.374+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Still loving the AbstractTransactionalDataSource- SpringContextTests</title><content type='html'>&lt;i&gt;written by Daniel Rijkhof&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;If you are using &lt;i&gt;junit testing&lt;/i&gt; and a &lt;i&gt;spring context&lt;/i&gt;, you surely have the performance problem of loading the context every time you run a single test. Reusing the context would enormously improve the performance. The next thing you'll find irritating is modifying the persistent data. Having a transaction for every test and rolling back after every run would solve this.&lt;br /&gt;&lt;br /&gt;So after thinking about these solutions, you obviously google if someone else already made this possible.&lt;br /&gt;You'll find the AbstractTransactionalDataSourceSpringContextTests class from the &lt;i&gt;org.springframework.test&lt;/i&gt; package. It does precisely what i was looking for.&lt;br /&gt;&lt;br /&gt;We are using it since the moment we found it, and we still love it. You'll find the class in the spring-mock.jar.&lt;br /&gt;&lt;br /&gt;Read more about it &lt;a href="http://www.springframework.org/docs/reference/testing.html"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7922042537872033964-8528058998902855883?l=daniel-rijkhof.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daniel-rijkhof.blogspot.com/feeds/8528058998902855883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7922042537872033964&amp;postID=8528058998902855883' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8528058998902855883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7922042537872033964/posts/default/8528058998902855883'/><link rel='alternate' type='text/html' href='http://daniel-rijkhof.blogspot.com/2006/04/still-loving-abstracttransactionaldatas.html' title='Still loving the AbstractTransactionalDataSource- SpringContextTests'/><author><name>Daniel Rijkhof</name><uri>http://www.blogger.com/profile/05870456384458726743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_kO7SLMLX-WQ/SexXWRe9GAI/AAAAAAAAACU/xls7pUPGCsQ/S220/daniel.jpg'/></author><thr:total>1</thr:total></entry></feed>
