<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Extreme JS</title><link>http://weblogs.asp.net/jsgreenwood/default.aspx</link><description>JS Greenwood's WebLog on architecture, .NET, processes, and life...</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>XP StoryStudio v0.99b released</title><link>http://weblogs.asp.net/jsgreenwood/archive/2005/01/18/355485.aspx</link><pubDate>Tue, 18 Jan 2005 21:42:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:355485</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=355485</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2005/01/18/355485.aspx#comments</comments><description>&lt;p&gt;Having gathered initial feedback from the v0.99 release, v0.99b is now available, with the following minor improvements:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Iterations can be deleted.&amp;nbsp; In v0.99, this feature just linked to the Story Delete, and wasn't implemented&lt;/li&gt; &lt;li&gt;Date fields now have pop-up calendars&lt;/li&gt; &lt;li&gt;Installer now supports choice of whether to run/not run tests following installation&lt;/li&gt; &lt;li&gt;Installer now supports not configuring the database&lt;/li&gt; &lt;li&gt;Installer will now work without SQL Server being installed on the local machine&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;v0.99 is now no longer available for download.&lt;/strong&gt;&amp;nbsp; However, v0.99b is available from &lt;a href="http://www.xpstorystudio.com"&gt;www.xpstorystudio.com&lt;/a&gt;, or directly by &lt;a href="http://www.xpstorystudio.com/XPStoryStudio%20v0.99b.zip"&gt;clicking here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;em&gt;To perform an upgrade from v0.99, first uninstall the existing version (this will &lt;strong&gt;NOT&lt;/strong&gt; remove your existing database), then run the v0.99b MSI installer and select the database upgrade version.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=355485" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>Active and passive risk</title><link>http://weblogs.asp.net/jsgreenwood/archive/2005/01/08/349210.aspx</link><pubDate>Sat, 08 Jan 2005 19:05:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:349210</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=349210</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2005/01/08/349210.aspx#comments</comments><description>&lt;p&gt;Attitudes towards risk&amp;nbsp;are something that I've been meaning to write about for some time now.&amp;nbsp; To me, there're basically two types of risk - active and passive (I'm no &lt;em&gt;risk&lt;/em&gt; expert in the "risk analyst"/academic sense, so ignore all of this if it's obvious)...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Active risk is that which is deliberately taken on - for instance the choice to develop a new product that may (in theory) fail in the market.&amp;nbsp; Or the rewrite of a piece of software due to burgeoning support costs.&lt;/li&gt; &lt;li&gt;Passive risk is that which is inherent in inaction - for instance, the choice not to update an existing product to compete with others in the marketplace.&amp;nbsp; Or the decision not to rewrite a piece of software, despite burgeoning support costs.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Both these types of risk can be measured in the same way - the cost, and the potential return/loss.&amp;nbsp; Yet people seem to have very different attitudes towards them.&amp;nbsp; Passive risk is seen as a necessary evil that's often ignored.&amp;nbsp; Whereas active risk is seen as something to be avoided, regardless of the potential payback (and likelihood thereof).&lt;/p&gt; &lt;p&gt;I think, in corporate life,&amp;nbsp;the problem lies in what people are measured/judged on - the decisions that they DO make (active risk), rather than the ones they DON'T make (passive risk).&amp;nbsp; It's easier to blame indecision on someone else than it is a choice you made yourself.&amp;nbsp; Unfortunately, I've seen many cases where the passive risk is huge; easily enough to cause a company to go under sometimes (and actually causing it to, in at least one company I've worked with). &lt;/p&gt; &lt;p&gt;In theory, this all comes down to a corporate risk register, and ensuring that it's both complete, and has well-defined accountabilities for each item.&amp;nbsp; Unfortunately, I've rarely seen this really working, with numerous passive risk items dropping out of sight due to an unwillingness to take on responsibility.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=349210" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Other/default.aspx">Other</category></item><item><title>Agile planning tool - XP StoryStudio - available for download</title><link>http://weblogs.asp.net/jsgreenwood/archive/2005/01/04/346024.aspx</link><pubDate>Tue, 04 Jan 2005 00:49:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:346024</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=346024</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2005/01/04/346024.aspx#comments</comments><description>&lt;p&gt;Whilst I've not had time to do all the documentation I was planning to over Christmas, I have got round to bundling up the installer and updating &lt;a href="http://www.XPStoryStudio.com"&gt;www.XPStoryStudio.com&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So, available for download now (from the aforementioned URL), is v0.99 of XP StoryStudio - the freely distributable XP planning tool created by myself and&amp;nbsp;&lt;a href="http://www.twelve71.org/blogs/dave"&gt;Dave Fellows&lt;/a&gt;, with the help and support of several other kind souls at Egg.&lt;/p&gt; &lt;p&gt;From the documentation enclosed within the installer:&lt;/p&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;p&gt;&lt;em&gt;This is a functionally complete, pre-release version of XP StoryStudio &lt;br /&gt;intended for limited distribution to test installation and integration issues &lt;br /&gt;prior to the public release.&amp;nbsp; As such, should issues be found, please forward them to: &lt;strong&gt;support {at} xpstorystudio.com&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=346024" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>When TDD Goes Bad #2</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/12/29/343963.aspx</link><pubDate>Wed, 29 Dec 2004 22:35:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:343963</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=343963</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/12/29/343963.aspx#comments</comments><description>&lt;p&gt;I've been debating whether to post another entry on this for the last couple of weeks due to another bad smell I've spotted around Agile practices.&amp;nbsp; However, it's &lt;strong&gt;my&lt;/strong&gt; blog, and I think it's worth saying.&amp;nbsp; But first, the bad smell...&lt;/p&gt; &lt;p&gt;Zealotry.&amp;nbsp; Many advocates of Agile practices have had to fight their corner hard against supporters of traditional methodologies.&amp;nbsp; Having had several such confrontations myself, it does become tiring, and you do beging to expect fairly incongruent arguments against it.&amp;nbsp; There is a danger, though, that the habit of dealing with arguments against Agile that don't stack up will lead to a blinkered view where it's assumed that any negative statement about&amp;nbsp;the principles and approach should be dismissed.&amp;nbsp; No methodology is perfect - different circumstances call for different approaches, etc.&amp;nbsp; Also, just because a methodology when applied correctly is appropriate and should result in success, it doesn't mean that it &lt;strong&gt;will&lt;/strong&gt; be applied correctly and appropriately.&amp;nbsp; People can, and will, get things wrong - especially when lacking experience.&lt;/p&gt; &lt;p&gt;So, TDD Gone Bad #2...&amp;nbsp; &lt;em&gt;Mock oriented development&lt;/em&gt;.&amp;nbsp; Mocks are a good thing where you really want to extract a dependency and ensure you're testing the right thing.&amp;nbsp; But there are a couple of issues that can arise:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Poor integration tests, as everything is being tested in isolation - we can end up with a system where the constituent parts are clean, isolated, well tested, and known to be correct.&amp;nbsp; But how they fit together is a greyer (or even blacker) area unless mocking is accompanied with a complement of integration tests. Dave describes this well in his blog, so there's no need for me to go on about it here: &lt;a href="http://www.twelve71.org/blogs/dave/archives/000616.html"&gt;http://www.twelve71.org/blogs/dave/archives/000616.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Mock oriented design.&amp;nbsp; Whilst mocking is good at removing dependencies, their introduction regularly alters the design of the system.&amp;nbsp; I've seen numerous occasions where the introduction of mocks has added a large amount of complexity to an otherwise simple design.&amp;nbsp; This complexity leads to higher implementation costs, a higher cognitive load on the developers working on the system, and higher maintenance costs (as there's more code to maintain).&amp;nbsp; All of which go against the principle of "the simplest thing".&amp;nbsp; The irony is that the introduction of mocking &lt;em&gt;can&lt;/em&gt;, sometimes, make&amp;nbsp;completing a system far more time consuming due to the different levels of granularity, and the additional code required to implement interfaces, etc.&amp;nbsp; Again, that's not to say mocks aren't very useful things, just that they're a tool to be used where appropriate, not a pattern to base the foundations of your entire implementation on...&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;em&gt;Whenever mocking is used, the value that the mock gives versus the cost it will introduce over the lifetime of the system should be measured (or at least estimated/considered)&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=343963" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>When TDD Goes Bad #1.2</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/12/08/278332.aspx</link><pubDate>Wed, 08 Dec 2004 16:06:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:278332</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=278332</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/12/08/278332.aspx#comments</comments><description>&lt;p&gt;So, #1.1 was all about the "business" - people defining requirements, and how these can cause issues.&amp;nbsp; #1.2 is just a short entry about the underlying statement I was trying to make in the original post:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Anti-pattern:&lt;/em&gt; Where inexperienced/misguided developers keep on testing where it's not realistic or financially astute to do so, thinking that's what TDD is, and thinking they're "adding value".&amp;nbsp; As we all know, that's not what TDD is.&amp;nbsp; And it's something we should try to avoid&amp;nbsp;by coaching, mentoring, and working closely with development teams; helping to give them ways of judging the value of any piece of work.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;It's all too easy to work with a group of savvy technical people that get TDD, and not be able to see how it could go wrong.&amp;nbsp; If you try and scale this across an enterprise where some people just don't &lt;em&gt;get it&lt;/em&gt;, and the support isn't there to keep things moving in the right direction, things &lt;strong&gt;can&lt;/strong&gt;, and&amp;nbsp;&lt;strong&gt;do&lt;/strong&gt;&amp;nbsp;go wrong.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=278332" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>When TDD Goes Bad #1.1</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/12/07/277694.aspx</link><pubDate>Tue, 07 Dec 2004 17:43:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:277694</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=277694</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/12/07/277694.aspx#comments</comments><description>&lt;p&gt;OK, so people don't seem to get what I was trying to say in my previous TDD post, to the point of claiming (on certain newsgroups) that I "don't get TDD".&amp;nbsp; There were two points I was trying to make. So, I'll try and lay out the first of these now, in a simpler manner:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Every test you write has a cost associated with it - the development time/cost: C&lt;/li&gt; &lt;li&gt;Every test you write has a value associated with it - the time/money it'll save over the lifetime of the system: V&lt;/li&gt; &lt;li&gt;At its simplest level, V must be&amp;nbsp;greater than or equal to&amp;nbsp;C for it to have been worth implementing the test (I'll probably post something separately on the mathematical modelling of this in the future)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The reason that V &lt;strong&gt;isn't&lt;/strong&gt; always greater than C can arise from several situations from a "story" (business)&amp;nbsp;perspective:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Developers have been provided with open ended requirements&lt;/strong&gt; - where there is no bounding to the tests that have to be written.&amp;nbsp; At its most extreme case, this could be something like "&lt;em&gt;Test:&lt;/em&gt; An unexpected physical occurence takes place outside the system. &lt;em&gt;Result:&lt;/em&gt;&amp;nbsp;The data will be backed up correctly".&amp;nbsp; That's an open ended test, though.&amp;nbsp; What if someone cuts power?&amp;nbsp; Or a lightning bolt hits the&amp;nbsp;server rack?&amp;nbsp; Or a tiny blackhole forms over the CPU?&amp;nbsp; "C" would become infinite if all scenarios were dealt with (just because I've used an extreme example here doesn't mean it couldn't be something much more subtle, either).&amp;nbsp; Some of these scenarios are more likely than others, and there's diminishing return on each test being implemented as the likelihood of the scenario occuring drops.&amp;nbsp; &lt;em&gt;To stop this situation from occuring,&amp;nbsp;requirements need to be &lt;strong&gt;closed&lt;/strong&gt; and&amp;nbsp;&lt;strong&gt;finite&lt;/strong&gt;.&amp;nbsp; &lt;/em&gt;If they're not closed/finite, you arrive at the situation in my previous post where a developer can simply "judge" how much testing is enough.&amp;nbsp; Unless developers are they calculating the C:V ratio of each test in a situation with any open-endedness, then &lt;strong&gt;TDD can go bad&lt;/strong&gt;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Developers have been provided with requirements with negative value&lt;/strong&gt; - where the cost of implementing the test + code is inherently greater than the value it will deliver.&amp;nbsp; &lt;em&gt;Accurate estimation of tasks and comparison against the value of any given story will avoid this situation.&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;em&gt;[In part #1.2, I'll discuss the second part of this]&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=277694" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>XPStoryStudio site up: www.xpstorystudio.com</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/11/28/271226.aspx</link><pubDate>Sun, 28 Nov 2004 20:36:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:271226</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=271226</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/11/28/271226.aspx#comments</comments><description>&lt;p&gt;Having registered the site a couple of weeks ago, I've got round to putting together and uploading a couple of web-pages for XPStoryStudio, in preparation for it's release in the very near future.&amp;nbsp; All that's left to do is put some installation documentation together and generate the finished installer package.&amp;nbsp;&amp;nbsp;In addition&amp;nbsp;to&amp;nbsp;posting major news about its release, etc. here, all the details will be published on XPStoryStudio's site:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.xpstorystudio.com"&gt;&lt;strong&gt;www.xpstorystudio.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=271226" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>When TDD Goes Bad #1</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/11/26/270503.aspx</link><pubDate>Fri, 26 Nov 2004 00:58:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:270503</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=270503</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/11/26/270503.aspx#comments</comments><description>&lt;p&gt;Although Test Driven Development (TDD) is one of the greatest steps forwards in software engineering, especially when combined with modern languages and testing frameworks (i.e. xUnit), there's a definite anti-pattern lurking in there - Test Oriented Development.&lt;/p&gt; &lt;p&gt;At its most basic level level, writing tests is done for one reason and one reason only.&amp;nbsp; It's not about ensuring you meet requirements, it's not to have a repeatable means of knowing the code functions properly after changes, and it's not to aid design.&amp;nbsp; The key reason for writing tests is the same as everything else in software development - to make the company commisioning the software more profitable.&amp;nbsp; So, the justification for TDD is based upon the premise that, in the long run, writing tests will save the company money on down time, effort in re-workings, and so on - but these are just implementation details of the underlying principle.&amp;nbsp; Now, although most developers that do TDD understand the long-term payback view of the approach, I'd question how many actually consider the value of each test or set of tests that are being developed.&lt;/p&gt; &lt;p&gt;Using an agile methodology, tying the (acceptance) tests to the stories is fairly simple, seemingly giving visibility of the value of tests.&amp;nbsp; But, given that many verbal tests are quite open ended, how do you know how much testing is enough?&amp;nbsp; The test may be stated as "When I enter the correct data, but there is a connectivity issue, I will see error message X".&amp;nbsp; A verbally described test such as this can have a hundred different programmatic tests implemented - simulating standard firewall issues, XML-firewall issues, web servers being down, latency in connections, time-outs, corruption of data, etc.&amp;nbsp; There is no immediately visible answer to "how much testing is enough?" in such a scenario.&amp;nbsp; This is even worse with unit tests, where they aren't likely to be defined formally (verbally) at all, and are largely up to how meticulous a developer is.&lt;/p&gt; &lt;p&gt;Added to the lack of metric is the fact that the developer is concentrating on testing before "coding" - the primary function is hence the development of tests, leading to a situation of "test-oriented development".&amp;nbsp; This is where the production of tests becomes the overriding concern and output of a team, with the development of required functionality being secondary.&amp;nbsp; When this occurs, the design, quality, and scope of the tests all become greater than that of the system actaully being created.&amp;nbsp; As the development of tests follows the law of diminishing returns principle, beyond a point, each additional test you write for a certain circumstance adds only more and more marginal increases in quality.&amp;nbsp; Eventually, you will reach a point where there will never be a point in the lifetime of the system where the development of the tests achieves ROI.&amp;nbsp; Basically, the development of tests becomes counter-productive to the aims of the business.&amp;nbsp; This is compounded by the Heisinger's Uncertainty Principle-like facet of TDD - it's alteration of the design of the code it's testing.&amp;nbsp; But that's a subject for another post in the next few days...&lt;/p&gt; &lt;p&gt;Avoiding test-oriented development&amp;nbsp;can be&amp;nbsp;quite difficult - changing a developer's mindset to take on TDD is difficult enough to start with, trying to then amend that to temper the creation of tests goes back on that principle to some extent.&amp;nbsp; My current thinking on this is that, along with acceptance tests and development tasks, a separate list of requirements needs creating for each story - a list of required unit tests.&amp;nbsp; Rather than just estimate the effort required to complete a story point in its entirety, the effort required for each unit test (and its value in pound-notes/dollar-bills) should also be calculated to some extent. Each test is then subject to the same cost-benefit analysis and prioritisation as stories at a higher level.&amp;nbsp; The task of doing this should also help developers to consider the reason for creating a test; how realistic/contrived the situation it's testing is, how better the effort could be expended, and finally, help remind them what they're actually trying to achieve at a less programmatic level.&amp;nbsp; If this seems like too much effort, then an alternative may be to look at the ratio of time that is to be spent on writing tests to that of the production code itself for a given story-point to ensure that the focus isn't shifting from the system to the tests.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=270503" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>Coordinating Enterprise Website Development in .NET</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/11/10/255336.aspx</link><pubDate>Wed, 10 Nov 2004 22:25:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:255336</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=255336</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/11/10/255336.aspx#comments</comments><description>&lt;p&gt;One of the favourite Enterprise development strategies for .NET websites I've come up with is that of splitting the website into logical areas along functional- (and naturally change-) boundaries; having separate areas of the site developed as separate ASP.NET controls.&amp;nbsp; I'm not talking small-scale controls like "Address entry" here,&amp;nbsp;I'm talking entire&amp;nbsp;5+&amp;nbsp;page application processes as a single control (that might itself comprise further controls).&amp;nbsp; This model works well for all kinds of large organisations - an online e-commerce site could have separate basket, checkout-process, and product-search controls, for instance, each of which would be aligned against a set of services that they're consuming (in an SOA).&amp;nbsp; The current enterprise-in-question is a bank, which fits this model better than most other sites I've come across due to the sheer amount of functionality necessary on the website, and its diversity.&amp;nbsp; Application forms alone constitue a raft of controls:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Mortgage applications &lt;li&gt;Credit card applications &lt;li&gt;Personal loan applications &lt;li&gt;Motor insurance applications &lt;li&gt;Etc.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;My view on coordinating this has been, for some time, to have separate teams working on each "control", basically becoming product teams that deliver a black-box control to one overall "site" team.&amp;nbsp; It is then this team's responsibility for plugging all of the controls into the main site, maintaining all the links between areas, etc.&amp;nbsp; There are several benefits to implementing an enterprise-class site this way:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;It gives a simple way of logically breaking-down/grouping a large number of development staff &lt;li&gt;It supports concurrent development on multiple parts of the site.&amp;nbsp; Because the controls don't know about each other, there's no risk of them linking to one another and dependencies being created.&amp;nbsp; This allows for varying rates of change in different areas, and doesn't predicate large-scale upgrades when a new version of some base functionality becomes available &lt;li&gt;It provides a black-box component that allows for alternative internal implementations, for instance migrating from an HTML based UI to a Macromedia Flash one, and eventually to a Longhorn one. &lt;li&gt;It matches a model of having multiple levels of continuous integration, rather than having a single-level uber-integration that becomes unwieldy&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That's the good news - a paradigm for developing enterprise websites that theoretically has few drawbacks.&amp;nbsp; Moving on to the implementation is where the bad news begins...&lt;/p&gt; &lt;p&gt;In .NET, these controls could either be developed as user controls (.ascx files), or as custom controls (.cs files).&amp;nbsp; The advantage of the former is the speed of development, and close integration with UI designers - developers can work in "HTML view".&amp;nbsp; The latter involves writing all content as controls.&amp;nbsp; A short example of this is as follows:&lt;/p&gt; &lt;p&gt;Web control implementation:&lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;nbsp; &amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;asp:TextBox id=txt runat=server /&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Custom control implementation:&lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&amp;nbsp; Literal literal = new Literal();&lt;br /&gt;&amp;nbsp; literal.Text = "&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;";&lt;br /&gt;&amp;nbsp; Page.Controls.Add(literal);&lt;br /&gt;&amp;nbsp; TextBox txt = new TextBox();&lt;br /&gt;&amp;nbsp; txt.Id = "txt";&lt;br /&gt;&amp;nbsp; Page.Controls.Add(txt);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Although possible, developing a graphically compelling site using the second method is torturous, so I've discounted it as an option.&amp;nbsp; I also don't want control teams to deliver an editable ASCX control to the site team - it would be prone to editing, etc. and not as much of a "boxed product".&amp;nbsp; There is an alternative, however.&amp;nbsp; Whenever .NET renders a web page that makes use of a user control, it converts the first code example into the second internally.&amp;nbsp; In Visual Studio .NET 2002 and Visual Studio .NET 2003, this process is largely invisible, and only happens when the page is requested.&amp;nbsp; Visual Studio .NET 2005 ("Whidbey") changes this, though, allowing for pre-compilation of websites into Assemblies (DLLs).&lt;/p&gt; &lt;p&gt;So, my long-term plan was to have each team develop a control in a separate VS.NET 2005 project, pre-compile the output when they're ready to release, and then just hand the Assembly over to the "site" team to use just like any other class library.&amp;nbsp; Having spent many, many hours over the last week poking and prodding the aspnet_compiler.exe tool, rewriting it from scratch, attempting reflection on the System.Web.Compilation namespace, and even disassembling most of the System.Web assembly, I'm getting close to giving up.&amp;nbsp; Rather than creating one sensibly named assembly for the whole project, the compiler creates multiple randomly named assemblies - usually one for each control/page (although it sometimes puts several together).&amp;nbsp; After recreating the aspnet_compiler tool from scratch, and extending it to sift through these files, pull out just the assemblies, give them new file names based on the controls they contain, etc. I thought I was getting somewhere.&amp;nbsp; Now the problem is that if one of these controls uses another from the same project, it will be given a reference to the random 8-letter assembly name (and matching internal module name).&amp;nbsp; I've yet to see if any internal assembly hacking can rectify this.&lt;/p&gt; &lt;p&gt;None of this would be necessary if Microsoft hadn't specifically made the majority of the System.Web.Compilation namespace private/internal, presumably in an attempt to make it difficult for other people to develop competing tools, etc.&amp;nbsp; The most infuriating part of this is that, in theory, you can access all of the System.* functionality through reflection, whether its supposedly private or publicly visible.&amp;nbsp; Additionally, tools like Salamander and Reflector make it possible to decompile vast swathes of the system classes back into C#.&amp;nbsp; So Microsoft aren't really "protecting" anything, they're just making it painful to come up with enterprise class solutions.&lt;/p&gt; &lt;p&gt;The point to this post?&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Here's a model for enterprise web-site development that works, even if it DOES mean handing over controls that aren't totally black-boxed. &lt;li&gt;If anyone is a System.Web.Compilation guru and fancies helping out on creating a tool to enable this, please mail me &lt;li&gt;If anyone thinks that Microsoft should make it easier to compile source code, please mail them&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=255336" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>SOA Design with Agile methodologies</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/10/17/243639.aspx</link><pubDate>Sun, 17 Oct 2004 19:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:243639</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=243639</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/10/17/243639.aspx#comments</comments><description>&lt;p&gt;Service Oriented Architecture (SOA) and Agile - two of the current "hot topics" in IT.&amp;nbsp; The interesting thing is that even though they're fundamentally different - one being a set of architectural principles, the other a set of methodology principles, one of the key goals and benefits of both is enabling change.&lt;/p&gt; &lt;p&gt;Now, there are clearly differences in the goals (enterprise integration vs. fail early, etc.), but that's beyond the scope of this entry.&amp;nbsp; What this is about is that these are two sets of principles that are both useful and appropriate in today's technology landscape.&amp;nbsp; So, a natural situation to arrive at is where you want to transform a company to use both Agile and SOA.&amp;nbsp; This raises an interesting issue, though...&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Agile methodologies promote an incremental, iterative approach to development of functionality (including method signatures), with visibility of the impact of change given through test coverage.&amp;nbsp; Basically, working on the premise that, change is cheap if supported correctly&lt;/li&gt; &lt;li&gt;SOA promotes a well defined service interface through contracts - these contracts are aligned against business processes, not implementation details.&amp;nbsp; The rigidity of the service interface, and its non-technical alignment allows for internal change without impacting consumers of the service.&amp;nbsp; Changing a service interface is an involved process, though; rather than an outright change, a versioning mechanism is needed due to the immutability of contracts, and therefore a migration process is required.&amp;nbsp; The visibility of service usage is also very difficult to monitor as it could be external organisations rather than internally controlled systems.&amp;nbsp; The upshot of these two factors is that change to the interfaces of a service are relatively expensive&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So, whilst the internal development of services and service-consumers is in-line with Agile, the creation of service interfaces isn't - an incremental, iterative approach to those would cause serious versioning and compatibility problems, especially with remote (3rd party) consumers.&amp;nbsp; Similarly, imagine you're on the receiving end of another company that has an Agile approach to a service interfaces you're consuming; the contract you're adhering to would shift under your feet continually, introducing additional cost.&lt;/p&gt; &lt;p&gt;Thankfully, there is not only a solution to this problem, but it is also one that actually benefits Agile methodologies.&amp;nbsp; The solution is to make use of the incremental aspects of Agile, without the iterative approach when designing service interfaces.&amp;nbsp; Basically, the service interfaces should be defined just-in-time; when the first requirement for a certain piece of functionality arises, the definitive implementation of the interface for that particular service method and no more is derived.&amp;nbsp; The removal of an iterative approach to interface design is important not just for cost reasons - one of the key factors in the success of an SOA is how accurately the service interface mirrors the real world process.&amp;nbsp; If deriving a clear definition of this interface cannot be done, then it generally means that the underlying process isn't well understood.&lt;/p&gt; &lt;p&gt;As for the benefits of this to Agile, it's long been my opinion that the largest problem with such approaches are the introspective facets of them - the virtual disregard for what isn't clearly defined and within the primary context.&amp;nbsp; Service interfaces act as change boundaries for these introspective "pockets", containing them from unintentional impact on other such "pockets".&amp;nbsp; This allows iterative approaches to be taken to the component- and object-oriented internals of services, without incurring the cost of repeatedly integrating between potentially external, non-visible systems.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=243639" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>User Agents - Tomorrow's Technology Today</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/10/14/242424.aspx</link><pubDate>Thu, 14 Oct 2004 19:58:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:242424</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=242424</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/10/14/242424.aspx#comments</comments><description>&lt;p&gt;For years, there's been talk of tomorrow's technology - user agents, and how they'll make our lives better.&amp;nbsp; How we'd be able to sit there waiting for information to come to us, with agents going away collecting it, collating it, and presenting it back.&amp;nbsp; How this would change our lives.&amp;nbsp; Like many, I've been of the opinion &lt;em&gt;"I'll believe it when I see it"&lt;/em&gt; for a long time, and it kind of got written off and pushed to the back of my mind. And then I realised, user agents are here and have been for quite some time.&amp;nbsp; It's just that the reality's not quite how I (or I guess others) envisaged it to be.&lt;/p&gt; &lt;p&gt;From the very first e-mail client, we've had user agents; desktop applications that communicate with remote servers and bring down data ready for when we want it, and notify us of its arrival.&amp;nbsp; The addition of out-of-office replies, then Rules Wizards, then Junk mail filters are all moving the likes of Outlook in the direction of the archetypal "user agent".&amp;nbsp; But the presentation is still largely standard desktop client.&amp;nbsp; Other examples of such applications are the MSN Messenger Hotmail notifier and RSS readers.&lt;/p&gt; &lt;p&gt;To me, the two true prerequisites for a real user agent world are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Web services/XML - a common means of requesting, retrieveing, and interpreting data.&lt;/li&gt; &lt;li&gt;A client-side infrastructure for displaying this information&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Whilst the first of these is now available, standardisation of schemas is currently one of the biggest problems.&amp;nbsp; Even RSS, one of the most widely used standards, has several different versions (0.90, 0.91, 2.0), and competition from the likes of Atom.&amp;nbsp; What the world really needs is standardised ways of representing everything else - personal information, stock quotes, and so on.&lt;/p&gt; &lt;p&gt;A larger problem exists in the client-side infrastructure.&amp;nbsp; Support for platforms besides Windows aside, there is currently no simple way built into the platform of writing such an agent that "integrates" with the environment and other such agents whilst having adequate usability.&amp;nbsp; If you look at all the agents so far - E-mail clients, RSS Readers, MSN Messenger, whilst there are attempts to integrate all of these things, it's neither controlled nor elegant.&amp;nbsp; In the future this, problem will be solved with the Longhorn Sidebar, along with MSN-esque popups.&amp;nbsp; In the meantime, the closest thing I've seen so far is &lt;a href="http://www.desktopsidebar.com"&gt;www.desktopsidebar.com&lt;/a&gt;; a true framework for integrating various agents that borrows more than a few ideas from the Longhorn Sidebar.&amp;nbsp; Supporting Messenger, performance monitors, weather feeds, RSS feeds, the obligatory stock quotes, and so on, as well as being a framework for hosting further agents and giving them a UI with which to interact with the user.&lt;/p&gt; &lt;p&gt;So, agent technologies are here, they just crept up on us quietly - evolving over time rather than arriving with a fanfare fitting the amount of hype around them.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=242424" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Other/default.aspx">Other</category></item><item><title>Tool updates</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/10/07/239479.aspx</link><pubDate>Thu, 07 Oct 2004 22:20:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:239479</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=239479</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/10/07/239479.aspx#comments</comments><description>&lt;p&gt;&lt;em&gt;Long time since my last post - I've been getting ready for and going on a&amp;nbsp;nice bit of pan-European road racing.&amp;nbsp; The car was getting a fair bit of stick, so didn't make it the full distance, but that's another one to cross off the list of lifelong ambitions.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I've now updated both the &lt;strong&gt;NUnit GUI&lt;/strong&gt; and &lt;strong&gt;MSI Command Launcher&lt;/strong&gt; applications. The former has an extra try-catch around an event handler for showing details of errors, because of some weird boundary condition.&amp;nbsp; The latter now changes directory to where the executable specified&amp;nbsp;to be run&amp;nbsp;exists, allowing it to use relative paths, etc. if it's a batch file.&lt;/p&gt; &lt;p&gt;Download URLs are the same as ever:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.altervisitor.com/software/NUnit_GUI_Update_Release001.zip"&gt;http://www.altervisitor.com/software/NUnit_GUI_Update_Release001.zip&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.altervisitor.com/software/MSICommandLauncher.msi"&gt;http://www.altervisitor.com/software/MSICommandLauncher.msi&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=239479" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category></item><item><title>The simplest thing that can possibly (get me out of) work</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/09/06/226158.aspx</link><pubDate>Mon, 06 Sep 2004 22:03:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:226158</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=226158</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/09/06/226158.aspx#comments</comments><description>&lt;p&gt;Having spent a few posts on .NET specific tools, I'll get back to more process and architecture oriented topics for a bit now...&lt;/p&gt; &lt;p&gt;As a believer in Agile and XP for delivering software (where appropriate), I subscribe to the &lt;em&gt;"simplest thing that can possibly work"&lt;/em&gt; ethos - not overengineering a solution based upon the assumption that as yet unknown requirements will change the defined implementation.&amp;nbsp; An application of YAGNI, if you will.&amp;nbsp; Whilst numerous people in the office have taken this mantra on, I've spotted a lurking anti-pattern that's reared its head a couple of times:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;"The simplest thing that could possibly get me out of work"&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;One of the great things about Agile/XP is that it delivers some control back to the developer, removing the need for business analysts that are basically translator-patterns from business -&amp;gt;&amp;nbsp;technology.&amp;nbsp; This is also one of the approach's problems (which I will discuss in another Blog entry soon); If developers cling to a statement such as "the simplest thing that could possibly work", it means that they are using none of their intelligence, experience, and insight to make decisions.&amp;nbsp; Like most maxims, "The simplest thing..." is a principle to use that cuts to the heart of the majority of cases.&amp;nbsp; It is also a rod for your own back if applied blindly rather than judging the implications of all solutions.&amp;nbsp; In my opinion, a developer is a "professional" who shouldn't mechanically apply rules to derive solutions - a modicum of intelligence is required at each juncture, not a parrot-like ability to repeat a phrase.&lt;/p&gt; &lt;p&gt;I've seen this anti-pattern manifest itself most recently where 2 solid man days were wasted on a task that would've taken 10 minutes if there'd been an understanding of what "simple" implied, and the more elegant solution hadn't been discounted for not involving the simplest steps.&lt;/p&gt; &lt;p&gt;This leads, for me, to two rules:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Whilst in the vast majority of cases, the simplest approach is the best one, there are numerous other cases where something that is only marginally more complicated will clearly give many times the potential going forwards. &lt;li&gt;The "simplest thing" and the "quickest thing" are quite often very different.&amp;nbsp; "Simple" could mean going through 100 files by hand, manually searching for similar text and overtyping it where needed.&amp;nbsp; "Quick" could mean hitting Ctrl-R in a decent editor and typing in a simple regular expression.&amp;nbsp; I know which of the two options I'd choose.&amp;nbsp; And, unfortunately, I know people that would choose the other option, protecting themselves with the "shield of simple".&amp;nbsp; The "sum of simple" should actually be: &lt;em&gt;simplicity-of-each-step x number-of-steps.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;The problem with simplicity is that it exhibits no intelligence.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=226158" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item><item><title>New Setup &amp; Deploy tool "MSI Command Launcher" released</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/09/04/225523.aspx</link><pubDate>Sat, 04 Sep 2004 00:47:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:225523</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=225523</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/09/04/225523.aspx#comments</comments><description>&lt;p&gt;I finished the initial release of my latest (and possibly last for a while) MSI plugin tonight. This one, &lt;em&gt;MSI Command Launcher&lt;/em&gt;, extends the ability of custom actions to run user-defined code by:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Supporting the execution of batch files (standard Setup &amp;amp; Deploy packages don't&amp;nbsp;allow this) &lt;li&gt;Allowing for roll-back of execution based upon the exit code returned from running a script/executable &lt;li&gt;Provides a standardised Windows GUI for showing command-line input/output, rather than "shelling out" to a DOS box&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;MSI Command Launcher runs as a proper ProjectInstaller and&amp;nbsp;can be run (i.e. tested)&amp;nbsp;standalone from&amp;nbsp;the command line.&amp;nbsp; Documentation on usage is included in the archive that can be downloaded from: &lt;a href="http://www.altervisitor.com/software/MSICommandLauncher.msi"&gt;http://www.altervisitor.com/software/MSICommandLauncher.msi&lt;/a&gt;&lt;/p&gt; &lt;p&gt;When running, the application appears as follows:&lt;/p&gt; &lt;p style="TEXT-ALIGN: center"&gt;&lt;img src="http://homepage.ntlworld.com/james.greenwood4/software/images/msicommandlauncher.gif" /&gt;&lt;/p&gt; &lt;p&gt;This is a first release of this application, and I've not tested it as much as the others, so feedback would be great. The only problem I know about is if you're writing huge amounts of text to the console in an interactive script (one that requires user input) - the RichTextBox it writes to is pretty slow to update, meaning that input may be expected (and output blocked) before all of the preceeding text has been written to the screen. In applications that are more judicious in their usage of Console.WriteLine, and applications that don't read from the console, this problem won't exist.&lt;/p&gt; &lt;p&gt;&lt;em&gt;If you do use this in your projects, please drop me a mail to let me know - I'd like to track the uptake of all the tools I put out on the Net, so I know which ones to support/extend.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=225523" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category></item><item><title>NUnit MSI - an NUnit plugin for Setup &amp; Deploy packages</title><link>http://weblogs.asp.net/jsgreenwood/archive/2004/08/18/216229.aspx</link><pubDate>Wed, 18 Aug 2004 01:26:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:216229</guid><dc:creator>jsgreenwood</dc:creator><slash:comments>18</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/jsgreenwood/rsscomments.aspx?PostID=216229</wfw:commentRss><comments>http://weblogs.asp.net/jsgreenwood/archive/2004/08/18/216229.aspx#comments</comments><description>&lt;p&gt;One of the things that's irked me for quite some time is how, even in a mature TDD environment, the tests that are written never seem to make it past the integration server.&amp;nbsp; Yet vast amounts of time gets spent tracing and fixing the differences between environments that cause glitches in execution.&amp;nbsp; The time it takes to spot these errors and&amp;nbsp;the fact that the installation of bad software has already occured makes it a bit like shutting the stable door after the horse has bolted.&amp;nbsp; To me, it became apparent quite some time ago that tests shouldn't just be a means of validating refactorings and amends locally, they should also be&amp;nbsp;a first line of defence when it comes to deploying to and troubleshooting environments (security factors aside).&lt;/p&gt; &lt;p&gt;So, after a few late nights over the last week, the project I've been working on has been finished - &lt;strong&gt;NUnit MSI&lt;/strong&gt;.&amp;nbsp; This application does pretty much what it says on the tin - it sits in MSI installers as a custom action and runs the tests as part of the installation package, deciding whether or not to continue installation based upon success (and the user's input if so desired).&amp;nbsp; It can be downloaded from: &lt;a href="http://www.altervisitor.com/software/NUnitMSI.msi"&gt;http://www.altervisitor.com/software/NUnitMSI.msi&lt;/a&gt;,&amp;nbsp;and here's a screenshot to give you an idea:&lt;/p&gt; &lt;p style="TEXT-ALIGN: center"&gt;&lt;img src="http://homepage.ntlworld.com/james.greenwood4/software/images/blog/nunitmsi.gif" /&gt;&lt;br /&gt;&lt;i&gt;Screenshot of NUnit MSI&lt;/i&gt;&lt;/p&gt; &lt;p&gt;As well as running from within installers, I personally now use it as a custom build action to give me a "green light" that I've not broken anything, rather than having the heavier-weight NUnit GUI running all the time (although it is still useful for persistent errors and larger projects).&lt;/p&gt; &lt;p&gt;The code for NUnit MSI is based directly on NUnit v2.2 (2.2.0), and makes use of all the behind the scenes logic from that, just re-implementing the UI portion of NUnit. Full instructions are included in the archive, and are summarised (in brief) below.&amp;nbsp; &lt;em&gt;As a parting comment, if you use this, please let me know give me feedback - I'm all for extending it, polishing it, making it work as a VS.NET plugin, etc.&lt;/em&gt;&lt;/p&gt; &lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt; &lt;p&gt;&lt;em&gt;&amp;nbsp; Running the NUnitMSI.exe application without any command line &lt;br /&gt;&amp;nbsp; parameters will look in&amp;nbsp;the folder&amp;nbsp;it resides in for the first file with a &lt;br /&gt;&amp;nbsp; .nunit file extension.&amp;nbsp; This will automatically be loaded and the tests run. &lt;br /&gt;&amp;nbsp; If all the tests succeed, the application will pause for one second then &lt;br /&gt;&amp;nbsp; exit successfully.&amp;nbsp; This is the exact same behaviour if it is added to a &lt;br /&gt;&amp;nbsp; Setup and Deploy project.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; More advanced command-line usage takes the form:&lt;br /&gt;&amp;nbsp; NUnitMSI.exe [config.nunit] [/queryerrors]&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Giving a relative filepath for "config.nunt" will cause the specified NUnit &lt;br /&gt;&amp;nbsp; project file to be loaded, instead of one being probed for.&lt;br /&gt;&amp;nbsp; The "/queryerrors" parameter will cause a dialog to be shown should errors &lt;br /&gt;&amp;nbsp; be detected, asking the user if they wish to continue with installation &lt;br /&gt;&amp;nbsp; regardless.&amp;nbsp; The default is to NOT show this dialog, and for a failed test &lt;br /&gt;&amp;nbsp; to result in the installation rolling back.&amp;nbsp; However, whenever tests fail, &lt;br /&gt;&amp;nbsp; whether this dialog is shown or not, the GUI does NOT automatically exit - &lt;br /&gt;&amp;nbsp; it remains open to allow the user to inspect the errors in more detail.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Usage example:&amp;nbsp; "NUnitMSI.exe ../tests.nunit /queryerrors"&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; This basic-usage mode allows for NUnit MSI to be integrated with a local &lt;br /&gt;&amp;nbsp; build process as a "post build action", allowing for a succinct graphical &lt;br /&gt;&amp;nbsp; display of the test results, rather than requiring a heavyweight interface &lt;br /&gt;&amp;nbsp; such as the NUnit GUI, or having to parse the output of the command line &lt;br /&gt;&amp;nbsp; installer.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NOTE: once the tests have completed, pressing "F10" on the form will cause &lt;br /&gt;&amp;nbsp; them to run again.&amp;nbsp; This is not documented in the GUI, but is useful when &lt;br /&gt;&amp;nbsp; running the application as an alternative to the standard NUnit GUI &lt;br /&gt;&amp;nbsp; interface;.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; NOTE: If the application does not have a ".nunit" file specified, and it &lt;br /&gt;&amp;nbsp; cannot locate one in the execution directory, it will exit automatically &lt;br /&gt;&amp;nbsp; with a status code of "-3".&amp;nbsp; Other status codes are:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0: OK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1: Tests failed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -2: Invalid ".nunit" file specified&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=216229" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/jsgreenwood/archive/tags/Process/default.aspx">Process</category></item></channel></rss>