<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Radyology</title>
    
    <link rel="hub" href="http://hubbub.api.typepad.com/" />
    <link rel="alternate" type="text/html" href="http://www.benrady.com/" />
    <id>tag:typepad.com,2003:weblog-1517578</id>
    <updated>2009-11-13T22:48:31-06:00</updated>
    
    <generator uri="http://www.typepad.com/">TypePad</generator>
    <link rel="self" href="http://feeds.feedburner.com/Radyology" type="application/atom+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
        <title>Kata:Ruby:Prime Factors</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/11/katarubyprime-factors.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/11/katarubyprime-factors.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340128759f141d970c</id>
        <published>2009-11-13T22:48:31-06:00</published>
        <updated>2009-11-13T22:48:31-06:00</updated>
        <summary>It took me a fair bit of refactoring after I got the last test passing (generate 10 ) to get it this tight, but I like it. def generate(n) return [] if n == 1 factor = (2..n).find {|x| n...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p>It took me a fair bit of refactoring after I got the last test passing (generate 10 ) to get it this tight, but I like it.</p>

<pre><code>
def generate(n)
  return [] if n == 1
  factor = (2..n).find {|x| n % x == 0} 
  [factor] + generate(n / factor) 
end
</code></pre></div>
</content>


    </entry>
    <entry>
        <title>svn replacement for git stash</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/09/svn-replacement-for-git-stash.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/09/svn-replacement-for-git-stash.html" thr:count="1" thr:updated="2009-10-01T11:05:26-05:00" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340120a5af77f4970b</id>
        <published>2009-09-30T20:51:40-05:00</published>
        <updated>2009-09-30T20:51:40-05:00</updated>
        <summary>I had no idea how dependent I'd become on git's stash function until I needed it while working on a project that uses subversion. I needed to make a quick change to a class to support a change to a...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p>I had no idea how dependent I'd become on git's stash function until I
needed it while working on a project that uses subversion. I needed to
make a quick change to a class to support a change to a schema change
to a live server (don't ask), but I was already in the middle of
working on another task. </p><p>Thankfully, you can approximate git stash by creating a patch file:</p><p><span style="font-family: Courier;">% svn diff &gt; WorkInProgress.txt</span><br /><span style="font-family: Courier;">% svn revert -R .</span><br /><span style="font-family: Courier;">&lt;make changes&gt;</span><br /><span style="font-family: Courier;">% svn commit -m "Patched to support server schema change"</span><br /><span style="font-family: Courier;">
% patch -p0 -i WorkInProgress.txt</span><br /><span style="font-family: Courier;">% rm WorkInProgress.txt</span></p></div>
</content>


    </entry>
    <entry>
        <title>New post on Continuous Flow</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/08/new-post-on-continuous-flow.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/08/new-post-on-continuous-flow.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340120a508ea55970b</id>
        <published>2009-08-20T12:09:48-05:00</published>
        <updated>2009-08-20T12:09:48-05:00</updated>
        <summary>You're Already Doing Continuous Flow (poorly) This was a fun one to write. One of those blogs that just flows out of you in one pass.</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.dzone.com/links/youre_already_using_continuous_flow_poorly.html">You're Already Doing Continuous Flow (poorly)</a> </p><p>This was a fun one to write. One of those blogs that just flows out of you in one pass. </p></div>
</content>


    </entry>
    <entry>
        <title>Survey results posted on feedbackjunkies.com</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/08/survey-results-posted-on-feedbackjunkiescom.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/08/survey-results-posted-on-feedbackjunkiescom.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340120a5574be2970c</id>
        <published>2009-08-18T00:07:55-05:00</published>
        <updated>2009-08-18T08:33:34-05:00</updated>
        <summary>I've started a new blog called Feedback Junkies as a home for all my rants on software development. I'm looking forward to talking a lot about Improving Works and the good stuff we're doing with it. As an inaugural post,...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="html" xml:lang="en-US" xml:base="http://www.benrady.com/">
&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;I&amp;#39;ve started a new blog called &lt;a href="http://benrady.typepad.com/feedback_junkies/"&gt;Feedback
Junkies&lt;/a&gt; as a home for all
my rants on software development. I&amp;#39;m looking forward to
talking a lot about Improving Works and the good stuff we&amp;#39;re doing with it.

&lt;/p&gt;&lt;http: benrady.typepad.com="" feedback_junkies=""&gt;&lt;p&gt;As an inaugural post, I&amp;#39;ve published the results from last week&amp;#39;s survey on
TDD and automated
testing. They were quite surprising, and I hope to do it again soon.&lt;/p&gt;&lt;http: 08="" 2009="" benrady.typepad.com="" feedback_junkies="" tdd-survey-results.html=""&gt;&lt;/http:&gt;&lt;/http:&gt;&lt;/div&gt;
</content>


    </entry>
    <entry>
        <title>Agile 2009 Sessions</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/08/agile-2009-sessions.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/08/agile-2009-sessions.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340120a4e24c3f970b</id>
        <published>2009-08-11T09:06:00-05:00</published>
        <updated>2009-08-11T09:06:00-05:00</updated>
        <summary>If you're headed to Agile 2009 this year, and you're at all interested in TDD, be sure to swing by my two talks: Test Driven Development in Java: Live and Uncensored and Continuous Testing Evolved. The TDD session will be...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p>If you're headed to Agile 2009 this year, and you're at all interested in TDD, be sure to swing by my two talks: <a href="http://agile2009.agilealliance.org/node/713">Test Driven Development in Java: Live and Uncensored</a> and <a href="http://agile2009.agilealliance.org/node/712">Continuous Testing Evolved</a>.</p><p>The
TDD session will be a lot of fun. I've found that solving real-world problems in front of an audience can lead to some unexpected outcomes which are usually entertaining and informative for everyone. Plus, it keeps me on my toes!</p><p>I'm hoping the Continuous Testing session will
spark some discussion about the future of TDD, Continuous Integration
and automated testing in general. I really think CT is the future of automated testing, and <a href="http://blog.rodcoffin.com/">Rod</a> and I are going to be bringing some great new research and insight to the conference for this session. </p></div>
</content>


    </entry>
    <entry>
        <title>Survey on automated testing and TDD</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/08/survey-on-automated-testing-and-tdd.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/08/survey-on-automated-testing-and-tdd.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da88340120a4cba676970b</id>
        <published>2009-08-05T21:43:23-05:00</published>
        <updated>2009-08-05T21:55:53-05:00</updated>
        <summary>Take the survey! I'll be posting the results on this survey next week. Thanks in advance for participating!</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://bit.ly/GCW7M">Take the survey!</a></p><p>I'll be posting the results on this survey next week. Thanks in advance for participating!</p></div>
</content>


    </entry>
    <entry>
        <title>Dual Licensing for Infinitest</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/07/dual-licensing-for-infinitest.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/07/dual-licensing-for-infinitest.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-6a00e54fb013da883401157243b923970b</id>
        <published>2009-07-29T00:00:00-05:00</published>
        <updated>2009-07-28T22:17:56-05:00</updated>
        <summary>In the latest release of Infinitest, we've moved to a dual license model. While the terms of the commercial license are nothing special, the terms of the free license are rather innovative: It's free for individuals. Companies that want their...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p>In the latest release of <a href="http://infinitest.org">Infinitest</a>, we've moved to a dual license model. While the terms of the commercial license are nothing special, the terms of the free license are rather innovative: It's free for individuals. Companies that want their employees to use the tool can buy a commercial license from our newly formed company, <a href="http://improvingworks.com">Improving Works</a>. While I think this license is actually quite straightforward, its novelty demands an explanation. What does "free for individuals" mean anyway? (Hint: it's not the same as "personal use")</p><p>First, let's talk about why we moved to a dual license in the first place. </p><p>I think some companies believe that by "open sourcing" their products, they can enlist an army of unpaid developers to help them meet their business goals. I'm sorry, but it doesn't work that way. On every open source project that I've ever contributed to, the core committers wound up doing 95% of the work, Infinitest included. Patches from the user community, while helpful and appreciated, tended to focus on bugs and compatibility issues, and were never significant enough to actually move the project forward. What Infinitest needs right now, more than anything, is to move forward. I think Continuous Testing is going to become an essential practice in the next few years, similar to what Continuous Integration or automated developer testing are today. In order to get there, however, the practice needs a mature Java tool. </p><p>We believe, like many other companies that use a dual license model, the most direct path to that maturity is via commercialization. While we gladly contribute our free time to Infinitest, most of the Infinitest committers are professional consultants. That means we have the flexibility to turn every dollar of revenue that we earn into development time for the product. It also means Infinitest need not be a full time gig for us. If it can pay for 500 additional hours of development a year, that's great. 5000 hours? Even better. With this approach, there's no magic number we need to reach to be sustainable, because we're sustainable from day one. And with the depth of <a href="http://improvingenterprises.com">Improving Enterprises</a>' bench at our disposal, we can offer high quality support to our customers without worrying about where it's going to come from.</p><p>The conundrum, however, is that Infinitest also needs to be a freely available tool. If developers are not free to use the tool on their own projects, without restriction, it's unlikely that they'll be able to learn the practice of continuous testing well enough to apply it when working for a client or employer. The reality of the software industry is that very few companies will pay you to learn things that aren't (in their view) directly related to your day-to-day work. If you want to learn a new tool or technique, you often have to do it on your own time. We don't think you should have to pay to improve yourself. </p><p>So why not use the GPL, as is typical with dual licensed products? We considered a more traditional dual licensing model using the GPL, and if Infinitest were a library, that would be the clear choice. The problem is, you don't need to create a derivative work from Infinitest in order to use it. So the GPL doesn't create the kind of incentives necessary to make a dual license model feasible for a tool like Infinitest. The usage requirement we need in order to create those incentives also means that any open source license we adapted to our needs would <a href="http://www.opensource.org/docs/definition.php">surely not be accepted</a> by the <a href="http://opensource.org/">OSI</a>, the <a href="http://www.fsf.org/">FSF</a> or any other group. Plus, open source license proliferation is generally <a href="http://www.opensource.org/node/365">not a good thing</a>, so why make it worse?</p><p>After much research and debate, we wound up in the middle ground. The <a href="http://improvingworks.com/license">licenses we created</a> balance all these concerns with a single restriction: You must be working for yourself. That is, free licenses are granted only to individuals, not corporations or other entities. Those individuals cannot use Infinitest to do work on behalf of another party (what's known in copyright law as a work made for hire). However, if you want to license, sell, or even assign the copyright of your work after creating it with Infinitest, that's fine. We want to encourage individual entrepreneurs and innovators to use Infinitest in any way that benefits them, because they contribute the most back to the user community. I think that's simple, fair, and offers a good balance between all the competing interests. </p><p>And if that's all too much to absorb, the layman's version goes like this: <em>If you want to use Infinitest at your day job, your employer has to pay for it. Otherwise, it's free for you to use however you like. <br /><br /></em>For more information about Infinitest, please visit <a href="http://infinitest.org">Infinitest.org</a> or <a href="http://improvingworks.com/products">ImprovingWorks.com</a>.</p></div>
</content>


    </entry>
    <entry>
        <title>Working Effectively with Transitional Code (Part 1)</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/05/working-effectively-with-transitional-code-part-1.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/05/working-effectively-with-transitional-code-part-1.html" thr:count="1" thr:updated="2009-05-14T19:49:51-05:00" />
        <id>tag:typepad.com,2003:post-66751155</id>
        <published>2009-05-13T22:44:37-05:00</published>
        <updated>2009-05-13T23:03:53-05:00</updated>
        <summary>Thanks to M. Feathers for the title inspiration. Many companies today are struggling. As the economy contracts, they have started to look for new ways to become more efficient. Some have recognized the benefits of Agile methodologies, and have started...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><div><span style="font-style: italic;">Thanks to </span><a href="https://www.amazon.com/dp/0131177052?tag=wwwbenradycom-20&amp;camp=0&amp;creative=0&amp;linkCode=as4&amp;creativeASIN=0131177052&amp;adid=1JD4NVYA0PVPKPCAD5NG&amp;"><span style="font-style: italic;">M. Feathers</span></a><span style="font-style: italic;"> for the title inspiration.</span></div><br /><div><span style="border-collapse: collapse; font-family: arial; line-height: normal; "><div>Many companies today are struggling. As the economy contracts, they have started to look for new ways to become more efficient. Some have recognized the benefits of Agile methodologies, and have started to make the transition. These transitions can be lengthy, and if done improperly, painful and costly. A problem that I've started to see more and more among companies adopting an agile mindset is the <span style="font-style: italic;">stalled transition.</span></div><div><span style="font-style: italic;"><br /></span></div><div>A stalled transition occurs when an organization:</div><div><ul>
<li>Partially adopts agile practices and/or principles. Some teams and individuals fail to make the transition and revert to old habits.</li>
<li>Adopts practices that have been modified for expediency by mandate, rather than for effectiveness through team retrospectives.</li>
<li>Fails to adopt sets of practices that are interdependent (Continuous integration without automated testing, for example).</li>
<li>Mandates agile practices blindly, without understanding their benefits and effects.</li>
</ul>
</div><div>For example, an organization may adopt some of the project management practices of various agile methods (Stand up meetings, planning poker, user stories) without adopting the technical practices that make those management practices effective (Test Driven Development, Continuous Integration, Refactoring). </div><br /><div>The result is, quite often, a mess. Projects managed in this fashion typically exhibit a number of common characteristics. Test coverage is spotty. Many tests make trivial assertions like checking for nullity of a returned object. Some tests make no assertions at all, which makes any code coverage metrics highly suspect. Builds often take 30 minutes or longer to complete, not due to any inherent complexity, but simply due to poorly written tests that run slowly. Refactoring is not done mercilessly, if at all, and so the the level of code quality is low and dropping. Quality standards are only intermittently applied. Pairing is rare or non-existent, and implicit code ownership silos start to appear "Give that task to Larry, he knows the UI better than anyone". </div><br /><div>As a result, the team may find it impossible to make frequent deliveries of working code. Customer demos are full of hand-waving and special cases, and the product is most certainly not ready to ship. When it does ship, defect counts and high, and stakeholders are often disappointed with the result.</div><br /><div>I call this mess <span style="font-style: italic;">transitional code</span>, and it is a serious and increasingly common problem. Adopting iterative and incremental project management practices without rigorously applying iterative and incremental technical practices is recipe for disaster. <br /></div><br /><div>This is the first in what I hope will be a series of posts on this issue. I believe its resolution is critically important to the Agile movement.</div></span></div></div>
</content>


    </entry>
    <entry>
        <title>Comparing Infinitest and JUnitMax</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/04/comparing-infinitest-and-junitmax.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/04/comparing-infinitest-and-junitmax.html" thr:count="3" thr:updated="2009-09-17T16:36:57-05:00" />
        <id>tag:typepad.com,2003:post-65955093</id>
        <published>2009-04-23T23:24:04-05:00</published>
        <updated>2009-04-23T23:23:40-05:00</updated>
        <summary>As the author of Infinitest, a lot of people have been asking me what the difference is between my tool and JUnitMax. They both run tests continuously. They both are packaged as Eclipse plugins. They both report test errors in...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><br /><div>As the author of <a href="http://www.infinitest.org/" style="color: blue; text-decoration: underline; cursor: pointer; ">Infinitest</a>, a lot of people have been asking me what the difference is between my tool and <a href="http://junitmax.com/junitmax/subscribe.html">JUnitMax</a>. They both run tests continuously. They both are packaged as Eclipse plugins. They both report test errors in the "Problems" view just like compiler errors. In all honesty, their similarities are much more numerous than their differences. So it's hard for me to compare them in a way that's helpful to those that ask.</div><br /><div>Compounding this is the fact that we're doing, on average, a couple of releases <span style="font-style: italic;">each week. </span>I don't know if Kent is keeping track of what we're doing, but we're very aware of what he's doing. When it comes to responding to change, I think we do it as well as anyone. So any kind of feature by feature breakdown is likely to be out of date by the time anyone reads it.</div><br /><div>There are some differences though, and I think they are significant. Here are three that I think are unlikely to change in the near term:</div><br /><br /><div><span style="font-size: 15px; font-family: 'Trebuchet MS'; "><span style="font-weight: bold;">There is an IntelliJ version of Infinitest</span></span></div><br /><div>Kent has blogged about possibly doing an IntelliJ version at some point. We've got a working version today, maintained primarily by my friend and colleague <a href="http://blog.rodcoffin.com">Rod Coffin</a>. I think it's a more mature tool than the Eclipse version in some respects, but they're both based on the same core. </div><br /><div><span style="font-weight: bold; font-size: 15px; font-family: 'Trebuchet MS'; ">Infinitest selects a subset of tests to run, while JUnitMax runs them all</span></div><br /><div>I think there are two basic functions that make a continuous test runner worthwhile. The first is <span style="font-style: italic;">test prioritization</span>. The order that you run your tests in is very important. You can think of this as "the fastest possible red bar". If a test is likely to fail, I want it to be the very first test I run. Both Infinitest and JUnitMax track test metrics and use them to prioritize the tests. </div><br /><div>The other function that I think a CT runner needs to do is <span style="font-style: italic;">test selection</span>. If you're doing TDD, you're probably running a single test every time you make a change. If you're doing CI, you're running all your tests on a semi regular basis. Somewhere in the middle of these two approaches is a good balance of feedback quality vs speed. I think that's where CT tools should be focused. Infinitest uses dependency analysis to determine what tests need to be run for a given change. JUnitMax runs them all. My philosophy is that time spent running tests that are highly unlikely to fail is wasted. I want "the fastest green bar possible" so that I can have confidence in my last change and move on to the next one. And while the multicore revolution may one day provide so much desktop CPU horsepower that we can run all the tests in a typical project, concurrently, in a second or two, we're not there yet.</div><br /><div><span style="font-size: 15px; font-weight: bold; line-height: 18px;">You don't have to buy Infinitest to use it</span></div><br /><div>All of the committers to the Infinitest project share a common vision. Not only of Infinitest as a useful tool, but also of Continuous Testing as a valuable and transformative developer practice. We've been writing code this way for a couple of years at this point, and we find the difference between Continuous Testing and plain Test Driven Development to be quite substantial. It reminds me of when I first got addicted to doing TDD...there's just no way I could go back.</div><br /><div>I'm a <a href="http://manifesto.softwarecraftsmanship.org/">software craftsman</a>. That means that I'm committed to not only building quality software, but also contributing back to the profession by helping others learn. With Infinitest, I get to do both. </div><br /><div>I think these differences make Infinitest a better tool. I also think there's plenty of room in the CT tools market for multiple vendors serving different market segments. We'll see how everything settles out in the next year or so...it promises to be a very interesting ride.</div></div>
</content>


    </entry>
    <entry>
        <title>Infinitest for IntelliJ 5.0 Released</title>
        <link rel="alternate" type="text/html" href="http://www.benrady.com/2009/04/infinitest-for-intellij-50-released.html" />
        <link rel="replies" type="text/html" href="http://www.benrady.com/2009/04/infinitest-for-intellij-50-released.html" thr:count="0" />
        <id>tag:typepad.com,2003:post-65035969</id>
        <published>2009-04-03T09:12:27-05:00</published>
        <updated>2009-04-03T09:12:27-05:00</updated>
        <summary>As Rod already mentioned Infinitest 5.0 for IntelliJ is out. We've added some great new features to it, including gutter annotations that make it crystal clear where and why your test is failing. If you haven't tried it already, now's...</summary>
        <author>
            <name>Ben Rady</name>
        </author>
        
        
<content type="xhtml" xml:lang="en-US" xml:base="http://www.benrady.com/">
<div xmlns="http://www.w3.org/1999/xhtml"><p>As <a href="http://blog.rodcoffin.com/?p=159">Rod already mentioned</a> Infinitest 5.0 for IntelliJ is out. We've added some great new features to it, including gutter annotations that make it crystal clear where and why your test is failing. If you haven't <a href="http://www.infinitest.org/intellij.html">tried it</a> already, now's a great time.</p></div>
</content>


    </entry>
 
</feed><!-- ph=1 --><!-- nhm:dynamic-ssi -->
