<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Something Smells</title><description>Agile Methods and Software Engineering...</description><managingEditor>noreply@blogger.com (Anonymous)</managingEditor><pubDate>Sat, 18 Apr 2026 05:29:18 -0500</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">54</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://blog.agilejedi.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle>Agile Methods and Software Engineering...</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Dan Pupek</itunes:author><itunes:owner><itunes:email>noreply@blogger.com</itunes:email><itunes:name>Dan Pupek</itunes:name></itunes:owner><item><title>Agile Project Management Tools are doing it wrong</title><link>http://blog.agilejedi.com/2017/11/agile-project-management-tools-are.html</link><category>agile development</category><category>Backlog Management</category><category>Configuration Management</category><category>Project Management</category><pubDate>Wed, 15 Nov 2017 20:00:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-1376566880321317292</guid><description>&lt;h2&gt;
Introduction&lt;/h2&gt;
I have noticed many bug tracking products attempting to add "Agile" project management to their offerings. I use the word "attempting" because I have yet to use one that really works. I also find it frustrating that many of these same products are setting aside useful features (like case commenting permissions in&amp;nbsp;&lt;a href="https://manuscript.com/" target="_blank"&gt;FogBugz&lt;/a&gt;) and enhancements in favor of failed attempts at making an agile PM tool. Here I'll try to outline, as I see them, the problems faced in trying to make an AGILE PM TOOL.&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;
&lt;h2&gt;
Users Believe that they want an online Card Board (or kanban)&lt;/h2&gt;
Unfortunately, most of us have believed for a long time that a nice&amp;nbsp;&lt;a href="http://trello.com/" target="_blank"&gt;Trello&lt;/a&gt;&amp;nbsp;style online board would be perfect for managing an Agile Project. So far, IMHO, none of the tools have gotten this right AND I doubt they ever will. The great thing about a card board or board full of sticky notes is that you can grab the card, pass it around, set them out on a table, return them to board or put them on another board very easily. All of this while having a full visceral interaction with the rest of the team.&lt;br /&gt;
The electronic card boards fail to allow uninhibited control of the cards. You have to click then drag a card somewhere AND unless you have a huge (45+ inches) touch screen monitor many of your cards end up falling off the screen or are unreadable. We always do our planning using physical cards. Even though the tool we use (FogBugz) has a so-called Agile Planner built in. It's just to unwieldy to use BUT we keep telling these companies that this board is what we want.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Suggestion #1&lt;/b&gt;:&amp;nbsp;&lt;b&gt;Stop trying to create online card boards&lt;/b&gt;&amp;nbsp;and focus on managing the backlog (see below) or workflows (see below). When we ask for the card boards we really don't know what we're asking for.&lt;br /&gt;
&lt;h2&gt;
Agile Projects all follow different workflows&lt;/h2&gt;
&lt;div&gt;
Agile teams rarely have the same exact workflow. The workflows differ from team to team for good reasons. Differing product schedules, team size, organizational demands, etc. The tools that try to prescribe a single workflow, do so at the loss of potential market share. The tools that have a super flexible workflow editor don't always go far enough or it becomes difficult to see what the workflow really looks like. The tools that try to have a one size fits all approach tend to be berated for not really meeting anyone's needs.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Suggestion #2&lt;/b&gt;: Workflow is one place I think these tools can make big differences. If you are going to have a workflow editor then it needs to be robust enough to allow good workflows to be described. Managing the workflows is the absolute best use of these tools. It allows developers and users to easily move cases along the pipeline that your team has described. It does suggest "kanban" but as mentioned above it doesn't need to be visually like kanban, just conceptually. It's really just a pipeline approach.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
The BACKLOG is what really needs to be managed&lt;/h2&gt;
&lt;div&gt;
Some backlogs have tens of thousands of user stories in them. Managing that backlog effectively and allowing product owners to more easily garden is a missed opportunity in most of these tools. Once again no visual representation of cards is going to help here. It's too cumbersome and time consuming. The ability search and order stories in a backlog based on factors such as priority, area and cost are very important BUT also being able to tie these stories to epics on a road-map is even more important.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Suggestion #3&lt;/b&gt;: My backlog order rarely drives the priority of work. We follow a constantly changing road-map of EPICs based on current business needs. Being able to associate stories with Epics and then to a product road-map AND have that automatically fix the backlog order would be THE KILLER FEATURE! Being able to bring up a road-map of EPICS that I can modify then have the backlog automatically changed would be amazing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Story Points versus Man Hours&lt;/h2&gt;
&lt;div&gt;
Fogbugz just recently added story points as a second class citizen but still has no good burn down chart capability that uses story points. Most tools do have a burn down but the problem we always face is that some teams use hours while others prefer story points. To further compound this is how and when do you receive story points (or hours) for a story or task? Some teams allocate points once the developer has completed the work, other teams only allocate once a QA review has been done and still other teams use completely different methods.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Suggestion #4&lt;/b&gt;: This is a point I am less confident about. My gut says this capability can be fleshed out if attention is given to it (see suggestion 1). This may be a matter of allowing point allocation to be defined as part of the workflow. I believe that would work but once again the workflow editor must give a solid representation of how that workflow will be enforced.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2&gt;
Final Thoughts&lt;/h2&gt;
&lt;div&gt;
At the end of the day my preference is for a basic issue tracker that allows me to stay in continuity with our end users and allocate engineers/QA to stories. We've used the FogBugz API extensively to build our own burn downs and other information radiators. For us having the programmatic access to our stories is of greatest importance, along with the added workflow capabilities. Enhancements in the areas mentioned above would be of most value to us.&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">16</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>When do you stop for UX in SCRUM?</title><link>http://blog.agilejedi.com/2012/11/when-do-you-stop-for-ux-in-scrum.html</link><pubDate>Thu, 29 Nov 2012 09:28:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-5696510782552202150</guid><description>I've been struggling with the question of integrating User Experience (UX) into our release cycle. Here is an article that suggests a pretty good solution:

&lt;a href="http://uxdesign.smashingmagazine.com/2012/11/06/design-spikes-fit-big-picture-ux-agile-development/"&gt;Fitting Big-Picture UX Into Agile Development&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">12</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>See what your SQL Queries are costing you</title><link>http://blog.agilejedi.com/2012/11/see-what-your-sql-queries-are-costing.html</link><category>sql</category><category>sql server</category><pubDate>Tue, 27 Nov 2012 09:02:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-776224549730215445</guid><description>Here is a neat script that will tell you what the most costly queries are on your SQL Server:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush: sql"&gt;SELECT  creation_time 
        ,last_execution_time
        ,total_physical_reads
        ,total_logical_reads 
        ,total_logical_writes
        , execution_count
        , total_worker_time
        , total_elapsed_time
        , total_elapsed_time / execution_count avg_elapsed_time
        ,CAST('' AS XML) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY total_elapsed_time / execution_count DESC;&lt;/pre&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>FIXED: "Invalid type owner for DynamicMethod" error in Nhibernate</title><link>http://blog.agilejedi.com/2012/10/fixed-invalid-type-owner-for.html</link><category>nhibernate</category><pubDate>Tue, 16 Oct 2012 11:12:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-3550246015882744722</guid><description>If you recieve the "Invalid type owner for DynamicMethod" error while initializing you NHibernate SessionFactory then it's pretty likely that you are using generic methods on some of your lazy loaded/proxied classes.&lt;br /&gt;
&lt;br /&gt;
Nhibernate incorporates a reflection optimization that speeds up the creation of proxy classes. This reflection optimization does not play well with generics. The error it throws is&amp;nbsp;"Invalid type owner for DynamicMethod". Not very friendly.&lt;br /&gt;
&lt;br /&gt;
So, to fix this you must either stop using generic methods OR turn off the optimization. To turn off the optimization you must run the following code before you initialize your SessionFactory.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;NHibernate.Cfg.Environment.UseReflectionOptimizer = false;&lt;code&gt;&lt;/code&gt;&lt;/code&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>I was Interviewed</title><link>http://blog.agilejedi.com/2011/11/i-was-interviewed.html</link><pubDate>Tue, 29 Nov 2011 13:36:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-1348319473708704636</guid><description>Not sure if I posted my interview done by Rustici:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://scorm.com/blog/2011/04/interview-with-dan-pupek-chief-systems-architect-at-advanced-systems-technology/"&gt;http://scorm.com/blog/2011/04/interview-with-dan-pupek-chief-systems-architect-at-advanced-systems-technology/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Good article on Mulit-Thread Applications in C#</title><link>http://blog.agilejedi.com/2011/05/good-article-on-mulit-thread.html</link><category>c# threads</category><pubDate>Thu, 26 May 2011 16:56:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-485985635855114918</guid><description>I was very pleased to find this. Been using it as a reference:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.albahari.com/threading/"&gt;http://www.albahari.com/threading/&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Make a 5 Second Video from Image using FFMPEG</title><link>http://blog.agilejedi.com/2011/05/make-5-second-video-from-image-using.html</link><pubDate>Thu, 26 May 2011 11:12:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-7622112127686364981</guid><description>Been playing with &lt;a href="http://www.ffmpeg.org/"&gt;FFMpeg &lt;/a&gt;and &lt;a href="http://www.mplayerhq.hu/design7/news.html"&gt;Mencoder &lt;/a&gt;to create videos from a list of Images and an audio file.&lt;br /&gt;
Here is the command I used:&lt;code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre style="background: none repeat scroll 0% 0% white; color: black; font-family: Consolas; font-size: 13px;"&gt;ffmpeg&amp;nbsp;-loop_input&amp;nbsp;-vframes&amp;nbsp;50&amp;nbsp;-f&amp;nbsp;image2&amp;nbsp;-i&amp;nbsp;foo-1.png&amp;nbsp;-r&amp;nbsp;10&amp;nbsp;&amp;nbsp;foo1.avi
ffmpeg&amp;nbsp;-loop_input&amp;nbsp;-vframes&amp;nbsp;50&amp;nbsp;-f&amp;nbsp;image2&amp;nbsp;-i&amp;nbsp;foo-2.png&amp;nbsp;-r&amp;nbsp;10&amp;nbsp;&amp;nbsp;foo2.avi
ffmpeg&amp;nbsp;-loop_input&amp;nbsp;-vframes&amp;nbsp;25&amp;nbsp;-f&amp;nbsp;image2&amp;nbsp;-i&amp;nbsp;foo-3.png&amp;nbsp;-r&amp;nbsp;10&amp;nbsp;&amp;nbsp;foo3.avi
ffmpeg&amp;nbsp;-loop_input&amp;nbsp;-vframes&amp;nbsp;25&amp;nbsp;-f&amp;nbsp;image2&amp;nbsp;-i&amp;nbsp;foo-4.png&amp;nbsp;-r&amp;nbsp;10&amp;nbsp;&amp;nbsp;foo4.avi
mencoder&amp;nbsp;-audiofile&amp;nbsp;foo.wav&amp;nbsp;&amp;nbsp;-oac&amp;nbsp;copy&amp;nbsp;-ovc&amp;nbsp;copy&amp;nbsp;-o&amp;nbsp;output.avi&amp;nbsp;foo1.avi&amp;nbsp;foo2.avi&amp;nbsp;foo3.avi&amp;nbsp;foo4.avi&lt;/pre&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Making the leap to QueryOver</title><link>http://blog.agilejedi.com/2011/04/making-leap-to-queryover.html</link><category>activerecord</category><category>C#</category><category>nhibernate</category><category>queryover</category><pubDate>Thu, 28 Apr 2011 16:06:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8300110918231365558</guid><description>So, if you are using the ActiveRecord/NHibernate stack I highly recommend switching to query over. The syntax is cleaner and it's type-safe.&lt;br /&gt;
&lt;br /&gt;
Here is an example of a criterion based query:&lt;br /&gt;
&lt;script class="brush: csharp" type="syntaxhighlighter"&gt;
&lt;![CDATA[
var crit = DetachedCriteria
     .For&lt;ShapeData&gt;()
     .Add(Expression.Eq("AgendaItem", this));

    return ShapeData.FindAll(crit);
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Here is an example of the same query in QueryOver:&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: csharp" type="syntaxhighlighter"&gt;
&lt;![CDATA[
var query = QueryOver
     .Of&lt;ShapeData&gt;()
     .Where(shape =&gt; shape.AgendaItem == this);
    
    return ShapeData.FindAll(query.DetachedCriteria);
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Unlike the Linq language for Nhibernate QueryOver is just a translation layer for Criterion.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Silverlight: Getting your Listbox Items to stretch</title><link>http://blog.agilejedi.com/2011/04/silverlight-getting-your-listbox-items.html</link><category>silverlight wpf xaml listbox</category><pubDate>Tue, 26 Apr 2011 15:54:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-2866707925521512799</guid><description>I was having some trouble getting my ListBox items to stretch across the entire ListBox. I did not want to get into the game of dropping into code to fix layout issues. Here is what I had to do.&lt;br /&gt;
&lt;br /&gt;
This first attempt did not work:&lt;br /&gt;
&lt;script class="brush: xml" type="syntaxhighlighter"&gt;
&lt;![CDATA[
&lt;ListBox  HorizontalContentAlignment="Stretch" /&gt;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
I had assumed that the HorizontalContentAlignment attribute would do the trick. For most controls it does. I was wrong. Here is what I finally had to do:&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: xml" type="syntaxhighlighter"&gt;
&lt;![CDATA[
&lt;ListBox &gt;
    &lt;ListBox.ItemContainerStyle&gt;
     &lt;Style TargetType="ListBoxItem"&gt;
      &lt;Setter Property="HorizontalContentAlignment" Value="Stretch"&gt;&lt;/Setter&gt;
     &lt;/Style&gt;
    &lt;/ListBox.ItemContainerStyle&gt;
   &lt;/ListBox&gt;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Notice the addition of the container style. As far as I can tell this is a bug. I found the original answer &lt;a href="http://stackoverflow.com/questions/838828/how-to-get-a-listbox-itemtemplate-to-stretch-horizontally-the-full-width-of-the-l"&gt;here&lt;/a&gt;.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Nhibernate/ActiveRecord Lazy Loading Fails when Ignore is Set</title><link>http://blog.agilejedi.com/2010/12/nhibernateactiverecord-lazy-loading.html</link><category>nhibernate activerecord orm "lazy loading"</category><pubDate>Fri, 17 Dec 2010 08:59:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8215083971803670221</guid><description>Recently our [BelongsTo] relationships in ActiveRecord with the &lt;i&gt;Lazy = FetchWhen.OnInvoke&lt;/i&gt; have stopped lazy loading. This caused some massive performance problems. Suddenly entities that were not supposed to be loading unless invoked were loading all of the time.&amp;nbsp; I've been struggling with this for a couple days and just now found the answer.&lt;br /&gt;
&lt;br /&gt;
Here is the property definition in question:&lt;br /&gt;
&lt;br /&gt;
&lt;script type="syntaxhighlighter" class="brush: csharp"&gt;&lt;![CDATA[
[ActiveRecord]
public class SomeEntity {
//...
[BelongsTo(Lazy = FetchWhen.OnInvoke, NotFoundBehaviour=NotFoundBehaviour.Ignore)]
public virtual CustomPage HomePage { get; set; }
//...
}
]]&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Normally, when retrieving an instance of "SomeEntity" the HomePage property would not load until it was accessed by some code. Two days ago, using the Nhibernate Profiler, I noticed that HomePage was being loaded...all of the time. &lt;br /&gt;
&lt;br /&gt;
I tried so many possible solutions and searched for a possible answer until I came across &lt;a href="http://www.adamaldrich.com/blog/post/NHibernate-Lazy-Loading-Problem-with-Not-Found3de2809dIgnoree2809d-Association.aspx" target="_blank"&gt;this article&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
It turns out that when you set  &lt;i&gt;NotFoundBehaviour=NotFoundBehaviour.Ignore&lt;/i&gt; on a BelongsTo relationship it circumvents the lazy loading and loads the entity anyway. I also found a &lt;a href="http://www.google.com/url?sa=t&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CBMQFjAA&amp;amp;url=http%3A%2F%2F216.121.112.228%2Fbrowse%2FNH-1001&amp;amp;rct=j&amp;amp;q=nhibernate%20nh-1001%20jira&amp;amp;ei=kXoLTffjE4P88AajnvmPDg&amp;amp;usg=AFQjCNE80iRtKoqsJXmDoLmGwWPsQvJcvw&amp;amp;sig2=5FAwwOYAR1pYhYYmIThrxA&amp;amp;cad=rja"&gt;bug&lt;/a&gt; that has been posted for this as well. Although the link rarely works well.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Death March Values...revisited</title><link>http://blog.agilejedi.com/2010/10/death-march-valuesrevisited.html</link><pubDate>Tue, 26 Oct 2010 23:30:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-2441357617023047663</guid><description>Some time ago, I was reading a great page on the &lt;a href="http://c2.com/cgi/wiki"&gt;C2 Project Wiki&lt;/a&gt; about &lt;a href="http://c2.com/cgi/wiki?DeathMarchValues"&gt;Death March Values&lt;/a&gt;. This is in no way implying that we have this problem here...but these are habits we should not fall into.&lt;br /&gt;
&lt;br /&gt;
The basic concept is that some organizations have a subculture that continues to employ self-destructive values over and over again. Here are a few indicators that you may be in one of these organizations:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&amp;nbsp;Business Value Desicion Makers (BVDMs) want the "magic" of software without considering the work involved, "ProductWithoutProcess".&lt;/li&gt;
&lt;li&gt;&amp;nbsp;BVDMs reward the guy who stayed up all night fixing a bug while the guy/gal who's code always works the first time gets little recognition. The Hero Programmer&lt;/li&gt;
&lt;li&gt;Young Hotshot Programmers fall in love with a product "Project Love Affair", take little time to consider the broader picture and fail to employ the Practices.&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;In most organizations you can insulate against the Death March Values by not accepting the status quo. In some organizations it's so embedded in the culture that you may never be able to fight the tide.&lt;br /&gt;
&lt;br /&gt;
Here are several things your development team can do to mitigate the Death March Values:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt; Commit to only as much work as you can do&lt;/b&gt;&lt;br /&gt;
This is tough because most teams don't know how much work they can get done. Always track the amount of work you have done in the past so you can properly estimate in the future.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Set a schedule and stick to it&lt;/b&gt;&lt;br /&gt;
Sticking to a schedule is tough, but if you only commit to as much work as you can perform then you won't have a problem. The two things that will affect your schedule the most are distracting task and scope creep.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Value working software over scope creep&lt;/b&gt;&lt;br /&gt;
Inevitably, near the end of a release everyone wants to pile on "just one more feature." In these moments you must remind everyone that it's more important to get the bulk of the new features out to production rather than "creep" in new ones.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Accept success and failure as a team&lt;/b&gt;&lt;br /&gt;
Simple...enough said ;-)&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;See also: &lt;a href="http://c2.com/cgi/wiki?DeathMarchProject"&gt;Death March Project&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Top 12 Things Likely To Be Said By A Klingon Programmer</title><link>http://blog.agilejedi.com/2010/07/top-12-things-likely-to-be-said-by.html</link><category>humrous</category><pubDate>Wed, 21 Jul 2010 16:22:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-2323295026860126537</guid><description>found originally at&amp;nbsp; &lt;span style="font-size: small;"&gt;&lt;a href="http://www.cs.berkeley.edu/%7Elorch/humor/klingon-code.html" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;Courtney Hentz (CHentz@spinner.com)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Specifications are for the weak and timid!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; This machine is a piece of GAGH!  I need quad PowerPC processors if I am to do battle with this code!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; You cannot really appreciate Dilbert unless you've read  it in the original Klingon.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; Indentation?! I will show you how to indent when I indent your skull!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt; What is this talk of `release'?  Klingons do not make software `releases'.  Our software `escapes' leaving a bloody trail of designers and quality assurance people in its wake.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  Klingon function calls do not have `parameters' - they have`arguments' - and they ALWAYS WIN THEM.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  Debugging?  Klingons do not debug.  Our software does not coddle the weak.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  I have challenged the entire quality assurance team to a Bat-Leth contest.  They will not concern us again.&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  A TRUE Klingon Warrior does not comment his code!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  By filing this bug you have challenged the honor of my family. &lt;i&gt;&lt;b&gt;Prepare to die!&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  You question the worthiness of my code?  I should kill you where you stand!&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;  Our users will know fear and cower before our software! Ship it!Ship it and let them flee like the dogs they are!&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Documentation Specialists</title><link>http://blog.agilejedi.com/2010/07/documentation-specialists.html</link><category>madcap documentation</category><pubDate>Wed, 14 Jul 2010 00:06:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-7103444023970797641</guid><description>&lt;b&gt;*** UPDATE Dec 20, 2010, We ended up using the tool &lt;a href="http://www.madcapsoftware.com/products/flare/overview.aspx"&gt;MadCap Flare&lt;/a&gt;. I'll post some pros and cons later ***&lt;/b&gt;&lt;br /&gt;
So, we just hired a new documentation specialist. We're looking at a tool named &lt;a href="http://www.innovasys.com/products/hs3/overview.aspx"&gt;Help Studio&lt;/a&gt;. If anyone has any suggestions please let me know.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I intend to treat her as any other developer (&lt;a href="http://www.agilejedi.com/chickenandpig"&gt;a pig&lt;/a&gt;). Currently our workflow is: Engineer Resolves Case to QA and QA Closes case. The new workflow that we will try out is: Engineer resolves case to Documentation, who then resolves to QA, who then closes.&lt;br /&gt;
&lt;br /&gt;
Over the next couple of weeks I will write more about how things work out.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>From SVN to Mercurial: Part 1</title><link>http://blog.agilejedi.com/2010/07/from-svn-to-mercurial-part-1.html</link><category>Configuration Management</category><category>Version Control</category><pubDate>Sun, 11 Jul 2010 21:20:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8190978928220778219</guid><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mercurial.selenic.com/images/mercurial-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://mercurial.selenic.com/images/mercurial-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;Recently, we have begun dividing our work amongst several teams on different branches. This prompted us to start moving from Subversion (&lt;a href="http://subversion.tigris.org/"&gt;SVN&lt;/a&gt;) to &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
We have actually had great success with Subversion (SVN). We moved from CVS several years ago and have never regretted it. With it's improved rename and move support and cleaner branching SVN was an easy decision.&lt;br /&gt;
&lt;br /&gt;
Now we find ourselves, once again, pinning for the capabilities of a Version Control System that we don't have. We are also in the throws of moving build servers from &lt;a href="http://luntbuild.javaforge.com/"&gt;Luntbuild &lt;/a&gt;to &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt;. So, over the next few posts I'll discuss our experiences with moving from SVN to Mercurial.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>COBOL.Net is NUTS!!</title><link>http://blog.agilejedi.com/2009/09/cobolnet-is-nuts.html</link><category>C#</category><category>COBOL</category><category>software engineering</category><pubDate>Wed, 2 Sep 2009 21:47:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8957582135831533902</guid><description>Just read an &lt;a href="http://www.codinghorror.com/blog/archives/001294.html"&gt;article about COBOL.Net&lt;/a&gt;.....who would really want to subject themselves to this horror.&lt;br /&gt;&lt;br /&gt;Let's take the sample code in C#:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;private void button1_Click(object sender, System.EventArgs e)&lt;br /&gt;{&lt;br /&gt;   button1.Text = "Call COBOL";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Now here is the same method in COBOL:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;METHOD-ID. button1_Click PRIVATE.&lt;br /&gt;DATA DIVISION.&lt;br /&gt;LINKAGE SECTION.&lt;br /&gt;01 sender OBJECT REFERENCE CLASS-OBJECT.&lt;br /&gt;01 e OBJECT REFERENCE CLASS-EVENTARGS.&lt;br /&gt;PROCEDURE DIVISION USING BY VALUE sender e.&lt;br /&gt;   SET PROP-TEXT OF button1 TO "Call COBOL".&lt;br /&gt;END METHOD button1_Click.&lt;br /&gt;&lt;/pre&gt;Am I the only one that finds this maddening. OK, OK, for the record there are still more lines of COBOL running then any other language. It could be that COBOL is just that great or it could be the fear of re-engineering systems are working just fine.&lt;br /&gt;&lt;br /&gt;Any thoughs?</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Refactoring: Means versus Ends</title><link>http://blog.agilejedi.com/2009/08/refactoring-means-versus-ends.html</link><pubDate>Thu, 6 Aug 2009 22:50:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8875256783980215862</guid><description>First, I see 2 reasons to refactor:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Improve performance&lt;/li&gt;&lt;li&gt;Make code easier to maintain (and extend)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Most other "&lt;a href="http://rpsetzer.blogspot.com/2006/10/reasons-to-refactor-your-code.html"&gt;reasons&lt;/a&gt;" that people use to justify refactoring are only a means to one of the 2 ends stated above. If you aren't ultimately reaching one of those ends, then reconsider refactoring. If your changes are to the detriment of one of these 2 means, &lt;span style="font-weight: bold;"&gt;then don't refactor&lt;/span&gt;. In fact cargo cult refactoring can be more harmful than helpful.&lt;br /&gt;&lt;br /&gt;Think about these:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Not all duplication is bad. Some blocks of code are more self explanatory then an oddly named method that wraps it. Saving 6 lines of code may come at the cost of flexibility and higher levels of coupling. &lt;/li&gt;&lt;li&gt;Overly abstract code can become highly unmaintainable, even cryptic. In an effort to write more concise code we inadvertently write less concise code. Specialization can be a good thing. &lt;a href="http://www.joelonsoftware.com/items/2008/05/01.html"&gt;Astronaut APIs&lt;/a&gt; can be bad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and of course...&lt;a href="http://www.c2.com/cgi/wiki?PrematureOptimization"&gt;premature optimization&lt;/a&gt; is the &lt;a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf"&gt;root of all evil&lt;/a&gt;!&lt;/li&gt;&lt;/ol&gt;Just a few things to think about...</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Ridding Your Garden of Bugs: Gardening the Backlog</title><link>http://blog.agilejedi.com/2009/03/ridding-your-garden-of-bugs-gardening.html</link><category>agile development</category><category>Backlog Management</category><category>extreme programming</category><category>Project Management</category><pubDate>Wed, 25 Mar 2009 22:41:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-6671310664585152131</guid><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;span style='border-collapse: separate; color: rgb(0, 0, 0); font-family: arial; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;' class='Apple-style-span'&gt;&lt;div&gt;I'm not sure if I agree with this "&lt;a href='http://ayende.com/Blog/archive/2009/03/24/microsoft-connect-fail-yet-again.aspx'&gt;article&lt;/a&gt;" but, it is somewhat related to a discussion my boss (Dr. Rob Miller) and I were having earlier today. Ideally, we would like to focus every third (I just picked a number) release on "bug hunting" or finding and fixing bugs. Unfortunately, bugs are often a debt we live with for a long time, in the face of progress and new features. I have known few products that didn't have some glitch and the promise of new features often takes some of the edge off of these glitches.&lt;/div&gt;&lt;div&gt;&lt;br/&gt;&lt;/div&gt;&lt;div&gt;Conversely, some bugs can leave users with such a bad taste that they never quite trust your software again. In the article above the author describes a bug that was reported fixed but still remains broken....after 2 years. Furthermore, as more bugs slip through the cracks a system can slowly become more and more unstable.&lt;br/&gt;&lt;br/&gt;This suggests that, when planning product releases, stakeholders should balance the need for new features with the need for a stable system. I believe that, by better "gardening" a product's backlog, most products can avoid these pitfalls. So, here are a few points to consider when gardening your backlogs:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Are stakeholders keeping and gardening personal backlogs? When I say, "personal backlog" I am referring to the features, enhancement and bugs that each stakeholder or program manager would like to see implemented. At every release planning meeting these "personal backlogs" should be gardened and brought to the table for consideration in the "product backlog". &lt;br/&gt;&lt;/li&gt;&lt;li&gt;What have users been promised (explicitly or implicitly) and what is the impact of leaving those promises unfulfilled?&lt;/li&gt;&lt;li&gt;Do you know how "real" users feel about your software? How do you collect this information? Sometimes, we get ONE very vocal user (see above). Sometimes we have a quiet majority. When should a user's/client's opinions impact the requirements for a release?&lt;/li&gt;&lt;li&gt;When is a "bug hunting" expedition called for? Is there some threshold or event horizon? Do we have a good litmus test?&lt;/li&gt;&lt;li&gt;Finally, is there a single decision maker (&lt;a href='http://www.infoq.com/news/2009/02/product-owner-one-person' target='_blank'&gt;the one ringable neck&lt;/a&gt;) for the product backlog? Someone to take all of the personal backlogs and prioritize them. In XP this would be the&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;a href='http://c2.com/cgi/wiki?OnsiteCustomer'&gt;On Site Customer&lt;/a&gt;&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;and in SCRUM this would be the&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;a href='http://www.mountaingoatsoftware.com/product-owner'&gt;Product Owner&lt;/a&gt;. I suggest that it NEVER be your development team. This person maintains the backlog, the &lt;a href='http://blog.agilejedi.com/2007/03/5-levels-of-planning-i-just-read.html' target='_blank'&gt;vision &lt;/a&gt;and the &lt;a href='http://blog.agilejedi.com/2007/03/5-levels-of-planning-i-just-read.html' target='_blank'&gt;roadmap&lt;/a&gt;.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt; It's not likely that you will squash all the bugs in any &lt;a href='http://bugsareeasy.wordpress.com/2009/01/03/abstraction-101-making-sense-of-complex-systems/' target='_blank'&gt;non-trivial system&lt;/a&gt; without writing some&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;a href='http://thedailywtf.com/Articles/Writing_Bugfree_software.aspx'&gt;questionable code&lt;/a&gt;. So, you should take the time to test drive your software. Also, watch others "test drive" your software. This advice is not just for developers. In fact it's doubly important for non-developer stake holders and Decision Makers to "test-drive" the software. Kick the tires, check all the instruments. How's the suspension? Is it idling rough? Take it to a mechanic (engineer) and see if any maintenance is due (&lt;a href='http://onstartups.com/home/tabid/3339/bid/165/Development-Short-Cuts-Are-Not-Free-Understanding-Technology-Debt.aspx'&gt;technology debt&lt;/a&gt;). Next time you prioritize your backlog you may have a different perspective.&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div&gt;Taking the time to garden your backlog will leave you&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;a href='http://www.wildcat-adventures.com/images/gardens.jpg'&gt;smelling like roses&lt;/a&gt;. While just letting things grow out of control could have you&lt;span class='Apple-converted-space'&gt; &lt;/span&gt;&lt;a href='http://images.google.com/imgres?imgurl=http://lh4.google.com/kkettler/Rq_6ukq6htI/AAAAAAAABvs/iJ-6fnLMR0k/s400/July%252029,%25202007%2520730.jpg&amp;amp;imgrefurl=http://iwetmyplants.com/2007/08/&amp;amp;usg=__BEd8WHZfLOtvUXp2mTE96r762C4=&amp;amp;h=300&amp;amp;w=400&amp;amp;sz=52&amp;amp;hl=en&amp;amp;start=10&amp;amp;sig2=AH0KWA7hOOJiwHeM1iN1nQ&amp;amp;um=1&amp;amp;tbnid=dAEythp1BcBYAM:&amp;amp;tbnh=93&amp;amp;tbnw=124&amp;amp;prev=/images%3Fq%3Ddigging%2Bup%2Bweeds%26hl%3Den%26rlz%3D1B3GGGL_enUS215US215%26sa%3DG%26um%3D1&amp;amp;ei=pvTKSYHVHNa9twfp0pHmCQ'&gt;digging in the weed&lt;/a&gt;s!&lt;/div&gt;&lt;/span&gt;&lt;div class='blogger-post-footer'&gt;&lt;script type='text/javascript'&gt;&lt;br/&gt;&lt;/script&gt;&lt;br/&gt;&lt;script type='text/javascript'&gt;&lt;br/&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&amp;gt;&lt;br/&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class='blogger-post-footer'&gt;&lt;script type='text/javascript'&gt;&lt;br/&gt;&lt;/script&gt;&lt;br/&gt;&lt;script type='text/javascript'&gt;&lt;br/&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&amp;gt;&lt;br/&gt;&lt;/script&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class='zemanta-pixie'&gt;&lt;img src='http://img.zemanta.com/pixy.gif?x-id=4c2aa5ef-b325-44f8-827b-e60cb5323f1e' class='zemanta-pixie-img'/&gt;&lt;/div&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Profiling Nhibernate</title><link>http://blog.agilejedi.com/2009/02/profiling-nhibernate.html</link><pubDate>Tue, 3 Feb 2009 23:07:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-732396718373769958</guid><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I recently purchased 4 licenses of &lt;a href='http://ayende.com/Blog/Default.aspx' target='_blank'&gt;Ayenda's&lt;/a&gt; excellent &lt;a href='http://nhprof.com/' target='_blank'&gt;Nhibernate Profiler&lt;/a&gt; for my office. The tool truly is amazing. The real time metrics provided by the profiler have already helped us improve the performance of our applications and identify some not very efficient database calls.&lt;br/&gt;&lt;br/&gt;Here are a few features that we really like:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Realtime view of queries being sent to the database. This information includes a stack trace and properly formated SQL! You also get to see if the entities were pulled from the query cache, level 2 cache or directly from the database. The SQL view can really expose some nasty databse calls.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Number of sessions opened. The queries are broken down by session. You can see how many queries each session makes and a mirad of statistics.&lt;/li&gt;&lt;li&gt;Unique Query statistics. NH Profiler offers an aggregate view of how often each query was called and the average time it took. This is invauable information for improving performance.&lt;/li&gt;&lt;/ul&gt;This tool offers a ton of other features that we haven't even touched. If you use Nhibernate or ActiveRecord (as we do) I highly recommend you pay the fee and get a copy. You'll also be helping out a brilliant programmer (Oren Eini).&lt;br/&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>AAAA Unit Testing</title><link>http://blog.agilejedi.com/2008/12/aaaa-unit-testing.html</link><pubDate>Fri, 26 Dec 2008 17:46:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-5003073555381830059</guid><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;A while back &lt;a href='http://ayende.com/Blog' target='_blank'&gt;Oren &lt;/a&gt;wrote about the &lt;a href='http://ayende.com/Blog/archive/2008/05/16/Rhino-Mocks--Arrange-Act-Assert-Syntax.aspx' target='_blank'&gt;Arrange, Act, Assert&lt;/a&gt; syntax for unit tests. I've seen several other discussions on this and I am not sure if he is the originator but I'll attribute him either way.&lt;br/&gt;&lt;br/&gt;The syntax I most commonly use ressembles an Arrange, Assert, Act and Assert (AAAA) pattern.&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Arrange the system in it's initial configuration. Create any collaborators and mocks you may need. Initialize services.&lt;/li&gt;&lt;li&gt;Assert that the initial state is correct. For me this is important since so many layer of dependencies exist in modern applications. This is analogous to a control group in the scientific method. In this step I would also test the inverse of later assertion such as the non-existence of objects that should only exist after the Act step.&lt;/li&gt;&lt;li&gt;Act on the system by creating/deleting/updating new objects or invoking services.&lt;/li&gt;&lt;li&gt;Assert again that the system is in it's expected state.&lt;/li&gt;&lt;/ul&gt;I've caught a lot of bugs using this method. Asserting the initial state may also be a good way to expose weakness' in the design. &lt;br/&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Memcached for Monorail Update</title><link>http://blog.agilejedi.com/2008/12/memcached-for-monorail-update.html</link><category>memcached</category><category>monorail</category><pubDate>Mon, 1 Dec 2008 23:02:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-4325688859529347747</guid><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Memcached for Monorail is a session replacement for the Castle::Monorail framework. It uses memcached on the back end for distributing the session across a web farm. I have added some additional notes about &lt;a target="_blank" href="http://code.google.com/p/libagilejedi/wiki/MemcachedForMonorail?ts=1228193463&amp;amp;updated=MemcachedForMonorail"&gt;Memcached for Monorail&lt;/a&gt;. I have also uploaded a &lt;a href="http://code.google.com/p/libagilejedi/downloads/list" target="_blank"&gt;binary release&lt;/a&gt;. Although I recommend getting the &lt;a href="http://code.google.com/p/libagilejedi/source/checkout" target="_blank"&gt;source&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No time to discuss much more but feel free to ask questions and I'll answer them. The Memcached session provider is currently being used in a production environment with great success but it definitely has room for improvement. It's aimed squarely at extending the &lt;a href="http://www.castleproject.org/MonoRail/" target="_blank"&gt;Castle::Monorail&lt;/a&gt; session so if you are looking for something more generic than please look else where...or consider switching to MVC with &lt;a href="http://www.castleproject.org/MonoRail/" target="_blank"&gt;Castle::Monorail&lt;/a&gt; ;-)&lt;br /&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Monorail installed on a 64bit OS</title><link>http://blog.agilejedi.com/2008/12/monorail-installed-on-64bit-os.html</link><category>IIS Monorail CastleProject</category><pubDate>Mon, 1 Dec 2008 15:37:00 -0600</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-5477284494271986071</guid><description>Installing &lt;a href="http://www.castleproject.org/MonoRail/"&gt;Castle::Monorail&lt;/a&gt; on 64bit IIS7 proves to be much easier than I thought. You must use the 64bit handlers. To make this easy you can just add the handlers to your Web.Config:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  136&lt;/span&gt; &lt;span style="color:blue;"&gt;  &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;system.webServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  137&lt;/span&gt; &lt;span style="color:blue;"&gt;    &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;handlers&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  138&lt;/span&gt; &lt;span style="color:blue;"&gt;      &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;IconHandler&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;path&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*.ico&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;verb&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;modules&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;StaticFileModule&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;resourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;File&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&gt;      &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  139&lt;/span&gt; &lt;span style="color:blue;"&gt;      &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Monorail-64&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  140&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;path&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;verb&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  141&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;modules&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;IsapiModule&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  142&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  143&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;resourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Unspecified&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  144&lt;/span&gt; &lt;span style="color:blue;"&gt;      &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Monorail&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  145&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;path&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;verb&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;*&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  146&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;modules&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;IsapiModule&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  147&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;scriptProcessor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;/pre&gt; &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  148&lt;/span&gt; &lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;resourceType&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Unspecified&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&gt;&lt;/span&gt;&lt;/pre&gt;  &lt;pre style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;  149&lt;/span&gt; &lt;span style="color:blue;"&gt;    &lt;!--&lt;/span--&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;handlers&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;&lt;br /&gt;150&lt;/span&gt; &lt;span style="color:blue;"&gt;  &lt;!--&lt;/span--&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;system.webServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;As you can see above, I have added handler mappings for both the 64bit and the 32bit. Notice that the 64bit is listed first, this is important. The 64bit script processor is:&lt;br /&gt;&lt;br /&gt;&lt;pre style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;A more detailed overview can be found at &lt;a href="http://wiki.bittercoder.com/Default.aspx?Page=ConfiguringMonorailOnIIS7&amp;amp;AspxAutoDetectCookieSupport=1"&gt;BitterCoder&lt;/a&gt;.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Javascript: Equality versus Identity</title><link>http://blog.agilejedi.com/2008/09/javascript-equality-versus-identity.html</link><category>javascript</category><category>software engineering</category><pubDate>Fri, 12 Sep 2008 11:28:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-7821512309558157273</guid><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Javascript has 2 basic forms of &lt;a href="http://www.w3schools.com/JS/js_comparisons.asp" target="_blank"&gt;comparison operators&lt;/a&gt;: &lt;span style="font-family: Courier New;"&gt;===&lt;/span&gt; and &lt;span style="font-family: Courier New;"&gt;==&lt;/span&gt; .&lt;span style="font-family: Courier New;"&gt;==&lt;/span&gt; is the standard equality operator while &lt;span style="font-family: Courier New;"&gt;===&lt;/span&gt; is the identity operator. The equality operator will perform casting and usually test both sides as strings. The identity operator compares the value each side the type, but it does not work like instanceof.&lt;br /&gt;
&lt;br /&gt;
Recently we did some experiments with the different return values.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;The Expressions&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table border="1" style="height: 322px; width: 100%;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="font-weight: bold; height: 12%; width: 50%;"&gt;Expression&lt;/td&gt;&lt;td style="font-weight: bold; height: 12%; width: 50%;"&gt;Result&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"test" == "test"&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;true&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"test" === "test"&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;true&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;String("test") === "test"&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;true&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;new String("test") == "test"&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;true&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;new String("test") === "test"&lt;/small&gt;&lt;/td&gt;&lt;td style="color: red; font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;false&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;new String("test") === new String("test")&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;Before Firefox 3.0.1: true&lt;br /&gt;
After: &lt;span style="color: red;"&gt;false&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;new String("test") === String("test")&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="color: red; font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;false&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Here are some type tests we performed&lt;/span&gt;&lt;br /&gt;
&lt;table border="1" style="height: 232px; width: 694px;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="font-weight: bold; height: 12%; width: 50%;"&gt;Expression&lt;/td&gt;&lt;td style="font-weight: bold; height: 12%; width: 50%;"&gt;Type&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;typeof("test")&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"string"&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;typeof(String("test"))&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"string"&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;typeof(new String("test"))&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"object"&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;typeof(function(){})&lt;br /&gt;
&lt;/small&gt;&lt;/td&gt;&lt;td style="font-family: Courier New; height: 12%; width: 50%;"&gt;&lt;small&gt;"function"&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;What Did we Learn?&lt;/span&gt;&lt;br /&gt;
First we see that a string is not always a string. Sometimes it's an object. It's easy to forget that Javascript still has the concept of primitives and objects. Integers, Strings and a few others are all primitives. When using the identity operator (===) you have to assume that it is comparing the value of the variable and it's type (as returned by typeof). Further compounding this is the fact that new String() does not type to a "STRING", while calling String as a function does.&lt;br /&gt;
&lt;br /&gt;
What this all suggests is that when dealing with primatives you might as well use the equality operator (==). If you feel it's safer to use the identity operator (===) then you should use &lt;span style="font-family: Courier New;"&gt;String()&lt;/span&gt; as a function and &lt;span style="font-weight: bold;"&gt;never &lt;/span&gt;use &lt;span style="font-family: Courier New;"&gt;new String()&lt;/span&gt;.&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Hire the Right People</title><link>http://blog.agilejedi.com/2008/08/hire-right-people.html</link><category>Hiring Practices</category><pubDate>Tue, 12 Aug 2008 22:16:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-1127777773474434649</guid><description>&lt;div style="font-family: arial;" xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span&gt;I believe my team of engineers has been very successful. This is no accident. I look for, and like to, surround myself with smart people. I'm not being egotistical. I don't consider myself the sharpest tool in the shed, but I do know a sharp tool (smart engineer) when I talk to one.&lt;br /&gt;&lt;br /&gt;Hiring the right person is harder than it sounds. The top two impediments, in my experience, to hiring the right person have been "&lt;span style="font-style: italic;"&gt;Hiring People that are Non-Threatening&lt;/span&gt;" and "&lt;span style="font-style: italic;"&gt;knowing nothing about the job you are hiring for&lt;/span&gt;."&lt;br /&gt;&lt;br /&gt;Non-threatening can mean a lot of things. A non-threatening person can be a yes-man. Yes-men will agree with you on everything and never make you uncomfortable by pointing out flaws in your plan. Yes-men are often hired on the basis of philosophy rather than actual skill. Non-threatening people can also be that dull-tool that won't outshine the person who hired them. In both cases the company is stuck paying wages to an under performer.&lt;br /&gt;&lt;br /&gt;More often, though, I have seen poor hiring decisions made by managers that have no idea how to judge candidates for a job. These managers tend to rely heavily on applicants' resumes and sets of nebulous questions about work ethic or previous projects. Lacking a basic understanding of engineering practices and what makes a good engineer, these managers usually hire based on a feeling.&lt;br /&gt;&lt;br /&gt;So, how do I hire....smart people? First, I give a basic skills test. I actually test each applicant on basic problem solving skills using pseudo code. If they do well on the test, then I send them a practical exercise. I look for three things in the practical exercise: how well they followed the  directions, coding style, and does it work.&lt;br /&gt;&lt;br /&gt;The test and exercise help me weed out those applicants whose time would be wasted on an interview. If I am happy with the test and the practical exercise, I schedule an interview. I'm also a true believer in team buy-in on all new hires so I get as many engineers involved in the interview as we can afford.&lt;br /&gt;&lt;br /&gt;The interview includes some basic questions about relocating and what technologies the applicant is interested in, but the real meat of the interview is a set of problems the applicant must solve,  interactively, on a white board.  The problem solving progresses, "lecture style," with the applicant lecturing us on how the problems could best be solved.&lt;br /&gt;&lt;br /&gt;Engineers are free to ask questions and the applicant is encouraged to show all his work. After the interview, I discuss the applicant with the other engineers and prepare for the next interview.&lt;br /&gt;&lt;br /&gt;Once we have an adequate pool, we all sit down together to review, compare and contrast all the applicants.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">19</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>Watin Installed</title><link>http://blog.agilejedi.com/2008/08/watin-installed.html</link><category>extreme programming</category><category>test driven development</category><category>tools</category><category>watin</category><pubDate>Wed, 6 Aug 2008 02:56:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8562434278374751056</guid><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;I've spent the last few days getting our testers up to speed on &lt;a target="_blank" href="http://watin.sourceforge.net/"&gt;Watin&lt;/a&gt;. Watin is an Automated Web Acceptance Test Tool We are using &lt;a target="_blank" href="http://sourceforge.net/project/showfiles.php?group_id=167632&amp;amp;package_id=266951"&gt;Watin CTP v2.0&lt;/a&gt;. So far I have learned a few things about Watin that I didn't know when I wrote my original Watin Review. If you are completely unfamiliar with Watin I recommend you read &lt;a href="http://blog.agilejedi.com/2008/02/webtest-tool-round-up-round-1watin.html" &gt;my review&lt;/a&gt; first.&lt;br /&gt;&lt;br /&gt;Our descision to go with Watin was based on 4 factors. (1) Watin handles AJAX applications very well, (2) Watin doesn't inject Javascript into your code, (3) Watin supports Firefox (Not 3.0 as of this writing) and (4) it's open source (we can mod the code).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Watin Smarts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Watin has a good set of algorithms for handling the WaitForLoad stuff. WaitForLoadTimeout is the amount of time the underlying framework should wait for a page to load even though you have asked the framework to find an element.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;pre class="c-sharp:nogutter:nocontrols"  name="code"&gt;&lt;br /&gt;browser.goto("http://www.google.com");&lt;br /&gt;browser.Button(Find.ByValue("submit")).Click();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the example above the thread will reach the 2nd line before the page finishes loading. Watin is smart enough to wait for the page to load before clicking the button. This behavior is controled by the WaitForLoadTimeout property.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nice Syntax&lt;/strong&gt;&lt;br /&gt;The Syntax for finding elements on a page is pretty nice. Here is an example:&lt;br /&gt;&lt;pre class="c-sharp:nogutter:nocontrols"  name="code"&gt; browser.Button(Find.ByValue("submit").And(Find.ByClass("pretty-btn")).Click();&lt;/pre&gt;The "Find" constraint has both an "AND" and an "OR" method. Both take a single Find as an argument. Testers will prefer this syntax to the more arcane XPath style syntax but I would have preferred something like this:&lt;br /&gt;&lt;pre class="c-sharp:nogutter:nocontrols"  name="code"&gt;browser.Button.Find.ByValue("submit").And.ByClass("pretty-button").Click();&lt;/pre&gt;Either way the Find constraint offers many ByXXX methods for do all sorts of neat tricks and if need be you can drop to regular expressions (well coded sites shouldn't require that). I also appreciate the &lt;a target="_blank" href="http://watin.sourceforge.net/htmlelementmapping.html"&gt;HTML mappings&lt;/a&gt; syntax.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firefox Support&lt;/span&gt;&lt;br /&gt;You'll notice that the firefox support depends on a firefox plugin called &lt;a target="_blank" href="http://code.google.com/p/firewatir/downloads/list"&gt;jssh&lt;/a&gt;. JSSH opens up a telnet server that allows Watin (or any other framework) to issue automation commands that it then forwards to Firefox. Watin 2.0 comes with a version of JSSH in it's Mozilla folder. This version only works on Firefox 2.x. We have tried several "fixed" version and we have tried turning off compatibility and security checks in Firefox 3.x. All attempts to run JSSH failed. In Firefox 2.x we experienced great success. So, I have no doubt that support will come soon.&lt;br /&gt;&lt;br /&gt;Either way if you plan to support multiple browsers then you should use the BrowserFactory class. It has a create method that returns an IBrowser instance based on a BrowserType enum. In this way you can use the same tests for both Firefox and IE.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Final Thoughts&lt;/span&gt;&lt;br /&gt;One of the most attractive things to me, about Watin, is the fact that the tests live in source code along with all our other tests. They run using Nunit and the same tool set we use for Unit Testing.&lt;br /&gt;&lt;br /&gt;I also like that Watin does not want to inject javascript into our code. So far our testers seem excited and I hope we can keep up the momentum.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;br/&gt;&lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br/&gt;src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;&lt;br/&gt;&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item><item><title>SVN LDAP and Active Directory</title><link>http://blog.agilejedi.com/2008/07/svn-ldap-and-active-directory.html</link><category>Configuration Management</category><category>Subversion</category><category>tools</category><category>Version Control</category><pubDate>Sun, 13 Jul 2008 21:57:00 -0500</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-27472404.post-8298259361233446515</guid><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;We just upgraded to the 1.5 series of &lt;a href='http://subversion.tigris.org/' target='_blank'&gt;SVN&lt;/a&gt;. Almost all of our "team" tools have some hook into &lt;a href='http://en.wikipedia.org/wiki/Active_Directory' target='_blank'&gt;Active Directory&lt;/a&gt; (AD) for authentication. For SVN this is done via the AD LDAP interface. It turns out that some of SVN's auth_ldap libraries have changed and now our repository sits dead in the water.&lt;br/&gt;&lt;br/&gt;For those who don't know, SVN is really just a very elaborate Apache web application. Apache handles the network communications while SVN does the versioning stuff. That being the case the real problem exists with the instance of apache that comes with SVN 1.5.0. I believe the LDAP module libraries shipped with SVN are &lt;a href='http://blogs.open.collab.net/svn/2008/06/collabnet-subve.html#comment-120559448' target='_blank'&gt;out of date&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;I have considered switching to the mod_sspi for authentication. Others have got it to &lt;a href='http://svn.haxx.se/users/archive-2007-05/0886.shtml' target='_blank'&gt;work&lt;/a&gt;. Has anyone else had luck with this?&lt;br/&gt;&lt;br/&gt;The benefit (I suppose) of SSPI would be the seamless inferance of domain credentials. In short, the SVN client should use your windows logon credentials to authenticate against the server. This is how &lt;a href='http://www.cvsnt.org' target='_blank'&gt;CVSNT &lt;/a&gt;works but I'm not sure it's that easy with SVN.&lt;br/&gt;&lt;br/&gt;Oh well....more later.&lt;br/&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><author>noreply@blogger.com (Dan Pupek)</author></item></channel></rss>