<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13321238</id><updated>2012-06-03T11:57:58.418+10:00</updated><category term='AOP'/><category term='Visual Studio'/><category term='alt.net'/><category term='tools'/><category term='pdc'/><category term='workflow'/><category term='silverlight'/><category term='books'/><category term='ajax'/><category term='TFS'/><category term='development'/><category term='holiday'/><category term='Sandcastle'/><category term='alm'/><category term='community'/><category term='WP7'/><category term='how to'/><category term='games'/><category term='live writer'/><category term='readify'/><category term='communication'/><category term='open source'/><category term='general'/><category term='CruiseControl.NET'/><category term='VSTS'/><category term='blogger'/><category term='scrum'/><category term='agile'/><category term='tech industry'/><category term='powershell'/><category term='mocking'/><category term='tech.ed'/><category term='microsoft'/><category term='design'/><category term='VS11'/><category term='.net'/><category term='podcasting'/><category term='code contracts'/><category term='testing'/><category term='architecture'/><category term='blogging'/><category term='basics'/><category term='usability'/><category term='nhibernate'/><category term='management'/><category term='database'/><category term='presentations'/><title type='text'>Richard Banks - Agile and .NET</title><subtitle type='html'>Agile Development in a .NET world</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.richard-banks.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default?start-index=26&amp;max-results=25'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>563</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13321238.post-4035599995510384804</id><published>2012-06-01T11:45:00.001+10:00</published><updated>2012-06-01T11:45:47.513+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>How To Prevent Visual Studio 2012 ALL CAPS Menus!</title><content type='html'>&lt;p&gt;For all those people who can’t stand the ALL CAPS menus in Visual Studio 2012 there’s a way to switch them to normal casing.&lt;/p&gt;  &lt;p&gt;Crack open your registry editor and create the following registry key and value&lt;/p&gt;  &lt;p&gt;HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\General\SuppressUppercaseConversion   &lt;br /&gt;REG_DWORD value: 1&lt;/p&gt;  &lt;p&gt;Here’s what it looks like BEFORE&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-wz9D9bqQwBQ/T8geqlkIEQI/AAAAAAAABS8/9cHKspI1Ics/s1600-h/image%25255B6%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-8Fx6ZWCPv-k/T8get6hiSoI/AAAAAAAABTE/j1ChXoQZDLU/image_thumb%25255B2%25255D.png?imgmax=800" width="346" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And here it is after the change&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-WFnjjgvpgP0/T8geu4bhrFI/AAAAAAAABTM/pfsdb7RB1r4/s1600-h/image%25255B7%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-QfxIM4ldFxA/T8gewvm6oFI/AAAAAAAABTU/ApCcE6aPiyM/image_thumb%25255B3%25255D.png?imgmax=800" width="346" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You’re all very welcome!&amp;#160; Now go tell your friends &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://lh6.ggpht.com/-s9wPtd7I4eM/T8gex58iVWI/AAAAAAAABTc/kcBJYcMznh8/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-4035599995510384804?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/4035599995510384804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/06/how-to-prevent-visual-studio-2012-all.html#comment-form' title='50 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4035599995510384804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4035599995510384804'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/06/how-to-prevent-visual-studio-2012-all.html' title='How To Prevent Visual Studio 2012 ALL CAPS Menus!'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-8Fx6ZWCPv-k/T8get6hiSoI/AAAAAAAABTE/j1ChXoQZDLU/s72-c/image_thumb%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>50</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-567508545237230532</id><published>2012-04-18T11:33:00.001+10:00</published><updated>2012-04-18T11:33:01.138+10:00</updated><title type='text'>Visual Studio 11 First Look Cookbook</title><content type='html'>&lt;p&gt;I know I’ve been a little quiet lately, but with good reason; I’m writing a book :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.packtpub.com/microsoft-visual-studio-11-first-look-cookbook/book"&gt;http://www.packtpub.com/microsoft-visual-studio-11-first-look-cookbook/book&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.packtpub.com/sites/default/files/6525EN_MockupCover_Cookbook.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Short, sharp and to the point, and affordable as well! I’ll post more details as the publishing date gets closer, but there’s nothing stopping you preordering a copy now and helping me feed my starving children!&lt;/p&gt;  &lt;h3&gt;I’m not the only one…&lt;/h3&gt;  &lt;p&gt;As it turns out, there are a number of other Aussies also writing books at the moment.&amp;#160; You should also have a look at what they’re offering and support Australian technical authors.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://davidburela.files.wordpress.com/2012/04/book-cover.jpg?w=243&amp;amp;h=300" width="194" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;David Burela just released his Silverlight 5 &amp;amp; Azure book: &lt;a title="http://www.packtpub.com/microsoft-silverlight-5-enterprise-integration-on-windows-azure/book" href="http://www.packtpub.com/microsoft-silverlight-5-enterprise-integration-on-windows-azure/book"&gt;http://www.packtpub.com/microsoft-silverlight-5-enterprise-integration-on-windows-azure/book&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: inline" src="http://www.packtpub.com/sites/default/files/1987EN_MockupCover_Cookbk.jpg" width="194" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;Luke Drumm is currently finishing an XNA 4.0 book: &lt;a href="http://www.packtpub.com/microsoft-xna-4-0-game-development-cookbook/book"&gt;http://www.packtpub.com/microsoft-xna-4-0-game-development-cookbook/book&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="display: inline" src="http://ecx.images-amazon.com/images/I/515oDdqChAL._SL500_AA300_.jpg" width="240" height="240" /&gt;&lt;/p&gt;  &lt;p&gt;Alex Mackey, Mahesh Krishnan &amp;amp; William Tulloch are writing a .NET 4.5 book: &lt;a href="http://www.amazon.com/Introducing-NET-4-5-Alex-Mackey/dp/1430243325"&gt;http://www.amazon.com/Introducing-NET-4-5-Alex-Mackey/dp/1430243325&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-567508545237230532?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/567508545237230532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/04/visual-studio-11-first-look-cookbook.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/567508545237230532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/567508545237230532'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/04/visual-studio-11-first-look-cookbook.html' title='Visual Studio 11 First Look Cookbook'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-1426380124888364532</id><published>2012-03-15T22:16:00.001+11:00</published><updated>2012-03-15T22:16:44.066+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>What do I do With Partially Completed Stories in Scrum?</title><content type='html'>&lt;p&gt;It’s not that rare an occurrence for a scrum team to get to the end of a sprint and find that they have one or more stories that don’t meet the definition of “Done!”.&lt;/p&gt;  &lt;h3&gt;Question&lt;/h3&gt;  &lt;p&gt;This week from one of my former &lt;a href="http://www.scrum.org/scrummaster/" target="_blank"&gt;Professional Scrum Master&lt;/a&gt; students asked me about this situation:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;”What should we do with un-done work at the end of the sprint?     &lt;br /&gt;I was thinking we have two options:      &lt;br /&gt;1) Move the user story to the backlog for re-prioritisation (maybe into the next sprint).&amp;#160; The problem here is that I’m not sure what to do with the story points as it screws up our sprint velocity      &lt;br /&gt;2) Split the user story.&amp;#160; In this case we would leave the old user story’s points as-is, then create a new user story with the remaining work and re-estimate with planning poker.      &lt;br /&gt;I was reviewing the scrum.org &lt;a href="http://www.scrum.org/scrumguides/" target="_blank"&gt;scrum guide&lt;/a&gt; and it doesn’t seem to have any details in this area.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Answer&lt;/h3&gt;  &lt;p&gt;The lack of detail in the scrum guide should be enough indication on the approach to take. If the scrum guide doesn’t talk about splitting stories then it’s probably reasonable to assume you shouldn’t do it :-)&lt;/p&gt;  &lt;p&gt;Putting the story back on the backlog for reprioritisation.&amp;#160; Sure, you won’t get any credit for the story in the current sprint because it’s not done, but it won’t screw up velocity either because velocity will be a true reflection of what you actually delivered during the sprint.&amp;#160; &lt;em&gt;We want velocity to measure our rate of delivery not our effort&lt;/em&gt;. On average, over a number of sprints the velocity figures will average out in any case.&amp;#160; So yes, you may well have a few peaks and troughs when looking at single sprints but looking across the last 3 to 5 sprints you should have a good reflection of your actual rate of progress.&lt;/p&gt;  &lt;p&gt;Not having a story finished and getting no credit for it also gives the team something to talk about during the retrospective. “Why didn’t we get to ‘done’ on story X?”.&lt;/p&gt;  &lt;p&gt;On the flip side, I don’t like splitting incomplete stories because&lt;/p&gt;  &lt;p&gt;1. it gives teams an “out” for not finishing properly and they get credit for effort not delivery. It stops them pushing for a goal and stymies the inspect and adapt process.&lt;/p&gt;  &lt;p&gt;2. how do you actually split the story that was almost finished?&amp;#160; Can you split it in such a way that the work that was “almost” finished meets the “done” definition?&amp;#160; Can you do it in such a way that your product owner is absolutely sure that the completed part of the story is Done and that their acceptance criteria are satisfied? Can you cleanly separate the business value delivered between the completed part and the incomplete part? I doubt it.&lt;/p&gt;  &lt;p&gt;Taking an incomplete story and splitting it just to make it look like you have a stable velocity reduces transparency and hides the truth of what you can actually achieve from your product owner, your stakeholders and most importantly yourselves.&amp;#160; Don’t do it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-1426380124888364532?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/1426380124888364532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/03/what-do-i-do-with-partially-completed.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1426380124888364532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1426380124888364532'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/03/what-do-i-do-with-partially-completed.html' title='What do I do With Partially Completed Stories in Scrum?'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-4726072217265482953</id><published>2012-03-04T18:05:00.001+11:00</published><updated>2012-03-04T18:05:57.083+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>The Visual Studio 11 Interface, With More Metro</title><content type='html'>&lt;p&gt;Without getting into the “It sucks! No, It rocks!” debate about the new user interface there are some areas that people are particularly fired up about, including the use if colons as a placeholder for menu bars.&lt;/p&gt;  &lt;p&gt;On the &lt;a href="http://visualstudio.uservoice.com/forums/121579-visual-studio" target="_blank"&gt;Visual Studio User Voice site&lt;/a&gt; there’s a request to tweak the UI and &lt;a href="http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2623659-go-all-in-with-a-zune-style-metro-ui-see-my-makeo" target="_blank"&gt;go “all in” with the Metro styling&lt;/a&gt; borrowing from the Zune interface (an interface I happen to particularly like).&lt;/p&gt;  &lt;p&gt;Let’s have a look at the current UI as posted on the Visual Studio teams blog entry &lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2012/02/23/introducing-the-new-developer-experience.aspx" target="_blank"&gt;Introducing the New Developer Experience&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-29-92-metablogapi/2248.dev11lightcolourtheme_5F00_0BC702C8.png" width="640" height="396" /&gt;&lt;/p&gt;  &lt;p&gt;Now let’s look at the proposed user interface with it’s makeover (via &lt;a href="http://i.imgur.com/Dh0zV.png"&gt;http://i.imgur.com/Dh0zV.png&lt;/a&gt;):&lt;/p&gt;  &lt;p&gt;&lt;img src="http://i.imgur.com/Dh0zV.png" width="640" height="407" /&gt;&lt;/p&gt;  &lt;p&gt;Not to be left as the sole alternative, here’s a slightly different take on it (via &lt;a title="http://i.imgur.com/EWH1R.png" href="http://i.imgur.com/EWH1R.png"&gt;http://i.imgur.com/EWH1R.png&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;img src="http://bit.ly/A1LZHh" width="640" height="407" /&gt;&lt;/p&gt;      &lt;p&gt;I’m not campaigning for votes for the feature (and at this stage the UI is going to be mostly set in stone in any case), but what I do want to do is point out that a consistent focus on the Metro design principles makes a difference.&lt;/p&gt;  &lt;p&gt;If you go Metro, go full metro, not some halfway house. The alternate user interfaces work in that they remove as much window chrome and scroll bar noise as possible, letting developers focus more on the content and they realise that if typography is king, then make typography king!&amp;#160; Fix menu fonts, title fonts, and so forth and be consistent about it.&amp;#160; By improving the typography they also managed to retain the shouty tab names in such a way that they don’t grate anywhere near as much as the current UI does.&amp;#160; The UI also feels cleaner because the ::::: lines aren’t there adding unnecessary noise.&lt;/p&gt;  &lt;p&gt;It’s interesting to see how much of a difference the Metro design language can actually make to a user interface, and definitely something to consider if you get asked by your users to create a Windows 7 or desktop application that feels like a Windows 8 Metro style application.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-4726072217265482953?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/4726072217265482953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/03/visual-studio-11-interface-with-more.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4726072217265482953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4726072217265482953'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/03/visual-studio-11-interface-with-more.html' title='The Visual Studio 11 Interface, With More Metro'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-2287644337089218414</id><published>2012-03-04T09:10:00.001+11:00</published><updated>2012-03-04T09:16:40.995+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS11'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>How To Unit Test Async Methods with MSTest, XUnit and VS11 Beta</title><content type='html'>MSTest finally got some love with the Visual Studio 11 Beta and one of those changes was to enable tests to run asynchronously using the &lt;strong&gt;async&lt;/strong&gt; and &lt;strong&gt;await&lt;/strong&gt; keywords.&lt;br /&gt;&lt;br /&gt;This is required if you want to write tests against any async methods (especially with WinRT!) but can also be used anywhere else you need to perform asynchronous operations.&lt;br /&gt;&lt;br /&gt;Here’s a silly sample test to show you how it’s done&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#;"&gt;[TestMethod]&lt;br /&gt;public async Task LoadGoogleHomePageAsync()&lt;br /&gt;{&lt;br /&gt;    var client = new System.Net.Http.HttpClient();&lt;br /&gt;    var page = await client.GetStringAsync("www.google.com");&lt;br /&gt;    Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Contains(page, "google");&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;XUnit also supports this option as shown here:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: c#;"&gt;[Xunit.Fact]&lt;br /&gt;public async Task XUnitAsyncTestMethod()&lt;br /&gt;{&lt;br /&gt;    var c = new System.Net.Http.HttpClient();&lt;br /&gt;    var result = await c.GetStringAsync("http://www.google.com");&lt;br /&gt;    Xunit.Assert.Contains("google", result);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Be aware that if you have a testsettings file specified in the Unit Test Explorer that async tests will not work.&amp;nbsp; This applies to the beta only.&amp;nbsp; Apart from that everything works as expected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-2287644337089218414?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/2287644337089218414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/03/how-to-unit-test-async-methods-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/2287644337089218414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/2287644337089218414'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/03/how-to-unit-test-async-methods-with.html' title='How To Unit Test Async Methods with MSTest, XUnit and VS11 Beta'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-1692174643953903042</id><published>2012-03-03T20:43:00.001+11:00</published><updated>2012-03-03T20:43:40.860+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>Git-TFS Presentation at the 2012 MVP Summit</title><content type='html'>&lt;p&gt;The day before the 2012 Microsoft MVP Summit kicked off in earnest there was an MVP-to-MVP day. For those of us in the Visual Studio ALM area we had a day long series of lightning talks about all sort of TFS related subjects, making for a good and wide-ranging day.&lt;/p&gt;  &lt;p&gt;For something different, I did a talk about git and TFS integration and how &lt;a href="https://github.com/git-tfs/" target="_blank"&gt;git-tfs&lt;/a&gt; can be used to hide many of the problems with TFS source control.&amp;#160; Below is a slightly modified version of the slide deck I used. &lt;/p&gt;  &lt;p&gt;I hope you find it useful.&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_11842520"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Git TFS" href="http://www.slideshare.net/rbanks54/git-tfs" target="_blank"&gt;Git TFS&lt;/a&gt;&lt;/strong&gt; &lt;iframe height="355" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/11842520?rel=0" frameborder="0" width="425" marginwidth="0" scrolling="no"&gt;&lt;/iframe&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank"&gt;PowerPoint&lt;/a&gt; from &lt;a href="http://www.slideshare.net/rbanks54" target="_blank"&gt;Richard Banks&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-1692174643953903042?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/1692174643953903042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/03/git-tfs-presentation-at-2012-mvp-summit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1692174643953903042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1692174643953903042'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/03/git-tfs-presentation-at-2012-mvp-summit.html' title='Git-TFS Presentation at the 2012 MVP Summit'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-1925976331626602003</id><published>2012-03-03T19:59:00.001+11:00</published><updated>2012-03-03T20:56:05.582+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='alm'/><title type='text'>Improved Unit Testing with Visual Studio 11 Beta</title><content type='html'>&lt;a href="http://lh4.ggpht.com/-kKV7ACyilLA/T1HdSm74Z3I/AAAAAAAABP4/b6Jvt8_IYM8/s1600-h/image%25255B11%25255D.png"&gt;&lt;img align="left" alt="image" border="0" height="240" src="http://lh6.ggpht.com/-ahAO0fAOiF0/T1HdTD44N6I/AAAAAAAABQA/5ulG-49fNIM/image_thumb%25255B5%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; float: left; margin: 0px 10px 10px 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="212" /&gt;&lt;/a&gt;There’s just so much new stuff in the Visual Studio 11 Beta! In fact, someone should write a book about it… Oh wait, I am! (more on that when the time is right). For now, let’s have a look at one feature that makes me so very happy: Visual Studio’s new and improved unit testing capabilities.&lt;br /&gt;It’s widely recognised by those with a desire to do unit testing that there are better unit test frameworks out there than MSTest but given that Visual Studio has always been so tightly coupled with MSTest it’s always been more difficult than it should be to get other test frameworks working well in Visual Studio.&amp;nbsp; The TestDriven.NET and ReSharper test runners have helped, but the integration back to visual studio was always lacking.&lt;br /&gt;That all changes with the Visual Studio 11. Now it’s a case of “Use the framework that makes you happy. We don’t mind”.&lt;br /&gt;You want to use XUnit? No problem!    &lt;br /&gt;NUnit? Easy!    &lt;br /&gt;MSTest (without the baggage it usually has)? Sure thing!    &lt;br /&gt;QUnit for JavaScript? Bring it on!    &lt;br /&gt;Something random that we’ve never heard of? Write an adapter and it’ll work just fine!&lt;br /&gt;&lt;h3&gt; Dogs and Cats Living Together!&lt;/h3&gt;Visual Studio 11 introduced a test adapter model so that any test framework can run inside Visual Studio if there is an adapter for it.&amp;nbsp; The adapter model also means that you can not only run XUnit, NUnit, or any other type of test but you can run them in the same test assembly if you really wanted to! Why? I don’t know! But you can :-)&lt;br /&gt;Maybe you have a suite of MSTest tests but you also want use XUnit’s data driven test features because &lt;a href="http://www.richard-banks.org/2010/03/mstest-sucks-for-unit-tests.html" target="_blank"&gt;MSTest sucks for unit testing&lt;/a&gt;. You can do just that.&amp;nbsp; It’s really nice.&lt;br /&gt;Note: In MSTest’s favour, in this release when MSTest is used in a plain old class library for unit testing the MSTest test adapter uses a cut down, light weight version of MSTest with just the features needed for unit testing and none of the baggage that it normally comes with, making it quite usable for most unit testing needs. For most developers with an existing investment in MSTest tests they will see an improvement in performance as a result.&lt;br /&gt;&lt;h3&gt; Pre-Requisites&lt;/h3&gt;Get yourself started by loading the appropriate adapter for your unit test framework from the Visual Studio Extension Manager.&amp;nbsp; MSTest is already in the box so you don’t have to worry about that one.&amp;nbsp; In this screen shot I’ve loaded up the &lt;a href="http://xunit.codeplex.com/" target="_blank"&gt;XUnit&lt;/a&gt;, &lt;a href="http://www.nunit.org/" target="_blank"&gt;NUnit&lt;/a&gt; and &lt;a href="http://chutzpah.codeplex.com/" target="_blank"&gt;Chutzpah&lt;/a&gt; test adapters.&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-37SwZw6hBwc/T1HdTX5Kh3I/AAAAAAAABQI/Mn_31u3A8AA/s1600-h/SNAGHTML5b8384c%25255B6%25255D.png"&gt;&lt;img alt="SNAGHTML5b8384c" border="0" height="442" src="http://lh3.ggpht.com/-feyQmQYP2ss/T1HdT-Tu97I/AAAAAAAABQQ/KM3b2tWdVWo/SNAGHTML5b8384c_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML5b8384c" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt; Running Unit Tests&lt;/h2&gt;Create a new C# Assembly project (NOT a test project) and add the XUnit and NUnit test frameworks to your project using NuGet&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-CkDaKMxqJhY/T1HdUfiB1eI/AAAAAAAABQY/fePx1sFDo8Q/s1600-h/SNAGHTML5c26ddd%25255B5%25255D.png"&gt;&lt;img alt="SNAGHTML5c26ddd" border="0" height="427" src="http://lh3.ggpht.com/-hck3xCardUY/T1HdVMYFVWI/AAAAAAAABQg/e8z-hz8VQZQ/SNAGHTML5c26ddd_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML5c26ddd" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;You can also add a reference to Microsoft.VisualStudio.QualityTools.UnitTestFramework so that you can do MSTest based unit tests.&lt;br /&gt;Here, I’ve started by adding a simple XUnit test, then building the code and running the unit test as shown:&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/-2io0-1hoCjQ/T1HdVhVdNGI/AAAAAAAABQo/5N6foa6e2gY/s1600-h/SNAGHTML5d08bb9%25255B6%25255D.png"&gt;&lt;img alt="SNAGHTML5d08bb9" border="0" height="480" src="http://lh4.ggpht.com/-fJFzFgU678A/T1HdWDkyiHI/AAAAAAAABQw/hP7U_5VbHWg/SNAGHTML5d08bb9_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML5d08bb9" width="589" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see in the output window there is now a “Discover test started” phase where Visual Studio looks at the assemblies and determines what tests are in the system so that it can spin up the right framework and execute the tests.&lt;br /&gt;The Unit Test explorer on the left shows the tests that were run, the time it took and any error information for failed tests.&lt;br /&gt;In the same code I have then added MSTest and NUnit tests as shown, however at this stage I have not yet built the project – take note of the unsaved changes icon in the document tab, indicating that the project is neither saved nor built as yet:&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-zX9vPpCtZsg/T1HdWzezY3I/AAAAAAAABQ4/VZLr6pZnINw/s1600-h/image%25255B10%25255D.png"&gt;&lt;img alt="image" border="0" height="449" src="http://lh4.ggpht.com/-OCx9XEpV_vU/T1HdXlY80EI/AAAAAAAABRA/YaJXkSBumdQ/image_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt; Run Tests After Build (Almost Continuous Testing)&lt;/h3&gt;Continuous Testing is the idea that as you do your work all the unit tests are constantly running in the background and giving you live feedback when there are problems code by highlighting where tests have failed and where your code is broken.&amp;nbsp; The immediate feedback cycle makes test driven development an even faster development process since there’s no waiting around for all the tests to run.&lt;br /&gt;Visual Studio has taken a step towards this ideal with the “Run Tests After Build” option as shown in the image below. Turn that setting on and as soon as you compile your code Visual Studio will run the tests automatically on a background thread so that you don’t end up with a blocked UI and can get on with coding the next thing on your list.&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/-pw0LrJJRHUg/T1HdYPodMVI/AAAAAAAABRI/KVJS9s7PuNc/s1600-h/image%25255B17%25255D.png"&gt;&lt;img alt="image" border="0" height="175" src="http://lh4.ggpht.com/-97zRajE7lrE/T1HdYsOMN_I/AAAAAAAABRQ/Tnvhzsuz8W4/image_thumb%25255B9%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="572" /&gt;&lt;/a&gt;&lt;br /&gt;If a test failed the unit test explorer goes red and it’s obvious that there’s a problem.&amp;nbsp; The interesting thing is that in smaller projects the tests often run so fast that you don’t even notice them happening!&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-CvYlh8abA4E/T1HdY1UF-4I/AAAAAAAABRY/2GdLSF5DD-o/s1600-h/SNAGHTML5de845a%25255B5%25255D.png"&gt;&lt;img alt="SNAGHTML5de845a" border="0" height="467" src="http://lh4.ggpht.com/-wEJeHzcL9pk/T1HdZ6njg9I/AAAAAAAABRg/a7mQDZ_P2Vs/SNAGHTML5de845a_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML5de845a" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;As a tip, once you’ve been using the test after build feature for a while you will probably want to stop the Output window from popping up every time you build so that you don’t have to keep closing it.&amp;nbsp; You can do this in the Visual Studio Options as shown&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-VHsOJRYEUYU/T1HdaDqGK3I/AAAAAAAABRo/EhDFojou2qY/s1600-h/SNAGHTML5e0d612%25255B5%25255D.png"&gt;&lt;img alt="SNAGHTML5e0d612" border="0" height="372" src="http://lh3.ggpht.com/-mUK3WI_7u3g/T1HdauOXw7I/AAAAAAAABRw/N_tArTI0C5c/SNAGHTML5e0d612_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML5e0d612" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt; Don’t Forget JavaScript Unit Tests!&lt;/h3&gt;OK, I won’t.&amp;nbsp; Make sure you have the Chutzpah test adapter Visual Studio extension installed (see above).&lt;br /&gt;In a standard web project include QUnit or Jasmine in your project and then create a JavaScript file for your tests.&amp;nbsp; Once you have your tests written run them as you normally would and Chutzpah will do the tricky work of finding the tests and running them.&amp;nbsp; Here’s a screen shot of a web project with a QUnit test in it&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/-qFUraQ23VYs/T1Hda96LxOI/AAAAAAAABR4/vp4ub10Lp6c/s1600-h/SNAGHTML6029dd3%25255B5%25255D.png"&gt;&lt;img alt="SNAGHTML6029dd3" border="0" height="352" src="http://lh5.ggpht.com/-pNBDU03DgRc/T1HdbY1SKHI/AAAAAAAABSA/Hppyu4wv4v4/SNAGHTML6029dd3_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="SNAGHTML6029dd3" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h3&gt; Conclusion&lt;/h3&gt;So there you have it! A brief overview of the new unit testing features in Visual Studio 11 Beta. Go and get it now and start playing with it.&lt;br /&gt;Having Visual Studio automatically running your tests each time you do a build will change your development workflow for the better and keep you more focused on coding and help you stay in the mythical zone if you ever get there.&lt;br /&gt;Remember that since all tests run in the background and this removes the time spent waiting for tests to finish that you can have tens of thousands of tests taking minutes to run each time and you won’t even feel a delay in your development activities.&amp;nbsp; Fantastic!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-1925976331626602003?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/1925976331626602003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/03/get-visual-studio-11-beta-right-now-for.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1925976331626602003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1925976331626602003'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/03/get-visual-studio-11-beta-right-now-for.html' title='Improved Unit Testing with Visual Studio 11 Beta'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-ahAO0fAOiF0/T1HdTD44N6I/AAAAAAAABQA/5ulG-49fNIM/s72-c/image_thumb%25255B5%25255D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-3222301978256913529</id><published>2012-02-04T21:38:00.001+11:00</published><updated>2012-02-04T21:38:23.561+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Why do Developers Underestimate</title><content type='html'>&lt;p&gt;There’s a very funny response to a question on Quora doing the rounds at the moment.&amp;#160; The question is “Why are software development task estimations regularly off by a factor of 2-3?”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.quora.com/Engineering-Management/Why-are-software-development-task-estimations-regularly-off-by-a-factor-of-2-3/answer/Michael-Wolfe" target="_blank"&gt;The response&lt;/a&gt; (go ahead and read it) makes an analogy to hiking from San Francisco to Los Angeles to visit friends, underestimating the distance, terrain and rate of progress as well as encountering a number of impediments like the weather, colds, blisters and so forth.&amp;#160; It’s a really good read.&lt;/p&gt;  &lt;p&gt;It was mentioned on the &lt;a href="http://groups.google.com.au/group/ozaltdotnet?hl=en-GB" target="_blank"&gt;Australian Alt.Net mailing list&lt;/a&gt;, this week and followed up with the question of &lt;em&gt;“so what do we learn from it?”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Two simple lessons come to mind.&lt;/p&gt;  &lt;h2&gt;Lesson 1: It takes time to produce a reasonable estimate&lt;/h2&gt;  &lt;p&gt;On any reasonable project don’t expect to be accurate if your estimate takes you less than 5 minutes to arrive at.&amp;#160; In the example, it’s pretty obvious that little time was spent coming up with the estimate for how long the hike might take.&amp;#160; Once they’d decided they were going to hike, taking time to estimate how long it would take was just stealing time from actually hiking!&lt;/p&gt;  &lt;p&gt;As developers, we allow ourselves to do this all the time.&amp;#160; “I like to write code, I don’t like to estimate. If I get the estimate done quick then I can get back to doing what I like.” &lt;/p&gt;  &lt;p&gt;Stop it.&amp;#160; You’re only storing up pain for yourself down the track.&lt;/p&gt;  &lt;h2&gt;Lesson 2: Think about what might slow you down&lt;/h2&gt;  &lt;p&gt;When you estimate think about what might slow you down.&amp;#160; Very few teams do this but it’s critical if you want to be more realistic about how long something will take.&lt;/p&gt;  &lt;p&gt;Most developers estimate with the same approach that they test their own code.&amp;#160; They only consider the happy path.&lt;/p&gt;  &lt;p&gt;You can hear them in their heads saying “It takes this long to do that. And that long to do that. And … then put it all together and the estimate is X months!!”.&lt;/p&gt;  &lt;p&gt;Very few developers then say, “so the baseline is X months.&amp;#160; Now what is likely to slow us down?”.&amp;#160; Yet there are so many things that can do just that.&lt;/p&gt;  &lt;p&gt;Want a basic list? How about the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Have you done anything like this before?&amp;#160; How vague are the requirements you have at the time of estimating?&lt;/li&gt;    &lt;li&gt;How well do you know the technology you’re using?&amp;#160; Or the design and techniques you’ll be implementing with?&lt;/li&gt;    &lt;li&gt;How well do you know the people on your team? Are you all co-located? Can you communicate easily?&lt;/li&gt;    &lt;li&gt;Does your team have all the skills you need to get the job done or will you have to rely on other’s being available?&lt;/li&gt;    &lt;li&gt;How well do we know the problem you’re being asked to solve?&lt;/li&gt;    &lt;li&gt;How well can you communicate with your customer(s)? How available will they be?&lt;/li&gt;    &lt;li&gt;How bad are the worst people on your team and how much will they slow everyone down?&lt;/li&gt;    &lt;li&gt;How’s team morale? Are people likely to leave mid project and take a whole lot of knowledge with them? How long would it take to replace them and get them up to speed?&lt;/li&gt;    &lt;li&gt;How sucky is the code you’re working on?&lt;/li&gt;    &lt;li&gt;How likely is it that people on the team will get pulled off on to other work? And how often?&lt;/li&gt;    &lt;li&gt;If you’re estimating will you be doing the work? Or are you estimating on behalf of someone else without involving them?&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That’s a starting list of things all teams should consider when estimating and all of those items should be used to take your “happy path” estimate and adjust it from there.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So next time you need to estimate something, keep these two simple lessons in mind and good luck!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-3222301978256913529?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/3222301978256913529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2012/02/why-do-developers-underestimate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3222301978256913529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3222301978256913529'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2012/02/why-do-developers-underestimate.html' title='Why do Developers Underestimate'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-5103362901708355462</id><published>2011-11-24T10:39:00.001+11:00</published><updated>2011-11-24T10:39:46.036+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Parameters: You’re Doing It Wrong!</title><content type='html'>&lt;p&gt;Having parameters for a method is perfectly fine however like anything, they can be used for evil. So let me give you a tip: If your code looks anything like this method signature (and I kid you not, this is a real method) then YOU”RE DOING IT WRONG!&lt;/p&gt;  &lt;p&gt;SaveContentSetItem(ContentSetItem,String,String,Int32,Int32,Int32,Int32,DateTime,DateTime,DateTime,DateTime,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DateTime,DateTime,DateTime ,DateTime,Boolean,Boolean,Boolean,Int32,Int32,Int32,Int32,Int32,Int32 ,Boolean,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Boolean,Boolean,Boolean,Boolean,Single,Boolean,Boolean ,Boolean,Boolean,Boolean,Boolean,Boolean,Boolean,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Boolean,Boolean ,Boolean,Boolean,Boolean,Boolean,Boolean,Boolean,Boolean,Boolean,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; FileLocation,String,Stream,String,FileDisplayFormat,Boolean,Stream)&lt;/p&gt;  &lt;p&gt;Please, for the love of all things good, turn off your computer right now. Pack it in a box.&amp;#160; Put the box in a locked safe.&amp;#160; Put the safe in a bunker under a mountain. Seal the bunker using 40 foot thick concrete and collapse the entrance.&amp;#160; Place a minefield and barbed wire around the bunker, and never EVER WRITE A LINE OF CODE AGAIN!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-5103362901708355462?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/5103362901708355462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/11/parameters-youre-doing-it-wrong.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/5103362901708355462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/5103362901708355462'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/11/parameters-youre-doing-it-wrong.html' title='Parameters: You’re Doing It Wrong!'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-8386122928873489761</id><published>2011-11-23T11:01:00.001+11:00</published><updated>2011-11-23T11:01:15.043+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>Ready Player One</title><content type='html'>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/-WKebYzjQDGo/Tsw3wEmakjI/AAAAAAAABPE/sIzu-kxW4xU/s1600-h/image%25255B3%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 8px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://lh3.ggpht.com/-alU4DpuKbIM/Tsw3yIbeRkI/AAAAAAAABPM/EVs81C-wQf8/image_thumb%25255B1%25255D.png?imgmax=800" width="158" height="240" /&gt;&lt;/a&gt;I wouldn’t normally mention a fiction book here as your taste for books is likely to be different to mine, however in this case I’ll make an exception.&amp;#160; I’ve just finished reading “&lt;a href="http://www.amazon.com/Ready-Player-One-ebook/dp/B004J4WKUQ/ref=tmm_kin_title_0?ie=UTF8&amp;amp;m=AG56TWVU5XWC2&amp;amp;qid=1321957674&amp;amp;sr=8-1"&gt;Ready Player One&lt;/a&gt;” and enjoyed it so much I read it in just 2 days whilst catching planes and trains and by skipping on sleep.&amp;#160; It was such a good read I simply couldn’t put it down!&amp;#160; I loved it!&lt;/p&gt;  &lt;p&gt;Why so? Because it’s a near future, sci-fi book with a big virtual reality/gaming element that I think most geeks will love, especially those who know what an easter-egg is and those with a good knowledge of 80’s geek-, gaming- and/or pop-culture.&amp;#160; Plus it’s got some seriously fun puzzles to try and solve before the reveal happens.&lt;/p&gt;  &lt;p&gt;This book was also Amazon’s book of the month for August 2011, and deservedly so.&amp;#160; Here’s the Amazon review quoted verbatim:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.amazon.com/gp/feature.html?docId=1000706551"&gt;&lt;strong&gt;Amazon Best Books of the Month, August 2011:&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;Ready Player One&lt;/em&gt; takes place in the not-so-distant future--the world has turned into a very bleak place, but luckily there is OASIS, a virtual reality world that is a vast online utopia. People can plug into OASIS to play, go to school, earn money, and even meet other people (or at least they can meet their avatars), and for protagonist Wade Watts it certainly beats passing the time in his grim, poverty-stricken real life. Along with millions of other world-wide citizens, Wade dreams of finding three keys left behind by James Halliday, the now-deceased creator of OASIS and the richest man to have ever lived. The keys are rumored to be hidden inside OASIS, and whoever finds them will inherit Halliday’s fortune. But Halliday has not made it easy. And there are real dangers in this virtual world. Stuffed to the gills with action, puzzles, nerdy romance, and 80s nostalgia, this high energy cyber-quest will make geeks everywhere feel like they were separated at birth from author Ernest Cline.&lt;em&gt;--Chris Schluep&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That review made it sound a little formulaic and it could easily have fallen into that trap, but blissfully it doesn’t.&amp;#160; It’s a fast paced, highly entertaining, well written book and my inner geek loved each and every bit of it, especially the retro 80’s references; from &lt;a href="http://www.clubdevo.com/"&gt;Devo&lt;/a&gt; to &lt;a href="http://www.acdc.com/"&gt;AC/DC&lt;/a&gt;, &lt;a href="http://www.wizards.com/DND/"&gt;Dungeons and Dragons&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Car_Wars"&gt;Car Wars&lt;/a&gt; (awesome!) and from &lt;a href="http://www.imdb.com/title/tt0091042/"&gt;Ferris Bueller&lt;/a&gt; to &lt;a href="http://www.imdb.com/title/tt0083413/"&gt;Family Ties&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As a bonus, this is Ernest Cline’s debut novel.&amp;#160; If he keeps up this level of writing or, even better, improves then I can’t wait to see what he comes up with next!&lt;/p&gt;      &lt;p&gt;P.S. In the interests of full disclosure I’ve got no affiliations with the book or author and I get no kickbacks for mentioning this book, though I wouldn’t mind if there were some, hint, hint!&lt;/p&gt;  &lt;p&gt;If you haven’t read it, go grab it (just a suggestion) and if you have, did you enjoy as much as I did?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-8386122928873489761?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/8386122928873489761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/11/i-wouldnt-normally-mention-fiction-book.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8386122928873489761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8386122928873489761'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/11/i-wouldnt-normally-mention-fiction-book.html' title='Ready Player One'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-alU4DpuKbIM/Tsw3yIbeRkI/AAAAAAAABPM/EVs81C-wQf8/s72-c/image_thumb%25255B1%25255D.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-3324292553191835452</id><published>2011-11-11T08:49:00.001+11:00</published><updated>2011-11-11T08:49:54.395+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Underscores in Test Names are a Pain to Type, Right? Not Anymore!</title><content type='html'>&lt;p&gt;It might be a large assumption given some of the customers I deal with, but I’m going to assume you write unit tests.&amp;#160; I’m also going to assume that when you write tests your test names have underscores separating all the words and making your test names human readable. Something like This_is_a_really_long_test_name_but_thats_ok_because_its_easy_to_read_when_I_use_underscores.&lt;/p&gt;  &lt;p&gt;The only (minor) problem I have with this approach is that underscore isn’t the easiest key to type.&amp;#160; I’d rather just hit the space bar and have Visual Studio change that space to an underscore for me – after all, that’s exactly what computers are good for :-)&lt;/p&gt;  &lt;p&gt;Here’s the good news, there’s a great little ReSharper macro that has been developed that does just that – it’s available from &lt;a href="https://github.com/joaroyen/ReSharperExtensions"&gt;https://github.com/joaroyen/ReSharperExtensions&lt;/a&gt; and all you need to do is create an R# live template that wires the macro up to your test name field in a live template.&amp;#160; For example:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-sdA4nhHyejk/TrxG-Pn6wfI/AAAAAAAABOs/EvjjdlTbCLg/s1600-h/image3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-HwrA65auS7s/TrxG_61CKDI/AAAAAAAABO0/7JRf76ZytXs/image_thumb1.png?imgmax=800" width="675" height="241" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now when you use the live template to create a test you can simply type the test name with spaces and they’ll be converted into underscores for you automagically.&amp;#160; Fanstastic!&lt;/p&gt;  &lt;p&gt;Kudos to &lt;a href="http://www.joaroyen.com/"&gt;Joar Oyen&lt;/a&gt; for his great work, and feel free to &lt;a href="http://www.joaroyen.com/2010/08/resharpers-live-templates-can-do.html"&gt;check out his blog post&lt;/a&gt; for how this works under the hood.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-3324292553191835452?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/3324292553191835452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/11/underscores-in-test-names-are-pain-to.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3324292553191835452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3324292553191835452'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/11/underscores-in-test-names-are-pain-to.html' title='Underscores in Test Names are a Pain to Type, Right? Not Anymore!'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-HwrA65auS7s/TrxG_61CKDI/AAAAAAAABO0/7JRf76ZytXs/s72-c/image_thumb1.png?imgmax=800' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-7703821993716387899</id><published>2011-10-10T14:52:00.001+11:00</published><updated>2011-10-10T14:52:23.853+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum is Open for Extension and Modification</title><content type='html'>&lt;p&gt;The title says it all really.&lt;/p&gt;  &lt;p&gt;Modifications to the framework need to be approved by Ken Schwaber and Jeff Sutherland (co-creators of Scrum), and to be honest there are likely to be very few, given it’s such a simple framework.&lt;/p&gt;  &lt;p&gt;The more interesting thing to keep an eye on will be the Extensions.&amp;#160; As a Scrum Coach and Trainer, I’m often asked what teams should do in a specific scenarios.&amp;#160; Scrum is silent on those situations because they aren’t generic enough, and yet there are generally accepted, healthy behaviours teams should have in those situations.&amp;#160; That’s the essence of an extension.&amp;#160; The healthy, beneficial practices team can use to complement Scrum to help teams in Situation X.&lt;/p&gt;  &lt;p&gt;This a is great move by &lt;a href="http://www.scrum.org"&gt;Scrum.org&lt;/a&gt; and a very welcome one!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scrum.org/scrum-extensions/"&gt;Scrum Extension Library&lt;/a&gt; and &lt;a href="http://www.scrum.org/extend-mod-scrum/"&gt;Submission Guide&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.scrum.org/scrum-guide-proposal/"&gt;Scrum Modification Submission Guide&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-7703821993716387899?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/7703821993716387899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/10/scrum-is-open-for-extension-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/7703821993716387899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/7703821993716387899'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/10/scrum-is-open-for-extension-and.html' title='Scrum is Open for Extension and Modification'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-3921000145695792540</id><published>2011-10-10T09:46:00.001+11:00</published><updated>2011-10-10T09:46:45.888+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><title type='text'>Australian Alt.NET Open Spaces – Tickets Available</title><content type='html'>&lt;p&gt;The inaugural &lt;a href="http://ozaltnetopenspaces.squarespace.com/"&gt;Australian Alt.NET Opens Spaces unconference&lt;/a&gt; is happening on Sat Dec 3 in Melbourne, directly after the Melbourne YOW! event.&lt;/p&gt;  &lt;p&gt;(Free!) &lt;a href="http://ozaltnetopenspaces.eventbrite.com/"&gt;Tickets are now available&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;And for the curious amongst you, the famous &lt;a href="http://altnetseattle.pbworks.com/w/page/12367896/AltNet-Seattle-2011"&gt;Seattle Alt.Net conference&lt;/a&gt; is run in exactly this style, and has the motto of “practice don’t preach” to indicate that it’s all about participation.&amp;#160; Have a search for people’s thoughts on the conference and you’ll invariably find people who found the conference much more enjoyable that traditional lecture style conferences.&lt;/p&gt;  &lt;p&gt;So what are you waiting for? Go and &lt;a href="http://ozaltnetopenspaces.eventbrite.com/"&gt;book a ticket&lt;/a&gt;! I’ve got mine, you should get your hands on one too.&lt;/p&gt;  &lt;p&gt;And don’t forget to spread the word!&amp;#160; The more we have there, the better! Rewteet this post, write your own tweets, put a post on Facebook or LinkedIn, blog about it, tell your colleagues; whatever works.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-3921000145695792540?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/3921000145695792540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/10/australian-altnet-open-spaces-tickets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3921000145695792540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3921000145695792540'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/10/australian-altnet-open-spaces-tickets.html' title='Australian Alt.NET Open Spaces – Tickets Available'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-4346527285931481510</id><published>2011-09-19T08:58:00.001+10:00</published><updated>2011-09-19T08:58:13.150+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>TFS11 and Source Control Improvements</title><content type='html'>&lt;p&gt;Now that build is over and we have a Visual Studio 11 we can finally play with I’ve had a brief look at how local workspaces work.&lt;/p&gt;  &lt;p&gt;For those who aren’t aware, local workspaces finally removes the number 1, most annoying “feature” in TFS and that is the server-side source control model.&lt;/p&gt;  &lt;p&gt;This is the approach where the server keeps track of what it thinks you have on your local development machine and where all checkin/checkout operations require communication with the server making offline work very difficult, and where you can’t make local changes to checked out files because the server wouldn’t be aware of them so all files under source control have the read only bit set.&amp;#160; It’s a major pain.&lt;/p&gt;  &lt;p&gt;Now there are valid reasons for this approach related to managing VERY large source repositories (think multi-GB of source) and it’s still possible to use server-managed work spaces if desired, but for the 99% of us that just don’t deal with that sort of volume this is a feature we just don’t need.&amp;#160; TFS 11 sees the introduction of a subversion style approach to source control with the introduction of local workspaces.&amp;#160; Before you get too excited, remember that a local workspace is not a DVCS and TFS doesn’t feature one yet.&amp;#160; That said, Brian Harry in a recent post about source control improvements in TFS11 said the following (emphasis mine):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;I’m certain that about this time, I bunch of people are asking “but, did you implement DVCS”. The answer is no, not yet. You still can’t checkin while you are offline. And you can’t do history or branch merges, etc. Certain operations do still require you to be online. You won’t get big long hangs – but rather nice error messages that tell you you need to be online. &lt;strong&gt;DVCS is definitely in our future&lt;/strong&gt; and this is a step in that direction but there’s another step yet to take.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There’s also a number of suggestions about source control on the &lt;a href="http://visualstudio.uservoice.com/"&gt;Visual Studio User Voice site&lt;/a&gt; that you may want to vote on so that the team makes this a priority, for example &lt;a href="http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037673-allow-the-version-control-system-to-be-pluggable"&gt;Allow the version control system to be pluggable&lt;/a&gt;, or you can create one specifically for a TFS DVCS feature.&lt;/p&gt;  &lt;p&gt;Anyway, let’s have a look at a few things in the new developer preview.&lt;/p&gt;  &lt;h3&gt;What’s on our disk after doing a Get Latest?&lt;/h3&gt;  &lt;p&gt;Firstly, we see we now have a hidden folder in our workspace root&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Rb3Nz69KV-g/TnZ3XR8kiJI/AAAAAAAABNk/o5T4toGriDI/s1600-h/clip_image002%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://lh4.ggpht.com/-IKqpcE_Hlas/TnZ3YKs1N4I/AAAAAAAABNo/Egjc3Ebdo7o/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800" width="523" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The folder itself contains a bunch of child folders, which are oddly reminiscent of sourcesafe.&amp;#160; Thankfully it’s not!   &lt;br /&gt;&lt;a href="http://lh3.ggpht.com/-gFk1zWYYMIo/TnZ3YzxJbSI/AAAAAAAABNs/GV3qnAmc4Vg/s1600-h/clip_image004%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://lh4.ggpht.com/-x5w3mLLA8IE/TnZ3Z46mGwI/AAAAAAAABNw/VSrJw_W4Gs0/clip_image004_thumb%25255B1%25255D.jpg?imgmax=800" width="634" height="445" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;These folders course contain GUID based file names:   &lt;br /&gt;&lt;a href="http://lh6.ggpht.com/-lv2uH7lAP_8/TnZ3aqalmLI/AAAAAAAABN0/jsfP5V0PDZ8/s1600-h/clip_image006%25255B5%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://lh3.ggpht.com/-9-SdSWQ_CQ4/TnZ3bhxGvRI/AAAAAAAABN4/9sjiXt33uNU/clip_image006_thumb%25255B2%25255D.jpg?imgmax=800" width="634" height="445" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;And each of those files are simply GZipped copies of your individual source files. Opening them with 7Zip reveals the source files&amp;#160; just as you would expect.&amp;#160; Obviously you should leave all this alone and not touch it but it’s interesting nonetheless (or at least it is for me!)&lt;/p&gt;  &lt;h3&gt;Local Source Control Operations&lt;/h3&gt;  &lt;p&gt;So leaving that aside, what happens when we make file system changes outside of Visual Studio?&lt;/p&gt;  &lt;p&gt;To find out I did a simple copy/paste of a few files and renamed a view in an MVC3 project.&amp;#160; This is what pending changes shows (the other changes are from the VS11 project upgrade)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-WHYVyF1yfUw/TnZ3cU7J-XI/AAAAAAAABN8/howIpfGJUqE/s1600-h/clip_image008%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://lh5.ggpht.com/-2BFGdMnJOBw/TnZ3dEcW8lI/AAAAAAAABOA/4dQ1Sea65UY/clip_image008_thumb%25255B1%25255D.jpg?imgmax=800" width="289" height="491" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;So the changes are detected but are currently marked as ignored for now.&amp;#160; I get why the copied files are excluded, because they aren’t part of the solution, but I wasn’t sure why the rename was ignored until I realised it had happened because the files I’d chosen were from an MVC3 project and I hadn’t updated VS11 to support MVC3 apps as yet.&amp;#160; This mean Visual Studio hadn’t actually loaded the project so wasn’t actively tracking the file that was renamed.&lt;/p&gt;  &lt;p&gt;If I click the “Detected changes (5)” link, we see this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-xD11Mgko0MM/TnZ3dkZjsII/AAAAAAAABOE/ZPGDPF0xoyI/s1600-h/clip_image010%25255B4%25255D.gif"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://lh5.ggpht.com/-UkqWHbbcDwQ/TnZ3ebYJ5jI/AAAAAAAABOI/mrS_JwLbJ8I/clip_image010_thumb%25255B1%25255D.gif?imgmax=800" width="549" height="361" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You’ll note that the rename detection isn’t happening in the developer preview though I expect a way to mark add/delete pairs as renames will be provided before RTM.&amp;#160; We also have a “promote” button to turn the excluded changes into included ones.&amp;#160; Pretty simple.&amp;#160; You can also right click files to ignore them (such as upgrade reports, backup folders, etc) so that they don’t constantly sit in the “excluded files” list. &lt;/p&gt;  &lt;p&gt;Once we include the files we want, we see this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/-39mLnRGVSzg/TnZ3e6pluII/AAAAAAAABOM/YVFA70lGb4o/s1600-h/clip_image012%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://lh4.ggpht.com/--f9Z-1qzk0I/TnZ3fiNvzVI/AAAAAAAABOQ/ADfmYV4vN90/clip_image012_thumb%25255B1%25255D.jpg?imgmax=800" width="272" height="324" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nice.&amp;#160; Now, when we’re offline we can’t check in with a local workspace.&amp;#160; We have to be connected.&amp;#160; When we are, we can click the Check In button and we’ll get a notification message with a link to the Changeset we just added&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-DFsqGRmEtr0/TnZ3gEU-7DI/AAAAAAAABOU/cP9neTxuhGM/s1600-h/clip_image014%25255B4%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://lh3.ggpht.com/-h4Rz2oZn8K0/TnZ3gzF5-tI/AAAAAAAABOY/SLMn2esyxxc/clip_image014_thumb%25255B1%25255D.jpg?imgmax=800" width="304" height="227" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Local Exclusions&lt;/h3&gt;  &lt;p&gt;In git, mercurial and other source control systems there are usually configuration files to control the files that source control will ignore (i.e .gitignore and .hgignore) and they are located in the same folder as the source itself so that they can be checked in and shared across all team members.&lt;/p&gt;  &lt;p&gt;In TFS there is only one global exclusion file, and it contains all your local exclusions.&amp;#160; It lives in C:\Users\Me\AppData\Local\Microsoft\Team Foundation\4.0\Configuration\VersionControl\LocalItemExclusions.config and looks something like this:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UserExclusions&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Exclusion&amp;gt;c:\temp\tfspreview\scrum project\Trunk\DemoAppSolution\UpgradeLog.XML&amp;lt;/Exclusion&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Exclusion&amp;gt;c:\temp\tfspreview\scrum project\Trunk\DemoAppSolution\_UpgradeReport_Files&amp;lt;/Exclusion&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Exclusion&amp;gt;c:\temp\tfspreview\scrum project\Trunk\DemoAppSolution\Backup&amp;lt;/Exclusion&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/UserExclusions&amp;gt;&lt;/p&gt;  &lt;p&gt;I’d prefer a local exclusion file (e.g. a .$tfsignore) to live at the solution or workspace root and I’d also prefer it to be glob or regex syntax instead of and XML document, but at least we have something. It’s a start.&lt;/p&gt;  &lt;p&gt;Finally, if you want to play with local workspaces you’ll need access to a TFS11 server.&amp;#160; The hosted TFS preview service works well for this and if you try doing source control operations over a 3g connection you &lt;i&gt;really&lt;/i&gt; feel the difference between local operations and server calls.&amp;#160; Alternatively you can download the TFS11 developer preview from MSDN subscriber downloads and install your own TFS server to have a play with.&lt;/p&gt;  &lt;p&gt;All up, this is a well overdue improvement in source control and should alleviate some of the pain we all feel when dealing with TFS.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-4346527285931481510?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/4346527285931481510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/09/tfs11-and-source-control-improvements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4346527285931481510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4346527285931481510'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/09/tfs11-and-source-control-improvements.html' title='TFS11 and Source Control Improvements'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/-IKqpcE_Hlas/TnZ3YKs1N4I/AAAAAAAABNo/Egjc3Ebdo7o/s72-c/clip_image002_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-4338694964048167336</id><published>2011-09-07T14:32:00.001+10:00</published><updated>2011-09-07T14:32:28.883+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='tech.ed'/><title type='text'>Learning from a FAIL</title><content type='html'>&lt;p&gt;&lt;img style="margin: 0px 10px 0px 0px; display: inline; float: left" align="left" src="data:image/jpg;base64,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" /&gt;Last year at TechEd Australia I delivered a session on Unit Testing that was rated top 10 overall.&amp;#160; This year I delivered a group session that has ended up in the bottom 20.&amp;#160; Ouch!&lt;/p&gt;  &lt;p&gt;So what went wrong?&amp;#160; Let me run through a few things and explain.&lt;/p&gt;  &lt;p&gt;For those who weren’t there, the session was a group session presented by myself and 3 others and what we wanted to show was how you can use the full Microsoft stack do deliver on the “three screens and a cloud” promise, how the ALM tooling that Microsoft provides (i.e. Visual Studio and TFS) helps with that, and some of the things to watch out for when doing this kind of development.&amp;#160; Our vehicle for this was going to be a multiplayer game that runs on both Windows Phone 7 devices and Windows desktops.&amp;#160; We also wanted to show how you could extend the experience beyond the game itself and use a single page web application to extend the gaming experience, so we threw that into the mix as well.&amp;#160; That’s a lot for an audience to process in a short space of time.&amp;#160; Probably too much as it turns out.&lt;/p&gt;  &lt;p&gt;Adding to this, re-reading our session abstract I can see how it is easily misinterpreted.&amp;#160; It can be read as if we were going to actually build the application on stage.&amp;#160; We never even considered that as an option because we though for sure that the audience would be lost, but it appears a number of people thought we would try anyway.&amp;#160; I appreciate that you think we can condense 170 hours of development effort into a a 1 cohesive presentation, but we’re not superhuman! :-) This is a failure to manage expectations on my part.&amp;#160; If you turn up expecting to see pure, unadulterated, glowing awesomeness on stage and then we present something that makes them seem merely human then you’re going to be disappointed no matter what.&amp;#160; Not meeting expectations is a common cause of discontent and I missed the mark here.&lt;/p&gt;  &lt;p&gt;Now when we started our session planning we had nothing; no application and only the vaguest of idea on what it might be that we’re going to build, yet we needed something to show so we could have the bones of our session.&amp;#160; This meant we needed to build the whole thing in our spare time and this is where the main problem arose – for various reasons the team only finished the application right before TechEd.&amp;#160; Further, because of the last minute finish of the application, the remoteness of each of the presenters, and the presenter’s individual TechEd sessions on top of this one, we never managed to get a proper dry run through the presentation with all of us there.&amp;#160; We knew the basic idea of what we needed to talk about but we never managed a full practice first.&lt;/p&gt;  &lt;p&gt;This in particular was bad! When I’m doing a solo presentation I usually do at least 3 or 4 dry runs first just to make sure the timing is right, that the flow works and that I hit all the points as I want, etc.&amp;#160; Preparation is key!&amp;#160; I know this, yet did we do it for this particular session? Not really, no.&amp;#160; And the results, sadly, showed this.&lt;/p&gt;  &lt;p&gt;Because of the lack of preparation, we also had a few “off script” moments that really, really didn’t help.&amp;#160; Compounding this is that as presenters we all know each other and are quite ready to joke around and have fun while still getting stuff done.&amp;#160; This unfortunately doesn’t translate on stage.&amp;#160; Humour in a session is great on the proviso it doesn’t detract from the message, that it keeps audience interest up and reinforces the learning for them.&amp;#160; You’ve also got to ensure it’s delivered well and in-jokes or overdoing it certainly doesn’t count in any of these cases.&amp;#160; Again, we let the audience down a little by doing this.&lt;/p&gt;  &lt;h3&gt;Lessons Learned&lt;/h3&gt;  &lt;p&gt;So, what do I learn? How do I improve for next time?&lt;/p&gt;  &lt;p&gt;Content may be king but don’t overload the audience or be too shallow and too broad. We would have been better scaling back on what we did, limiting our content to only a few areas and going deeper in those areas instead of skimming.&lt;/p&gt;  &lt;p&gt;Preparation is paramount.&amp;#160; Our lack of preparation hurt.&amp;#160; Not the preparation in the building of the game (that was fine) but lack of preparation in the delivery of the session.&amp;#160; No matter how good (or bad) the software was, if the delivery was good we would have been fine and people would have enjoyed it more.&amp;#160; The lack of preparation also contributed to overload of humour on stage.&lt;/p&gt;  &lt;p&gt;Set realistic expectations.&amp;#160; There’s a trick when writing session abstracts.&amp;#160; If you make your session sound too boring you probably won’t get asked to speak, but if you over-hype it then people get their expectations raised too far and you set yourself up to disappoint.&amp;#160; More care and attention to the wording of the session abstract would have helped a great deal in this case.&amp;#160; It’s much better to under-commit and over-deliver than to do the opposite.&lt;/p&gt;  &lt;p&gt;Working in a group is hard.&amp;#160; The larger the group, the harder it gets.&amp;#160; If I do another group session in the future, the way we work and the amount of time we’ll commit to up front will be clear from the outset.&amp;#160; Coordinating 4 speakers when they each had their own individual sessions and limited availability was asking too much from everyone, so when something had to give it was, unsurprisingly, the group session that suffered.&lt;/p&gt;  &lt;h3&gt;Evaluation Comments&lt;/h3&gt;  &lt;p&gt;To round out this lengthy post, let’s have a look at some of the comments from the evaluations, both the positive and the negative.&amp;#160; I’ll provide my own feedback in italics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Although I gained a number of tips regarding potential issues there was little here that I can action directly when I get back to work on Monday. The speakers were all fun and had an easy rapport which made this an enjoyable session&lt;/li&gt;    &lt;li&gt;Cut the attempts at comedy and get on with presenting what would have been worth seeing at a more even pace. If you hadn't have jerked around with your piss weak in jokes at the start you could have maybe finished up properly. This doesn't apply to Steve. He looked embarrassed to be with you other gooses.     &lt;br /&gt;&lt;em&gt;- Whoa! OK, ignoring the bile, your point is taken.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Funny presentation, sometimes a bit over the top, but great stuff nonetheless     &lt;br /&gt;&lt;em&gt;- Point taken on the over the top.&amp;#160; It shouldn’t have happened. Sorry.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;good fun talk, relaxed&lt;/li&gt;    &lt;li&gt;Good stuff Ricahrd!!&lt;/li&gt;    &lt;li&gt;great presentation - thanks!     &lt;br /&gt;&lt;em&gt;- Not our best effort but also not a complete waste of time.&amp;#160; Good to know.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;I think the material was good but the comedy act they tried to tack on was just distracting and made their presentation look amateurish which is not what I expect for this type of event.     &lt;br /&gt;&lt;em&gt;- Agreed.&amp;#160; Comedy should have been used sparingly.&amp;#160; Mea culpa.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;I was looking forward to more on the fly coding, rather than flipping past a pre built project. It would be better for my understanding if the demo was for a simpler project, but setup and built in front of us.     &lt;br /&gt;&lt;em&gt;- Expectation management.&amp;#160; We probably should have been clearer in the session description about this.&amp;#160; Lesson learnt.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Its teched not the comedy festival ;)     &lt;br /&gt;&lt;em&gt;- I assume the smiley meant they enjoyed it.&amp;#160; Still, backs up the point that we overdid things.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Less talks and more information and code demo was desired&lt;/li&gt;    &lt;li&gt;Loved the idea of the talk but the reality wasn't what I was expecting. I was expecting (yes my expectations were probably too high) a simple MMO built from scratch during the presentation, demonstrating the key technologies for each platform. In reality the app had already been built but even then too much time was spent monkeying around instead of showing source code or talking about lessons learnt. Once again like most presentations at teched it would have been great to have a link at the end of the talk to any downloads/links etc. Talk had potential but didn't deliver.     &lt;br /&gt;&lt;em&gt;- That last sentence nicely sums up my feelings as well&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;OK demo, but a bit too simple for business app.     &lt;br /&gt;&lt;em&gt;- I thought a title including “MMO” would indicate it wasn’t a business app.&amp;#160; Expectation management again.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Session should have had more code examples going through the actual development process.&lt;/li&gt;    &lt;li&gt;The 4 speakers probably know the technology, but the whole session came across as a jumbled mess of in-jokes and non-seriousness. Not sure how anyone can manage to &amp;quot;learn&amp;quot; anything from these guys. Please plan the session better or if you really didn't have anything to say, just cancel it.     &lt;br /&gt;&lt;em&gt;- Preparation failure on our part.&amp;#160; I’m sorry.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;The humor and relavence of this session made it very worth while.     &lt;br /&gt;&lt;em&gt;- Humour works sometimes, but it didn’t work for everyone.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;The session was informative but I think that there the naming of it should have been better as the current title made the room uncomfortably crowded. The presenters were knowledgable in there fields but to me Steve Nagy was the best presenter, properly explaining the process he took in the development of that project. Though I don't mind some joking it really did distract too much from the amount of material that they needed to cover.&lt;/li&gt;    &lt;li&gt;the speakers did not realise the audience invested time to see this demo. They enjoyed each other company, but wasted my time.     &lt;br /&gt;&lt;em&gt;- Apologies for that.&amp;#160; It definitely wasn’t the intention.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;There was a little bit too much shenanigans on stage, and too many in jokes, so I think a lot in the audience lost interest. I think people were expecting to see more actual code and implementation (as the session title implied).&lt;/li&gt;    &lt;li&gt;This was a very ambitious session and unfortunately, the presenters did not quite pull it off. There was a lot of really cool stuff that these guts were trying to present - but the presentation was low on details, and the attempts at comedy took away from technology being presented&lt;/li&gt;    &lt;li&gt;Too busy trying to get a laugh from the crowd, that time could've been spent explaining some of the pitfalls they faced.&lt;/li&gt;    &lt;li&gt;too much focus on the &amp;quot;gaming concepts&amp;quot; (XNA/Latency&amp;amp;Prediction), but overall very good session.     &lt;br /&gt;&lt;em&gt;- A dry run would have helped balance a lot of the issues raised in the 3 comments above.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Too much time was spent playing about on Stage and not enough on the content. A little bit is good but they went way too far. Points focused on seemed to be very specific to the problems they found with an MMO example, not necessarially translating to what someone else would experience building an app with a cloud backend for the three screen types. The third presenter was more straight up and he actually pulled the about scores up a bit. If I was rating him individually he would get far higher scores for the above, but I would have liked some deeper content, particularly from a 300 session. The one thing that would save this is if we could get a look at the code to actually see how much crossover there is between each of the clients in detail and pull it apart ourselves a bit.     &lt;br /&gt;&lt;em&gt;- I’m tossing up wether to put the code up on github to look at, but some of it was very rushed and not our best work.&amp;#160; Is that still useful?&amp;#160; Blog posts that go into detail may be better.&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;Very good and informative session. Also the speakers' lightheart approach makes this sessions very interesting. Bravo&lt;/li&gt;    &lt;li&gt;Weirdos! Made the session fun     &lt;br /&gt;&lt;em&gt;- Erm, thanks for that summary… I think :-)&lt;/em&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And there you have it.&amp;#160; A very public retrospective from my part on what went wrong, what could have been done better and the lessons to learn.&lt;/p&gt;  &lt;p&gt;Publicly talk about your failings is hard, yet there’s nothing that teaches you more than a big, public failure.&amp;#160; This is my attempt to do some tough learning in an open way so that hopefully you learn something from it as well.&lt;/p&gt;  &lt;p&gt;Finally, if you attended the session at and you thought it sucked, then I apologise and hope that you enjoyed the rest of the conference.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-4338694964048167336?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/4338694964048167336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/09/learning-from-fail.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4338694964048167336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/4338694964048167336'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/09/learning-from-fail.html' title='Learning from a FAIL'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-2394908674364747264</id><published>2011-09-02T12:04:00.001+10:00</published><updated>2011-09-02T12:21:05.493+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Using Parallel Task Library to Unit Test Threading Issues</title><content type='html'>I was doing some work recently on a demo application where data was being pulled in from multiple locations and being added to a collection that was also being iterated over in the same method.&amp;nbsp; Because this data was arriving on multiple threads (i.e. async network call backs for example) I’d occasionally see the usual “collection was modified” error messages indicating that another thread had altered the collection while the first was iterating over it.&amp;nbsp; Obvious threading bug, #FacePlam applied.&lt;br /&gt;&lt;br /&gt;While it can be complex at times to find these kinds of errors, in this case it was fairly easy to diagnose and fix, so following good bug fix practices I took the standard approach of writing a test to prove the bug exists, fixing the code and then running the test again to prove it’s fixed.&lt;br /&gt;&lt;br /&gt;Now, it should be noted that testing threading issues in a deterministic way is nigh on impossible, and there is no guarantee that a unit test for threading issues will genuinely prove the code bug free, however the approach taken here was good enough to throw the threading exception each and every time I ran the test and also the throw the exception on the build server.&lt;br /&gt;&lt;br /&gt;Here’s the code:&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:0d6b495d-8837-495e-b3a7-7b6cc666c082" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;&lt;pre class="brush: c#;"&gt;[TestMethod]&lt;br /&gt;public void ThreadingFun()&lt;br /&gt;{&lt;br /&gt;    InitializeControllerAndGroup();&lt;br /&gt;&lt;br /&gt;    Task[] tasks = new Task[10]&lt;br /&gt;                            {&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(1)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(2)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(1)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(2)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(1)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(2)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(1)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(2)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(1)),&lt;br /&gt;                                Task.Factory.StartNew(() =&amp;gt; MakeMove(2)),&lt;br /&gt;                            };&lt;br /&gt;    Task.WaitAll(tasks);&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;Ignore the first line, that’s just where the collection is being initialised.&amp;nbsp; Also ignore the fact that there’s no Assert statements in this code.&amp;nbsp; The test passes if we have no threading exceptions thrown and fails if we have one.&lt;br /&gt;&lt;br /&gt;The important thing here is to see how easy it is to fire off a lot of threads in a single, easy to read unit test without all the usual threading plumbing code that would litter something like this.&lt;br /&gt;&lt;br /&gt;The way it works is that we define a set of tasks via the Task Parallel Library (part of .NET 4.0) each of which calls the code where we have our threading problem.&amp;nbsp; When Task.Factory.StartNew() is called the Task Parallel Library (TPL) immediately creates a new thread and calls the method returning control to our code along with a Task object so would can check the state of the task or cancel it if so desired.&amp;nbsp; In this case we don’t care and immediately start another thread as soon as possible.&lt;br /&gt;&lt;br /&gt;We then use the Task.WaitAll statement to wait until all the Tasks we defined are completed so that the test doesn’t complete prematurely.&amp;nbsp; Too easy.&lt;br /&gt;&lt;br /&gt;Note that we could also just as easily have used Parallel.Invoke for this.&amp;nbsp; The same test using Parallel Invoke would be something like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="wlWriterEditableSmartContent" id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:fd79ed64-26d2-4934-bb6e-256d57868d3b" style="display: inline; float: none; margin: 0px; padding: 0px;"&gt;&lt;pre class="brush: text;"&gt;[TestMethod]&lt;br /&gt;public void ParallelInvoke()&lt;br /&gt;{&lt;br /&gt;    InitializeControllerAndGroup();&lt;br /&gt;&lt;br /&gt;    Parallel.Invoke(&lt;br /&gt;        () =&amp;gt; MakeMove(1),&lt;br /&gt;        () =&amp;gt; MakeMove(2),&lt;br /&gt;        () =&amp;gt; MakeMove(1),&lt;br /&gt;        () =&amp;gt; MakeMove(2),&lt;br /&gt;        () =&amp;gt; MakeMove(1),&lt;br /&gt;        () =&amp;gt; MakeMove(2),&lt;br /&gt;        () =&amp;gt; MakeMove(1),&lt;br /&gt;        () =&amp;gt; MakeMove(2),&lt;br /&gt;        () =&amp;gt; MakeMove(1),&lt;br /&gt;        () =&amp;gt; MakeMove(2)&lt;br /&gt;    );&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;I personally prefer the first approach because I like the more explicit control over the thread creation, though it’s obviously noisier than the Parallel.Invoke version.&amp;nbsp; Note that with Parallel.Invoke you hand over control to the TPL and it figures out how many threads it will use to run the actions you define based on the number of cores available on the machine.&lt;br /&gt;&lt;br /&gt;Regardless of the method you choose you can take advantage of the TPL to help you unit test your multithreaded code and make your application more resilient.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-2394908674364747264?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/2394908674364747264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/09/using-parallel-task-library-to-unit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/2394908674364747264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/2394908674364747264'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/09/using-parallel-task-library-to-unit.html' title='Using Parallel Task Library to Unit Test Threading Issues'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-8791484328388951114</id><published>2011-08-31T16:22:00.003+10:00</published><updated>2011-08-31T16:24:33.566+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>How To Run Multiple WP7 Emulators</title><content type='html'>The Windows Phone 7 Tools, including the latest Mango update, provide no supported way for running two emulators at the same time.&amp;nbsp; This can be a problem when trying to see how a multiuser application works across multiple devices.&amp;nbsp; Fortunately there’s a way to workaround this limitation using some unsupported edits to your WP7 emulator settings.&lt;br /&gt; NOTE: This is not a supported change and if something breaks on your machine, well… you’ve been warned :-)&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Step 1:&lt;/strong&gt; Open explorer in Administrator mode and go to C:\ProgramData\Microsoft\Phone Tools\CoreCon\10.0\addons&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Step 2:&lt;/strong&gt; Copy “ImageConfig.en-US.xsl” and name it “ImageConfig.en-US 2.xsl”&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Step 3:&lt;/strong&gt; Open this new file in your text editor of choice and locate the DEVICE element and change the device name to something of your choice and the device GUID to a new GUID as shown.&amp;nbsp; Use the &lt;a href="http://www.guidgenerator.com/online-guid-generator.aspx"&gt;Online GUID Generator&lt;/a&gt; to make generating new GUIDs easy.&lt;br /&gt; &lt;br /&gt; &lt;a href="http://lh3.ggpht.com/-Y6XVbFBh9-o/Tl3THeGcWFI/AAAAAAAABM8/lWkHvnLBuJE/s1600-h/image%25255B5%25255D.png"&gt;&lt;img alt="image" border="0" height="59" src="http://lh5.ggpht.com/-LeJnomTpB4o/Tl3TIJYnHnI/AAAAAAAABNA/STgqFF_j3Z4/image_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="644" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Step 4:&lt;/strong&gt; Given the WP7 is a virtual machine, we also need to supply a new Virtual Machine ID, so locate the VMID section and provide a new GUID in there as well.&amp;nbsp; Again the &lt;a href="http://www.guidgenerator.com/online-guid-generator.aspx"&gt;Online GUID Generator&lt;/a&gt; can be used for this purpose.&lt;br /&gt; &lt;br /&gt; &lt;a href="http://lh3.ggpht.com/-aD8999WBvk4/Tl3TI4k6S6I/AAAAAAAABNE/4kayd9OelVw/s1600-h/image%25255B9%25255D.png"&gt;&lt;img alt="image" border="0" height="96" src="http://lh4.ggpht.com/-jo93aVk8gkk/Tl3TJgVYgNI/AAAAAAAABNI/1Q5G50tIqWo/image_thumb%25255B5%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="449" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Ensure that the GUID you insert is in the same format (i.e. with the braces)&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;Step 5:&lt;/strong&gt;&amp;nbsp; Save the file and start the Application Deployment Tool.&amp;nbsp; You should now see your new emulator available to deploy your applications to:&lt;br /&gt; &lt;br /&gt; &lt;a href="http://lh3.ggpht.com/-pL06EaDHflI/Tl3TKPIpBDI/AAAAAAAABNM/D9Itd4svlrM/s1600-h/image%25255B13%25255D.png"&gt;&lt;img alt="image" border="0" height="157" src="http://lh4.ggpht.com/-XDtwACAVGN0/Tl3TKxrnN1I/AAAAAAAABNQ/gFFd2hxx4gU/image_thumb%25255B7%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="450" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; If you close and restart Visual Studio 2010 you should also seen the second phone emulator available as a deployment target:&lt;br /&gt; &lt;br /&gt; &lt;a href="http://lh4.ggpht.com/-jkEii2kzIPI/Tl3TLQc5U8I/AAAAAAAABNU/PsjVW8R7cOs/s1600-h/image%25255B17%25255D.png"&gt;&lt;img alt="image" border="0" height="119" src="http://lh6.ggpht.com/-FdXurjhNAKE/Tl3TLwKZU4I/AAAAAAAABNY/xi0AOLFPf7k/image_thumb%25255B9%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="252" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Note that of you run a phone application in debug mode there seems to be no way to launch a second instance on the other emulator whilst the phone is running.&amp;nbsp; It’s not a major problem though since you can simply take the debug .xap file and deploy it to the second emulator using the deployment tool.&lt;br /&gt; &lt;br /&gt; I hope this helps you out.&amp;nbsp; Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-8791484328388951114?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/8791484328388951114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/08/how-to-run-multiple-wp7-emulators.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8791484328388951114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8791484328388951114'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/08/how-to-run-multiple-wp7-emulators.html' title='How To Run Multiple WP7 Emulators'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-LeJnomTpB4o/Tl3TIJYnHnI/AAAAAAAABNA/STgqFF_j3Z4/s72-c/image_thumb%25255B3%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-404428876910483906</id><published>2011-08-19T11:39:00.002+10:00</published><updated>2011-08-19T11:40:54.300+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><title type='text'>Getting Out of Sync With IIS and Riding A Comet</title><content type='html'>It’s taken a little while but my slide deck from &lt;a href="http://dddsydney.com/"&gt;DDD Sydney, 2011&lt;/a&gt; is now up on the web.&lt;br /&gt; Unfortunately I don’t have the code or load test details embedded in the presentation but even so this should still have a number of useful things for you to look at, especially the resources section at the end &lt;img alt="Smile" class="wlEmoticon wlEmoticon-smile" src="http://lh5.ggpht.com/-bnE5GBpp0D0/Tk2-vPFrCCI/AAAAAAAABM4/T7dPot8kaB8/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;br /&gt; Oh, as an experiment, I’ve put both a &lt;a href="http://www.slideshare.net/"&gt;Slideshare&lt;/a&gt; player and a &lt;a href="http://office.microsoft.com/en-gb/powerpoint/embed-a-powerpoint-presentation-on-a-webpage-FX102602487.aspx"&gt;Powerpoint Web App&lt;/a&gt; player in this post.&amp;nbsp; I’d like to know which one you think is better (send me a tweet to @rbanks54 or leave a comment)&lt;br /&gt; &lt;iframe frameborder="0" height="327" scrolling="no" src="http://r.office.microsoft.com/r/rlidPowerPointEmbed?p1=1&amp;amp;p2=1&amp;amp;p3=SDEF4A085C562CD5AD!172&amp;amp;p4=&amp;amp;kip=1" width="402"&gt;&lt;/iframe&gt;  &lt;br /&gt; &lt;div id="__ss_8910545" style="width: 425px;"&gt; &lt;strong style="display: block; margin: 12px 0px 4px;"&gt;&lt;a href="http://www.slideshare.net/rbanks54/ddd-sydney-2011-getting-out-of-sync-with-iis-and-riding-a-comet" title="DDD Sydney 2011 - Getting out of Sync with IIS and Riding a Comet"&gt;DDD Sydney 2011 - Getting out of Sync with IIS and Riding a Comet&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse8910545" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asyncasp-netembeddedfonts-110818202937-phpapp01&amp;amp;stripped_title=ddd-sydney-2011-getting-out-of-sync-with-iis-and-riding-a-comet&amp;amp;userName=rbanks54" /&gt; &lt;param name="allowFullScreen" value="true" /&gt; &lt;param name="allowScriptAccess" value="always" /&gt; &lt;embed name="__sse8910545" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=asyncasp-netembeddedfonts-110818202937-phpapp01&amp;amp;stripped_title=ddd-sydney-2011-getting-out-of-sync-with-iis-and-riding-a-comet&amp;amp;userName=rbanks54" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;br /&gt; &lt;div style="padding: 5px 0px 12px;"&gt; View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/rbanks54"&gt;Richard Banks&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-404428876910483906?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/404428876910483906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/08/getting-out-of-sync-with-iis-and-riding.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/404428876910483906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/404428876910483906'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/08/getting-out-of-sync-with-iis-and-riding.html' title='Getting Out of Sync With IIS and Riding A Comet'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/-bnE5GBpp0D0/Tk2-vPFrCCI/AAAAAAAABM4/T7dPot8kaB8/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-6541974582173946273</id><published>2011-08-12T15:49:00.001+10:00</published><updated>2011-08-12T15:49:29.814+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='management'/><title type='text'>Outsourcing, Unit Testing and Costs</title><content type='html'>&lt;p&gt;Let’s say you work in an internal IT department, largely doing maintenance work on software solutions.&amp;#160; Solutions that are by and large built by external vendors through an outsourcing arrangement and then brought in house once they’ve gone live and the initial warranty period has elapsed.&lt;/p&gt;  &lt;p&gt;Let’s say every time you look at one of these solutions that you now have to maintain you find the grand sum of zero unit tests.&amp;#160; Without exception. Every single application has nary a unit test to be seen. Not even a hint that one might have existed and been removed at a later date.&lt;/p&gt;  &lt;p&gt;“Why?!” you cry to yourself.&amp;#160; In frustration you cry “Why!!?” to management as well.&amp;#160; Their answer: The vendors tell us “it will cost more and take longer to do unit testing” and of course, they reason with you, if that’s the case then why would we pay for it? You know this is a bad argument and the logic is built on sand, so what’s your comeback? How do you get it across to management that a vendor that ignores unit testing is a bad vendor and is actually more expensive overall?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So my initial response to their claims would be along the lines of “So do I assume they’re not actually testing the software they write for us then.” and then explain how manual testing takes (much) longer than developing automated tests, assuming of course that the code being written is in any way testable.&amp;#160; If they develop poorly and have a lot of tight coupling between concrete classes or make a lot of static calls to HttpContext or develop in SharePoint for instance then the application might not be easily testable, but hey! That’s their problem not ours. The good news is that anyone with a business brain can understand the benefits of automation for tedious repetitive time consuming processes – heck, we worked that out during the industrial revolution.&lt;/p&gt;  &lt;p&gt;Let’s try a different angle in case the first, most obvious one doesn’t work.&amp;#160; If you consider a lack of automated testing to be merely another form of technical debt then it’s just like poor design and architecture, horribly complex methods, N+1 ORM queries, poor UI’s, high bug counts, etc. It’s something that will cost you. So, if a vendor delivers you software with a high level of technical debt and you’ll be maintaining it, then you’re going to have a lower long term ROI and higher TCO from those vendors versus what you might have from a vendor who keeps their debt levels low.&amp;#160; So while the cheap guys may argue that it will cost more and takes longer to write code with unit tests then what they’re really saying is this&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“It costs &lt;em&gt;US&lt;/em&gt; more and takes &lt;em&gt;US&lt;/em&gt; longer to do unit testing because the developers we hire are the cheapest and suckiest we could find. They don’t understand good development practices and we’re not about to teach them because they’ll leave in the next 3 to 6 months. Also manual testers here are cheap-as-chips and lose staff too quickly, so it’s easier for US if we just get the software to ‘it kind of works’ and then give it to you so we can get our money and hope you won’t notice”.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Also, don’t forget that post delivery, all those bugs and problems that snuck through from the vendor will end up becoming your bugs and problems to fix as part of your maintenance work.&amp;#160; So the company is either paying for it with internal staff costs (often seen as a hidden/sunk cost) or, if the vendor is also charging for maintenance, paying for it once a development project is concluded.&amp;#160; Development takes longer, it’s harder to find and fix bugs, it takes longer and longer to test the application manually, etc.&amp;#160; These all add up to time, and in software development time is money!&lt;/p&gt;  &lt;p&gt;With that, good luck convincing management to change their vendors, and if you’ve got a better reason to present yours case I’d love to hear it.&lt;/p&gt;  &lt;p&gt;Note: I’m not implying manual testing is bad.&amp;#160; In fact I think you should be doing manual testing; but only manual exploratory testing where testers are trying to break your code.&amp;#160; It’s rote, repetitive manual testing that is neither cost efficient or effective.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-6541974582173946273?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/6541974582173946273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/08/outsourcing-unit-testing-and-costs.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/6541974582173946273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/6541974582173946273'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/08/outsourcing-unit-testing-and-costs.html' title='Outsourcing, Unit Testing and Costs'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-8559316941776935351</id><published>2011-08-08T10:30:00.001+10:00</published><updated>2011-08-08T10:30:48.086+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='tech.ed'/><title type='text'>Going to TechEd Australia? Lock in DEV305</title><content type='html'>&lt;p&gt;Why? Because that’s the session you want to go to of course!&lt;/p&gt;  &lt;p&gt;Here’s the link with all the details: &lt;a href="http://australia.msteched.com/topic/details/DEV305"&gt;http://australia.msteched.com/topic/details/DEV305&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.aaron-powell.com/"&gt;Aaron Powell&lt;/a&gt;, &lt;a href="http://lzcd.com/"&gt;Luke Drumm&lt;/a&gt;, &lt;a href="http://azure.snagy.name/blog/"&gt;Steve Nagy&lt;/a&gt; and myself are going to show you how to build applications for the cloud using multiple clients (i.e. PC and Windows Phone 7 in this case) and some of the things to watch out for.&amp;#160; Don’t worry it won’t be one of those sessions where people try and prove how awesome they are by writing the whole thing on stage.&amp;#160; Instead we’ll be showing you the highlights and what you should think about if you want to try something similar.&lt;/p&gt;  &lt;p&gt;I’ll also have my recording equipment with me and will be recording a number of podcasts for &lt;a href="http://www.talkingshopdownunder.com/"&gt;Talking Shop Down Under&lt;/a&gt; with people while I’m up there, so if you want to hear from someone in particular, let me know so I can line up a time with them!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-8559316941776935351?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/8559316941776935351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/08/going-to-teched-australia-lock-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8559316941776935351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/8559316941776935351'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/08/going-to-teched-australia-lock-in.html' title='Going to TechEd Australia? Lock in DEV305'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-7404832274166389839</id><published>2011-07-05T11:35:00.001+10:00</published><updated>2011-07-05T11:35:47.785+10:00</updated><title type='text'>True Community is What YOU Make it</title><content type='html'>&lt;p&gt;Roy Osherove’s post on &amp;quot;&lt;a href="http://7enn.com/2011/07/04/appreciating-the-power-of-a-true-community/"&gt;True Community&lt;/a&gt;”™ has been making the rounds on the twitterz in the last 24 hours (or as some people have called it “Yet Another Leaving .NET Post”).&amp;#160; I feel like I should respond with some thoughts.&lt;/p&gt;  &lt;p&gt;First up, let me say I applaud Roy for making his views clear and talking about the differences in the communities and the speed at which the Ruby/Rails community is driving forward.&amp;#160; I thinks it great that someone showed enough courage to switch from one technology to another and begin the learning process all over again.&amp;#160; What I have a problem with is the deriding of the technology/community you leave.&amp;#160; It’s a pretty simple reason too.&lt;/p&gt;  &lt;p&gt;The Ruby/Rails community and the .NET community are &lt;em&gt;different&lt;/em&gt; communities!&amp;#160; There’s no such thing as “True Community”, just community.&amp;#160; Calling your community anything else is simply hyperbole, elitism and idealism.&lt;/p&gt;  &lt;p&gt;Of course the two communities won’t be the same! They’re made up of different people. Neither will one community be inherently better than another.&amp;#160; They are just made up of different people.&amp;#160; An apple is not inherently better than an orange or a banana, just because it’s a different fruit.&amp;#160; And just because you’ve decided that you like your new community because it’s more akin to your personal tastes, doesn’t mean that those in the other community are ignoramuses, fools, ill-treated and misguided or troglodytes.&amp;#160; These sort of attitudes won’t and don’t help anyone.&lt;/p&gt;  &lt;p&gt;We’re all developers and we all want to make the best software we can using whatever our chosen technology is.&amp;#160; If you don’t like the way your technology or community is progressing or you like the look of other groups more and you leave, that’s fine.&amp;#160; Go for it. Be awesome no matter where you go.&amp;#160; However if you do leave, don’t then berate those who stay or point out only the negatives as you see them.&amp;#160; Constructive criticism is welcome.&amp;#160; Criticism that exists just to validate your decision to move is not.&lt;/p&gt;  &lt;p&gt;The Ruby/Rails community is still quite small and young and thus is able to change rapidly and innovate quickly.&amp;#160; It won’t last forever, it never does, but there’s a lot to like about a community like that, and a lot that everyone can learn from it. I get that. Truly I do.&amp;#160; I wish there was more of that going on in the .NET space.&amp;#160; Look at the Java and .NET communities on the other hand. They’re much larger and more prone to innovation impedance, making it harder to change things and for .NET in particular when management places more focus on what Microsoft produces to the exclusion of better solutions there can be some real problems.&lt;/p&gt;  &lt;p&gt;On the flip side, while Roy makes some strong points about Microsoft not valuing the community, I think they only apply to certain parts of the business.&amp;#160; It’s not like that everywhere, and it’s changing.&amp;#160; I was on an open source panel on the weekend at the DDD Sydney conference and stated that we’re seeing a gradual change of Microsoft’s attitude towards their open source developers and the developer community in general.&amp;#160; The move from closed source to grudging acceptance of open source to a willing approval and active contribution to open source in the community at large has been a slow transition, but it is happening.&amp;#160; Why? Because of the very community that Roy complains about is driving change! Groups like Alt.NET that are looking for ways to push things forward regardless of what Redmond says do have an influence.&amp;#160; We see the change because of outspoken and community focused people like Roy himself, and others like Ayende Rahien, Sebastian Lambla, Jeremy Miller, the Herding Code guys, the Microsoft MVC team (who have strong community roots) and many, many more.&lt;/p&gt;  &lt;p&gt;People that realise that community is what &lt;em&gt;you&lt;/em&gt; make it!&lt;/p&gt;  &lt;p&gt;So, you don’t like something in a community you’re in? Then what are you doing to improve it.&amp;#160; If the answer is “nothing”, then either stop complaining or get off your butt and get active.&amp;#160; It’s pretty simple really.&amp;#160; Change your community or change your community.&lt;/p&gt;  &lt;p&gt;On a side note, the keen eyed amongst you will notice that Roy’s post didn’t mention the JavaScript community? Why? There’s just as much innovation and excitement happening in that space, if not more.&amp;#160; What makes them different? Why don’t we see “I’m leaving .NET for JavaScript” posts? Is it because their community is inclusive by nature and the Rails community is elitist? Is it because the technology is server side agnostic? Is it something else?&amp;#160; You know what.&amp;#160; Who cares! It’s just another community.&amp;#160; One from which everyone can learn.&lt;/p&gt;  &lt;p&gt;Nothing says you need to be exclusive.&amp;#160; You like .NET, Visual Studio &amp;amp; IntelliSense?&amp;#160; Wonderful.&amp;#160; Go contribute to your local .NET community.&amp;#160; You like Ruby and the Rails framework and enjoy the innovation in that space? Fantastic. Go contribute to your local Rails community.&amp;#160; You like Java and think there’s still a lot of improving that can be done there? Brilliant. Go contribute to your local Java community.&amp;#160; You like JavaScript and think modern browsers have the power you finally need to make some kick ass software? Excellent. Go contribute to your local JavaScript community.&lt;/p&gt;  &lt;p&gt;You get the point.&amp;#160; The community is made of &lt;em&gt;you&lt;/em&gt; so go influence your community.&lt;/p&gt;  &lt;p&gt;Fin.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-7404832274166389839?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/7404832274166389839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/07/true-community-is-what-you-make-it.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/7404832274166389839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/7404832274166389839'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/07/true-community-is-what-you-make-it.html' title='True Community is What YOU Make it'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-1429317977980111944</id><published>2011-07-04T21:13:00.001+10:00</published><updated>2011-07-04T21:13:45.804+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='community'/><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>My Geek Origin Story, what’s yours?</title><content type='html'>&lt;p&gt;&lt;em&gt;Yay! It’s Meme time, people.&amp;#160; This one started by &lt;/em&gt;&lt;a href="http://twitter.com/delic8genius"&gt;&lt;em&gt;@delic8genius&lt;/em&gt;&lt;/a&gt;&lt;em&gt; (&lt;a href="http://delicategeniusblog.com/"&gt;Michael Kordahi&lt;/a&gt;) who wants to learn your &lt;/em&gt;&lt;a href="http://delicategeniusblog.com/?p=1292"&gt;&lt;em&gt;Geek Origin Story&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and see how we all got in touch with our inner geek.&amp;#160; So here’s mine…&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;For me I remember it all starting with the &lt;a href="http://en.wikipedia.org/wiki/Atari_2600"&gt;Atari 2600&lt;/a&gt; and a little game called &lt;a href="http://au.gamespot.com/atari2600/action/asteroids/index.html"&gt;Asteroids&lt;/a&gt;, though looking back at photos from my earlier years I can see that the Atari was merely the trigger that brought the latent geek in me to the surface. I mean seriously, look at this photo of me as a little tacker and just ask yourself if that’s not a geek waiting to happen!&amp;#160; And no, that’s not a laptop backpack I’m wearing, though it could be! :-)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-DB_DpANabhs/ThGgZBJTupI/AAAAAAAABH0/mt3J6hRw_yM/s1600-h/Mini%252520Richard%25255B3%25255D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Mini Richard" border="0" alt="Mini Richard" src="http://lh3.ggpht.com/-0Dt_ChE8VgI/ThGgaLF1WSI/AAAAAAAABH4/S-rt-Vrh30o/Mini%252520Richard_thumb%25255B1%25255D.jpg?imgmax=800" width="233" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I spent days and weeks blowing up asteroids in space and leaping through jungles, swinging on vines and jumping over pits (&lt;a href="http://en.wikipedia.org/wiki/Pitfall!"&gt;Pitfall&lt;/a&gt; anyone?!), but that all faded to backstory when I went to a selective school and my parents decided it was good for my education if they splashed out on a &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt;.&amp;#160; The day that thing came home, my fate was sealed.&amp;#160; As a kid in primary school I remember the unboxing, plugging it into the TV along with the &lt;a href="http://en.wikipedia.org/wiki/Commodore_Datassette"&gt;tape drive&lt;/a&gt; and an &lt;a href="http://en.wikipedia.org/wiki/Commodore_1541"&gt;external floppy drive&lt;/a&gt;, turning it on and then seeing the blue screen, the blinking cursor and the READY prompt.&amp;#160; What now?! We could LOAD something from tape or disk, or we could crack out the programming books that it came with and explore the possibilities!&amp;#160; The games were great, but being able to type things into that C64 and watch them run was a revelation! Not only could I play games, and oh! how I played games, but I could write them as well!&amp;#160; I remember writing my own text based adventure games (they were crap of course) and building programs that would show animated running man sprites moving across the screen based on how the joystick was pushed.&amp;#160; It was a marvel, pure and simple.&amp;#160; Being able to make the computer do what I wanted based on my decisions and actions and see the results on screen.&amp;#160; Mwahahaha! The power! The unlimited, unfettered POWER!!! *Cough* *&lt;b&gt;Ahem&lt;/b&gt;* Yes, what was I saying? I think I got carried away with myself there…&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.c64-wiki.com/images/c/c9/Einschaltmeldung_C64.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;So I’m sure my parents wished I would go play sport with the other kids on the street more often than I did, but I knew I’d never be great at that.&amp;#160; Computers however? Different story.&amp;#160; I controlled the universe there.&amp;#160; They made sense to me.&amp;#160; I could figure out how it all fit together.&amp;#160; I could &lt;a href="http://en.wikipedia.org/wiki/PEEK_and_POKE"&gt;PEEK and POKE&lt;/a&gt; with the best of them.&amp;#160; I got so much joy, fun, fulfilment and square eyes from playing games and writing software that I knew what I wanted to do for the rest of my life.&amp;#160; You see, I’m a gamer, through and through.&amp;#160; I love playing games and programming is just another form of game.&amp;#160; A different form of accomplishment, but still the same sensation that you get from finishing a level or beating a boss fight.&amp;#160; Tell me you haven’t got some code working at times and fist pumped, or put your arms in the air in a victory pose! I’m sure this is how half of the world’s programmers started their coding careers – wishing they could spend all their time playing and writing games as cool and puzzling as &lt;a href="http://en.wikipedia.org/wiki/Boulder_Dash"&gt;Boulder Dash&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Impossible_Mission"&gt;Impossible Mission&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Paradroid"&gt;Paradroid&lt;/a&gt;.&amp;#160; I’m no different.&lt;/p&gt;  &lt;p&gt;So there you have it.&amp;#160; My geek origin story, what’s yours?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-1429317977980111944?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/1429317977980111944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/07/my-geek-origin-story-whats-yours.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1429317977980111944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/1429317977980111944'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/07/my-geek-origin-story-whats-yours.html' title='My Geek Origin Story, what’s yours?'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/-0Dt_ChE8VgI/ThGgaLF1WSI/AAAAAAAABH4/S-rt-Vrh30o/s72-c/Mini%252520Richard_thumb%25255B1%25255D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-6460665339457804467</id><published>2011-06-20T16:31:00.002+10:00</published><updated>2011-06-20T16:31:54.140+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile Australia: A Retrospective</title><content type='html'>&lt;br /&gt;Last week I was a panellist at the Agile Australia conference, talking about  hiring people for agile teams, and whilst that was fun the conference overall  left me feeling cold, frustrated and disappointed.  Anyone who saw my tweet  stream during the conference would have probably felt some of that and now that  I’ve calmed down a little and thought about things some more, I think it’s time  to get to the heart of what really annoyed me and offer some suggestions as to  what to do next time.  Consider this constructive criticism.&lt;br /&gt;&lt;br /&gt; Firstly, it felt like conference sponsors were given slots based on the  amount of sponsorship they paid.  The title sponsor had the largest number of  slots and each of the gold sponsors also appeared to have the option to take  slots.  The problem I have with this is that a staff member from the title  sponsor was also part of the advisory panel, as were staff from their major  customers.  Conflict of interest anyone? What we saw in the conference were  “case study” sessions presented by large corporates who just happened to be  customers of the sponsor or sessions from colleagues of other advisory board  members.  It meant that the event became largely a marketing exercise targeting  other large corporates wrapped in conference clothing with very little to offer  for anyone working in small organisations or who is already practicing agile and  looking for ways to improve through learning from others.  The worst session was  one where the presenter decided to slowly read a carefully prepared, PR laden,  speech.  No slides, no audience engagement, just fluff.  That sort of thing is  simply unforgivable, and even now still gets by blood boiling!&lt;br /&gt;&lt;br /&gt; Given one of the key principles of being agile is having the courage to be  open and visible with the process I can safely say that this was not an approach  followed by the conference.  What I would like to see? Community voting on  topics, with all submitted sessions available and open for the public/attendees  to vote on.  If sponsors are getting a number of slots then indicate how many by  blanking out their sessions on the schedule, that way we can also see just how  much non-sponsor content we may get.&lt;br /&gt;&lt;br /&gt; Next on my gripe list. Most sessions were targeted at beginners with content  rarely reaching the ‘200-level’ let along going beyond that into more advanced  and deeper topics.  I’m fine with a number of sessions being beginners based,  but to have most of the conference aimed at that level? Urgh!  At least mark the  sessions with some sort of required knowledge levelling system.  It’s important  to have sessions marked as “best for beginners”, but please, not the whole  conference!&lt;br /&gt;&lt;br /&gt; Moving on from that, there was also very little opportunity for ad-hoc  discussion with other attendees.  The “Individuals and Interactions” aspect of  agile should apply to conferences too.  Now there were a number of panel  sessions, but a panel is nowhere near as interactive as an open space, and  asking questions in a room of 200 is much harder for most people than in a group  of 20-30.  The only open space time in the conference was a 45 minute session at  the back end of day 2.  This, for me, was far and away the best part of the  conference as it meant I could finally sit down and discuss problems and issues  with other people and bounce some ideas around, but because of time limitations  we really only had 15 minutes per topic. This is just enough time to really get  started in on a topic but not enough to get far beyond the shallows.   Frustrating!  I’d like to see an entire day put aside for open space topics.   Make day 1 a “fixed content” day and day 2 an open spaces and workshop day so  that we can really dig into things and learn from each other.&lt;br /&gt;&lt;br /&gt; Finally, let’s talk about the keynotes. 2 of the 4 were keynotes were good,  though the content was unfortunately recycled. The other 2 sessions were  terrible.  One featured 40 minutes of name dropping, self promotion, marketing  and trite stories without any real content at all, and the other was a  cliché-ridden, pandering, hippy themed “lets all love each other because we’re  all geniuses!” farce.  Why a 2 day conference needs 3 keynotes and 2 lock notes  is beyond me.  I want less of that nonsense and more content next time, just not  more toddlers level content!&lt;br /&gt;&lt;br /&gt; And if you’re wondering if I would recommend you attend next years Agile  Australia conference, and things don’t improve dramatically, then here’s my  answer: If you work in a large corporate, are new to agile and you’re still  trying to figure out how to make it work for you then yes, but take your  marketing proof earmuffs with you.  If that’s not you, then stay well away.   It’s a complete and utter waste of time.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-6460665339457804467?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/6460665339457804467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/06/agile-australia-retrospective.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/6460665339457804467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/6460665339457804467'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/06/agile-australia-retrospective.html' title='Agile Australia: A Retrospective'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-5581203007374193457</id><published>2011-06-06T20:59:00.001+10:00</published><updated>2011-06-06T20:59:26.750+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><title type='text'>DDD Sydney, 2011 – Saturday, July 2nd</title><content type='html'>&lt;p&gt;Are you an Aussie dev? Based in Sydney or somewhere within driving/flying distance?&lt;/p&gt;  &lt;p&gt;Well, why don’t you get yourself along to DDD Sydney this year? Not only will you have a chance to hear me wax lyrical about Comet&amp;#160; with IIS and how async coding can help improve performance, but you’ll also get to partake of a slew, nay a plethora!, of topics from other great speakers.&lt;/p&gt;  &lt;p&gt;Apart from my talk, I’ll also be a panellist for the Open Source panel, and I’m facilitating the Web Panel later in the day, so at least you now know which sessions to avoid, right? :-)&lt;/p&gt;  &lt;p&gt;Jokes aside, last years DDD Sydney was a lot of fun and this year will be even bigger – the &lt;a href="http://www.dddsydney.com/agenda.aspx"&gt;agenda&lt;/a&gt; and &lt;a href="http://www.dddsydney.com/Registration.aspx"&gt;registration&lt;/a&gt; are now available.&amp;#160; Go check out the details, book yourself a ticket, and I’ll see you there!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-5581203007374193457?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/5581203007374193457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/06/ddd-sydney-2011-saturday-july-2nd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/5581203007374193457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/5581203007374193457'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/06/ddd-sydney-2011-saturday-july-2nd.html' title='DDD Sydney, 2011 – Saturday, July 2nd'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13321238.post-3734500665633532487</id><published>2011-06-06T10:57:00.001+10:00</published><updated>2011-06-06T10:57:37.141+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><title type='text'>Anaesthetic for your #region-itis</title><content type='html'>&lt;p&gt;If your code (or the rest of your team) suffers from a bad case of #region-itis then help is at hand.&lt;/p&gt;  &lt;p&gt;There’s a lovely little Visual Studio extension over at &lt;a href="http://teamsearchapp.com/region-tool"&gt;http://teamsearchapp.com/region-tool&lt;/a&gt; that will automatically expand #regions, and also make those #region lines much smaller and harder to read than your normal code.&amp;#160; No more pressing shortcuts to expand all those blocks, less visual clutter and optionally, the ability to prevent collapsing of #regions.&amp;#160; What’s not to like?&lt;/p&gt;  &lt;p&gt;Borrowing a few pictures from their site, it takes the #region afflicted code (on the left) and reveals it’s ugly inner truth (on the right):&lt;/p&gt;  &lt;p&gt;&lt;img alt="Regions1" src="http://teamsearchapp.com/images/regions/Regions1.png?1306892825" /&gt;&amp;#160;&lt;img alt="Regions2" src="http://teamsearchapp.com/images/regions/Regions2.png?1306892825" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ahh! That’s much better.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13321238-3734500665633532487?l=www.richard-banks.org' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.richard-banks.org/feeds/3734500665633532487/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.richard-banks.org/2011/06/anaesthetic-for-your-region-itis.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3734500665633532487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13321238/posts/default/3734500665633532487'/><link rel='alternate' type='text/html' href='http://www.richard-banks.org/2011/06/anaesthetic-for-your-region-itis.html' title='Anaesthetic for your #region-itis'/><author><name>Richard Banks</name><uri>https://profiles.google.com/108737416426536739827</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-qMhF7F-2pE0/AAAAAAAAAAI/AAAAAAAABG0/pyfB5AVfmqM/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry></feed>
