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

<channel>
	<title>Blogging about Software Development &#187; Development</title>
	<atom:link href="http://www.bloggingaboutjava.org/category/java/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bloggingaboutjava.org</link>
	<description>Blogging about Software Development</description>
	<pubDate>Tue, 04 Aug 2009 08:02:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>First steps into the Cloud (App Engine)</title>
		<link>http://www.bloggingaboutjava.org/2009/06/first-steps-into-the-cloud-app-engine/</link>
		<comments>http://www.bloggingaboutjava.org/2009/06/first-steps-into-the-cloud-app-engine/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 20:29:33 +0000</pubDate>
		<dc:creator>Arjen van Schie</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[J2ee]]></category>

		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=452</guid>
		<description><![CDATA[



For quite some time I have been thinking about trying out that &#8216;Cloud-thing&#8216; and see what all the fuzz is about. Because at first I was very skeptic, &#8216;how is this any different then a normal hosting service&#8217; or &#8216;how does this any different than a grid&#8217;. Because depending on the used definition, or cloud [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><img class="alignnone" title="app engine" src="http://code.google.com/intl/nl-NL/appengine/images/appengine_lowres.gif" alt="" width="142" height="109" /></td>
<td>For quite some time I have been thinking about trying out that &#8216;<a href="http://en.wikipedia.org/wiki/Cloud_computing" target="_blank">Cloud-thing</a>&#8216; and see what all the fuzz is about. Because at first I was very skeptic, &#8216;how is this any different then a normal hosting service&#8217; or &#8216;how does this any different than a grid&#8217;. Because depending on the used definition, or cloud provider, those difference are subtle.</td>
</tr>
</tbody>
</table>
<p><span id="more-452"></span></p>
<p>Then Google came along and launched their Java version of their Cloud environment(<a href="http://code.google.com/intl/nl-NL/appengine/" target="_blank">Google App<br />
Engine</a>). Since this one seemed to be easy and free to try, <a href="http://code.google.com/intl/nl-NL/appengine/docs/java/gettingstarted/" target="_blank">I decided to give it a try with the tutorial</a>. ( App Engine the java platform , so not only the java language is supported, but languages like groovy and jruby also work, but I stayed with &#8216;just&#8217; Java)  </p>
<p>Within a time span of 5 to 10 minutes I had registered my cloud application and was ready to get started. <a href="http://appengine.google.com/">The registration</a> is not much different than for a Gmail account. Then I decided to install the <a href="http://code.google.com/appengine/docs/java/tools/eclipse.html" target="_blank">eclipse plugins</a>, this also worked as a charm.<br />
Next, I generated a GWT App engine project with hello-world example code and pressed deploy and my ‘hello world’ was running in the cloud.</p>
<p>The total time taken for this test run was less than 15 minutes and additional applications would be deployed even faster because the environment is all ready installed.</p>
<p>The benefits of this over a normal hosting provider for me are ease of use (the java hosting providers i am used to take a lot more time for installing a build), and scalability (the app engine requires you to work in way no local file access to enable distributed computing which enables them to scale your application).</p>
<p>And just as an exercise I decided to port a normal small java project of mine into my cloud project. Not much had to be changed, the local property file access was replaced by a classpath resource, and I had to hack my way into GWT which i never had used before. And that last part cost me the most time.</p>
<p>For the few interested in my IMDB profile compare tool see: <a href="http://film-freak.appspot.com/">http://film-freak.appspot.com/</a> It&#8217;s supposed to help film freaks compare which films they both saw and which the other didn&#8217;t saw. (If you have an imdb vote history you need to make it public first before you can use your profile number, and some large profiles are not handled right but the feature this service uses is not yet supported by IMDB)</p>
<p>Is the app engine flawless? yeah, well even though app engine comes with a local environment that resembles the real app engine, I had a bug that occurred in the real one but not the local one. The bug was related to the character parsing of the app engine (the bug is still in my application btw)</p>
<p>Also this application didn’t use the datastore, but I heard quite some troubles with the use of frameworks and standards (JPA) on the appengine. To summarize this; the appengine has a special datastore, BigTable, which is fast but not a RDBMS, and to use JPA or JDO plugins for frameworks have to be created and the quality of those plugins define what part of JPA and JDO is available and at this moment this seem to be quite limited. Maybe later this year I’ll take some time to play around with this datastore.</p>
<p>Also see:<br />
<a href="http://www.theserverside.com/news/thread.tss?thread_id=54919">http://www.theserverside.com/news/thread.tss?thread_id=54919</a></p>
<p><a href="http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine">http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2009/06/first-steps-into-the-cloud-app-engine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Java 1.4 is officially obsolete</title>
		<link>http://www.bloggingaboutjava.org/2008/11/java-14-is-officially-obsolete/</link>
		<comments>http://www.bloggingaboutjava.org/2008/11/java-14-is-officially-obsolete/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 13:37:52 +0000</pubDate>
		<dc:creator>Jesper de Jong</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[j2se]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=417</guid>
		<description><![CDATA[Sun&#8217;s Java 1.4 has quietly gone end-of-life since 30 October; see Sun&#8217;s Java SE 1.4.2 page:
J2SE 1.4.2 is in its Java Technology End of Life (EOL) transition period. The EOL transition period began Dec, 11 2006 and will complete October 30th, 2008, when J2SE 1.4.2 will have reached its End of Service Life (EOSL).
This doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Sun&#8217;s Java 1.4 has quietly gone end-of-life since 30 October; see <a title="Sun Java SE 1.4.2" href="http://java.sun.com/j2se/1.4.2/">Sun&#8217;s Java SE 1.4.2 page</a>:</p>
<blockquote><p><strong>J2SE 1.4.2 is in its Java Technology End of Life (EOL) transition period</strong>. The EOL transition period began Dec, 11 2006 and will complete October 30th, 2008, when J2SE 1.4.2 will have reached its End of Service Life (EOSL).</p></blockquote>
<p>This doesn&#8217;t mean that Sun doesn&#8217;t support Java 1.4 anymore - with Sun&#8217;s <a title="Java SE for Business" href="http://www.sun.com/software/javaseforbusiness/index.jsp">Java SE for Business</a> you can get up to 15 years of support for older Java versions.</p>
<p>However, if you&#8217;re on a project that still uses Java 1.4 you should really upgrade to Java 6, if you have any say into which Java version is being used. Besides the new features added in Java 5 and 6, you&#8217;ll enjoy the <a href="http://java.sun.com/performance/reference/whitepapers/6_performance.html">performance enhancements</a> and bug fixes.</p>
<p>If you&#8217;re a Java programmer and you still didn&#8217;t learn the new Java 5 features&#8230; then you&#8217;re in trouble.</p>
<p>The SCJP exam for Java 1.4 has been discontinued this month.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/11/java-14-is-officially-obsolete/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Process Acceleration</title>
		<link>http://www.bloggingaboutjava.org/2008/11/process-acceleration/</link>
		<comments>http://www.bloggingaboutjava.org/2008/11/process-acceleration/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:46:45 +0000</pubDate>
		<dc:creator>Michel Klabbers</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Methodologies]]></category>

		<category><![CDATA[acceleration]]></category>

		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=408</guid>
		<description><![CDATA[Last thursday I visited a presentation about Process Acceleration (PA) [1]. PA is a Business Change method that also uses separation of concerns: it separates the end result from anything else in the business process. The end result of the process is the success state, i.e. all employees correctly submitted their billing forms and all [...]]]></description>
			<content:encoded><![CDATA[<p>Last thursday I visited a presentation about Process Acceleration (PA) [1]. PA is a Business Change method that also uses separation of concerns: it separates the end result from anything else in the business process. The end result of the process is the success state, i.e. all employees correctly submitted their billing forms and all team managers got a correct summary by mail. The emphasis lies primarely on getting the definition of the end result as accurate as possible.</p>
<p><span id="more-408"></span>I will try to give more insight into PA by using a more formal approach. In the section below I will use the definitions &#8220;success state&#8221; and &#8220;system&#8221; a lot. I will define these first:</p>
<blockquote><p>Success state: P_1 and P_2 and &#8230; P_N</p>
<p>P_x (1 &lt;= x &lt;= N) is a predicate, for example: P_1 == (All timesheets employees are submitted), P_2 == (All submitted timesheets are correct).</p>
<p>System: S</p>
<p>S =&gt; P_i and P_i+1 and &#8230; P_i+m and Q_j and Q_j+1 and &#8230; Q_j+n</p>
<p>where P_i and P_i+1 and &#8230; P_i+m is a subset of our success state P_1 and P_2 and &#8230; P_N</p>
<p>Q_j and Q_j+1 and &#8230; Q_j+n are additional predicates, not in our success state.</p></blockquote>
<p>Instead of system you can also read solution. A system can be an already existing system or something that can be built. To illustrate the difference between traditional strategies and the PA strategy, we will do a step by step construction towards an at first unknown success state T_success. We will start from an empty state T_empty.</p>
<blockquote><p>Traditional strategy 1:<br />
Step 1) Design new component C_1.<br />
Step 2) Check new state T_1 with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 3) Design new component C_2, connect C_2 to C_1.<br />
Step 4) Check new state T_2 with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 5) Design new component C_3, connect C_3 to C_2 and C_1.<br />
Step 6) Check new state T_3 with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The first strategy starts building new components, one at a time. After each component is finished we check if success state is reached. This is not unlike many hobby projects where you start from scratch and build a component at a time. Once you are happy with result you have reached T_success.</p>
<blockquote><p>Traditional strategy 2:<br />
Step 1) Apply systems S_q, S_q+1, &#8230; , S_q+k (short: S_q&#8217;) to T_empty.<br />
Step 2) Check new state T_k&#8217; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 3) Design new component C_1, add this component to S_q&#8217;.<br />
Step 4) Check new state T_k1&#8242; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step 5) Design new component C_2, add this component to S_q+1&#8242;.<br />
Step 6) Check new state T_k2&#8242; with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The second strategy starts from a combination of, most likely existing, systems. We then add components one at a time. After each component we check if we have reached the success state. This is a way of building systems which is used often when adding functionality to legacy systems.</p>
<blockquote><p>Traditional strategy 3:<br />
Step A.1) Apply a permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q&#8217;) to T_empty.<br />
Step A.2) Check new state T_k&#8217; with customer: is this state a good enough approximation of the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.3) Apply a different permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q1&#8242;) to T_empty.<br />
Step A.4) Check new state T_k1&#8242; with customer: is this state a good enough approximation of the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.5) Apply a different permutation of systems S_q, S_q+1, &#8230; , S_q+k (short: S_q2&#8242;) to T_empty.<br />
&#8230;<br />
Step B.1) Design new component C_1, add this component to previously found near success system permutation S_q&#8221;.<br />
Step B.2) Check new state T_k1&#8221; with customer: is this state the success state? Yes: done, No: proceed.<br />
Step B.3) Design new component C_2, add this component to previously found near success system permutation S_q&#8221;.<br />
Step B.4) Check new state T_k1&#8221; with customer: is this state the success state? Yes: done, No: proceed.<br />
&#8230;</p></blockquote>
<p>The third, somewhat less traditional, starts by finding a good combination of systems. This combination should give a good approximation of the final state the customer wants to achieve. Only then you start adding new components.</p>
<blockquote><p>Classic PA strategy:<br />
Step A.1) Create a definition of T_success, called T_success&#8217;.<br />
Step A.2) Check T_success&#8217; with customer: is this state the success state? Yes: proceed to B.1), No: proceed.<br />
Step A.3) Change the definition of T_success&#8217; resulting in a new definition called T_success1&#8242;.<br />
Step A.4) Check T_success1&#8242; with customer: is this state the success state? Yes: proceed to B.1), No: proceed.<br />
&#8230;<br />
Step B.1) Directly derive definitions of components C_1, &#8230; C_u from best definition T_success&#8221;.<br />
Note that C_1, &#8230;, C_u =&gt; P_1 and P_2 and &#8230; P_N must hold.<br />
Step B.2) Match components C_1, &#8230; C_u with systems S_q, S_q+1, &#8230; , S_q+k.<br />
Step B.3) Choose best matching(s). For these matchings T_success&#8221; must be a subset of resulting state T_matching.</p></blockquote>
<p>PA first creates a state definition as close as possible to the success state. It then reviews and alters this state iteratively. Only when the definition is satisfactory the next phase starts. In this phase component definitions are derived from the success state definition. These component definitions are then matched with systems and the best matchings are chosen. Simplicity is important in PA: we always strive for a correct succes state with minimal size.</p>
<p>Note that the first two traditional strategies have no real focus on the final success state. This means that during development the chosen success state might actually be (a lot) different than the real success state. The biggest difference between the third strategy and the PA strategy is that in PA we disregard existing systems (read: solutions) until a really good success state definition has been found. Also, we extract as much information as we can from the success state definition. We then use this information to define components. Each component definition should represent a part of the success state. These component definitions should be mutually exclusive (i.e. no overlap) and all component definitions together should imply the success state. Next we match the component definitions with all known systems and come up with the best matchings. Classic PA is almost done here. We now compare the best matchings and present them, with cost figures, to the customer.</p>
<p>As mentioned earlier an important aspect of PA is the separation of the success state from any solution. This is important because of the reduced effort needed: anyone involved in the process can just think about the success state and can forget about (existing) systems. Depending on the number of systems this can be a serious advantage.</p>
<p>When there are only few solutions and the customer really doesn&#8217;t know what he or she wants, starting from an existing solution and building from that is the way to go. However, when there is one clear success state and many possible (existing) solutions PA will shine.</p>
<ul>
<li>[1]: <a title="http://www.procesacceleratie.nl/" href="http://www.procesacceleratie.nl/" target="_blank">http://www.procesacceleratie.nl/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/11/process-acceleration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Separation of Concerns and SOA</title>
		<link>http://www.bloggingaboutjava.org/2008/11/separation-of-concerns-and-soa/</link>
		<comments>http://www.bloggingaboutjava.org/2008/11/separation-of-concerns-and-soa/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 23:39:27 +0000</pubDate>
		<dc:creator>Michel Klabbers</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=402</guid>
		<description><![CDATA[According to Google Trends SOA is not as &#8220;hot&#8221; as it was a year ago. According to a recent poll by Finalist [0] at the J-Fall [1] SOA is actually very &#8220;not&#8221;. Does this mean that companies are already preparing or even using SOA? Or are they abandoning SOA?

The idea behind SOA is actually very [...]]]></description>
			<content:encoded><![CDATA[<p>According to Google Trends SOA is not as &#8220;hot&#8221; as it was a year ago. According to a recent poll by Finalist [0] at the J-Fall [1] SOA is actually very &#8220;not&#8221;. Does this mean that companies are already preparing or even using SOA? Or are they abandoning SOA?</p>
<p><span id="more-402"></span></p>
<p>The idea behind SOA is actually very good. It loosely couples the service and the front-end, thus separating our concerns. The term seperation of concerns (SoC) was first introduced by Edsger Dijkstra about 35 years ago. The Wiki has an interesting qoute on SoC [2]:</p>
<blockquote><p>&#8220;All programming paradigms aid developers in the process of improving separation of concerns. For example, object-oriented programming languages can separate concerns into objects, and a design pattern like MVC can separate content from presentation and data-processing (model) from content. Service-oriented design can separate concerns into services.&#8221;</p></blockquote>
<p>In this context SOA really looks like the next step in programming.</p>
<p>Assuming your company is planning to &#8220;go SOA&#8221; in near future, what challenges await?<br />
Here are some of the implications that come to mind when using SOA:</p>
<ul>
<li> use of external services means higher internet bandwidth usage</li>
<li> exposure of internal services to external companies means additional security measures become necessary</li>
<li> using just a single connection to external services means a higher chance of losing messages</li>
<li> use of possibly badly written external services means additional infrastructure and code measures, such as timeouts, become necessary</li>
<li> when chaining services complex behaviour can emerge and message based testing tools are highly advised</li>
</ul>
<p>Using SOA we also have to be more aware of:</p>
<ul>
<li>connection failure</li>
<li> message loss</li>
<li>service failure</li>
</ul>
<p>By using a polling mechanism we could improve our awareness, but the transition to a Service Oriented Architecture will still be a step-by-step process [3], where we will learn by doing.</p>
<ul>
<li>[0]: <a title="http://www.finalist.com/content/19787/hot_or_not_contest_vermaakt_bezoekers_j-fall_" href="http://www.finalist.com/content/19787/hot_or_not_contest_vermaakt_bezoekers_j-fall_" target="_blank">http://www.finalist.com/content/19787/hot_or_not_contest_vermaakt_bezoekers_j-fall_</a></li>
<li>[1]: <a title="http://www.nljug.org/jfall/" href="http://www.nljug.org/jfall/" target="_blank">http://www.nljug.org/jfall/</a></li>
<li>[2]: <a title="http://en.wikipedia.org/wiki/Separation_of_concerns" href="http://en.wikipedia.org/wiki/Separation_of_concerns" target="_blank">http://en.wikipedia.org/wiki/Separation_of_concerns</a></li>
<li>[3]: <a title="http://it.toolbox.com/blogs/the-soa-blog/soa-benefits-challenges-and-risk-mitigation-8075" href="http://it.toolbox.com/blogs/the-soa-blog/soa-benefits-challenges-and-risk-mitigation-8075">http://it.toolbox.com/blogs/the-soa-blog/soa-benefits-challenges-and-risk-mitigation-8075</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/11/separation-of-concerns-and-soa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JAOO Conference day 3</title>
		<link>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-3/</link>
		<comments>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-3/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 11:30:55 +0000</pubDate>
		<dc:creator>Nicolai Buch-Andersen</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JAOO]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=373</guid>
		<description><![CDATA[This was my last day at JAOO. I was tired, but still looking forward to today’s speakers. It was hard to decide what to attend and what not to attend today. I just had to hope that I’ve chosen correctly.

The keynote today was held by Richard P. Gabriel and Guy L. Steele, Jr. It was&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>This was my last day at JAOO. I was tired, but still looking forward to today’s speakers. It was hard to decide what to attend and what not to attend today. I just had to hope that I’ve chosen correctly.</p>
<p><span id="more-373"></span></p>
<p>The keynote today was held by Richard P. Gabriel and Guy L. Steele, Jr. It was&#8230; strange. Very, very strange. Bizarre, in fact. The two of them went through the history of programming languages in a colourful slideshow spiked with music and video clips and singing and ringing on cowbells. They didn’t talk but recited, like they were reading poems instead of giving a tech talk. Bizarre, just bizarre. I couldn’t quite decide if it were madness or genius. So I suppose it must be art.</p>
<p><strong>Session 1: Five Considerations for Software Developers by Frank Buschmann and Kevlin Henney</strong><br />
I attended this session mostly because of Kevlin Henney. I listened to one of his talks last year and it was hugely entertaining, as well as insightful. This session wasn’t quite that entertaining, but it had a lot of good content. The five considerations were: Economy (strive for minimalistic solutions), visibility (your ideas should be visible in your code), spacing (keep separations between domain, services and infrastructure), symmetry (keep the code clean and balanced) and emergence (do not build too much explicit control in your code, let it emerge instead).</p>
<p><strong>Session 2: LEGO Develops a new robotics platform WeDo</strong><br />
This session was a disappointment. It was not a presentation on robotics or WeDo or LEGO’s vision for robotics in the future, or much of anything, really. Most of all it was a presentation of LEGO as a business, and of LEGO’s business processes. As if the audience was a group of business managers, and the speaker was trying to sell stocks. I should have attended Kevlin’s second talk instead.</p>
<p><strong>Session 3: Real-world Refactoring by Neal Ford</strong><br />
This was another session with a lot of content. It’s hard to summarise what he said in just a few sentences, but I’ll try anyway. First of all, he presented two principles to keep in mind when refactoring: The composed method (break down large methods into smaller well-named methods until it reads like a series of steps in an algorithm) and SLAP (keep the same level of abstraction in a method).  Next, he gave us two things to be cautious about: Dependencies on third-party frameworks and spider web dependencies among our own classes. In addition, he talked about detecting duplication in our code with the tool cpd, avoiding duplication of code in tests, doing large refactoring on branches and doing ‘scary’ refactorings of brittle code. Lastly, he advised us to use code metric tools to discover when and where to use refactoring.</p>
<p><strong>Session 4: Patterns of Internal DSLs by Martin Fowler</strong><br />
Martin Fowler is another of my favourite speakers. He always speaks loudly and clearly and I always feel as if I learn something when I’m reading one of his books or listening to him talk. This session was no different, although it was rather more technical than I had hoped for. He gave us several techniques for writing internal DSLs, but no pointers at all on when to use DSLs in the first place.</p>
<p><strong>Session 5: Building DSLs with External Workbenches by Neal Ford</strong><br />
Neal Ford opened this session with one interesting observation: IDEs are slowly moving from working on text files to working directly on the abstract syntax trees instead. Thus, text becomes just one possible representation of the software, among other possibilities. But the rest of the talk concentrated on two different tools for creating DSLs: An Eclipse based tool called Xtext, and a tool created by JetBrains, the company behind the IntelliJ IDE, called MPS. Both tools enabled the user to create DSLs and the tools to work efficiently with the DSLs. Xtext, for example, will automatically generate a new Eclipse editor plug-in for the language, complete with syntax-aware colour coding and context-sensitive help.</p>
<p><strong>Conclusion</strong><br />
Domain Specific Languages was hot topic this year. I think almost every speaker at JAOO mentioned them in some form or another. The most obvious use of DSLs I’ve seen is as a build language (Gant being an example of an internal DSL inside Groovy). But I would have liked to see some more (and more diverse) examples of using DSLs in real life projects.</p>
<p>Other hot topics included functional programming (emerging into the mainstream, both in the form of new languages such as F# and Scala, and as a heavy influence on the evolution of existing mainstream languages); dynamic languages (pretty well established in the mainstream by now, with representatives such as Ruby, Groovy and Python); parallel computing (mostly as a threat hanging over our heads, waiting to be overcome one way or another) and how best to utilize the internet in our applications (cloud-computing and rich internet applications).</p>
<p>In conclusion JAOO 2008 has been a wonderful conference. I’ve learned a lot, talked to a lot of very interesting persons and gotten a load of inspiration that will properly take me days, if not weeks or months, to process. I hope I’ll be able to attend next year too.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JAOO Conference day 2</title>
		<link>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-2/</link>
		<comments>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-2/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 17:38:47 +0000</pubDate>
		<dc:creator>Nicolai Buch-Andersen</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JAOO]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=372</guid>
		<description><![CDATA[I skipped the introduction of today’s program in order to write up my impression of yesterday instead. The long introduction is boring anyway. I already knew which sessions I wished to attend.

Today’s keynote was about Google Chrome and their V8 JavaScript engine. It’s as nifty piece of technology, but wasn’t a very interesting subject for [...]]]></description>
			<content:encoded><![CDATA[<p>I skipped the introduction of today’s program in order to write up my impression of yesterday instead. The long introduction is boring anyway. I already knew which sessions I wished to attend.</p>
<p><span id="more-372"></span></p>
<p>Today’s keynote was about Google Chrome and their V8 JavaScript engine. It’s as nifty piece of technology, but wasn’t a very interesting subject for me. I can’t help but to doubt that JavaScript will be any kind of long-term solution for developing web applications, no matter how much Google optimizes their engine. The browser is a perfect distributing platform, but a lousy execution platform. I believe more in RIA technologies such as Flex, Silverlight and JavaFx.</p>
<p><strong>Session 1: Of Code and Change: Beautiful Software by Michele Lanza</strong><br />
One word: Amazing! The first thing Michele showed us was a first generation visualization tool running in an Eclipse plug-in. It visualized code as a 2D graph where classes where represented by simple squares. Different metrics was used to control the width, height and colours of the squares. It was impressive what could be seen at a glance from such a relative simple figure. But the second thing Michele demonstrated was really fantastic. It’s a tool developed by one of his PhD student and it’s called CodeCity. It draws an entire software system as a full colour-coded 3D model of a city. Packages appear as districts and classes as buildings in the districts. It gives a whole new way of visualizing the overall architecture of system, spot areas ripe for refactoring, identify areas of frequent change or stale code, and much more. Take a look at <a href="http://www.inf.unisi.ch/phd/wettel/codecity.html">.</p>
<p><strong>Session 2: The Times They Are A-Changin? by Sofia Svanteson</strong><br />
This was an interesting, at times funny, and quite inspirational talk about GUI’s for mobile devices. Perhaps it was not very rich on actual, concrete information. But I’m glad there’s room for these ‘softer’ subjects at JAOO too.</p>
<p><strong>Session 3: Not your Grandfather’s Architecture: Taking Architecture into the Agile World by James O. Coplien</strong><br />
James had some surprising (for me!) insights about architecture. Firstly, he claimed that architecture was about ‘form’, not structure. That is, architecture was the basic form of your application, wherein you poured your material, or structure, in the form of methods and classes and packages. Secondly, he claimed that architecture should come from the business domain, not from the requirements. Architecture should capture aspects inherent in the business domain and therefore stable across varying user requirements. Unfortunately these interesting claims were drowned out in a general rant against OO which – according to the speaker – destroyed the clarity of the Fortran algorithms that went before; against the toy language called Java specifically, and the fact that all OO languages was missing the concept of ‘roles’ or ‘traits,’ without which architecture could not be expressed properly.</p>
<p><strong>Session 4: Flex and Air by James Ward</strong><br />
This session had some good demos. But I’m not sure about the composition of the platform: A JavaScript ‘mutant’ is used to code the client and anything, apparently, goes on the server (as long as it can be presented as a webservice). It seems to me to have the potential to turn into a mess of different languages and standards. On the other hand, the combination of the Flash Player in the browser and the Air player for desktop application, which can pretty much share the same code, seems like a very good idea. </p>
<p><strong>Session 5: Silverlight by Josh Holmes</strong><br />
In contrast with the previous session this one had rather lacklustre demos. Some of them looked impressive enough, but they were all just toy projects. I didn’t feel that Josh did a good job of “selling” Silverlight. The biggest strength of Silverlight is that it will run on Microsoft’s Mobile OS and that it utilizes the well-known .NET technology stack (C# + WPF). </p>
<p><strong>Conclusion</strong><br />
For me, this day was all about Rich Internet Applications. I think Chrome is a good looking browser (I like the slick interface) but, as I said, I’m doubtful if JavaScript will continue to be the preferred language for web application in the face of the competition. Media codex’es aren’t build into the browsers but played through dedicated media players and plug-ins. I think we will see a similar trend for web application: They will use the browser as a distribution platform, but will run in dedicated ‘application players’ and/or ‘application player’ plug-ins. Whether these players will be build by Microsoft (Silverlight/.NET), Adobe (Air/Flex) or Sun Microsystems (JavaFX) I don’t know. Time will tell, I guess.<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/10/jaoo-conference-day-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>JAOO Conference day 1</title>
		<link>http://www.bloggingaboutjava.org/2008/09/jaoo-conference-day-1/</link>
		<comments>http://www.bloggingaboutjava.org/2008/09/jaoo-conference-day-1/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 08:33:38 +0000</pubDate>
		<dc:creator>Nicolai Buch-Andersen</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[JAOO]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=371</guid>
		<description><![CDATA[JAOO: An international software development conference with more than 80 speakers, 3 days of presentations, 3 days of tutorials and about 1400 guests. And all of it right here in Aarhus, Denmark, right on top of where I live and work. I was lucky enough to attend last year, and I’ll be attending this year [...]]]></description>
			<content:encoded><![CDATA[<p>JAOO: An international software development conference with more than 80 speakers, 3 days of presentations, 3 days of tutorials and about 1400 guests. And all of it right here in Aarhus, Denmark, right on top of where I live and work. I was lucky enough to attend last year, and I’ll be attending this year too&#8230;<br />
<span id="more-371"></span><br />
The JAOO program is broken up into multiple thematic tracks, one set of tracks in the morning and another set of tracks after lunch. Last year I dutifully (well, more or less) followed the tracks and choose presentations according to practical value in my daily work. This year, I’ve decided to be a bit more adventurous and gone for inspirational value and pure fun.</p>
<p>But first the opening talk and the keynote: It was looong. The initial speaker, for some reason, decided to walk us through the complete program for today. The keynote itself was held by Anders Hejlsberg and the subject was “Where Are Programming Languages Going?” It was very interesting but, unfortunately, also felt kind of protracted. He did at least three demos along the way (of LINQ and F#) and used a lot of time to convey a rather simple message: Future programming languages will blend traits from imperative, functional and parallel languages into one.</p>
<p><strong>Session 1: End User Programming – Glenn Vanderburg</strong><br />
Excel, Lemmings and The Incredible machine as examples of successful user programming tools? Not something I would have considered on my own. But it made sense nevertheless. It was a bit of an eye opener, actually. All in all a very cool talk that nevertheless was a bit thick on the examples and a bit thin on the actual theorising and drawing of conclusions.</p>
<p><strong>Session 2: Gant - Andrew Glover</strong><br />
This talk was part of a dedicated build track at JAOO. It almost made me sorry to miss the rest of the talk. The talk itself was about using Groovy as a DSL to replace Ant as a build tool. Gant has tight integration with Ant so it’s easy to call all the existing Ant tasks from within Gant. It also has integration with Ivy (an Ant version of Mavens dependency handling). It was very interesting. I could definitely see potential in replacing some monster Ant script with a DSL. But I was not quite convinced that Groovy was the best tool for the job – too much Java-like syntax left in Groovy to make it very elegant. Or perhaps a Java-like syntax would only be an advantage for building Java projects?</p>
<p><strong>Lunch</strong><br />
Um, not the greatest variety ever. But nice with a break. I got to talk with a couple of interesting persons too.</p>
<p><strong>Session 3: Aesthetic programming with Ruby by Sam Aaron</strong><br />
I admit I was late for this session. I missed the first 20 minutes. Perhaps that’s why I didn’t get what the h&#8230; the guy was talking about. I didn’t see much Ruby and about the only thing I did catch was that we programmers shouldn’t call code ‘code’ anymore because code equals secrecy and it should be all about communication instead. He ended up by suggesting that we build systems in three layers, as a bottom-up pyramid: A stable layer build in Java at the bottom, a dynamic layer build in Ruby in the middle and a business layer build using DSL’s at the top. But I wonder&#8230; how are we supposed to know which part of the system should go where? If we already know which part of the system will be stable forever and we know all the areas of potential change then it should be easy to build the system practically no matter which technology we use.</p>
<p><strong>Session 4: Fortress by Guy L. Steele, Jr.</strong><br />
Fortress is a Sun sponsored open source project aimed at developing a next generation programming language for parallel computing on multi-core CPU’s. Basically, what Guy told us was that everything we know (about programming) is WRONG! Or control structures and even our data structures are inherently sequential and must be re-though for parallel computing. A rather depressing message! And still, also one that opened up new perspectives. I seriously doubt that Fortress will ever become a mainstream language but some of the techniques in Fortress will probably find their way to other languages given time. It was a very interesting and very insightful talk.</p>
<p><strong>Session 5: Scala by Bill Venners</strong><br />
Another session, another new programming language. This was the last session of the day. Scala is a programming language that merges OO (Java-style) with functional programming. It seems like a very nice language that shares some characteristics with the leaner dynamical languages such as Ruby, but without giving up on statistical type checking. It also seems like a very nice and ‘safe’ way for a Java developer to experiment with functional programming techniques.</p>
<p><strong>Conclusion</strong><br />
It was a very exciting and interesting day with some really good sessions. There’s not much Java in JAOO anymore it seems. The trends are all about DSL’s, functional programming and parallel computing. I don’t think a single speaker failed to mention those three today.</p>
<p>I’m looking forward to tomorrow.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/09/jaoo-conference-day-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3 important questions you should ask yourself when coding</title>
		<link>http://www.bloggingaboutjava.org/2008/09/3-important-questions-you-should-ask-yourself-when-coding/</link>
		<comments>http://www.bloggingaboutjava.org/2008/09/3-important-questions-you-should-ask-yourself-when-coding/#comments</comments>
		<pubDate>Mon, 01 Sep 2008 08:54:16 +0000</pubDate>
		<dc:creator>Jan Willem Tulp</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[coding]]></category>

		<category><![CDATA[quality]]></category>

		<category><![CDATA[smells]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=364</guid>
		<description><![CDATA[Allright, so you&#8217;ve written some code. Now how do you determine that it&#8217;s good code? What&#8217;s your approach in evaluating the quality of your code? Do you follow some Software Design Principles? Are you aware of some of the Code Smells? Whenever I write some code, I always ask myself questions about the code I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>Allright, so you&#8217;ve written some code. Now how do you determine that it&#8217;s good code? What&#8217;s your approach in evaluating the quality of your code? Do you follow some <a title="Software Design Principles" href="http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">Software Design Principles</a>? Are you aware of some of the <a title="Code Smells" href="http://wiki.java.net/bin/view/People/SmellsToRefactorings" target="_blank">Code Smells</a>? Whenever I write some code, I always ask myself questions about the code I&#8217;ve just written. Asking yourself the right questions will help you find the right answers. In this post I will share 3 important questions I always ask myself to help me evaluating the quality of my code.</p>
<p><span id="more-364"></span></p>
<p><strong><em>1. does this class have just one responsibility?</em></strong></p>
<ul>
<li><strong>Description</strong>: If your class has more than one responsibility, then responsibilities can become coupled. If responsibilities are coupled, changes to one responsibility may affect the other responsibility. This can lead to fragile design, more complex UnitTests and your code may break in unexpected ways, especially if different clients depend on this class for different reasons or responsibilities. Also, the more responsibilities your class has, the harder it becomes to comprehend your class.</li>
<li><strong>Possible indications</strong>: Lots of import declarations, long classes, long methods, one client depends on this class for one reason and another client depends on this class for another reason.</li>
<li><strong>Possible solutions</strong>: Extract a class that has its own responsibility and delegate from the original class to the extracted class.</li>
<li><strong>What do you achieve</strong>: Simpler class design, testability and robustness improves.</li>
</ul>
<p><strong><em>2. is this method side-effects free?</em></strong></p>
<ul>
<li><strong>Description</strong>: If your method has side-effects, it does more than its intended purpose. For example it also changes the state by modifying a global or static variable. Or for example, it validates some data and updates the database as well. Methods with side effects make the behavior more difficult to predict, are more difficult to test and are harder to comprehend.</li>
<li><strong>Possible indications</strong>: long methods, it&#8217;s hard to write UnitTests for this method, arguments are assigned inside the method body, static or global variables are modified.</li>
<li><strong>Possible solutions</strong>: break method into smaller methods, find alternatives for argument assignments</li>
<li><strong>What do you achieve</strong>: Simpler methods, easier to create UnitTests, possible indications for different responsibilities, more readable code, robustness improves</li>
</ul>
<p><strong><em>3. is my code readable for someone unfamiliar with this code?</em></strong></p>
<ul>
<li><strong>Description</strong>: If your code is unreadable, it takes more time to understand your code. It is also harder to change your code and it can be risky to change your code, because you may not be sure if your change is correct. Most of your colleagues will probably become frustrated if your code is unreadable, and changing your code takes longer than neccesary.</li>
<li><strong>Possible indications</strong>: long methods, long classes, magical numbers (numbers you don&#8217;t know what they stand for), use of uncommon abbreviations, it doesn&#8217;t look nice</li>
<li><strong>Possible solutions</strong>: rename methods and variables to something that is understandable, declare variables as close to where they are first used as possible, make it look nice (consistent and correct spacing, indentiation, white lines, etc.), introduce constants for magical numbers, use consistent naming</li>
<li><strong>What do you achieve</strong>: simpler code that&#8217;s easy to understand, easy to change, and changing your code takes less time. Also your colleagues won&#8217;t be frustrated <img src='http://www.bloggingaboutjava.org/cms/wordpress2/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>These are 3 of the many important questions I ask myself when writing code. They help me evaluating the quality of my work, and thus assist me improving the code I&#8217;m working on when necessary. You will notice that when you ask yourself these kind of questions a lot, it becomes a second nature to think about important principles and guidelines.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/09/3-important-questions-you-should-ask-yourself-when-coding/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Netbeans scripting IDE #1 ? Grails try-out&#8230;</title>
		<link>http://www.bloggingaboutjava.org/2008/07/netbeans-scripting-ide-1-grails-try-out/</link>
		<comments>http://www.bloggingaboutjava.org/2008/07/netbeans-scripting-ide-1-grails-try-out/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 18:03:18 +0000</pubDate>
		<dc:creator>Arjen van Schie</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Scripting]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=362</guid>
		<description><![CDATA[A few weeks ago some co-workers of mine were having a discussion about IDEs and concluded that their Eclipse would be the right choice for all most every project. Sure IntelliJ had some nice features and so has JDeveloper, but Eclipse had plugins to do the same. Did Eclipse had the best of the IDE [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="padding:4px;" src="http://grails.org/images/grails-logo.png" alt="" width="160" align="left" />A few weeks ago some co-workers of mine were having a discussion about IDEs and concluded that their Eclipse would be the right choice for all most every project. Sure IntelliJ had some nice features and so has JDeveloper, but Eclipse had plugins to do the same. Did Eclipse had the best of the IDE world ?</p>
<p><span id="more-362"></span></p>
<p>Then I stumbled upon some blog posts about Netbeans 6.5 and their scripting support for python, php, ruby(rails),groovy(grails). This reminded me about how much better Ruby, Ruby on Rails and JavaFX support was in Netbeans compared to Eclipse. Sure Eclipse has plugins for these platforms, but Netbeans support is better.</p>
<p>Now I started wondering, would Netbeans be better suited for all these scripting languages ? I gave it a try with the Grails framework, since I was interested in having a look at Grails anyway.<br />
The following screenshot shows the app I ended up with. I know nothing fancy, just a few simple entities (movie, director) but still it&#8217;s a result (be it very small <img src='http://www.bloggingaboutjava.org/cms/wordpress2/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )</p>
<p><img width=650 src="http://www.bloggingaboutjava.org/cms/wordpress2/wp-content/uploads/2008/07/grails_scrn.png"/></p>
<p>After working with the new Netbeans editor I must say I&#8217;m impressed with how easy it was to create this Grails app, without any experience with Grails or Groovy. I can see why people like groovy and Grails, although for a real comparison with RoR I should give it a bigger test-drive some day.</p>
<p>The conclusion of this story is that I&#8217;m impressed with groovy and grails now that I finally took the time for some minimal hands on experience. And Netbeans seems like the default editor for scripting; I now have postive experiences with JavaFX , Ruby and Groovy with Netbeans (so I guess it also will be just fine for Php and Python etc.) </p>
<p><em>note: netbeans 6.5 seems pretty stable for a beta, but the resources usage seems a bit high</em></p>
<p>Some links:<br />
<a href="http://blogs.sun.com/tor/entry/screenshot_of_the_week_31">Blogpost:Netbeans with groovy &#038; python </a><br />
<a href="http://blogs.sun.com/tor/entry/multilingual_netbeans">Blogpost: Netbeans with php, python, scala</a><br />
<a href="http://blogs.sun.com/tor/entry/javascript_type_inference">Blogpost: Netbeans with javascript</a><br />
<a href="http://blogs.sun.com/geertjan/entry/grails_this_time_with_tools">Blogpost:Netbeans and Grails</a><br />
<a href="http://dev2dev.bea.com/pub/a/2006/10/introduction-groovy-grails.html?page=1">Article: introduction to groovy + grails</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/07/netbeans-scripting-ide-1-grails-try-out/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to modify untested existing code safely</title>
		<link>http://www.bloggingaboutjava.org/2008/07/how-to-modify-untested-existing-code-safely/</link>
		<comments>http://www.bloggingaboutjava.org/2008/07/how-to-modify-untested-existing-code-safely/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 12:56:19 +0000</pubDate>
		<dc:creator>Jan Willem Tulp</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[characterization testing]]></category>

		<category><![CDATA[Testing]]></category>

		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.bloggingaboutjava.org/?p=360</guid>
		<description><![CDATA[You may know, or not know, that there are various kinds of software tests that may help you ensure that your code meets the requirements and behaves as intended, like Unit Testing, Scenario Testing, Integration Testing, etc. And the better your test coverage, the lower the risk and the safer you feel modifying your code [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="10px" src="http://www.bloggingaboutjava.org/cms/wordpress2/wp-content/uploads/2008/07/866529_26072537.jpg" alt="" width="106" height="120" align="left" />You may know, or not know, that there are various kinds of software tests that may help you ensure that your code meets the requirements and behaves as intended, like <a href="http://en.wikipedia.org/wiki/Unit_testing" target="_blank">Unit Testing</a>, <a href="http://en.wikipedia.org/wiki/Scenario_testing" target="_blank">Scenario Testing</a>, <a href="http://en.wikipedia.org/wiki/Integration_testing" target="_blank">Integration Testing</a>, etc. And the better your test coverage, the lower the risk and the safer you feel modifying your code since you can always run your tests to make sure you haven&#8217;t broken anything. Now, what do you do if you work on existing code without Unit Tests? Making a change can be a risky because you can&#8217;t run any Unit Tests. How do you make sure that your change won&#8217;t break anything? <span id="more-360"></span></p>
<p>One possibility is to create Characterization Tests. Characterization Tests are tests that describe (characterize) the behavior of existing code. It&#8217;s important to realize that characterization tests therefore <strong>do not verify the correct behavior</strong> of your code, but <strong>only the existing behavior</strong>. So the purpose of Characterization Tests is to make sure that if you make a change, your change doesn&#8217;t affect the existing behavior of your application.</p>
<p>So basically when you create a Characterization Test, you observe the output for a certain input of a method, and then you write a test to assert this. For example, if you observe that the output of the method sum(2, 3) is 5, then a test can be created that asserts 5 is the output for the input 2, 3. When you make a change to the code, the result of your test should still be the same. Now the fun thing is, since Characterization Tests are based on existing code, you could generate some Characterization Tests from your existing code. <a href="http://www.junitfactory.com" target="_blank">JUnitFactory</a> seems to be such a tool, but at this time the website seems to be down.</p>
<p>A best practice for writing Characterization Tests is only to write Characterization Tests for code that may be affected by your change. If methods are very long, have lots of side effects, and if the object or the method has lots of dependencies, then it may not be very easy to create a Characterization Test. Two factors that influence the testability of your code are:</p>
<ul>
<li>how easy is it to construct the Object Under Test</li>
<li>how easy is it to execute the method to be tested in order to assert something</li>
</ul>
<p>You can start writing Unit Tests now, even for existing code. And Characterization Tests really reduce the risk and make it safer to change existing code. Writing Tests also gives you more insight into existing code, and your tests will make your colleague developers happy for sure: they feel safer to make changes as well if you wrote a test.</p>
<p>To read more about Characterization Tests, see:</p>
<ul>
<li><a href="http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052" target="_blank">Working Effectively With Legacy Code</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=198296" target="_blank">Working Effectively With Characterization Tests</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=198674" target="_blank">Working Effectively With Characterization Tests - Part 2</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=198970" target="_blank">Working Effectively With Characterization Tests - Part 3</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=200725" target="_blank">Fun With Automated Characterization Test Generation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bloggingaboutjava.org/2008/07/how-to-modify-untested-existing-code-safely/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
