<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Blake Caraway</title>
        <link>http://geekswithblogs.net/bcaraway/Default.aspx</link>
        <description />
        <language>en-US</language>
        <copyright>Blake Caraway</copyright>
        <managingEditor>blake@caraways.net</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <image>
            <title>Blake Caraway</title>
            <url>http://geekswithblogs.net/images/RSS2Image.gif</url>
            <link>http://geekswithblogs.net/bcaraway/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Headspring Systems</title>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/07/08/123666.aspx</link>
            <description>&lt;p&gt;I recently took the opportunity to join Headspring Systems, the premier Agile software consulting practice here in Austin, TX. I'm very excited about getting to work with an incredibly talented Headspring team and look forward to helping the company continue it's fast-paced growth!&lt;/p&gt;  &lt;p&gt;Headspring Systems   &lt;br /&gt;&lt;a href="http://www.headspringsystems.com"&gt;www.headspringsystems.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123666"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123666" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/123666.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/07/08/123666.aspx</guid>
            <pubDate>Wed, 09 Jul 2008 02:51:12 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/123666.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/07/08/123666.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/123666.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/123666.aspx</trackback:ping>
        </item>
        <item>
            <title>WCF Client Proxy and IDisposable Issues</title>
            <category>WCF</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx</link>
            <description>&lt;p&gt;This issue has been known since late last year, but there doesn't seem to be too much noise about it in the blogosphere. No doubt as we continue to create and consume more and more WCF services, troubleshooting configuration issues has become a common occurrence (can I get an amen?). Keep this in mind the next time you add a new service reference to your .Net projects.&lt;/p&gt;
&lt;p&gt;Here's the scoop: when using a WCF proxy client object, simply having the typical Dispose() method fire off does not ensure the object is cleaned up. You see, Dispose() calls the Close() method, which actually makes a call across the wire to tell the remote service to do session clean-up before shutting down. We all know and respect the &lt;a href="http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing"&gt;fallacies of distributed computing&lt;/a&gt;, right? Successfully disposing our client proxy involves a trip across the network (our particular situation here deals mainly with the two fallacies involving reliable networks and the whole latency thing). When the method call for session clean up to the server doesn't go as expected, Close() fires an exception and the client proxy is not disposed. When this happens, the Abort() method actually needs to be called in order to correctly clean up the object's state.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/WCFClientProxyandIDisposableIssues_937/disposeNoWorkie_5.jpg"&gt;&lt;img width="640" height="71" border="0" style="border-width: 0px;" alt="Dispose No Workie" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/WCFClientProxyandIDisposableIssues_937/disposeNoWorkie_thumb_1.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Correctly disposing the proxy object won't work if everything doesn't go well with the remote call during Close().&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I found a couple good blog posts that discuss the issue in more detail with helpful solutions. Check them out:&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx" href="http://www.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx"&gt;http://www.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title="http://geekswithblogs.net/DavidBarrett/archive/2007/11/22/117058.aspx" href="http://geekswithblogs.net/DavidBarrett/archive/2007/11/22/117058.aspx"&gt;http://geekswithblogs.net/DavidBarrett/archive/2007/11/22/117058.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Hopefully this knowledge will help prevent needless service debugging and troubleshooting as we try to quickly develop working software. So be mindful of the fact that we often need to pay special attention to how we use WCF client proxy objects.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123622"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=123622" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/123622.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx</guid>
            <pubDate>Mon, 07 Jul 2008 05:48:18 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/123622.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/07/06/123622.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/123622.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/123622.aspx</trackback:ping>
        </item>
        <item>
            <title>Change Is Good...You Go First</title>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/05/28/122469.aspx</link>
            <description>&lt;p&gt;I've picked up more experience recently in dealing with the issues that face a company as it deals with the pains of growth. It's a phase of business that all successful companies have to go through at some point. Moving from "survival focused startup" to "growth oriented performer" exerts some interesting forces on a company.&lt;/p&gt;  &lt;p&gt;In a company's early years, the "startup mentality" is in full effect. Some qualities of this mentality are as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;People's time and effort are cheap...therefore Heroes are required &lt;/li&gt;    &lt;li&gt;Little to no focus on process, much less process improvement &lt;/li&gt;    &lt;li&gt;Most/all time is spent "Keeping the lights on" &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;When a company begins enjoying some initial sustained success, many of these qualities are validated and even reinforced. Indeed some or all of these qualities are often described as &lt;strong&gt;reasons&lt;/strong&gt; for initial success or even perceived as part of a company's competitive advantage. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Heroes Work Here&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As customers and their needs increase, the approaches in dealing with these demands begin to strain the current organizational capabilities.  Unless changes are made, working &lt;em&gt;harder &lt;/em&gt;is the primary if not only method of maintaining the same level of success. Working harder takes on different forms. This is where we typically witness things like &lt;a href="http://bill-poole.blogspot.com/2008/05/swivel-chair-integration-is-bad.html"&gt;swivel chair integration&lt;/a&gt;, as well as entire organizations that accept (indeed relish) manual and tedious processes. These processes involve the usage of half-baked and misguided technical solutions, where business people, IT nerds, and maybe a warehouse worker or two constantly engage in unrepeatable, heroic efforts to help keep normal day to day business going.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Grow Up and Work Smarter (Duh)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So how can a company mature? I think one of the most important qualities about a company's culture is it's &lt;strong&gt;commitment&lt;/strong&gt; &lt;strong&gt;to&lt;/strong&gt; &lt;strong&gt;continuous improvement&lt;/strong&gt;. At every level there should be an almost hostile aversion to inefficiency and waste. If you have worked on Agile teams before, you know many of the XP practices promote the concept of helping to eliminate waste through consistent feedback on progress of work being done. Through constant team collaboration Agile teams have a much greater ability to frequently assess their performance to ensure the optimal amount of business value is being realized as early as possible, taking every opportunity to eliminate things that don't deliver value. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMaturity_DE0E/lundberg_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="176" alt="lundberg" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMaturity_DE0E/lundberg_thumb.jpg" width="204" border="0" /&gt;&lt;/a&gt;&lt;a href="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMaturity_DE0E/good_for_company_10.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="80" alt="Lundberg says: Ask yourself...Is This Good For The Company?" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMaturity_DE0E/good_for_company_thumb_3.jpg" width="404" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&lt;em&gt;Lundberg says: Ask yourself...Is This Good For The Company?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Clearly this drive for excellence isn't only reserved for technology teams. EVERY person in each organization within a company should be encouraged and inspired to continuously improve how they provide value to the company. It sounds silly, but it's apparent we have to continue to remind ourselves to work smarter, not harder. When we begin to value our time and effort, the repetitive and tedious tasks become more apparent and should be addressed by either instilling a more defined process around these tasks (to help reduce risk) or simply improve the work being done (or even eliminate altogether) by using a combination of process and technology to achieve efficiency through automation.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Yipe!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This part might scare some employees because they may perceive the effort and toil of carrying out business functions by working harder (rather than smarter) as their main value add to the company. This is where good management really earns the country club membership fees because this is an opportunity to promote and inspire change within his or her organization by helping direct reports to break free of the usual toil and instead visualize and transform a particular business function to better align with the company's long term vision and goals (presuming they have a long term vision and goals).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Company Maturity Is a Difficult Process&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Difficult changes facing a growing company is one of the main reasons for turnover in an organization at this stage. Some people yearn to work in "startup mode". The prospect of high risk, high reward with a tactical approach brings out the best in some. Others might want a more controlled, repeatable work environment where all efforts are measured and the perceived speed of the organization might be more stable. Promoting and inspiring this change isn't easy. Human nature is involved. If the majority of a work force is too set in its heroic ways and unable or unwilling to think differently and adapt, a change in personnel might be necessary in order to mature effectively. By the same token, if real change is being blocked by management at any level, a change in leadership may be called for.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="276" alt="farley" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMaturity_DE0E/farley_3.jpg" width="381" border="0" /&gt; &lt;/p&gt;  &lt;p align="center"&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Bring It&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Regardless of how high or low on the organization chart you might be, make every effort to &lt;strong&gt;foster an environment of continuous improvement&lt;/strong&gt;. Be mindful of wasteful behaviors and/or processes. Be a leader, inspire positive change, and see what happens.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122469"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=122469" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/122469.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/05/28/122469.aspx</guid>
            <pubDate>Thu, 29 May 2008 04:55:19 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/122469.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/05/28/122469.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/122469.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/122469.aspx</trackback:ping>
        </item>
        <item>
            <title>Twitter</title>
            <category>Misc</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/04/19/121389.aspx</link>
            <description>&lt;p&gt;I wanted to keep up with the &lt;a href="http://altdotnet.org/events/seattle"&gt;altnet conference&lt;/a&gt; in Seattle this weekend so I took the time to create &lt;a href="http://twitter.com/bcaraway"&gt;my twitter account&lt;/a&gt; - &lt;a href="http://twitter.com/bcaraway" title="http://twitter.com/bcaraway"&gt;http://twitter.com/bcaraway&lt;/a&gt; -as I've been tracking the &lt;a href="http://hashtags.org/tag/altdotnet/"&gt;altdotnet tweets&lt;/a&gt;. This is a great way to communicate. Very Web 2.0.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121389"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121389" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/121389.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/04/19/121389.aspx</guid>
            <pubDate>Sat, 19 Apr 2008 21:59:26 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/121389.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/04/19/121389.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/121389.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/121389.aspx</trackback:ping>
        </item>
        <item>
            <title>Mike Cohn Coming To Austin</title>
            <category>Agile</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121350.aspx</link>
            <description>&lt;p&gt;Mike Cohn, founder of Mountain Goat Software and long-time vocal proponent of Scrum is coming to Austin next month as part of the Agile Austin Distinguished Speaker Series. Mike is the author of &lt;a href="http://www.amazon.com/Agile-Estimating-Planning-Robert-Martin/dp/0131479415/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1208528720&amp;amp;sr=8-1"&gt;Agile Estimating and Planning&lt;/a&gt; and &lt;a href="http://www.amazon.com/User-Stories-Applied-Development-Addison-Wesley/dp/0321205685/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1208528749&amp;amp;sr=8-1"&gt;User Stories Applied for Agile Software Development&lt;/a&gt;, among other development/programming books. He's served as technology executive and helped with the adoption of agile processes at various companies.&lt;/p&gt;
&lt;p&gt;If you are working on agile teams right now or are just interested in learning about agile methods and agile company adoption and are close enough to Austin on May 8th, then be sure to attend this event for some very highly valuable information. The title of Mike's talk is 'Succeeding With Agile: A Guide to Transition' and will cover such topics as why agile transitions fail as well as discussing several specific ways of getting started with agile and the advantages of each.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Date: &lt;/strong&gt;May 8, 2008 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time: &lt;/strong&gt;6:00 - 8:00 PM &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Location:&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;q=5930+Middle+Fiskville+Rd.&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=58.555544,108.984375&amp;amp;ie=UTF8&amp;amp;ll=30.323786,-97.710922&amp;amp;spn=0.007909,0.013304&amp;amp;z=16&amp;amp;iwloc=addr&amp;amp;om=1"&gt;Austin Community College, Highland Business Center Campus, Room 201,0, 5930 Middle Fiskville Rd.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;q=5930+Middle+Fiskville+Rd.&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=58.555544,108.984375&amp;amp;ie=UTF8&amp;amp;ll=30.323786,-97.710922&amp;amp;spn=0.007909,0.013304&amp;amp;z=16&amp;amp;iwloc=addr&amp;amp;om=1"&gt;&lt;/a&gt;&lt;/p&gt;
See all of the event information at &lt;a href="http://www.agileaustin.org."&gt;http://www.agileaustin.org.&lt;/a&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121350"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121350" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/121350.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121350.aspx</guid>
            <pubDate>Fri, 18 Apr 2008 14:49:46 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/121350.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121350.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/121350.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/121350.aspx</trackback:ping>
        </item>
        <item>
            <title>Company Morale Improves As a Result of Break-In</title>
            <category>Misc</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121347.aspx</link>
            <description>&lt;p&gt;There was a break-in at our company the other night. We had some nice products on visible display through the front door in our office's small reception area that evidently made for an easy target of a smash and grab operation. The entire caper was recorded on our internal security video system. The perpetrators (one inside taking things to the door, the other just outside receiving) broke the glass out of the front door and proceeded to carried out the items on display.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
At one point during the ~1 minute heist, the thief looked into the conference room just off the reception area near the front door and noticed an LCD projector on the table. He quickly ran into the conference room, grabbed the projector, and dragged it from the building by its cabling.&lt;/p&gt;
&lt;p align="center"&gt;&lt;img width="311" height="177" border="0" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/CompanyMoraleImprovesAsaResultofBreakIn_97D7/breakin_3.jpg" alt="break-in" style="border-width: 0px;" /&gt; &lt;/p&gt;
&lt;p&gt;The buzz in the office the next morning was mainly around the fact that our really crappy LCD projector was now gone and that we finally had the necessary justification to purchase a new projector actually good at, you know, projecting video images and displaying visual information.&lt;/p&gt;
&lt;p&gt;Thanks, degenerate criminals!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121347"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121347" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/121347.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121347.aspx</guid>
            <pubDate>Fri, 18 Apr 2008 13:38:14 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/121347.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/04/18/121347.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/121347.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/121347.aspx</trackback:ping>
        </item>
        <item>
            <title>Wow, We ARE Agile...or Choose Your Partner Wisely</title>
            <category>Agile</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2008/04/10/121167.aspx</link>
            <description>&lt;p&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;New Partner&lt;/strong&gt;       &lt;br /&gt;
Our company is growing and the processes that support our e-commerce efforts must be ready to grow along with the business. Looking to ensure our abilities to effectively manage this growth, we recently decided to form a strategic partnership with another outfit that will develop, operate, and maintain our various e-commerce sites, as well as replace our internal sales and customer service applications. You could say our company's strength is in quickly executing our e-commerce, marketing, and merchandising initiatives. In other words, we are &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_as_a_Service"&gt;&lt;font face="Tahoma"&gt;SaaS&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;'ing our core competencies and processes.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   &lt;br /&gt;
&lt;font face="Tahoma"&gt;&lt;strong&gt;Background        &lt;br /&gt;
&lt;/strong&gt;All of our company's technology is totally home grown (except for the usage of Microsoft Commerce Server which our sites were built upon). Up to this point, our internal IT staff has developed, operated, and maintained all of our e-commerce sites. We've also created from scratch the entire suite of applications and tools that serve as the back end operations to our business.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   &lt;br /&gt;
&lt;font face="Tahoma"&gt;&lt;strong&gt;Kick Off&lt;/strong&gt;       &lt;br /&gt;
Our partner arrived at our offices last week to officially "kick off" the relationship by discussing the first project we will work together on. The project manager began things by presenting their engagement model and how they run projects with each of their clients. The slide in his deck that helped describe their project process was a very nice looking diagram that appeared to be split up into various phases that included sequential steps, all flowing in a downhill manner, marching toward a completion date ~3 months into the future.&lt;em&gt; &lt;/em&gt;&lt;/font&gt;&lt;/p&gt;
&lt;em&gt;
&lt;p&gt;Wait a minute....      &lt;br /&gt;
    hold on here....is that...       &lt;br /&gt;
        yes...I think it is...       &lt;br /&gt;
            that appears to be a....       &lt;br /&gt;
                Waterfall!!!!!   NOOOOOO!!!!!!&lt;/p&gt;
&lt;/em&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt;Their plan included a 3 month project schedule with a ~1 month "iteration" somewhere in the middle. This followed an exhaustive requirements and UI wireframe gathering period where we would &lt;em&gt;sign off&lt;/em&gt; on the deliverables. After we &lt;span style="text-decoration: line-through;"&gt;waive our ability to change our mind&lt;/span&gt; sign off on the requirements, our partner would then go away (this is the iterative part, I guess?) and do the work. At the end of this period, the web site (that's the main deliverable that can be demonstrated) would be unveiled to us and at that point the initial requirements would be open for modification and all bugs will be worked on and fixed until the day the first site launches. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="244" height="196" border="0" align="left" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/WowWeAREAgile.orChooseYourPartnerWisely_A83C/deathMarch_3.jpg" alt="Death March!" style="border-width: 0px; margin: 0px 15px 10px 0px;" /&gt; &lt;/p&gt;
&lt;p&gt;   &lt;br /&gt;
&lt;font face="Tahoma"&gt;While this was being explained to us, our team (which included all the main business owners within my company as well as a few of us technical guys) immediately began asking about feedback, backlogs, demonstration of working software during the project, communication channels, etc. The responses to our inquiries** served to paint a very clear picture regarding just how Agile our group has been in delivering business value over the past year....and how non-Agile our partner seems to be. At that point, I think we all recognized how good we had it while working as an internal team, co-located and committed to a common purpose for a company we all worked for. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width="404" height="296" border="0" align="right" src="http://geekswithblogs.net/images/geekswithblogs_net/bcaraway/WindowsLiveWriter/WowWeAREAgile.orChooseYourPartnerWisely_A83C/weAreAgile_AllAboutTeam_2.jpg" alt="We ARE Agile!!! It's All About TEAM" style="border-width: 0px; margin: 0px 0px 0px 10px;" /&gt;     &lt;br /&gt;
&lt;font face="Tahoma"&gt;&lt;strong&gt;We ARE Agile&lt;/strong&gt;       &lt;br /&gt;
Our attempts at delivering working software internally over the past year have followed the Agile/Scrum process. We very much believe in and implement the tenants of the &lt;/font&gt;&lt;a href="http://agilemanifesto.org/"&gt;&lt;font face="Tahoma"&gt;Agile Manifesto&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;. We communicate. We adapt. We don't lock in our stakeholders to agreements, statements, or requests made weeks(months!) in the past. Key implementers don't go away and create solutions for weeks at a time with no customer interaction. We are open and available, not hidden away.We work at a predictable pace.Once we started holding daily stand-ups and displaying our sprint burndowns, our stakeholders became addicted to the constant feedback they receive on the progress of work being completed and business value provided. When we voiced the concerns with our new partner, the response we received was "We don't work that way, but we'll see what we can do...".&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;font face="Tahoma"&gt;&lt;strong&gt;Partnership? -- Lessons Learned&lt;/strong&gt;       &lt;br /&gt;
Right from the beginning, the relationship can be seen as adversarial, due mainly to a stark contrast in expected communication patterns and a drastic change in how business solutions are collaborated on and delivered for our company. When you ask someone to &lt;em&gt;sign off&lt;/em&gt; on something, that's an agreement and a waiver of sorts. That's definitely not a partnership from the outset. It's a transaction.       &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt;Please note that I'm not claiming ultimate demise on this new partnership. Clearly, this doesn't mean everything won't work out in the end as very capable professionals at both companies will no doubt do whatever it takes to make this thing succeed. However, it's a tough thing for a company like ours to become pretty good at working in an Agile manner and then turn over implementation to another team from another company in another state that doesn't value the same things as we do.      &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt;It's clear that any business today will need to have a solid strategy for how to effectively leverage technology to achieve it's vision. When evaluating these strategic options that include partnering with another company or consulting firm, it's VERY important to keep in mind your company/team culture to ensure that the team concept is not lost in the shuffle. Culture in the situation described in this post means 'the processes, methods, and communication patterns that allow a team to get things done'. Mismatches in culture between companies and teams brings more obstacles to an already difficult task.      &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt;&lt;strong&gt;Feedback&lt;/strong&gt;       &lt;br /&gt;
I'd like to know...how do you think strategic technology partnerships should operate today? What are your success/failure stories? Is it too much to expect third party vendors to adapt to their clients' way of working/culture? What are reasonable expectations here?       &lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Tahoma"&gt;** Both the project manager and the technical architect from our partner expressed their company's inability to easily create a tenant's (that's us) environment in isolation so 1) at any moment we can easily see the progress on the deliverables and 2) it can be tested, among the other benefits of having the capability to automate environment/application deployments.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121167"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=121167" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/121167.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2008/04/10/121167.aspx</guid>
            <pubDate>Thu, 10 Apr 2008 17:31:34 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/121167.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2008/04/10/121167.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/121167.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/121167.aspx</trackback:ping>
        </item>
        <item>
            <title>How Firefox Handles Empty SRC tags</title>
            <category>ASP.Net</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2007/08/24/114945.aspx</link>
            <description>&lt;p&gt;I ran into a crazy issue while working on my ASP.Net 2.0 application in Firefox this week and thought I'd share...&lt;/p&gt;
&lt;p&gt;When a certain ASPX page completed rendering and emitted it's final markup to the browser, I noticed the status bar read 'Done' for an instant, but then immediately changed to 'Waiting for localhost...' again. It definitely seemed as if the page was being requested twice. I immediately looked at FireBug to see what was loading, and indeed the same page showed up twice in the 'Net' listing. To see it in action, I ran the site in DEBUG mode and put a break on Page_Load. Sure enough, the page WAS being requested twice. IE(7) worked just fine. It was not behaving in this odd manner, so I set out to figure out what was causing this strange behavior in Firefox.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="4"&gt;Two Browsers - Two Different Behaviors&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;After many Google searches, I finally found a few message board posts talking about pages being loaded twice. It seems that an empty src attribute (like in an &amp;lt;img&amp;gt; tag) will cause this undesirable behavior in Firefox. The browser's rendering engine sees an empty src attribute and tries to put the current page name (URI) in it's place.&lt;/p&gt;
&lt;p&gt;So, when Firefox sees this...&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;IMG&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="fooImage"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;=""&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;...it substitutes the empty attribute value like this...&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font size="3"&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;IMG&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="fooImage"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="http://localhost/foo/bar.aspx"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Inserting the current page within the src attribute will of course cause the browser to request the page once again. That's why I was seeing the 'waiting for localhost...' browser status message fire up again after the page had already visually rendered. IE (7) handles the empty src attribute by adding '/null' rather than the actual page name, like this...&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&lt;font size="3"&gt;&lt;strong&gt;IE7&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;IMG&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="fooImage"&lt;/span&gt; &lt;span class="attr"&gt;src&lt;/span&gt;&lt;span class="kwrd"&gt;="http://localhost/foo/null"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="4"&gt;AJAX Extender Control To Blame&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;The reason this strange behavior started to occur was because I recently began using the ASP.Net AJAX DropDown extender on the problematic ASPX page in question. The DropDown extender has several properties that you can configure to fit your display needs. One of these properties is the 'DropArrowImageUrl'. Since I didn't have the need to override this image, I didn't assign a value to this property. When ASP.Net renders the image tag for this control, the src attribute is left empty because I didn't specify a particular image.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="4"&gt;The Fix (Hack)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;It was clear that some sort of valid image needed to be set on this control in order to prevent Firefox from requesting the page twice. So we plugged in a 1 pixel transparent image and the problem went away. I've provided a few links below to a good blog post and a couple forum threads that discuss the issue and helped point me to a solution. In the blog post there's a comment about the URI specification and how Firefox seems to adhere to the specification - which doesn't really make sense for &amp;lt;img&amp;gt; tags.&lt;/p&gt;
&lt;p&gt;Either way, it's silly that I had to go through this in order to prevent a (potentially expensive - depending on the page in question) needless page request. The AJAX extender controls have some nice behaviors that can really help out your UI development. But since these controls are fairly new, we should be mindful of potential side effects our sites may experience due to the fact that these controls probably have not been as rigorously tested as the standard ASP.Net controls have.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Links&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://brian.pontarelli.com/2006/05/02/is-your-browser-requesting-a-page-twice/" title="http://brian.pontarelli.com/2006/05/02/is-your-browser-requesting-a-page-twice/"&gt;http://brian.pontarelli.com/2006/05/02/is-your-browser-requesting-a-page-twice/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://forums.asp.net/t/978268.aspx?PageIndex=2" title="http://forums.asp.net/t/978268.aspx?PageIndex=2"&gt;http://forums.asp.net/t/978268.aspx?PageIndex=2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://forums.mozillazine.org/viewtopic.php?p=3022038&amp;amp;" title="http://forums.mozillazine.org/viewtopic.php?p=3022038&amp;amp;"&gt;http://forums.mozillazine.org/viewtopic.php?p=3022038&amp;amp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114945"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114945" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/114945.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2007/08/24/114945.aspx</guid>
            <pubDate>Fri, 24 Aug 2007 20:30:20 GMT</pubDate>
            <comments>http://geekswithblogs.net/bcaraway/archive/2007/08/24/114945.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/114945.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/114945.aspx</trackback:ping>
        </item>
        <item>
            <title>Decouple Your Code For Testability</title>
            <category>Design Patterns</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2007/08/12/114591.aspx</link>
            <description>&lt;p&gt;&lt;font size="2" face="Verdana"&gt;I've received a handful of comments/questions surrounding part of the code sample from my &lt;/font&gt;&lt;a href="http://geekswithblogs.net/bcaraway/archive/2007/06/02/112942.aspx"&gt;&lt;font size="2" face="Verdana"&gt;previous post&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;The comments I received have to do with the few lines of code in the Authentication WebService that included a custom interface and a call to a third party tool. Here's the code in question:&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Authentication : WebService&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; IWebContext _webContext = ObjectFactory.GetInstance&amp;lt;IWebContext&amp;gt;();&lt;br /&gt;&lt;br /&gt;    [WebMethod]&lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsLoggedIn()&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;._webContext.IsUserAuthenticated;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;/font&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;font face="Verdana"&gt;Create An Abstraction&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;IWebContext is an interface I created for use within my web site that abstracts calls to lower level ASP.Net stuff like QueryString, Session, and Identity thru the HTTPContext object. Often I want to have a testable object in an ASP.Net web project that will depend on something at the ASP.Net lower level. The way to put a seam in my code that decouples the object I want to test from the ASP.Net stuff is to abstract it away...into something like IWebContext. Here's the IWebContext interface definition:&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IWebContext&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsUserAuthenticated { get; }&lt;br /&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Clear();&lt;br /&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Save(&lt;span class="kwrd"&gt;string&lt;/span&gt; key, &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;    &lt;span class="kwrd"&gt;object&lt;/span&gt; Get(&lt;span class="kwrd"&gt;string&lt;/span&gt; key);&lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; GetQuerystringValue(&lt;span class="kwrd"&gt;string&lt;/span&gt; key);&lt;br /&gt;    &lt;span class="kwrd"&gt;void&lt;/span&gt; Set(&lt;span class="kwrd"&gt;string&lt;/span&gt; s, &lt;span class="kwrd"&gt;object&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;pre class="csharpcode"&gt; &lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;&lt;font face="Verdana"&gt;Dependency Inversion / Inversion of Control&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;Regarding the ObjectFactory.GetInstance&amp;lt;IWebContext&amp;gt;(); line of code -- to help with decoupling, I use the Dependency Inversion Principle (DIP). Another name for DIP is Inversion of Control (IoC). The DIP has been proposed by Robert C. Martin. It states that:&lt;/font&gt; &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;font size="2"&gt;High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. &lt;/font&gt;&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;In short, strive to make your classes depend upon abstractions, not concretions. When you see the keyword 'new' - that's a tight coupling to a specific concrete type. If you cannot easily isolate an object from it's dependencies, and if this makes it more difficult to test, then that's a tight coupling that needs to be addressed. You need to &lt;em&gt;invert &lt;/em&gt;the dependencies.&lt;/font&gt; &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;  &lt;/font&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;font face="Verdana"&gt;The Flavors of DIP - Inverting with StructureMap&lt;/font&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;There are two main flavors of Dependency Inversion - Dependency Injection and Service Location. Beyond that, Dependency Injection has two main forms - Constructor Injection and Setter Injection. Constructor Injection is when an object is instantiated with a dependency. Setter Injection is when a dependency is provided through some sort of setting method/property.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;The other main form of Dependency Injection is Service Location. Using a method like StructureMap's ObjectFactory.GetInstance() is another way to locate a service/dependency. In the code sample, the ObjectFactory object lives in a third party tool called StructureMap ( &lt;a href="http://structuremap.sourceforge.net"&gt;http://structuremap.sourceforge.net&lt;/a&gt; ). We ask StructureMap.ObjectFactory to return an instance of a certain type (i.e. IWebContext). This effectively inverts the control of resolving dependencies from the object needing to use the dependency to a third party, adhering to the DIP, and promoting looser object coupling.&lt;/font&gt;&lt;font size="2" face="Verdana"&gt; &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;If you are interested in learning more about the open source project StructureMap, visit the project page on SourceForge at &lt;/font&gt;&lt;a href="http://structuremap.sourceforge.net/"&gt;&lt;font size="2" face="Verdana"&gt;http://structuremap.sourceforge.net/&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Verdana"&gt;. I won't try and detail all of the implementation details of StructureMap, but here's a quick rundown of the basic usage. &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;StructureMap allows us to decorate abstractions with a [PluginFamily] attribute, as well as a [Pluggable] attribute on the types that implement the abstraction. When a call is made to ObjectFactory.GetInstance&amp;lt;IWebContext&amp;gt;(), StructureMap finds the classes that implement the type being requested and resolves, instantiates, and returns the correct concrete instance. Let's look at an example: &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;strong&gt;Interface:&lt;/strong&gt; This is the IAccountRepository interface, decorated with the &lt;em&gt;PluginFamily&lt;/em&gt; attribute and key name of 'Default'. &lt;/font&gt;&lt;/font&gt; &lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[PluginFamily(&lt;span class="str"&gt;"Default"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IAccountRepository&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    BillToAccount[] GetBillingAccountsForUser(User user);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    ShipToAccount GetShipToAccount(AccountIdentifier accountIdentifier);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    BillToAccount GetBillToAccount(AccountIdentifier accountIdentifier);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;strong&gt;Default Implementation:&lt;/strong&gt; Here we have an implementation of the IAccountRepository interface decorated with the &lt;em&gt;Pluggable&lt;/em&gt; attribute and a key name of 'Default'. &lt;/font&gt;&lt;/font&gt; &lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[Pluggable(&lt;span class="str"&gt;"Default"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AccountRepository : AccountRepositoryBase&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ...&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Verdana"&gt;&lt;strong&gt;Cached Implementation:&lt;/strong&gt; Here we have another implementation of the IAccountRepository interface decorated with the &lt;em&gt;Pluggable&lt;/em&gt; attribute and a key name of 'Cached'. &lt;/font&gt;&lt;/font&gt; &lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[Pluggable(&lt;span class="str"&gt;"Cached"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CachedAccountRepository : IAccountRepository&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ...&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;When code needs to make use of a dependency like IAccountRepository, it can ask ObjectFactory for the default instance in this way: &lt;/font&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Consolas"&gt;_accountRepository = ObjectFactory.GetInstance&amp;lt;IAccountRepository&amp;gt;();&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;You can have StructureMap return specific implementations of IAccountRepository in a couple easy ways: you can set the &lt;em&gt;PluginFamily &lt;/em&gt;attribute's key on the interface to match that of the desired "default" &lt;em&gt;Pluggable&lt;/em&gt; instance like this: &lt;/font&gt; &lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[PluginFamily(&lt;span class="str"&gt;"Cached"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IAccountRepository&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ...&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;...Or you may ask for a particular instance by name, like this: &lt;/font&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2" face="consol"&gt;_cachedAccountRepository = ObjectFactory.GetNamedInstance&amp;lt;IAccountRepository&amp;gt;(&lt;span class="str"&gt;"Cached"&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;   &lt;/p&gt;
&lt;p&gt;&lt;font size="3" face="Verdana"&gt;&lt;strong&gt;Dynamic Behavior / Configuration&lt;/strong&gt;&lt;/font&gt;  &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;StructureMap also allows you to specify type configurations (and all sorts of other behaviors your system might need) in a config file. Some may prefer the config file method because it's a little more obvious (in a file, rather than living inside the code at various locations) as to what objects implement certain interfaces and what the default behavior is for a particular abstraction. Having these settings in a config file can also be helpful when you have an automated build that might require different system behavior (i.e. different implementation of various abstractions) based on the particular environment you are deploying to or maybe the state of an entire subsystem.&lt;/font&gt;  &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;When deploying your system, behavior can be switched around by having your build tool like NAnt issue an 'XMLPoke' command to change key names inside the StructureMap.config file. Also, your application may need to behave differently based on some runtime situations like database or service availability (think 'offline mode'). This can easily be achieved by using a tool like StructureMap. Simply request a different implementation of a type using the '&lt;em&gt;ObjectFactory.GetNamedInstance'&lt;/em&gt; method as shown above and your system can gracefully adapt to any unexpected environmental situation. &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;  &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;Hopefully I've shown here the importance of abstracting away the factors that can make code more difficult to get under test, as well as a couple mechanics on how to approach the problem. &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;  &lt;/font&gt; &lt;/p&gt;
&lt;p&gt;&lt;font size="2" face="Verdana"&gt;/bc&lt;/font&gt;  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="2" face="Consolas"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114591"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114591" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/114591.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2007/08/12/114591.aspx</guid>
            <pubDate>Sun, 12 Aug 2007 17:30:45 GMT</pubDate>
            <comments>http://geekswithblogs.net/bcaraway/archive/2007/08/12/114591.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/114591.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/114591.aspx</trackback:ping>
        </item>
        <item>
            <title>AJAX UpdatePanel Callback And Expired Forms Auth Ticket</title>
            <category>ASP.Net AJAX</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2007/06/02/112942.aspx</link>
            <description>&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;I have an UpdatePanel on a page within a web application that is using Forms Authentication. The UpdatePanel callback executes as a result of a custom JavaScript function that calls __doPostback.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;If a user loads the page in question, but then allows the forms auth ticket to expire on the server due to inactivity (i.e. goes to lunch, goes home for the day, etc) and then interacts with the web page to fire off the UpdatePanel callback, the partial postback fails b/c the forms auth ticket is expired. The partial postback is short-circuited b/c the forms authentication has done its job and has issued the redirect to the login.aspx page. The UpdatePanel does not handle this. Instead, it tries to parse the page response which is directing the browser to redirect. AJAX (thru the ScriptManager/UpdatePanel) throws an error about not being able to parse the response.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Obviously, I would rather detect that the forms auth expired BEFORE attempting the __doPostback and have the user redirected to the login page to authenticate once again. What I needed was a way to see (from the browser) if a user had a valid forms auth cookie on the server or not.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;I was able to find a solution by using the ASP.NET 2.0 AJAX Extensions that enable the seamless proxy generation for Web services for client-side JavaScript running from the browser.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Here's what I did:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;strong&gt;Web Service&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Create a web service and decorate it with the [ScriptService] attribute. This declares to ASP.NET that it should provide a JavaScript proxy class for use in calling the web service. After doing this, you can then call this web service directly (append /js to the end) in the browser to see the generated JavaScript proxy code necessary to invoke the web method on the server from client-side script.&lt;/span&gt;&lt;/p&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;code&gt;    [&lt;span style="color: rgb(43, 145, 175);"&gt;ScriptService&lt;/span&gt;]&lt;/code&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    [&lt;span style="color: rgb(43, 145, 175);"&gt;WebService&lt;/span&gt;(Namespace = &lt;span style="color: rgb(163, 21, 21);"&gt;"http://tempuri.org/"&lt;/span&gt;)]&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    [&lt;span style="color: rgb(43, 145, 175);"&gt;WebServiceBinding&lt;/span&gt;(ConformsTo = &lt;span style="color: rgb(43, 145, 175);"&gt;WsiProfiles&lt;/span&gt;.BasicProfile1_1)]&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    [&lt;span style="color: rgb(43, 145, 175);"&gt;ToolboxItem&lt;/span&gt;(&lt;span style="color: blue;"&gt;false&lt;/span&gt;)]&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Authentication&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;WebService&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    {&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;IWebContext&lt;/span&gt; _webContext = &lt;span style="color: rgb(43, 145, 175);"&gt;ObjectFactory&lt;/span&gt;.GetInstance&amp;lt;&lt;span style="color: rgb(43, 145, 175);"&gt;IWebContext&lt;/span&gt;&amp;gt;();&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        [&lt;span style="color: rgb(43, 145, 175);"&gt;WebMethod&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; IsLoggedIn()&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        {&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;this&lt;/span&gt;._webContext.IsUserAuthenticated;&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        }&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    }&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;strong&gt;Service Reference&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;Next add a ServiceReference within the ScriptManager pointing to the web service you just created. Just by doing this you should be able to load the page that you &lt;em&gt;AJAX-ified&lt;/em&gt; in your browser and see the generated JavaScript code in the page source that will enable the page to "phone home" to the web service. You will see that to call the web service method, the JavaScript function will take three arguments: a success method callback, a failure method callback, and a variable to hold something useful from the calling context (note: this context info is NOT passed across the wire, it's just "forwarded" on to the client side callback functions after the call completes).&lt;/span&gt;&lt;/p&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span&gt;ScriptManager&lt;/span&gt; &lt;span style="color: red;"&gt;ID&lt;/span&gt;&lt;span style="color: blue;"&gt;="Manager"&lt;/span&gt; &lt;span style="color: red;"&gt;runat&lt;/span&gt;&lt;span style="color: blue;"&gt;="server"&lt;/span&gt; &lt;span style="color: red;"&gt;EnablePartialRendering&lt;/span&gt;&lt;span style="color: blue;"&gt;="true"&lt;/span&gt; &lt;span style="color: red;"&gt;EnablePageMethods&lt;/span&gt;&lt;span style="color: blue;"&gt;="true"&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Services&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span&gt;ServiceReference&lt;/span&gt; &lt;span style="color: red;"&gt;path&lt;/span&gt;&lt;span style="color: blue;"&gt;="~/WebServices/Authentication.asmx"&lt;/span&gt; &lt;span style="color: red;"&gt;InlineScript&lt;/span&gt;&lt;span style="color: blue;"&gt;="true"&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Services&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;asp&lt;/span&gt;&lt;span style="color: blue;"&gt;:&lt;/span&gt;&lt;span&gt;ScriptManager&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;After this, I just wrote the necessary JavaScript methods to call the proxy method that handles the call across the wire. In my code below, the loadSKUs() method is the entry point. This method makes the call across the wire, indicating the callback methods that should fire after completion. In the successfulAuthCallback() method, the result is inspected to determine if we are still logged in or not. All I'm looking for is a value of 'true' coming back from the call to my WebMethod. If this is the case, then we are still considered to be 'logged in' and I can allow the UpdatePanel to do it's magic. If not, then I tell the entire page to reload b/c it will then be a real/normal full page postback and the normal flow will occur where the forms auth will validate the session and redirect to the login URL or allow the page to proceed normally.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;When we make the async call once the forms auth cookie has expired, the result that comes back is actually the HTML response telling the browser to redirect -- and is the markup that the UpdatePanel was choking on to begin with b/c it didn't know what to do with it -- hence the parser error.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;         function&lt;/span&gt; loadSKUs(selectedProductAndHand) {&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            WebServices.Authentication.IsLoggedIn(successfulAuthCallback, failedAuthCallback, selectedProductAndHand);&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         }&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         &lt;span style="color: blue;"&gt;function&lt;/span&gt; setProductAndHandAndPostBack(selectedProductAndHand)&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;var&lt;/span&gt; hiddenField = $get(hiddenProductAndHandField);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;if&lt;/span&gt; (hiddenField) {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;if&lt;/span&gt; (hiddenField.value != selectedProductAndHand)&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                    hiddenField.value = selectedProductAndHand;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                    __doPostBack(hiddenProductAndHandField,&lt;span style="color: rgb(163, 21, 21);"&gt;''&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         &lt;span style="color: blue;"&gt;function&lt;/span&gt; successfulAuthCallback(isLoggedInResult, selectedProductAndHand)&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;if&lt;/span&gt; (isLoggedInResult == &lt;span style="color: blue;"&gt;true&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                setProductAndHandAndPostBack(selectedProductAndHand);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;else&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            {&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;                &lt;span style="color: green;"&gt;// reload the entire page so the Forms Auth will see that the cookie has expired and redirect to login&lt;/span&gt;                 window.location.reload(&lt;span style="color: blue;"&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         &lt;span style="color: blue;"&gt;function&lt;/span&gt; failedAuthCallback(result, selectedProductAndHand)&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         {&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;            alert(&lt;span style="color: rgb(163, 21, 21);"&gt;"Auth Callback failed: Reason -- "&lt;/span&gt; + result);&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0%; font-size: 9pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: black; margin-right: 0px; font-family: Consolas;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;         }&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;One other thing I had to add in my web.config is add an AJAX HTTP Handler for .asmx files:&lt;/span&gt;&lt;/p&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;add&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;GET,HEAD&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;ScriptResource.axd&lt;/span&gt;"&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions,&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;            Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&lt;/span&gt;"&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: red;"&gt;validate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;false&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;remove&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;path&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;*.asmx&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;add&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;path&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;*.asmx&lt;/span&gt;"&lt;span style="color: blue;"&gt;      &lt;/span&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;System.Web.Script.Services.ScriptHandlerFactory&lt;/span&gt;"&lt;br /&gt;&lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: red;"&gt;validate&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;false&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&amp;gt;      &lt;/span&gt; &lt;/pre&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;httpHandlers&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;So that's it. Now a user won't get an ugly parsing error from AJAX when an async call is made from the client after the forms auth cookie has expired on the server.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;strong&gt;Problem Solved...Final Thought&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;I think this is too involved. I don't think we should be forced to write any custom code to handle the async calls to the server in order for forms auth to work properly within the AJAX space. Shouldn't the partial postback play nicely and handle this situation automatically somehow?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;It's entirely possible I'm missing something here, though. This was a pain to overcome. I Googled extensively and posted a message on the ASP.Net AJAX forum looking for guidance on this issue, but didn't find any help. Please feel free to leave comments if you have solved this same problem -- especially if you have a different/easier solution.&lt;/span&gt;&lt;/p&gt;
&lt;div style="background: white none repeat scroll 0% 50%; font-size: 9pt; color: black; font-family: Consolas; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt; &lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir="ltr" style="background: white none repeat scroll 0% 50%; font-size: 9pt; color: black; margin-right: 0px; font-family: Consolas; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;br /&gt;
&lt;pre xml:space="preserve" style="margin: 0px;"&gt;&lt;span style="color: blue;"&gt;         &lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;
&lt;p class="zoundry_bw_tags"&gt;   &lt;!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com --&gt;   &lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Technorati&lt;/span&gt; : &lt;a rel="tag" class="ztag" href="http://technorati.com/tag/AJAX%20UpdatePanel%20Forms%20Authentication"&gt;AJAX UpdatePanel Forms Authentication&lt;/a&gt;&lt;/span&gt; &lt;br /&gt;
&lt;span class="ztags"&gt;&lt;span class="ztagspace"&gt;Del.icio.us&lt;/span&gt; : &lt;a rel="tag" class="ztag" href="http://del.icio.us/tag/AJAX+UpdatePanel+Forms+Authentication"&gt;AJAX UpdatePanel Forms Authentication&lt;/a&gt;&lt;/span&gt;  &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=112942"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=112942" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/112942.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2007/06/02/112942.aspx</guid>
            <pubDate>Sun, 03 Jun 2007 05:17:39 GMT</pubDate>
            <comments>http://geekswithblogs.net/bcaraway/archive/2007/06/02/112942.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/112942.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/112942.aspx</trackback:ping>
        </item>
        <item>
            <title>Does Your Code Work?</title>
            <category>Rants</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2006/11/01/95828.aspx</link>
            <description>&lt;b&gt;two basic questions&lt;/b&gt;
&lt;br/&gt;
&lt;br/&gt;

It seems silly and awfully fundamental, but ask any professional software developer this question:
&lt;br/&gt;

&lt;ul&gt;&lt;i&gt;Does your code work correctly?&lt;/i&gt;&lt;/ul&gt;

When faced with answering this question, most developers will - and should - undoubtedly reply with a resounding "hell yes, my code works!". Now follow that up by asking another question:
&lt;ul&gt;&lt;i&gt;Can you prove the claim that your code works correctly in the next 10 minutes?&lt;/i&gt;&lt;/ul&gt;

The answer to this second question speaks volumes not only about a developer's skillset, but also the team he or she works with, specifically that team's ability to provide solid business value in a timely 
and efficient manner.
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;  

&lt;b&gt;proving code works: the debugger is not the answer&lt;/b&gt;
&lt;br/&gt;
&lt;br/&gt;

Debugger. The name says it all. It exists so one can fire it up to determine what's going on inside an application line by line b/c the behavior is in question - i.e. there's a bug and you need to determine where it is and what conditions are causing it (duh). If the sole method of determining that your code does (or likely does not) work as expected is by firing up a fully-functional system and actually using the debugger to put the application through its paces by hand, then you are putting your business at risk. It's that simple. The more applications your company has in play, the bigger the risk. Developing - not to mention trying to sustain - business applications in this way is lunacy.
&lt;br/&gt; 
&lt;br/&gt;

You must be able to prove that a particular system component is working before the final product is assembled. In my experience, this is not how the majority of software is developed throughout the industry. Unfortunately, I've seen (and continue to see) too many developers blindly bang out a new feature and then fire up the debugger to step through the code in order to see it in action for the first time, trying to make sure the new feature plays nicely within the application. Why do we accept this risky behavior that continually jeopardizes our business' ability to generate revenue by constantly turning loose half-baked, untested software applications full of goo into the production environment? Why do we then complain about the amount of time spent supporting said goo-filled application, as if we had nothing to do with bringing about this sad state of affairs? 
&lt;br/&gt;
&lt;br/&gt;

Using the debugger as the only code verification method carries with it some of the following bad habits: 

&lt;ul&gt;
&lt;li&gt;FEAR &amp; UNCERTAINTY -- A developer is afraid of the code he just wrote, thus the constant need of stepping into the code and watching it run all the time in a fully functional system.&lt;/li&gt;

&lt;li&gt;WASTED TIME -- Requiring a complete, fully functional, end-to-end application environment on your dev box so you can employ the 'code and debug' method of feature development can take a lot of time to set up just right. Making sure you have a fully-loaded database on your system, live web services running somewhere, a message queuing infrastructure configured and running, and/or maybe even a security/authorization infrastructure in place can take a lot of time to configure and keep in working order -- all so a developer can fire up the application and step through the code to see if it works or (more likely) not.&lt;/li&gt;

&lt;li&gt;GREATER CHANCE OF DEVELOPER ERROR - The manual act of using the debugger to step through code verifying application behavior requires the developer to think about, remember, and reproduce all valid (and invalid) usages of a system component, making sure it can handle all the different imaginable scenarios. Without some sort of test automation, it's almost a certainty the developer will forget to run through one or more scenarios when stepping through the code manually.&lt;/li&gt;&lt;/ul&gt;

I've actually seen developers test entire order systems by hand over a number of days thinking about all the various scenarios that *could* occur, generating actual XML files, waiting for services to pick up said orders, process them into the system, then query data 10 different ways from Sunday to determine SUCCESS or FAILURE. Wow. So now the part of the business that enables revenue generation relies completely on a single developer's memory and uncommon ability to work in this insane manner. Thusly, this developer is the ONLY person on 
the team that knows about this system b/c there's way too much tribal knowledge to share with others.

&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;

&lt;b&gt;testing, testing...is this thing on?&lt;/b&gt;
&lt;br/&gt;
&lt;br/&gt;

A very obvious fix to this problem is, of course, automated testing. By supporting our code with unit (written before the code - i.e. Test Driven), integration, and user-acceptance tests (and automating them so they run regularly), we help ourselves out immensely by assuring we have a working codebase every step of the way. This feedback is priceless! That sound you hear when some poor, unsuspecting user discovers/proves your application doesn't work is the sound of potential revenue running to your closest 
competitor and then telling everyone about the terrible experience they had with your company. The earlier on in the development cycle you receive feedback from your code that it's satisfying all business requirements and behaving as expected, the better.
&lt;br/&gt;
&lt;br/&gt;


For some time now, we've been aware of the virtues of a software QA organization within a business. But for too long developers have viewed QA organizations as corporate 'bus boys'; there to clean up the mess made during a project's design and development cycle. I recently had a colleague tell me he needed someone else to test the code he's written over the past month (this is days before the code is going to be put into production - doh!). No doubt having multiple parties exercise code is valuable, but if you don't know your code works as expected and you are waiting for others to prove it, then it's time to rethink your approach. This irresponsible behavior on the part of individuals and entire software development teams alike must be extinguished.
&lt;br/&gt;
&lt;br/&gt;


Despite the rising popularity in test-driven design and the increased discussion of topics like automated testing and continuous integration, it's clear that most developers have not taken enough interest in these concepts so as to improve themselves by adding these skillsets to their development abilities.
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;  

&lt;b&gt;on the road to improvement&lt;/b&gt;
&lt;br/&gt;
&lt;br/&gt;

Okay, so what are the concepts that go into developing good code supported by a battery of tests? In the blog posts to come, I'll discuss concepts and practices that will (hopefully) help transform developers from fearful, time wasting, error-prone hackers into confident, focused, efficient developers.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=95828"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=95828" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/95828.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2006/11/01/95828.aspx</guid>
            <pubDate>Thu, 02 Nov 2006 05:58:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/95828.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2006/11/01/95828.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/95828.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/95828.aspx</trackback:ping>
        </item>
        <item>
            <title>Team Smells...Refactoring For A Better Tomorrow (Part Two)</title>
            <category>TDD</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2006/03/30/73875.aspx</link>
            <description>In a &lt;a href="http://geekswithblogs.net/bcaraway/archive/2006/03/22/73106.aspx"&gt; previous post&lt;/a&gt; I detailed some conditions existing on development teams that would suggest some changes need to be made in order to bring about better performance and ultimately higher quality software. In this post I will identify a couple more Team Smells and discuss how these issues can be remedied and why these conditions should be addressed in the first place.

&lt;br/&gt;
&lt;br/&gt;

&lt;b&gt;Smell: Developers Spent Way Too Much In The Debugger (AKA Debugger Junkies)&lt;/b&gt;

&lt;br/&gt;

A good feature-rich debugger like the one that comes with Microsoft Visual Studio is a nice tool. It allows you to easily get a view into the runtime state of your code. Unfortunately, developers can use this tool as the sole form of verification that the code they wrote is functioning properly. There should be one obvious, overriding reason to step through code using the debugger: tracking down a bug (duh!). A valid debugging scenario would entail watching a particular piece of code execute to determine why it’s behaving in an unexpected manner. A &lt;i&gt;Debugger Junkie&lt;/i&gt; commonly works in this way:

&lt;br/&gt;
&lt;br/&gt;

&lt;li&gt;1. * fingers crossed *&lt;/li&gt;
&lt;li&gt;2. Hit F5 and see if the solution compiles&lt;/li&gt;
&lt;li&gt;3. Wait for the entire application to load up&lt;/li&gt;
&lt;li&gt;4. Navigate to the specific point in the application where the breakpoint or breakpoints are ready and waiting&lt;/li&gt;
&lt;li&gt;5. Interact with the application to try and re-create the unexpected behavior&lt;/li&gt;
&lt;li&gt;6. When Step 5 uncovers some indication as to where the problem might be, investigate the objects’ state in and around the perceived problem area to uncover the root cause&lt;/li&gt;
&lt;li&gt;7. Devise a plan for where the code should be modified to make the feature behave as expected&lt;/li&gt;
&lt;li&gt;8. Make code change and GoTo Step 1&lt;/li&gt;

&lt;br/&gt;

Not only is this an unbelievably inefficient way to work, it can often make for a confusing and miserable work experience. No wonder developers on a team that exhibit these smells don’t want/are afraid to modify their code – they are sick of looking at it! Because of the dependency on the debugger to validate their efforts, by the time these junkies have completed a couple medium-sized application features, they are experiencing no small amount of frustration from the debugging monotony they have put themselves through. There _is_ a better way…

&lt;br/&gt;
&lt;br/&gt;

&lt;i&gt;&lt;u&gt;Refactor:&lt;/u&gt;&lt;/i&gt; The key to ridding your team of this poor habit is to implement measures that help developers gain confidence in the code they are producing. Getting a development team to change the way they work and weaning them from the perceived security of the debugger can be a rough ride in the beginning. J. Peterman, of Seinfeld fame, said it best when demanding Elaine help her office ‘boyfriend’ Zach break his drug habit –

&lt;br/&gt;
&lt;br/&gt;

 “&lt;i&gt;PETERMAN: … Uh, P.S., the first twenty-four hours are the worst. Better bring a pancho.&lt;/i&gt;”

&lt;br/&gt;
&lt;br/&gt;

Yep, it can get messy. There will be no limit to the number of excuses offered up as to why this new approach won’t work. But Test Driven Development (TDD) is perfectly suited for ridding a development team of their debugger dependency. The very process of creating a unit test before writing any live code provides the developer with an accurate measurement of how the code should work. When code is written to make a unit test pass, there should be a large amount of confidence that the code is doing exactly what it needs to do. When all requirements for an application feature are satisfied by a battery of unit tests – THE FEATURE IS COMPLETE. Some other things have to change in order to for this approach to work. Separation of concerns among application layers and coding to interfaces across these layer boundaries must occur so that isolating code for unit testing can take place. Doing this effectively also allows developers to work without having every layer functioning – i.e. no need for a working, populated database, web services, or active directory services.

&lt;br/&gt;
&lt;br/&gt;

When these dependency endpoints can be ‘faked’ through some sort of abstraction (like an interface), application logic can be created and tested effectively – one test at a time. When the time comes for a true build process and deployment to an integrated, end-to-end environment, there should be fewer surprises as to how the code works when it’s all put together – all because of the effort taken to develop test first and receive feedback from the very beginning regarding how the code is behaving. See &lt;a href=http://codebetter.com/blogs/scott.bellware/archive/2005/11/22/134954.aspx&gt;Scott Bellware’s excellent post&lt;/a&gt; on TDD and failing tests meaningfully for a much more elaborate discussion surrounding the benefits of good unit tests.

&lt;br/&gt;
&lt;br/&gt;

That’s it for now.

&lt;br/&gt;
&lt;br/&gt;


Oh, and for no apparent reason, here are a few more Seinfeld quotes talking about Zach’s drug problem:

&lt;br/&gt;
&lt;br/&gt;

&lt;i&gt;PETERMAN: I'm afraid the problem with Zach is more serious. He's back on the horse, Elaine. Smack. White palace. The Chinaman's nightcap.&lt;/i&gt;

&lt;br/&gt;
&lt;br/&gt;

&lt;I&gt;PETERMAN: And, in a tiny way, I almost feel responsible. I'm the one who sent him to Thailand - in search of low-cost whistles. Filled his head with pseudoerotic tales of my own Opium excursions. Plus, I have him some phone numbers of places he could score near the hotel.&lt;/I&gt;

&lt;br/&gt;
&lt;br/&gt;

&lt;I&gt;PETERMAN: Damn it, Elaine. That wasn't Zach. That was the yam-yam. Now, he is going cold turkey. (Ordering) And you will be at his side.&lt;/I&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73875"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73875" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/73875.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2006/03/30/73875.aspx</guid>
            <pubDate>Thu, 30 Mar 2006 20:13:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/73875.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2006/03/30/73875.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/73875.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/73875.aspx</trackback:ping>
        </item>
        <item>
            <title>FireFox SessionSaver</title>
            <category>Tools</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2006/03/28/73600.aspx</link>
            <description>I've been looking for a FireFox extension that will remember what tab/web pages I had opened after closing and re-opening browser instances. I found one yesterday after searching, again, (I've looked for something like this for sometime now) through the myriad of extensions - in the Navigation, Tabbed Browsing sections. I give you...&lt;br/&gt;&lt;br/&gt;&lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?id=436&amp;application=firefox"&gt;SessionSaver&lt;/a&gt;. This extension seems to do exactly what I've been looking for. I have not experienced any issues with installing subsequent extensions like a couple of the comments I read on the extension download page. Give it a shot.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73600"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73600" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/73600.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2006/03/28/73600.aspx</guid>
            <pubDate>Tue, 28 Mar 2006 12:27:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/73600.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2006/03/28/73600.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/73600.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/73600.aspx</trackback:ping>
        </item>
        <item>
            <title>Team Smells...Refactoring For A Better Tomorrow (Part One)</title>
            <category>TDD</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2006/03/22/73106.aspx</link>
            <description>Just like any project you work on, there are signs and behaviors within a development team that indicate a need for refactoring as well. Before a development team can get to the job of developing quality code, the definition of "quality code" has to be addressed, identified, and agreed upon. I believe this is the most difficult step in evolving a development team's skill set away from the 'slap it together and fix it later' mindset. Why do I think this? Because this is exactly what I'm attempting to do with my current team.&lt;br/&gt;&lt;br/&gt;

In order to convince an entire team of developers to change the way they code, you have to establish a case for _why_ this big change has to occur. Point out where the inefficiencies in the current methods (or lack thereof) are. Make everyone realize that there is a better way. Security is a _huge_ factor because you are asking someone to step out of their comfort zone and learn something new. In fact, many take offense to this notion of improving the way they do things. This brings us to our first Team Smell:&lt;br/&gt;&lt;br/&gt;

&lt;b&gt;Smell: Hubris&lt;/b&gt;&lt;br/&gt;
There are two things to consider here: 1) the industry of software development is full of bright, intelligent people, and 2) almost every person in the industry thinks they are one of these bright, intelligent beings. This is a potential team killer because the person that thinks he or she knows everything they need to know to develop good code – all too often doesn’t. I don’t want to work with someone that thinks they have nothing left to learn. This is the type of person that eschews Agile practices like TDD because he claims he can create solid, object oriented, sustainable code on his own, without some crazy process to help him along.&lt;br/&gt;&lt;br/&gt;

&lt;i&gt;Refactor: &lt;/i&gt;This might be the most difficult symptom to battle because of the inherent human nature involved. The good part about working with someone afflicted with this condition is that they will often jump into management ;-) . Of course, you know the downside to this - they could become your manager ;-( If this smell is too widespread on a team that you are trying to change for the better, the best choice is probably to find another team and/or place to work. The point of all this improvement is to write higher quality software through better methods. If the vast majority of team members are just too full of themselves to change, then wish them the best as they continue to pump in 70-hour weeks and seek out a place where your peers will be more like-minded.&lt;br/&gt;&lt;br/&gt;

&lt;b&gt;Smell: Developers Are Afraid To Modify Their Own Code&lt;/b&gt;&lt;br/&gt;
This may seem silly and unbelievable to you, but during my current project I constantly hear fellow developers say, “Yeah, but I finally got this working. If I change this now, it might break, and I just don’t have time for that”. Translation: “I have no idea how my code even compiled, much less how I would go about modifying or moving pieces of it around for the sake of refactoring, especially since the deadline is next week.” If a developer is afraid to dig into the code he or she spent a lot of time producing, chances are the code 1) sucks – in that it resembles a large plate of spaghetti – at best, and 2) has little or no chance of becoming testable without many large, risky refactorings.&lt;br/&gt;&lt;br/&gt;

&lt;i&gt;Refactor: &lt;/i&gt;Defunkifying this smell should be easier to address because it’s simply based on a lack of understanding. Where there’s a lack of understanding, there’s usually a hidden desire to understand because the uncertainty of the work he or she is doing is somewhat unsettling. Many developers in this position simply don’t know how to shed this uncertainty. This is where preaching the value of test driven design should find an eager audience. By working in small, testable chunks, a code base evolves bit by bit, thereby reducing the chance of it becoming too large and fragile. When code is just slammed into place in order to ‘get it working’, what should have been prototype code usually becomes production code b/c the developer is just happy that the junk he or she produced compiles. All too often this type of developer knows the code should be at the very least cleaned up and modularized, much less refactored to patterns and made testable, but he or she knows the trouble they will be in when they try this – so they just let it lie.&lt;br/&gt;&lt;br/&gt;

One of the greatest bi-products of designing test-first is that when a feature is completed (i.e. all uses cases or stories are satisfied) there is a compliment of unit tests that can be run at any time to verify the code is doing the job it’s supposed to. Another great thing about code that is designed test first is the resulting structure is typically _much_ easier to 1) understand, 2) extend, and 3) if necessary, modify. I can’t start any new piece of application functionality now without beginning in a test method. I feel quite secure coding one test-case at a time, constantly thinking about the responsibilities of a class and how it should operate with its dependencies. Working in this way I know that the code was created thoughtfully and with care (as opposed to entire features crammed into 80-line methods that can do 20 things, depending on another 20 possible conditions). And thusly, when the code goes live, it will run as intended with very few surprises.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;


In part two, I’ll identify one or two more Team Smells and how to expunge their foul stench from your working environment.&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73106"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=73106" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/73106.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2006/03/22/73106.aspx</guid>
            <pubDate>Thu, 23 Mar 2006 05:06:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/73106.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2006/03/22/73106.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/73106.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/73106.aspx</trackback:ping>
        </item>
        <item>
            <title>New Neal Stephenson Fan</title>
            <category>Misc</category>
            <link>http://geekswithblogs.net/bcaraway/archive/2006/02/24/70669.aspx</link>
            <description>I just finished reading my first &lt;a href="http://www.nealstephenson.com/"&gt;Neal Stephenson&lt;/a&gt; book - &lt;i&gt;Cryptonomicon&lt;/i&gt;. That is one awesome novel! I'm blown away by the complexity of Stephenson's writing. I really connected with the great characters in the story. The connection was so great that I picked up a copy of &lt;i&gt;Quicksilver&lt;/i&gt;, the follow-up to &lt;i&gt;Cryptonomicon&lt;/i&gt;, at the local B&amp;N this afternoon; and I'm trying to convince my wife to go along with the idea of changing my one week old son's name from Grant Thomas to Bobby Shaftoe ;-)&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70669"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=70669" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/bcaraway/aggbug/70669.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blake Caraway</dc:creator>
            <guid>http://geekswithblogs.net/bcaraway/archive/2006/02/24/70669.aspx</guid>
            <pubDate>Sat, 25 Feb 2006 03:05:00 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/bcaraway/comments/70669.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/bcaraway/archive/2006/02/24/70669.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/bcaraway/comments/commentRss/70669.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/bcaraway/services/trackbacks/70669.aspx</trackback:ping>
        </item>
    </channel>
</rss>