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

<channel>
	<title>cwash into software &#187; Uncategorized</title>
	<atom:link href="http://cwash.org/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://cwash.org</link>
	<description>+= construction + craftsmanship;</description>
	<lastBuildDate>Thu, 29 Sep 2011 04:23:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.2</generator>
		<item>
		<title>Transactions, Part 2 &#8211; Writing Data Reliably</title>
		<link>http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=transactions-part-2-writing-data-reliably</link>
		<comments>http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 14:58:00 +0000</pubDate>
		<dc:creator>Chris Wash</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cwash.org/?p=465</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/";</script>In Part 1, we covered the basic concept of a transaction, what the ACID properties are and how they specify transactional behavior, and why you might use transactions. This time, we&#8217;ll talk more specifically about what it&#8217;s like to use a transaction, and how the contracts it provides allow us to write data in a [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><p>
<blockquote>In <a href="http://cwash.org/2010/07/08/transactions-part-1/">Part 1</a>, we covered the basic concept of a transaction, what the ACID properties are and how they specify transactional behavior, and why you might use transactions.  This time, we&#8217;ll talk more specifically about what it&#8217;s like to use a transaction, and how the contracts it provides allow us to write data in a reliable fashion.</p></blockquote>
<h3>Programming With Transactional Systems</h3>
<h4>Commit and Rollback</h4>
<p>Transactions either <em>commit</em> or <em>rollback</em>.  Until a transaction is committed, it is assumed none of the work it has done is saved.  Once a commit signal is issued by the application (either through an API call, or by a container), this work is actually performed by the transaction processing engine that&#8217;s being used.  If for some reason the commit fails due to an error scenario, or some other runtime exception occurs, we assume that the integrity of the transaction has been compromised and the transaction <em>rolls back</em>, removing any work done up to that point.  When a rollback occurs, the transaction must be resubmitted.<span id="more-465"></span></p>
<p>At its most basic, rollback is simply an undo mechanism, used to revert all changes back to the original state before the transaction began.  To do this, we need to keep a copy of the original state before any changes, and if we need to rollback, we must reinstate the previous copy.  Since there is always the possibility of multiple transactions running, concurrency control comes into play &#8211; we want to rollback to the last committed state, not just the state before beginning a single transaction.  For example, consider this scenario: Alice and Bob both need to submit changes to a source code file under version control, and Alice and Bob must be able to turn in (commit) their changes at the same time in order to meet a deadline.  The source code management system must ensure both transactions are consistent &#8211; that the data is recorded properly, but also make sure that the transactions are durable &#8211; that Alice&#8217;s changes (that were committed first) were not overwritten by Bob&#8217;s changes.  If you had to implement this behavior that&#8217;s provided by the SCM system, how would you do it?</p>
<p>One way to think about the core of transaction processing engines is the Memento Pattern &#8211; as you perform actions within a unit of work that manipulate your application state, the transaction processor keeps track of sets of state changes and what the most recently committed state was.  This way, when Bob goes to commit his work (after Alice), the SCM system can tell that the state of the resource he was working on has changed since he started his work, and can take steps to remedy the situation.  This is a simplified view of what is going on: the steps to remedy Bob&#8217;s situation are not always straightforward.  Also, providing this transactional behavior through network protocols, in a distributed environment, across different types of transactional resources, etc. all introduce complexity.  But all complexity and bugs aside, the essence of transactions, that is, commit and rollback, should retain the simple semantics we outlined above.</p>
<h4>Transactional API Code</h4>
<p>We&#8217;ve talked a lot about transactions so far, but haven&#8217;t seen much in the way of code.  To a large extent, we&#8217;d like to make transactions configurable, for many of the same reasons we tend to make other parts of our code configurable.  But before going too deep into how to configure your code for transactions, let&#8217;s look at how you can control transactional APIs through code (&#8220;by hand&#8221;), first.  Boilerplate code for working with a transactional resource often looks like this:
</p>
<pre class="brush: java; highlight: [5-16];">
public class TestProcess {

	// ...

	public void process() {
		// open connection to resource
		// create transaction object
		// call begin on transaction object
		try {
			// perform interaction with resource
			// call commit on transaction object
		} catch (Exception e) {
			// call rollback on transaction object
		} finally {
			// call close on connection object
		}
	}
}
</pre>
<h4>Problem: Transactional API code mixed in Application Code</h4>
<p>Imagine writing code without using any transactions at all, that is, without any of the <strong>rollback semantics</strong> that we talked about above.&nbsp;&nbsp;If the code is to work correctly in all scenarios, it needs to include a substantial amount of cleanup code. &nbsp;Cleanup code and retry code, in general, is messy code.  There are a lot of corner cases and expected failures that could occur, not to mention unexpected failures/error scenarios that need to be sorted out.  The unassuming rookie programmer usually ignores these cases up front, and tackles adding error handling as he or she discovers the errors. This can make maintenance significantly more difficult because all business logic devolves into the&nbsp;<em>arrow antipattern:</em> becoming littered with if-else statements that inhibit readability and stifle the ability to refactor to a more suitable design. &nbsp;While this is not a big deal in prototyping or non-critical scenarios, when we need to count on data integrity, it&#8217;s not an adequate approach.</p>
<p>Calling transactional APIs around your business logic can dramatically reduce the complexity of your cleanup code by providing rollback semantics. &nbsp;In other words, when it is determined an error scenario has occurred and the transaction cannot be committed, we rollback, or restore the application to a previously consistent state. &nbsp;This often means &#8220;undo-ing&#8221; pending work, but is often implemented by queuing up work to be done and only making those changes when commit is called. &nbsp; Still, code that interacts directly with a transaction manager or monitor API leaves something to be desired in terms of maintainability. &nbsp;Applications constrained to be implemented by working with Transactional APIs tend to make them inherently procedural, which can be more difficult to test and maintain.  Because your business logic is surrounded by another API, often this makes code harder to read as well.  For these reasons, we favor using declarative transaction management in cases where your application demands implementing more than a trivial amount of transaction code.</p>
<h3>Declarative Transaction Management</h3>
<h4>Transaction Attributes</h4>
<p>
<strong>Transaction attributes</strong> allow us to declare how the container should handle interfacing with transaction APIs on our behalf, eliminating a lot of the boilerplate transaction API code and messy cleanup code altogether, allowing it to be specified and live in configuration metadata.  I asked a <a href="http://stackoverflow.com/questions/1759554/examples-or-uses-cases-to-explain-ejb-transaction-attributes" target="_new">question on Stackoverflow</a> that challenged the community to come up with a good metaphor for how these worked.  I would encourage you to read the link to the OpenEJB description, the examples/use cases/metaphors there, and add your own.</p>
<h4>Transaction Attributes in Programming Models</h4>
<p>System.Transactions in .NET, and EJB3 in JEE5+ provide transaction attributes that allow for defining the way your application code should interact with the underlying transactional resource.  See the references section below for more information on each of these models.</p>
<h3>Advanced Transaction Concepts and Terminology</h3>
<h4>Distrubuted (XA) Transactions</h4>
<p>When committing work across two or more different transactional resources, we use a &#8220;distributed&#8221; transaction, also known as an  <em>XA</em> transaction. (XA stands for the industry-standard XA interface defined by the X/Open group.)  In Java, support for distributed transactions is provided by libraries that implement the Java Transaction API (JTA) &#8211; most often you&#8217;ll find these libraries included in the runtime of JavaEE application servers.  N.B. that use of JTA does not necessarily imply that you are using distributed transactions &#8211; it simply provides a space for you to define your own &#8220;global&#8221; transactions, that may include XA and/or &#8220;local&#8221; transactions.</p>
<p>XA  transactions are much more complicated because in order for the ACID properties of all resources to be guaranteed, each system must implement a &#8220;Two-Phase Commit&#8221; protocol that ensures transactional consistency across <strong>all</strong> resources.  Support for this protocol is often included in more robust versions of drivers or connectors and used only when needed, as they introduce complexity and overhead that degrades performance.  It&#8217;s beyond the scope of this article to describe this protocol, but the reader is encouraged to investigate how two-phase commit works if it is in use in his or her environment.</p>
<p>Local transactions do not support the XA protocol &#8211; the transactional semantics are only guaranteed to work against a single resource.  Let&#8217;s look at an example that will contrast the two models.  Consider an application that must write some information to a database and also enqueue a message to a message queue (for example, enqueuing a message that triggers a confirmation e-mail to be sent).  If we are using local transactions, we must ensure that the message is not enqueued after the data has been committed to the database.  This sounds like an easy enough request to accommodate, and may to lead you to use only local transactions.  If there is a problem writing the data to the database, no e-mail will ever be sent, because the global transaction (containing the database updates and message enqueue) will rollback before it ever tries to send the email.  But what if the enqueue of the message fails?  Without using distributed transactions, there is no way to &#8220;uncommit&#8221; the database changes.  There are certainly other strategies to mitigate this problem without using a distributed transaction, but they involve writing cleanup and retry code.  If both the writing of the data to the database and the enqueue of the message are part of a global, <em>distributed</em> transaction, then any problem enqueuing the message will force the entire transaction to rollback, in which case the client will need to resubmit the entire transaction again.  Obviously there are pros and cons to using either approach, but this example should give you a taste of when and why you would choose to use a distributed transaction.  Distributed transactions are useful when data integrity is paramount, but are more difficult to configure and become challenging as the ability to scale and handle highly concurrent transactions increases.</p>
<h4>Compensating Transactions</h4>
<p>When no rollback semantic is available to us, we often find ourselves in a situation where we&#8217;d like to issue a transaction that will &#8220;undo&#8221; a specific transaction that was already previously committed.  This is the idea behind <em>compensating</em> transactions.  They&#8217;re to transactions what anti-particles are to elementary particles in physics; one will &#8220;cancel&#8221; or &#8220;equal out&#8221; the other, the net overall effect being to compensating the state of the system.  To use compensating transactions, for each transaction type you define the steps that will perform the opposite work to reverse a committed transaction.  Compensating transactions are often used in lieu of distributed transactions, but they can also be used to undo an entire distributed transaction that has been committed.  They&#8217;re especially useful for transactions that are very long-lived, for instance, as part of a long business process, but can suffer from the same data integrity issues that they are used to address &#8211; by their very nature they are themselves &#8220;cleanup/retry&#8221; code.  The idea of a compensation transaction is used heavily in the BPM/service orchestration space, where several remote service calls must be glued together into an overall unit of work.  In these cases, compensation transactions can be vital to keeping the orchestration logic in a well-known state, especially when you don&#8217;t have control over the transaction demarcation or a way to enlist in a transaction for systems that you are integrating with.  We won&#8217;t talk much more about them, as the mechanisms that provide this behavior are not standardized, and could be the topic of a series of blog articles all by themselves.</p>
<h3>Up Next</h3>
<ul>
<li>Transaction Isolation</li>
<li>Concurrency Control</li>
</ul>
<h3>References</h3>
<ul>
<li>http://openejb.apache.org/3.0/transaction-annotations.html</li>
<li>http://www.simple-talk.com/dotnet/.net-framework/.net-2.0-transaction-model/</li>
<li>http://en.wikipedia.org/wiki/Two-phase_commit_protocol</li>
</ul>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=2&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=3&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=24&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-dzone">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=102&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to DZone">Add this to DZone</a>
		</li>
		<li class="shr-gmail">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=52&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Email this via Gmail">Email this via Gmail</a>
		</li>
		<li class="shr-googlebookmarks">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=74&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=257&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=207&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=88&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=6&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=4&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=40&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=38&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=10&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://www.shareaholic.com/api/share/?title=Transactions%2C+Part+2+-+Writing+Data+Reliably&amp;link=http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/&amp;notes=In%20Part%201%2C%20we%20covered%20the%20basic%20concept%20of%20a%20transaction%2C%20what%20the%20ACID%20properties%20are%20and%20how%20they%20specify%20transactional%20behavior%2C%20and%20why%20you%20might%20use%20transactions.%20%20This%20time%2C%20we%27ll%20talk%20more%20specifically%20about%20what%20it%27s%20like%20to%20use%20a%20transaction%2C%20and%20how%20the%20contracts%20it%20provides%20allow%20us%20to%20wr&amp;short_link=http://b2l.me/act4t5&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=%24%7Btitle%7D+-+%24%7Bshort_link%7D&amp;service=7&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul><div style="clear: both;"></div></div>

<h3  class="related_post_title">More Related Content</h3><ul class="related_post"><li>No Related Post</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cwash.org/2010/07/26/transactions-part-2-writing-data-reliably/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pairing Lessons #1: Be cynical with code</title>
		<link>http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pairing-lessons-1-be-cynical-with-code</link>
		<comments>http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 23:55:22 +0000</pubDate>
		<dc:creator>Chris Wash</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cwash.org/?p=448</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/";</script>The following scenario plays out a lot when I pair up with people, so I thought I&#8217;d distill it down and write it up for future reference. I think teaching lessons through scenarios could make for an interesting series of articles, and I&#8217;m sure others have equally interesting experiences to share. I&#8217;ve tried to condense [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><p>The following scenario plays out a lot when I pair up with people, so I thought I&#8217;d distill it down and write it up for future reference.  I think teaching lessons through scenarios could make for an interesting series of articles, and I&#8217;m sure others have equally interesting experiences to share.</p>
<p>I&#8217;ve tried to <em>condense</em> this down to just the steps vital to understanding the underlying problem (though this is certainly not the only way to get there) and <em>introduce</em> some terminology (providing links, even if deferring to google) along the way.  I hope these help out aspiring or new developers.</p>
<p><span id="more-448"></span></p>
<p>Here&#8217;s a scenario:  you find yourself doing X all over the place, (where X is nearly anything) and you&#8217;re just plain tired of writing the code to do it.  You first reluctantly copy and paste it into new places, and twiddle what you need to twiddle to get it to work.  You soon realize this is a pain because it&#8217;s error prone &#8211; you can mess things up using copy and paste.  You fancy yourself the pragmatic type and decide to write a IDE template that will fill in the code for you instead of having to write it out every time. </p>
<p>(Aside: This is but one of many kinds of code generation).  </p>
<blockquote><p>If you are using code generation, you stopped asking &#8220;why&#8221; too soon. -<a href="http://bit.ly/cfdg0P">mahvne</a></p></blockquote>
<p>This helps with the problem of introducing errors, but you soon you realize this code is everywhere, cluttering up other code.  Not only that, when the structure of this code changes a little bit, you need to go and change it everywhere it was copied and pasted, or generated using your template.</p>
<p>(Aside: It&#8217;s a violation of the <a href="http://www.google.com/search?q=dry+principle">DRY principle</a>.)  </p>
<p>Now you decide the best course of action is to try get this code to a common place that&#8217;s visible across every part of your project.  You also have to go find every place you copied and pasted or used your template and replace them with calls to your method that use generic parameters.  </p>
<p>(Aside: You&#8217;ve just created a <a href="http://www.google.com/search?q=three+strike+refactoring">static utility method</a>.)  </p>
<p>You make up your mind that in the future, it will be much easier to do this before the code gets copied and pasted that many times, and vow to follow the <a href="http://www.google.com/search?q=three+strike+refactoring">three-strike rule of refactoring</a>.  </p>
<p>(Aside: And use automated <a href="http://www.google.com/search?q=extract+method+refactoring">extract method refactoring</a> and <a href="http://www.google.com/search?q=move+method+refactoring">move method refactoring</a> to do this).</p>
<p>The lesson to take away is this: any line of code you introduce creates change points and increases complexity.  We need to make sure the lines of code allow into our code base are well-factored/designed/tested and worthy of our ongoing maintenance efforts.  Really &#8211; try to break your code before it leaves your hands.  Fix it, or get rid of it.  While this might seem cynical at first, you&#8217;ll understand it&#8217;s just preventative maintenance, or programming deliberately (not <a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/coincidence">programming by coincidence</a>).</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=2&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=3&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=24&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-dzone">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=102&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to DZone">Add this to DZone</a>
		</li>
		<li class="shr-gmail">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=52&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Email this via Gmail">Email this via Gmail</a>
		</li>
		<li class="shr-googlebookmarks">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=74&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=257&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=207&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=88&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=6&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=4&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=40&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=38&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=10&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://www.shareaholic.com/api/share/?title=Pairing+Lessons+%231%3A+Be+cynical+with+code+&amp;link=http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/&amp;notes=The%20following%20scenario%20plays%20out%20a%20lot%20when%20I%20pair%20up%20with%20people%2C%20so%20I%20thought%20I%27d%20distill%20it%20down%20and%20write%20it%20up%20for%20future%20reference.%20%20I%20think%20teaching%20lessons%20through%20scenarios%20could%20make%20for%20an%20interesting%20series%20of%20articles%2C%20and%20I%27m%20sure%20others%20have%20equally%20interesting%20experiences%20to%20share.%0D%0A&amp;short_link=http://bit.ly/bpn1ZV&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=%24%7Btitle%7D+-+%24%7Bshort_link%7D&amp;service=7&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul><div style="clear: both;"></div></div>

<h3  class="related_post_title">More Related Content</h3><ul class="related_post"><li>No Related Post</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cwash.org/2010/02/10/pairing-lessons-1-be-cynical-with-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A response to &#8220;Can Java Be Saved?&#8221;</title>
		<link>http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=a-response-to-can-java-be-saved</link>
		<comments>http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 06:51:25 +0000</pubDate>
		<dc:creator>Chris Wash</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[response]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Weld]]></category>

		<guid isPermaLink="false">http://cwash.org/?p=414</guid>
		<description><![CDATA[I recently read Scott Leberknight's "Can Java Be Saved?" with interest and started typing up a response.  As Scott's article was a bit lengthy, so became the comments I had in response.  In excess of 1000 characters, which JRoller told me was spam when I finally tried to post it.  I'm still never surprised to see that happen to my writing.  Anyway, I'm probably just an oaf, but I didn't see Scott's e-mail listed anywhere on his site (probably another spam-deterrent choice) so I thought since I spent more than a few minutes on it, it'd be appropriate enough to post here and link it.  Sorry but I don't have the energy to evolve this into a more formal post, perhaps I will at a later date.]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><p>I recently read <a href="http://www.sleberknight.com/blog" target="_blank">Scott Leberknight</a>&#8216;s &#8220;<a href="http://www.sleberknight.com/blog/sleberkn/entry/can_java_be_saved" target="_blank">Can Java Be Saved?</a>&#8221; with interest and started typing up a response.  As Scott&#8217;s article was a bit lengthy, so became the comments I had in response.  In excess of 1000 characters, which JRoller told me was spam when I finally tried to post it.  I&#8217;m still never surprised to see that happen to my writing.  Anyway, I&#8217;m probably just an oaf, but I didn&#8217;t see Scott&#8217;s e-mail listed anywhere on his site (probably another spam-deterrent choice) so I thought since I spent more than a few minutes on it, it&#8217;d be appropriate enough to post here and link it.  Sorry but I don&#8217;t have the energy to evolve this into a more formal post, perhaps I will at a later date.</p>
<p><span id="more-414"></span></p>
<blockquote><p><!-- 		@page { size: 8.5in 11in; margin: 0.79in } 		P { margin-bottom: 0.08in } --></p>
<p style="margin-bottom: 0in;">A Newardian post deserves a Newardian reply!   I really do like your suggestions for language additions.  But those kind of additions are going to be happening in the context of the JCP, and that&#8217;s its own can of worms. I think you can directly attribute people&#8217;s despise for Java, or maybe more aptly, their enthusiasm for new languages, to the difficulty involved in making language changes to Java.  Regardless, there is still freshness to the innovation in the Java world.  People are just looking for it in the wrong place.  Certainly, the virtual machine ecosystem is alive and well, as you point out.  But in terms of innovation within Java, it&#8217;s happening in the programming model, not the language.  Some of Spring, Guice, and CDI&#8217;s enhancements to the programming model are novel ways of evolving Java given the restrictive &#8220;all things to everyone&#8221;, bureaucratic nature of language changes at this stage of the game.</p>
<p style="margin-bottom: 0in;">Here are a few examples of programming model innovation.  The native property syntax reminds me of another recent <a href="http://in.relation.to/Bloggers/WritingAPropertiesFileInJava" target="_blank">blog entry</a> by Gavin King.   Sure, it&#8217;s a bit more verbose, and lacks the punch of a native language feature.  But is it that much different?  Also, do I really need type inference?  I see it as easier to read and more powerful to leave the variable declaration and remove the duplication by nixing the call to the constructor, and annotating a producer method.  It also gets rid of the new keyword, which was your next item on the list.  Again, this is a programming model enhancement that&#8217;s independently evolved and proven itself.</p>
<p style="margin-bottom: 0in;">I think there is still a lot of room for evolution, and a lot of work being done.  As you point out, the 800 lb gorilla seems to be continued by-in and enthusiasm from vendors &#8211; but most if not all of the real innovation that is occurring in the community is through open source software.  It&#8217;s interesting how you have a rift in the open source space, in how, e.g. the Spring and the Seam teams have approached developing open source, and the willingness to reintroduce innovations to the JCP.  Is the JCP to be used as a springboard for adoption, or a roundtable to resolve pain points everyone is feeling?  Its days as a think-tank for ivory tower specs are gone.  The fate of Java is not yet sealed, but I think in terms of the language, we&#8217;re only really going to see problems that everyone feels are painful get pushed through diplomatically.  But that&#8217;s not to say that there are programming model enhancements that can be pushed for adoption.  Vendors seem to be more open to evolving the programming model than the language at this point, if someone is willing to baby a spec through the process.</p>
<p style="margin-bottom: 0in;">I certainly welcome any of your thoughts on this.  Thanks for the interesting article.</p>
</blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=2&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=3&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=24&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-dzone">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=102&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to DZone">Add this to DZone</a>
		</li>
		<li class="shr-gmail">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=52&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Email this via Gmail">Email this via Gmail</a>
		</li>
		<li class="shr-googlebookmarks">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=74&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=257&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=207&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=88&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=6&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=4&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=40&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=38&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=10&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://www.shareaholic.com/api/share/?title=A+response+to+%22Can+Java+Be+Saved%3F%22&amp;link=http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/&amp;notes=I%20recently%20read%20Scott%20Leberknight%27s%20%22Can%20Java%20Be%20Saved%3F%22%20with%20interest%20and%20started%20typing%20up%20a%20response.%20%20As%20Scott%27s%20article%20was%20a%20bit%20lengthy%2C%20so%20became%20the%20comments%20I%20had%20in%20response.%20%20In%20excess%20of%201000%20characters%2C%20which%20JRoller%20told%20me%20was%20spam%20when%20I%20finally%20tried%20to%20post%20it.%20%20I%27m%20still%20never%20surprised%20to%20see%20that%20happen%20to%20my%20writing.%20%20Anyway%2C%20I%27m%20probably%20just%20an%20oaf%2C%20but%20I%20didn%27t%20see%20Scott%27s%20e-mail%20listed%20anywhere%20on%20his%20site%20%28probably%20another%20spam-deterrent%20choice%29%20so%20I%20thought%20since%20I%20spent%20more%20than%20a%20few%20minutes%20on%20it%2C%20it%27d%20be%20appropriate%20enough%20to%20post%20here%20and%20link%20it.%20%20Sorry%20but%20I%20don%27t%20have%20the%20energy%20to%20evolve%20this%20into%20a%20more%20formal%20post%2C%20perhaps%20I%20will%20at%20a%20later%20date.&amp;short_link=http://bit.ly/brIbBX&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=%24%7Btitle%7D+-+%24%7Bshort_link%7D&amp;service=7&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul><div style="clear: both;"></div></div>

<h3  class="related_post_title">More Related Content</h3><ul class="related_post"><li>November 28, 2008 -- <a href="http://cwash.org/2008/11/28/must-havesreferences-for-modern-java-ee-developers/" title="Must Haves/References For Modern Java EE Developers">Must Haves/References For Modern Java EE Developers</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cwash.org/2009/11/14/a-response-to-can-java-be-saved/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In response to Stackoverflow #38/&#8221;Quality Doesn&#8217;t Matter That Much&#8221; &#8212; Jeff and Joel</title>
		<link>http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel</link>
		<comments>http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 01:16:05 +0000</pubDate>
		<dc:creator>Chris Wash</dc:creator>
				<category><![CDATA[Meta/Blog]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blog fight]]></category>
		<category><![CDATA[Bob Martin]]></category>
		<category><![CDATA[Cal Henderson]]></category>
		<category><![CDATA[Cedric Beust]]></category>
		<category><![CDATA[Clean Code]]></category>
		<category><![CDATA[creativity]]></category>
		<category><![CDATA[development practices]]></category>
		<category><![CDATA[Gavin King]]></category>
		<category><![CDATA[Hanselminutes]]></category>
		<category><![CDATA[Jared Richardson]]></category>
		<category><![CDATA[Jeff Atwood]]></category>
		<category><![CDATA[Jim Coplien]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[pragmatic]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[stackoverflow]]></category>
		<category><![CDATA[technical debt]]></category>
		<category><![CDATA[testng]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://cwash.org/?p=107</guid>
		<description><![CDATA[Weighing in on the recent ideological classes between Stackoverflow's recent podcast with Jeff Atwood and Joel Spolsky in which they call out Robert "UncleBob" Martin on his views of Unit Testing and his SOLID principles.]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div class="content">
<p><strong>Update:</strong> Robert Martin is scheduled to appear on the Feb 10 episode of the SO Podcast.  Should be interesting to see where things go.  Also, Jay Fields has <a href="http://blog.jayfields.com/2009/02/thoughts-on-developer-testing.html">weighed in on the topic</a>.</p>
<p><strong>Update #2:</strong> Listened to the new SO podcast and am working on a short followup post.  I just met another local boy and kindred spirit in <a href="http://www.codethinked.com/">Justin Etheredge who has also had a few things to say</a> about this whole debacle.</p>
<p>I wanted to add my two cents to this philosophical, in my view very important, but not very pragmatic debate. For the uninitiated, the argument begins with the <a href="http://blog.stackoverflow.com/2009/01/podcast-38/">Stackoverflow Podcast Episode #38</a> which is a discussion between Joel Spolsky and Jeff Atwood.  They discussed, among many other topics, some of &#8220;UncleBob&#8221; Martin&#8217;s recent material found in his book <em><a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a></em>, (actually, Spolsky cited Martin&#8217;s appearance on <a href="http://www.hanselminutes.com/default.aspx?showID=163">Hanselminutes</a> as the spark to his comments), which Martin responded to with a number of tweets and a <a href="http://blog.objectmentor.com/articles/2009/01/31/quality-doesnt-matter-that-much-jeff-and-joel">blog post</a>.<span id="more-107"></span></p>
<p><a href="http://agileartisans.com/main">Jared Richardson</a> introduced me to the idea of <strong>technical debt</strong>, (term was coined, like so many other terms, by Ward Cunningham) which I think is a pragmatic way to cut through the philosophical differences in this argument.  But in the interest of carrying on the debate, and because it&#8217;s the weekend, I&#8217;ve decided to (perhaps) add some fuel to the fire.  Please don&#8217;t read this at work.</p>
<p>The gist of the argument is about how much emphasis you should focus on robustness/code hygiene/maintainability in your code, even if it is unclear there is much business value in doing so.  Essentially, if we consider impacts to budgets, deadlines, etc., and even in terms of its impact to your code (see Antipattern: &#8220;Yet Another Useless Layer&#8221;) &#8212; is it worth it?  It&#8217;s very much a discussion of what software quality is and why is it important, which raises questions like:</p>
<ul>
<li>Are robustness and business value mutually exclusive?</li>
<li>Does quality require rigor and conceptual cleanliness?</li>
<li>Is code hygiene a purely academic pursuit, or is there intrinsic value in it?</li>
</ul>
<p>These are interesting questions.  Atwood and Spolsky take what they feel is a more pragmatic position; Atwood explaining quality in terms of a Frank Zappa quote [paraphrasing] &#8220;Nobody gives a crap if we&#8217;re great musicians,&#8221; meaning that what matters is ultimately what is delivered to the customer. He explains further that &#8220;Quality is just another axis&#8221; &#8212; another set of competing concerns for your development time and interest.  Spolsky&#8217;s comments constitute a self-professed rant that there is a thread of zealotry in the OO community around TDD.  It reminded me a lot of what <a href="http://beust.com/weblog/archives/000477.html">Cedric Beust has argued</a> in reference to what <a href="http://www.infoq.com/interviews/coplien-martin-tdd">Jim Coplien has debated with Martin himself</a>.  While Spolksy could be playing devil&#8217;s advocate, or could have been looking to start a &#8220;blog fight&#8221; (already popping up in comment threads) I think he could have gone about it in a more pragmatic way.  While Beust does paint Martin as a zealot as well, at least his main point didn&#8217;t portray unit testing as just short of completely useless; rather, he is one of the creators of the popular <a href="http://testng.org/doc/">TestNG </a>framework:</p>
<blockquote><p>&#8220;Tests first&#8221; or &#8220;tests last&#8221; is unimportant as long as there are tests.</p></blockquote>
<p>I might be wrong, but I even remember reading a section of <em>Clean Code</em> in Borders last week and essentially reading Beust&#8217;s point in Martin&#8217;s book.  It stuck out in my mind after watching his debate with Coplian.  But I digress.</p>
<p>Before going further, I wanted to point out how much this debate reminds me of <a href="http://www.plasticbag.org/archives/2004/03/from_pirate_dwarves_to_ninja_elves/">From pirate dwarves to ninja elves&#8230;</a>, which I believe is a great way to classify personality types &#8212; especially those of people writing code.  We know for sure that UncleBob falls into the Ninja-Elf quadrant.  He thinks practicing TDD is a professional responsibilty and lays out his own definition for TDD in <em>Clean Code</em>.  I think this is the very definition of a Ninja-Elf.  My personal leanings are toward that quadrant as well. When you are innundated with Dijsktra, the ulitmate Ninja-Elf, in school, the following quote really sticks with you:</p>
<blockquote><p>I mean, if 10 years from now, when you are doing something quick and dirty, you suddenly visualize that I am looking over your shoulders and say to yourself &#8220;Dijkstra would not have liked this&#8221;, well, that would be enough immortality for me.</p></blockquote>
<p>But there are people whose opinions I respect with Dwarf-Pirate leanings, too.  Obviously Atwood and Spolsky lean in this direction (though they may not fall directly into that quadrant).  I’ve heard some others that I respect espouse the same opinion as Spolsky; Gavin King, for example, I’ve heard him say, “The types of bugs that I introduce usually aren’t caught by a <strong>unit</strong> test.”  He wasn’t as over the top in his argument, he simply explained that he prefers integration tests.  And I don&#8217;t think you&#8217;d hear any of the people mentioned in this post say that they never write any tests.  For a great argument from the ultimate Pirate-Dwarf see Cal Henderson&#8217;s <a href="http://www.ludicorp.com/flickr/flickr_php_final.zip">normalized data is for sissies</a> (slide #27); it is pretty entertaining and compelling when scalability is of utmost concern.</p>
<p>I think Atwood’s argument ultimately came down to championing the idea of <a href="http://www.infoq.com/news/2008/02/continuous-production">continuous production</a>; that being able to respond to change or bugs found and having a quick no-brainer deployment process is the Zen-like state you&#8217;d like to get to.  But the idea of getting there is that it comes out of some notion of continuous integration, which is predicated on the idea of testing.  Henderson himself makes this very argument (I believe in this <a href="http://cdn4.libsyn.com/carsonsystems/Cal_Henderson.mp3?nvb=20090201003132&amp;nva=20090202004132&amp;t=0cab6219613db05c73c82">talk</a>, but perhaps in another). You need to trust your team enough to get changes and fixes out to address problems quickly, and be smart about what you spend time on. Testing is great and if you can find people that can test their code well and be productive, that’s awesome. But Henderson’s point is those people are extremely hard to find and retain.</p>
<p>All this goes back to the old question, is producing code an artistic or engineering practice?  (Interesting that Atwood supported his comment with a Frank Zappa quote about art.)  Obviously you need a talented and cohesive team to be able to make it work either way. I think the answer is it <strong>has to be</strong> a little bit of both.  You&#8217;ll need some measure of creativity, some degree of engineering aptitude, also strong analytical skills, and to succeed in a business environment, some acumen in decision making and managing (at the very least your own time).</p>
<p>The fact is, though, that we’ve come leaps and bounds in terms of being able to efficiently produce these tests, and balance their production and maintenance out with constraints, business expectations, budgets and deadlines.  And <a href="http://rubyconf.org/talks/24">it can fuel your creative side</a>, too.</p>
<p>As for professional responsibilities, I definitely wouldn’t recommend trying to write code without at least <em>some</em> tests if you expect anyone else to have to maintain your code. If you&#8217;ve got a close knit team and an overwhelmingly urgent need to deliver untested code (and are of the Pirate-Dwarf persuasion) then go for it.  But that being said, I’d say I agree with Martin and Jared Richardson that argue it’s a professional responsibility to <strong>not take on the technical debt of untested code</strong>. Of course, if tests mean you can get maintainability (and other -ilities) along the way then I think that you&#8217;re well on your way to a quality product.</p>
<p>One final way to look at this: would you say it&#8217;s better for your team to take the view that code is innocent until proven guilty, or guilty until proven innocent?  In the interest of skepticism, considering the teams that most developers &#8220;in the trenches&#8221; have to work on, and how far we&#8217;ve come in making testing easier and more efficient, I&#8217;d need a very strong team to make the assumption that all they code they write is innocent.  We all make mistakes.  I believe this is also brought up in <em>Clean Code</em>.</p>
<p>Ultimately the message Atwood and Spolsky send in their Stackoverflow podcast is that unit testing and efforts to support it are not a silver bullet.  Personal slights aside (&#8220;I don&#8217;t think these people write very much code.&#8221;) they have a point &#8212; and Martin agrees in his blog post.  But I think it took them a long time to make that point which is certainly no great revelation.  In the end, I did not feel they explained a whole lot about what the <em>right approach to quality</em> is, but communicated their distaste for an attempt (especially if accepted dogmatically) that aims to do so.  I can relate to this, and agree you must treat what you read, hear and are taught with a healthy dose of skepticism.  Martin&#8217;s ideas may seem dogmatic on the surface but I don&#8217;t think it&#8217;s fair to paint him in that light.  If you really read what he writes, I think he realizes that he is a voice many people are listening to, and works hard to say what he thinks is the right.  Martin defends a style of development that favors more rigor and discipline than many others feel is necessary, but in an industry that can be categorized by its lack of discipline, I can&#8217;t do much but respect him for that.</div>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=2&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=3&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=24&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-dzone">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=102&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to DZone">Add this to DZone</a>
		</li>
		<li class="shr-gmail">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=52&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Email this via Gmail">Email this via Gmail</a>
		</li>
		<li class="shr-googlebookmarks">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=74&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Bookmarks">Add this to Google Bookmarks</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=257&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=207&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Google Reader">Add this to Google Reader</a>
		</li>
		<li class="shr-linkedin">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=88&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on LinkedIn">Share this on LinkedIn</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=6&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=4&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=40&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=38&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=&amp;service=10&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://www.shareaholic.com/api/share/?title=In+response+to+Stackoverflow+%2338%2F%22Quality+Doesn%27t+Matter+That+Much%22+--+Jeff+and+Joel+&amp;link=http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/&amp;notes=Weighing%20in%20on%20the%20recent%20ideological%20classes%20between%20Stackoverflow%27s%20recent%20podcast%20with%20Jeff%20Atwood%20and%20Joel%20Spolsky%20in%20which%20they%20call%20out%20Robert%20%22UncleBob%22%20Martin%20on%20his%20views%20of%20Unit%20Testing%20and%20his%20SOLID%20principles.&amp;short_link=http://bit.ly/a3OkUe&amp;v=1&amp;apitype=1&amp;apikey=&amp;source=Shareaholic&amp;template=%24%7Btitle%7D+-+%24%7Bshort_link%7D&amp;service=7&amp;tags=&amp;ctype=" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul><div style="clear: both;"></div></div>

<h3  class="related_post_title">More Related Content</h3><ul class="related_post"><li>November 28, 2008 -- <a href="http://cwash.org/2008/11/28/must-havesreferences-for-modern-java-ee-developers/" title="Must Haves/References For Modern Java EE Developers">Must Haves/References For Modern Java EE Developers</a> (1)</li><li>February 17, 2009 -- <a href="http://cwash.org/2009/02/17/dont-unit-test-anymore-no-really/" title="Don&#8217;t Unit Test Anymore&#8230; No, Really!">Don&#8217;t Unit Test Anymore&#8230; No, Really!</a> (6)</li><li>January 13, 2009 -- <a href="http://cwash.org/2009/01/13/on-software-quality/" title="On Software Quality">On Software Quality</a> (8)</li><li>March 13, 2008 -- <a href="http://cwash.org/2008/03/13/continuous-integration-dissected/" title="Continuous Integration Dissected">Continuous Integration Dissected</a> (0)</li><li>March 11, 2008 -- <a href="http://cwash.org/2008/03/11/bugs-detectives-and-test-automation/" title="Bugs, Detectives, and Test Automation">Bugs, Detectives, and Test Automation</a> (2)</li><li>June 9, 2009 -- <a href="http://cwash.org/2009/06/09/mocking-with-jmockit/" title="Mocking with JMockit">Mocking with JMockit</a> (5)</li><li>August 2, 2008 -- <a href="http://cwash.org/2008/08/02/how-i-escape-the-reuse-trap/" title="How I Escape the &#8220;Reuse Trap&#8221;">How I Escape the &#8220;Reuse Trap&#8221;</a> (0)</li><li>July 8, 2010 -- <a href="http://cwash.org/2010/07/08/transactions-part-1/" title="Transactions, Part 1">Transactions, Part 1</a> (0)</li><li>January 7, 2010 -- <a href="http://cwash.org/2010/01/07/eliminate-branching-if-statements-to-produce-better-code/" title="Eliminate Branching (IF Statements) to Produce Better Code">Eliminate Branching (IF Statements) to Produce Better Code</a> (0)</li><li>July 24, 2009 -- <a href="http://cwash.org/2009/07/24/the-elements-of-reusable-code/" title="The Elements of Reusable Code">The Elements of Reusable Code</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://cwash.org/2009/01/31/in-response-to-stackoverflow-38quality-doesnt-matter-that-much-jeff-and-joel/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://cdn4.libsyn.com/carsonsystems/Cal_Henderson.mp3?nvb=20090201003132&amp;amp" length="46243558" type="audio/mpeg" />
		</item>
	</channel>
</rss>

