<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;C08BRnk_cCp7ImA9WhFSFko.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818</id><updated>2013-06-19T20:57:37.748+01:00</updated><category term="SOLID" /><category term="DDD10" /><category term="kata" /><category term="IE9" /><category term="stuff" /><category term="VS 2010" /><category term="Jon Skeet" /><category term="Package management" /><category term="community" /><category term="DDD SW" /><category term="user stories" /><category term="validation" /><category term="InternetExplorer" /><category term="presentation" /><category term="NDepend" /><category term=".Net 3.5" /><category term="TDD" /><category term="backlog" /><category term="code coverage" /><category term="ddd scot" /><category term="DSL" /><category term="ORM" /><category term="hotfix" /><category term="review" /><category term="work" /><category term="training" /><category term="64 bit" /><category term="webdeploy" /><category term="Manning Books" /><category term="CSP" /><category term="display attributes" /><category term="jQuery" /><category term="retrospective" /><category term="Window Phone" /><category term="Asp.Net" /><category term="XmlSerialization" /><category term="ScottGu" /><category term="IConfigurationManager" /><category term="kb958484" /><category term="DDD9" /><category term="Pex" /><category term="MSBuild" /><category term="koan" /><category term="DI" /><category term="WinRT" /><category term="dojo" /><category term="SimpleMembership" /><category term="team lead" /><category term="opinion" /><category term="code quality" /><category term="unit testing" /><category term="design" /><category term="dotnetdevnet" /><category term="VS" /><category term="Bin Deploy" /><category term="Event" /><category term="Entity Framework" /><category term="Microsoft" /><category term="MVC" /><category term="introduction" /><category term="givecampuk" /><category term="MVCBuildViews" /><category term="Mango" /><category term="Family" /><category term="burnout" /><category term="Dependency Injection" /><category term=".Net" /><category term="Repository" /><category term="CI" /><category term="Build" /><category term="conference" /><category term="Balance" /><category term="OSS" /><category term="Apollo" /><category term="MEF" /><category term="response" /><category term="agile" /><category term="metrics" /><category term="Linq-to-sql" /><category term="kanban" /><category term="Guathon" /><category term="DAL" /><category term=".Net 4.5" /><category term="Windows 7" /><category term="lean" /><category term="DeveloperDeveloperDeveloper" /><category term="Book Review" /><category term="Social" /><category term="tech" /><category term="ajax" /><category term="dōjō" /><category term="Asp.Net Dynamic Data" /><category term="WP7" /><category term="speaker" /><category term="getting started" /><category term="Gems" /><category term="ADO.NET" /><category term="C#" /><category term="DDDIE" /><category term="column order" /><category term="passion" /><category term="teched" /><category term="certification" /><category term="scrum" /><category term="mobile development" /><category term="TeamCity" /><category term="data access" /><category term="Nu" /><category term="C# in Depth" /><category term="management" /><category term="Login" /><title>Design, Code, Release</title><subtitle type="html">If it was only that easy</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>114</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/DesignCodeRelease" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="designcoderelease" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">DesignCodeRelease</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DU8ERHw4eyp7ImA9WhNbFEQ.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-3416659641292510366</id><published>2013-01-18T08:30:00.000Z</published><updated>2013-01-18T08:30:05.233Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-18T08:30:05.233Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="retrospective" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>So 2013 begins….</title><content type="html">&lt;p&gt;This post has been primarily delayed due to illness but also being very busy my new job.&lt;/p&gt;  &lt;p&gt;Just like &lt;a href="http://designcoderelease.blogspot.com/2012/01/2011-into-2012.html"&gt;previous&lt;/a&gt; years I’m treating this as a retrospective on the previous year and planning for the year to come.&lt;/p&gt;  &lt;h2&gt;2012 goals&lt;/h2&gt;  &lt;p&gt;At the beginning of 2012 I set out the following headline goals I wanted to achieve:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Blog posts &lt;/li&gt;    &lt;li&gt;Read books &lt;/li&gt;    &lt;li&gt;Presentations &lt;/li&gt;    &lt;li&gt;MVP &lt;/li&gt;    &lt;li&gt;Coding &lt;/li&gt; &lt;/ul&gt; &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;What did I achieve?&lt;/h3&gt;  &lt;h4&gt;Blog posts&lt;/h4&gt;  &lt;p&gt;Well in 2011 I published 30 posts but in 2012 I only managed 19 posts which is a little disappointing, but interestingly the traffic to the blog increased by over 2000 visits so hopefully I’m doing something right.&lt;/p&gt;  &lt;p&gt;My most popular post of the year was &lt;a href="http://designcoderelease.blogspot.com/2012/05/is-software-craftsmanship-luxury-most.html"&gt;Is software craftsmanship a luxury most can’t afford?&lt;/a&gt; with 476 views.&lt;/p&gt;  &lt;h4&gt;Read books&lt;/h4&gt; I had a very long list of books that I wanted to read but I only managed to read 6 and post a review of 2 of those. My hope is to try and post reviews of the other books I read during last year and any books I read this year.  &lt;h4&gt;Presentations&lt;/h4&gt;  &lt;p&gt;Although I’ve come up with some ideas I ended up only created 1 new presentation this year “Inversion of Control containers Vs hand rolled - how they compare” which I got to present at DDD10. &lt;/p&gt;  &lt;h4&gt;MVP&lt;/h4&gt;  &lt;p&gt;At the beginning of the year I spent some time looking into the MVP program, there was the post by &lt;a href="http://devlicio.us/blogs/rob_eisenberg/archive/2012/01/04/how-i-lost-regained-and-then-turned-down-an-mvp-award.aspx"&gt;Rob Eisenberg&lt;/a&gt; about why he turned down an MVP and then other posts about how good it was to be one and posts such as &lt;a href="http://www.brentozar.com/archive/2012/10/congratulations-youre-mvp-heres-need-know/"&gt;Brent Ozars’s&lt;/a&gt; about what being an MVP meant.&lt;/p&gt;  &lt;p&gt;So I now have a fairly good idea about what the MVP program is about and a better understanding of how you could be awarded an MVP.&amp;#160; For now I think its safe to say I won’t be getting an MVP any time soon so am going to park this goal.&lt;/p&gt;  &lt;h4&gt;Coding&lt;/h4&gt;  &lt;p&gt;Last year I split my coding goals in to “will do” and “nice to do”&lt;/p&gt;  &lt;h5&gt;Will Do &lt;/h5&gt;  &lt;div style="margin-left: 25px"&gt;   &lt;p&gt;&lt;u&gt;Concerted effort to finish the OSS project I started about 2 years ago &lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Complete failure on this, I never managed to even open the project the entire year.&amp;#160; I haven’t given up on this and am &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Improve my JavaScript &lt;/u&gt;&lt;/p&gt;    &lt;p&gt;I did manage to do a little bit of JavaScript but not to the level that I had envisaged and unfortunately for me in the last year the number of JavaScript frameworks seems to have exploded so there’s so much more I need to learn.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Continue working on my ADO.NET DAL &lt;/u&gt;&lt;/p&gt;    &lt;p&gt;I never managed to large changes I wanted to make but did manage some minor changes to the internals for people that wanted to use it in an actual product.&lt;/p&gt; &lt;/div&gt;  &lt;h5&gt;Nice to do&lt;/h5&gt;  &lt;div style="margin-left: 25px"&gt;   &lt;p&gt;&lt;u&gt;NuGet&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Although I didn’t publish a package publically I did in work, configuring TeamCity as a local NuGet server to be used through out the team which was almost effortless to set up and very easy to use.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Learn PowerShell &amp;amp; Learn Python&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;I never managed to get to either of these items although its still on my ‘wish list’&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Develop WP7 apps&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;I attended a WP7 phone camp in January and I did create a WP7 app, &lt;a href="http://www.windowsphone.com/en-gb/store/app/math-power/2e1c8f98-5511-44f2-aac5-e9a8d4d30bba"&gt;Math Power&lt;/a&gt; a maths based game, which to date has been downloaded 1342 times which I’m very happy with.&amp;#160; &lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;What else?&lt;/h3&gt;  &lt;h4&gt;Jobs&lt;/h4&gt;  &lt;p&gt;During last year I ended up changing jobs twice having 3 different jobs over the course of the year.&amp;#160; This wasn’t planned at all and has ultimately lead me to being a contractor so I’m sure that work wise 2013 is going to be interesting.&lt;/p&gt;  &lt;h4&gt;Community&lt;/h4&gt;  &lt;p&gt;During the year I was lucky enough to be selected to present at both DDD Southwest 4, DDD 10 and DDD North 2 as well as at NxtGen Southampton and Dot Net Developers Network.&amp;#160; As always I really enjoy doing these presentations and value any feedback I can get about how they went.&lt;/p&gt;  &lt;p&gt;I have also been involved in some development work for a user group which I hope may get to see the light of day during 2013.&lt;/p&gt;  &lt;h4&gt;Continuous Delivery&lt;/h4&gt;  &lt;p&gt;If I’m totally honest I’m really chuffed at managing to set up a continuous delivery pipeline at one of my jobs this year which meant code was pulled from DVCS, built, tested and deployed to a test environment.&amp;#160; What makes this different from what I’ve done previously is that it also included database deployment as well and I aim to blog about the technology used in the not too distant future.&lt;/p&gt;  &lt;h2&gt;This year…&lt;/h2&gt;  &lt;p&gt;In the same vein as the immortal words of “&lt;a href="http://en.wikipedia.org/wiki/Stars_in_Their_Eyes"&gt;Stars in their eyes&lt;/a&gt;”…this year Matthew I’m going to be looking to:&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Make better use of personal time&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Looking back over what I’ve done last year I can see that in my spare time I tend to focus on just one thing which is why when I’m doing my own development I don’t write blog posts, read books or watch training video’s.&amp;#160; So this year to try and get more done I know I’m going to have balance out what I do which may mean that it takes longer to finish things off but at the same time I hope to keep things moving and not appear to “go dark”.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Learn JavaScript&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I’m making this one of my primary goals for the year, JavaScript is here to stay and anybody involved in web development will need to know all about it, main stream libraries e.g. &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; and related technology i.e. &lt;a href="http://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt;, &lt;a href="http://coffeescript.org/"&gt;CoffeeScript&lt;/a&gt;, etc.&amp;#160; I have already watched a &lt;a href="http://www.pluralsight.com/training"&gt;Pluralsight&lt;/a&gt; course on &lt;a href="http://knockoutjs.com/"&gt;knockout.js&lt;/a&gt; and plan to watch more along with a selection of books to read.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Investigate Software Craftsmanship&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;I am going to continue my investigation of &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;software craftsmanship&lt;/a&gt; by working through the further &lt;a href="http://manifesto.softwarecraftsmanship.org/#/reading"&gt;reading list&lt;/a&gt; and to continue blogging my thoughts about it.&lt;/p&gt;  &lt;p&gt;As part of this I &lt;em&gt;may&lt;/em&gt; attempt to set up a local craftsmanship group to be able to try and meet up with other people for discussion and writing code.&amp;#160; My main impediment for this is a venue so if I manage to remove that I will be looking to pursue this further.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Code&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;After 2 years of inactivity I need to either push on with my OSS project or ditch it since if its not out there solving a problem its just waste.&lt;/p&gt;  &lt;p&gt;Again I have ideas around my ADO.Net DAL that I want to pursue and if I can find time I may look at doing so.&lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;Compared to last year I have massively reduced my goals having only 4 goals, I’ve decided that reading books, writing blog posts and writing presentations are things that I’m just going to do and as such I’ve removed them as goals.&amp;#160; &lt;/p&gt;  &lt;p&gt;As always if a user group would like me to do a presentation give me a yell and lets see what we can arrange.&lt;/p&gt;  &lt;p&gt;I’m hoping my more focused goals will allow me to make progress with them and be able to achieve more than I did last year.&lt;/p&gt;  &lt;p&gt;So that’s what I’m doing, what are you planning on doing in 2013? what are your goals?&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/YLiRNIhR6kI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/3416659641292510366/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2013/01/so-2013-begins.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3416659641292510366?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3416659641292510366?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2013/01/so-2013-begins.html" title="So 2013 begins…." /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUMEQHc7eSp7ImA9WhNTGUo.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-5514360818880921070</id><published>2012-10-23T08:30:00.000+01:00</published><updated>2012-10-23T08:30:01.901+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-23T08:30:01.901+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CI" /><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="webdeploy" /><category scheme="http://www.blogger.com/atom/ns#" term="TeamCity" /><category scheme="http://www.blogger.com/atom/ns#" term="MSBuild" /><category scheme="http://www.blogger.com/atom/ns#" term="MVCBuildViews" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net 4.5" /><title>Build errors with TeamCity, MSBuild, MVC Build Views and .Net 4.5</title><content type="html">&lt;p&gt;Recently I moved an application from .Net 4.0 &amp;amp; MVC3 to .Net 4.5 &amp;amp; MVC4 which for the most part went fairly painlessly.&lt;/p&gt;  &lt;p&gt;Previous to the .Net 4.5 upgrade the code was already being built and tested on TeamCity, but as part of the upgrade exercise it was decided to implement deployment from TeamCity using web deploy to a test server.&lt;/p&gt;  &lt;p&gt;Getting web deploy set up on TeamCity is fairly painless and &lt;a href="http://www.troyhunt.com/"&gt;Troy Hunt&lt;/a&gt; has a nice set of &lt;a href="http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity.html"&gt;posts&lt;/a&gt; about this, what it generally boils down to is using MSBuild to package the code and then calling web deploy to use the newly created package.&lt;/p&gt;  &lt;p&gt;I set up the necessary build steps only to find that I was getting build failures on TeamCity when using the MSBuild runner (previously had used VS Solution runner) with the following error:&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;ASPNETCOMPILER error ASPRUNTIME: Could not load file or assembly 'System.Web.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.      &lt;br /&gt;Project XYZ\XYZ.csproj failed.       &lt;br /&gt;Project XYZ.Tests\XYZ.Tests.csproj failed. Project ABC.sln failed.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I appeared to be able to solve this by adding an additional MSBuild property &lt;code&gt;/p:VisualStudioVersion=11.0&lt;/code&gt; which I found from &lt;a href="http://stackoverflow.com/a/12030049/53962"&gt;this&lt;/a&gt; stack overflow answer.&lt;/p&gt;  &lt;p&gt;Once done the code then built successfully but when it then attempted to package and deploy the web site it was failing with the error:&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000" face="Courier New"&gt;MvcBuildViews AspNetCompiler      &lt;br /&gt;AspNetCompiler C:\TeamCity\buildAgent\work\f2cfe4b9b1db787a\XYZ\obj\uat\csautoparameterize\original\web.config(27, 0): error ASPCONFIG: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I quickly discovered that this was an issue with the package command and happened because the obj folder wasn’t deleted, normally you get around this by altering the project file and telling it to use a different folder to output files to but this didn’t work for me.&amp;#160; &lt;/p&gt;  &lt;p&gt;After much searching I finally found the answer with &lt;a href="http://haacked.com/archive/2011/05/08/compiling-mvc-views-in-a-build-environment.aspx#83755"&gt;this&lt;/a&gt; comment on a Phil Haack's blog post where I needed to add another MSBuild parameter &lt;code&gt;/p:BaseIntermediateOutputPath=&amp;lt;your path here&amp;gt;&lt;/code&gt; which then allowed the TeamCity agent to create the package and successfully execute web deploy.&lt;/p&gt;  &lt;p&gt;This took me a couple of days to resolve and the initial problem was that I had just upgraded to TeamCity 7.1 and &lt;strong&gt;incorrectly&lt;/strong&gt; suspected it of causing me the problem, I was wrong.&lt;/p&gt;  &lt;p&gt;Hopefully this post will help you if you too run into the problem.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/M1mc1GG-WDY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/5514360818880921070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/build-errors-with-teamcity-msbuild-mvc.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5514360818880921070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5514360818880921070?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/build-errors-with-teamcity-msbuild-mvc.html" title="Build errors with TeamCity, MSBuild, MVC Build Views and .Net 4.5" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;D0MERXYzeip7ImA9WhNTFUk.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-2853534253612272203</id><published>2012-10-18T08:30:00.000+01:00</published><updated>2012-10-18T08:30:04.882+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-18T08:30:04.882+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="kanban" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Why does agile fail?</title><content type="html">&lt;p&gt;There is more than one company out there that has tried to “go agile” but have ultimately failed and gone away with the impression that “agile just doesn’t work” or “agile’s great but just not for us”.&amp;#160; You also have the situation where you have a company that has been working in an agile manner and then agile breaks down.&lt;/p&gt;  &lt;p&gt;So why do people fail to successfully implement agile practices? what are the common reasons that are cited? who is to blame?&amp;#160; In this post I’m going to cover some of the factors I’ve seen that can cause an agile adoption to fail, I’m not going to offer any suggestions on how to combat the various reasons but you could consider this a list of symptoms that could indicate problems if you want to implement agile in your organisation.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h2&gt;Reasons for failure&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;Culture – organisation sees no need to change &lt;/li&gt;    &lt;li&gt;Control – management want to control what people do &lt;/li&gt;    &lt;li&gt;Wrong focus - focusing on perceived value of a project plan &lt;/li&gt;    &lt;li&gt;Buy in – people implementing don’t care about the process not invested in what they are doing &lt;/li&gt;    &lt;li&gt;Pseudo experts – people who “believe” they know all about agile when they have limited knowledge &lt;/li&gt;    &lt;li&gt;Clients – fixed term contracts, non-agile customers, square peg round hole &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Culture&lt;/h3&gt;  &lt;p&gt;What makes up the culture of a company? The culture comes from the people who work there, their attitudes towards the work, the processes that they follow day to day and the work that they do; their behaviour at work is driven by what they achieve and how they are treated dependent upon whether they succeed or fail with the tasks they undertake.&lt;/p&gt;  &lt;p&gt;An organisation will tend to hire and retain people that want/like to work the way the organisation works this in turn reinforces the culture which has the side effect of making change even more difficult to introduce.&lt;/p&gt;  &lt;p&gt;Culture is, IMHO, the biggest cause of failure of agile adoptions, if you are working in an organisation that has a closed mind-set that does not easily accept change or attempt new things you will struggle to get any traction for the agile practices you want to implement even if these practices could very well help the organisation grow and succeed.&lt;/p&gt;  &lt;p&gt;In this situation is very unlikely that &lt;em&gt;anything&lt;/em&gt; you can do will actually make a difference and nothing short of an epiphany from the higher managers or a company crisis will make the organisation consider the “radical” approaches outlined in agile practices. &lt;/p&gt;  &lt;h3&gt;Control&lt;/h3&gt;  &lt;p&gt;In a waterfall based project control usually sits with a manager and/or a project manager which leads to developers being told what task they will work on and sometimes even how long they have to complete it.&lt;/p&gt;  &lt;p&gt;When trying to adopt agile this type of control is a direct opposite to practices you want to start using where the developers work out what they can achieve and it is this tension between developer and manager that can cause even existing agile practices to fail.&amp;#160; A developer knows that within the organisation authority sits with the manager and if the manager starts telling them what to work on unless their is a person, or people, able to tell that manager to stop then agile practices can very quickly breakdown.&lt;/p&gt;  &lt;p&gt;The role of a Programme/Project manager is a strange dichotomy in that although they usually don’t have any authority over individuals they have ultimate responsibility for successful delivery of a project. This can lead to a desire to actually control what happens on a project which in turn can lead to issues as they try to assert control over what the team does and tell them when they should deliver, again going against agile principles &amp;amp; practices.&lt;/p&gt;  &lt;h3&gt;Wrong focus&lt;/h3&gt;  &lt;p&gt;If the organisation is operating in a waterfall manner it believes it can predict the future and can therefore determine every aspect of a project before it begins. This leads to the expectation that any estimates given by the people involved in a project &lt;em&gt;&lt;strong&gt;will&lt;/strong&gt;&lt;/em&gt; be hit, effectively making them commitments not estimates, and so create project plans showing milestones and completion dates based on these “estimates”.&lt;/p&gt;  &lt;p&gt;This type of organisation tends to focus on the wrong thing as it is more concerned with the project plan, or cost of the project, rather than any perceived value of what is being produced; often it is only at the end of the project when the software is complete that the actual value of that software is considered.&lt;/p&gt;  &lt;p&gt;This is the antithesis of agile where it &lt;em&gt;should&lt;/em&gt; be about delivery of value to the customer rather than following a plan for the sake of it, striving to ensure that the organisation is, wherever possible, deriving value for the organisation as the project progresses rather than just at the end.&lt;/p&gt;  &lt;h3&gt;Buy in&lt;/h3&gt;  &lt;p&gt;Agile is a collaborative effort, you need the developers, managers, PO’s, etc all wanting to work together looking to deliver value to the business, but to achieve this people need to have “brought in” to the concepts and principles behind agile.&lt;/p&gt;  &lt;p&gt;If you don’t have this buy in from all the various people involved then your agile implementation may be ultimately doomed to failure. It may well work for 6 months or a year but all it takes is for one or two of the people involved who are passionate about agile to move on and the rot starts and before long the practices are either just being followed &lt;a href="http://en.wikipedia.org/wiki/Cargo_cult"&gt;cargo cult&lt;/a&gt; style with the people who are left not knowing why they are doing something, or they are dropped completely.&lt;/p&gt;  &lt;h3&gt;Pseudo Experts&lt;/h3&gt;  &lt;p&gt;A pseudo expert is a person that has worked in a an agile environment before, has attended a talk or read a book on agile, they usually haven’t been deeply involved in all aspects of agile (if any at all) rather they believe they have a deep understanding allowing them to direct others in adoption of agile principle &amp;amp; practices.&lt;/p&gt;  &lt;p&gt;However, their limited knowledge of the principles &amp;amp; practices can lead to problems when faced with the normal day-to-day challenges an agile team faces as when the pseudo expert doesn’t have a solution to a problem then at best the “expert” consults their books on what to do or at worst makes it up.&lt;/p&gt;  &lt;p&gt;Frequently with the pseudo experts if they have had some success with their agile implementation they develop a closed mind believing that they know all about agile which leads to an inability to change producing a further barrier to being able to actually adopt agile.&lt;/p&gt;  &lt;h3&gt;Clients&lt;/h3&gt;  &lt;p&gt;When developing software both internal and external clients usually want to know exactly what they are getting and when they are going to be getting it, it is the classic &lt;a href="http://en.wikipedia.org/wiki/Project_management_triangle"&gt;iron triangle&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For external clients this is a little more understandable as they are paying money to a 3rd party to create software for them; historically in a waterfall project external clients have had very little direct involvement apart from at certain “milestones” so seek to assert more control over the project through the contract which can lead to focusing on the plan rather than the value (wrong focus).&amp;#160; There are very few companies which happily transition from purchasing software with a set deliverable to a situation in which they believe that they &lt;em&gt;may&lt;/em&gt; not get all the features/functionality that they want.&lt;/p&gt;  &lt;p&gt;Internal clients should be easier to convince that agile will deliver more value for them but if they have to get budget approval for the work to be done then you will often find an internal client acting like an external client and wanting guarantees over what they will have delivered. Whilst frustrating this is more a symptom of a dysfunctional organisation which places more emphasis on cost than value, again the wrong focus, than the actual internal clients.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;These are some of the most common symptoms that I’ve come across and you may see one or more of these in your organisation, if you are unlucky you may see all of them, it doesn’t mean you that your organisation can’t become agile but you need to be prepared to face and overcome these challenges.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/CWUGfuou5lE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/2853534253612272203/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/why-does-agile-fail.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/2853534253612272203?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/2853534253612272203?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/why-does-agile-fail.html" title="Why does agile fail?" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEEHSHwyfip7ImA9WhJaF0o.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-743259632478107376</id><published>2012-10-09T09:50:00.001+01:00</published><updated>2012-10-09T09:50:39.296+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-09T09:50:39.296+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="user stories" /><category scheme="http://www.blogger.com/atom/ns#" term="backlog" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>Stop using Priority 1!</title><content type="html">I will come as no surprise to hear that&amp;nbsp; I read a lot of blogs about agile and agile methodologies and&amp;nbsp; when it comes to ordering/prioritising the backlog you will usually have people talking about priorty 1 this, priority 1 that and with the stories being numbered in sequence e.g. 1,2,3,4, etc&lt;br /&gt;
&lt;br /&gt;
To be honest I'm surprised that after all the years agile has been around that this is still what people are suggesting you do since its actually a complete pain to work with.&lt;br /&gt;
&lt;br /&gt;
What am I talking about? Well if you have a backlog of say 30 items (I'm assuming they are in some sort of electronic system) and they are all number sequentially then if the business suddenly discovers something that must be "Priority 1" you have to alter every other story in the backlog to adjust their priorities and the work required to do this is really pure waste.&lt;br /&gt;
&lt;br /&gt;
A better way of handling the priority is to invert the numbers, make the highest number the highest priority, this way if you want an new highest priority item you simply find the current top priority and add to its number, no need to reorganize the backlog, no change to what you have no waste, plus people often like the idea of giving a big number of a top priority so you are likely to get little resistance there.&lt;br /&gt;
&lt;br /&gt;
An added bonus is with more numbers to "play with" you are less likely to get product owners/stakeholders trying to make everything "Priority 1" and more likely to engage in ordering the stories appropriately for the team to work on.&lt;br /&gt;
&lt;br /&gt;
Also to make your life even easier don't number your stories using sequential numbers leave space between the numbers so that you can slot new stories in between existing ones if you need to.&lt;br /&gt;
&lt;br /&gt;
So instead of 1,2,3,4 try using 4000, 3000, 2000, 1000 it will relive you of a little pain in your backlog management.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/VI4v2zeP_bI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/743259632478107376/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/stop-using-priority-1.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/743259632478107376?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/743259632478107376?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/10/stop-using-priority-1.html" title="Stop using Priority 1!" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEEEQn06cSp7ImA9WhJVGUw.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-5837415527296674821</id><published>2012-09-06T08:30:00.000+01:00</published><updated>2012-09-06T08:30:03.319+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-06T08:30:03.319+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="Dependency Injection" /><category scheme="http://www.blogger.com/atom/ns#" term="DI" /><title>DI != IoC</title><content type="html">&lt;p&gt;At the weekend I gave the a presentation “Inversion of control containers Vs HandRolled” showing the difference between using an Inversion of Control (IoC) container versus doing the dependency injection yourself.&lt;/p&gt;  &lt;p&gt;I was asked a question on twitter Tuesday&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font size="6"&gt;“&lt;/font&gt;@philpursglove: @nathangloyn meant to chat with you at #ddd10 about why DI != IoC. Have you got a blog on this?&lt;font size="6"&gt;”&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There was a brief exchange on twitter about this but I wanted to just put my thoughts down around this.&lt;/p&gt;  &lt;p&gt;For me Dependency Injection is a pattern, it is where a class that uses other classes i.e. is dependent on the classes,&amp;#160; has these dependencies injected into it, whether this injection is via the constructor, property or methods. &lt;/p&gt;  &lt;p&gt;When people talk about IoC they most commonly think of a container such as &lt;a href="http://www.ninject.org/" target="_blank"&gt;Ninject&lt;/a&gt;/&lt;a href="http://docs.structuremap.net/index.html" target="_blank"&gt;StructureMap&lt;/a&gt;/&lt;a href="http://code.google.com/p/autofac/" target="_blank"&gt;Autofac&lt;/a&gt;, they think about it as a mechanism to handle the injection of the dependencies so they don’t have to worry about writing all the code to do this.&lt;/p&gt;  &lt;p&gt;I believe IoC isn’t just the mechanism to implement DI but its exact definition is a little more difficult to pin down, if you read &lt;a href="http://stw.castleproject.org/Default.aspx?Page=Inversion-of-Control&amp;amp;NS=Windsor&amp;amp;AspxAutoDetectCookieSupport=1" target="_blank"&gt;this&lt;/a&gt; wiki on the Castle project documentation then IoC is all about frameworks if you read Martin Fowlers &lt;a href="http://www.martinfowler.com/bliki/InversionOfControl.html" target="_blank"&gt;article&lt;/a&gt; then its a principle to bear in mind when building your application.&amp;#160; One thing that Martin Fowler does say in his 2005 article:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;font size="6"&gt;“&lt;/font&gt;There is some confusion these days over the meaning of inversion of control due to the rise of IoC containers; some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.&lt;/em&gt;&lt;em&gt;&lt;font size="6"&gt;”&lt;/font&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He is describing DI as a specific style of IoC but I believe it simpler to think of DI as a separate pattern that can stand by itself but could easily fall under the general principle of IoC, hence DI != IoC.&lt;/p&gt;  &lt;p&gt;Interestingly the closer you look at IoC to me it seems very similar to the &lt;a href="http://www.objectmentor.com/resources/articles/dip.pdf" target="_blank"&gt;Dependency Inversion Principle&lt;/a&gt; but that’s another conversation &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/-Q4MKKhJ2X-o/UEfBhHliLbI/AAAAAAAAALo/fcx_ENFoZok/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/-jX9Z2YrPEQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/5837415527296674821/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/09/di-ioc.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5837415527296674821?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5837415527296674821?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/09/di-ioc.html" title="DI != IoC" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-Q4MKKhJ2X-o/UEfBhHliLbI/AAAAAAAAALo/fcx_ENFoZok/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkEEQn08fCp7ImA9WhJVF0U.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-6795066519384888735</id><published>2012-09-04T20:56:00.001+01:00</published><updated>2012-09-04T20:56:43.374+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-04T20:56:43.374+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Event" /><category scheme="http://www.blogger.com/atom/ns#" term="DI" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD10" /><category scheme="http://www.blogger.com/atom/ns#" term="DeveloperDeveloperDeveloper" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>DDD10 Slides &amp; code from the presentation</title><content type="html">&lt;p&gt;On Saturday I presented “Inversion of control containers Vs HandRolled” at &lt;a href="http://developerdeveloperdeveloper.com/ddd10/" target="_blank"&gt;DDD 10&lt;/a&gt;, I had a really good time and wanted to thank everybody that came to the session, this post is to provide links to the slides and code.&lt;/p&gt;  &lt;p&gt;The slides can be found &lt;a href="http://www.slideshare.net/Nathangl/inversion-of-control-containers-vs-handrolled-how-they-compare" target="_blank"&gt;here&lt;/a&gt; although the font seems to have been altered so it doesn’t appear as it did in the presentation, I didn’t create the slides in comic sans honest!&lt;/p&gt;  &lt;p&gt;At the beginning of the talk I said I didn’t intend to upload the code but I was talking to &lt;a href="https://twitter.com/RoryBecker" target="_blank"&gt;Rory Becker&lt;/a&gt; at the geek dinner and he convinced me to upload the code so that others could look at/play with the code, so you can find the code &lt;a href="https://github.com/NathanGloyn/Inversion-of-control-vs-hand-rolled" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As always any questions feel free to ping me &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://lh4.ggpht.com/-tzS61Af9h8o/UEZc-Y1MzkI/AAAAAAAAALQ/1X-SiNLMeG8/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" /&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/U-gSOCwN1lc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/6795066519384888735/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/09/ddd10-slides-code-from-presentation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6795066519384888735?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6795066519384888735?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/09/ddd10-slides-code-from-presentation.html" title="DDD10 Slides &amp;amp; code from the presentation" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-tzS61Af9h8o/UEZc-Y1MzkI/AAAAAAAAALQ/1X-SiNLMeG8/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEUEQXw5eSp7ImA9WhJQGE0.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4381352370424274588</id><published>2012-08-01T08:30:00.000+01:00</published><updated>2012-08-01T08:30:00.221+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-08-01T08:30:00.221+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CI" /><category scheme="http://www.blogger.com/atom/ns#" term="Manning Books" /><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review: Continuous Integration in .Net</title><content type="html">&lt;p&gt;Searching on Amazon for the phrase continuous integration (CI) you’ll get over 2000 results but looking at them you’ll find very few books actually on the subject.&lt;/p&gt;  &lt;p&gt;This book has a unique slant in that it focus’ on the the .Net world and how you can introduce CI into your development practices and once implemented build upon that foundation to extend the functionality of your build server.&lt;/p&gt;  &lt;p&gt;The authors have structured the book to take a CI novice from installing a CI server through to automating deployment or as &lt;a href="http://paulstack.co.uk" target="_blank"&gt;Paul Stack&lt;/a&gt; describes in his talks how to climb the CI ladder.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;h2&gt;Part 1: Getting started&lt;/h2&gt;  &lt;p&gt;In the first part of the book the authors introduce you to the concepts behind continuous integration explaining why you would want to introduce this practice. &lt;/p&gt;  &lt;p&gt;Before getting to CI servers the authors spend a couple of chapters discussing the idea behind CI, the importance of source control in relation to the whole process and how you automate the build process using MS Build.&lt;/p&gt;  &lt;p&gt;The next chapter goes on to talk about CI servers and introduces the 3 CI servers that are discussed throughout the book: Cruise Control.Net, Team City and Team Foundation Server. At each stage of CI described in the book the authors show how to implement the various techniques discussed in all 3 of the servers. &lt;/p&gt;  &lt;p&gt;Next the importance of feedback that the CI server gives you is discussed, including the various forms of feedback - build notifications via email/RSS, external devices, etc.&lt;/p&gt;  &lt;p&gt;The final chapter in this part introduces you to unit testing, firstly explaining what unit testing is and a brief introduction on how to do it before then talking about how you can integrate it into your build process.&lt;/p&gt;  &lt;h2&gt;Part 2: Extend it&lt;/h2&gt;  &lt;p&gt;The second part of the book is all about extending your build process.&lt;/p&gt;  &lt;p&gt;This part has 2 chapters the first provides details on how to perform integration, system and acceptance testing by configuring the various CI servers to be able to utilise tools to run the various tests from NUnit for unit tests through to FitNesse for acceptance testing.&lt;/p&gt;  &lt;p&gt;The second chapter of this part discusses analysing your codebase using FxCop and StyleCop to help you improve the code including storing reports generated by both tools to allow you to monitor how the codebase is improving over time and not deteriorating. There are also details on using &lt;a href="http://www.ndepend.com/" target="_blank"&gt;NDepend&lt;/a&gt; (which I’ve blogged about &lt;a href="http://designcoderelease.blogspot.com/2012/01/introduction-to-ndepend.html" target="_blank"&gt;before&lt;/a&gt;) which provides a report that you can store including a lot of key metrics that will show you where to focus any improvements you may wish to make.&lt;/p&gt;  &lt;h2&gt;Part 3: Smooth and polish it&lt;/h2&gt;  &lt;p&gt;The third part of the book is devoted to truly extend the functionality of the CI server beyond simply building and testing your code.&lt;/p&gt;  &lt;p&gt;Generating documentation from xml comments using &lt;a href="http://shfb.codeplex.com/" target="_blank"&gt;Sandcastle&lt;/a&gt; is the first chapter of this part enabling development documentation to be updated as part of the build process ensuring that they are always up to date.&lt;/p&gt;  &lt;p&gt;Deployment and deliver of the applications are covered next showing you how add a visual studio deployment project and creating a Wix installer for windows based applications.&amp;#160; If you are creating web applications details are provided on how to use MS Deploy to enable automatic deployment of the site upon successful build.&lt;/p&gt;  &lt;p&gt;Database deployment is then covered, firstly the authors cover generation of SQL scripts through Sql Server Management Studio and how to run these from the command line but then going on to show how you can use &lt;a href="https://github.com/chucknorris/roundhouse/wiki" target="_blank"&gt;RoundHousE&lt;/a&gt; to automate this as part of the process when you aren’t using TFS as your build server.&amp;#160; For people using TFS the authors also cover Visual Studio Database projects as a way to be able to work with your database as well as deploying using this type of project.&lt;/p&gt;  &lt;p&gt;The final chapter is all about your CI process and provides advice on dealing with slow builds, how to scale your CI and measuring the maturity of your CI process.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;At the beginning of the book it clearly states that the book is intended for a reader that wants to “dive into” CI and that it is not really for experienced CI practitioners or build masters and I would have to agree with this, if you have been practicing CI and already have automated builds (or even better building and testing) it is only the last few chapters of the book that may contain anything new to you.&lt;/p&gt;  &lt;p&gt;Also there are some oddities in the book, such as explaining how to use source control and what unit testing is and how to do it, which I think would have been better covered by being included as an appendix rather than an actual chapter.&amp;#160; To my mind it would have been better to keep the main part of the book focussed on CI rather than attempt to give the reader a very brief introduction to the other subjects.&lt;/p&gt;  &lt;p&gt;For a newcomer to CI in the .Net world I would recommend you read this book as it will provide you with information and guidance to help you get your CI process in place.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/-Bai-hNlDCo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4381352370424274588/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/08/book-review-continuous-integration-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4381352370424274588?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4381352370424274588?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/08/book-review-continuous-integration-in.html" title="Book Review: Continuous Integration in .Net" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MERXw_fSp7ImA9WhJSGU0.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4256063331851758264</id><published>2012-07-10T08:30:00.000+01:00</published><updated>2012-07-10T08:30:04.245+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-10T08:30:04.245+01:00</app:edited><title>Feedback</title><content type="html">Everyday we need and use feedback to help us understand that what we are doing is working, when:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Executing a build - it tells us if the code compiles&lt;/li&gt;
&lt;li&gt;All unit tests passing - tells us the code does what we expect &lt;/li&gt;
&lt;li&gt;Acceptance tests passing - tells us the code is doing what the business expects&lt;/li&gt;
&lt;/ul&gt;
Day in and day out we utilise feedback in our work to help us write our code and improve what we are doing.&lt;br /&gt;
&lt;br /&gt;
But what about ouside of code? do you utilise feedback to help you improve?&lt;br /&gt;
&lt;br /&gt;
Do you:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Ask people to review your code?&lt;/li&gt;
&lt;li&gt;Talk to your manager regularly about any targets you've been set?&lt;/li&gt;
&lt;li&gt;Ask companies you interview with to provide feedback if unsuccessful in?&lt;/li&gt;
&lt;li&gt;Ask your peers if there is anything you can do to improve? &lt;/li&gt;
&lt;/ul&gt;
What TDD has shown us is the tighter the feedback loop the quicker we can adjust our behavior and improve what we are doing.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Feedback may just be the most important mechanism there is to help you improve as receiving feedback, in whatever form, tells you about how you are doing. The feedback may not always be what you want to hear, it may even be painful, but if you want to improve listen to it as it is could be the quickest way for you to get better at not only what you do but possibly how you do it.&lt;br /&gt;
&lt;br /&gt;
Conversely if you are a manager or perform interviews provide honest feedback as anything less doesn't actually help the person you manage/interviewed to improve.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/yNXQerX3UfE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4256063331851758264/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/07/feedback.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4256063331851758264?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4256063331851758264?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/07/feedback.html" title="Feedback" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08EQnk7eip7ImA9WhJTFkQ.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-92438189560345458</id><published>2012-06-26T08:30:00.000+01:00</published><updated>2012-06-26T08:30:03.702+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-26T08:30:03.702+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Book Review" /><title>Book Review: The Art of Agile Development</title><content type="html">&lt;p&gt;I have decided to go back and re-read some of the agile books from my &lt;a href="http://nrg.im/MnqXqW" target="_blank"&gt;list&lt;/a&gt; of books I recommend to people wanting to know about agile.&lt;/p&gt;  &lt;p&gt;The first book that I picked was the last on my list, it is one of the larger of the books I recommend at 440 pages so it has taken me a while to get through it although I’m glad that I have.&lt;/p&gt;  &lt;p&gt;The title of the book is a little misleading as the book is not about general agile development but it is in fact all about &lt;a href="http://www.extremeprogramming.org/" target="_blank"&gt;Extreme Programming&lt;/a&gt; (XP) and its aim is to provide the reader with information based on the authors experience not only about what XP is, its practices and principles but some real world advice about agile projects.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;p&gt;The information in the book is broken down into 3 sections:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Getting Started &lt;/li&gt;    &lt;li&gt;Practicing XP &lt;/li&gt;    &lt;li&gt;Mastering Agility &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In the preface of the book the authors provide some advice about who should read what parts of the book:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Merely curious about agile – read Part 1then move onto Part 2 &lt;/li&gt;    &lt;li&gt;Enough to do your job – chapter 3 from Part 1 then all of Part 2 &lt;/li&gt;    &lt;li&gt;A leader or bringing agile to your organisation – read the book cover to cover &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;They also point out that the book is not just for purists but that in fact if you are only concerned with writing good software the information contained in part 1 &amp;amp; 2 will be of use to you.&lt;/p&gt;  &lt;h2&gt;Getting Started&lt;/h2&gt;  &lt;p&gt;The first couple of chapters outline why an organisation would want to consider looking to implement agile and how you can go about introducing it with a warning about not trying to create your own methodology but to use one of the existing methodologies.&lt;/p&gt;  &lt;p&gt;Chapter 3 is provides a high level explanation of the XP Lifecycle, XP team and XP core concepts.&amp;#160; It is this chapter out of all the chapters in part 1 the authors recommend people should read due to its focus on explaining XP which is key for the rest of the book.&lt;/p&gt;  &lt;p&gt;Chapter 4 provides guidance for people looking to implement XP setting some prerequisites that you should have in place before attempting to do so and some recommendations for you to follow to help you establish agile in your organisation.&amp;#160; &lt;/p&gt;  &lt;h2&gt;Practicing XP&lt;/h2&gt;  &lt;p&gt;This part is the main section of the book making up fully 2/3 of it, it is made of 5 different chapters and covers all of the various team and technical practices that are associated with XP.&lt;/p&gt;  &lt;p&gt;Each chapter concerns one phase of the XP lifecycle and details the practices connected with that phase: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Thinking – Pair Programming, Energized Work, Informative Workspace, Root-Cause Analysis, Retrospectives &lt;/li&gt;    &lt;li&gt;Collaborating – Trust, Sit together, Real Customer Involvement, Ubiquitous Language, Stand-Up Meetings, Coding Standards, Iteration Demo, Reporting &lt;/li&gt;    &lt;li&gt;Releasing – “Done, Done”, No Bugs, Version Control, Ten-Minute Build, Continuous Integration, Collective Code Ownership, Documentation &lt;/li&gt;    &lt;li&gt;Planning – Vision, Release Planning, The Planning Game, Risk Management, Iteration Planning, Slack, Stories, Estimating &lt;/li&gt;    &lt;li&gt;Developing – Incremental Requirements, Customer Tests, Test-Driven Development, Refactoring, Simple Design, Incremental Design &amp;amp; Architecture, Spike Solutions, Performance Optimization, Exploratory Testing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Most of the sections in each chapter have what the authors call Études which are exercises, usually for the whole team, to carry out to help you understand and master the practice that is being explained.&amp;#160; Each section also contains contra-indications which are to help you identify when you shouldn’t try to implement the practice due to conditions on your team or in your organisation.&lt;/p&gt;  &lt;h2&gt;Mastering Agility&lt;/h2&gt;  &lt;p&gt;The final part has 6 chapters, the first chapter in this section lays the groundwork for the other 5, the authors explain that they have distilled values and principles from various agile sources and found 5 themes each of which is covered in this section.&lt;/p&gt;  &lt;p&gt;Each chapter contains some information about the theme how it often works in practice then a section called “Beyond Practices” where the authors offer advice about the theme through anecdotes of their experience in the field and how you can see that things don’t always go to plan.&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;The strength of this book is that you can read it cover to cover and learn all about Extreme Programming and its agile practices, but you can also use it as a reference book going back to each practice and using the Étude to improve you and your teams skills in that area.&lt;/p&gt;  &lt;p&gt;Although this book is primarily about Extreme Programming, today you will find the majority of practices used in most agile methodologies and it is for that reason that even if you aren’t doing XP but want to know more about the various agile practices it is worth reading the book.&lt;/p&gt;  &lt;p&gt;The one thing that did strike me on re-reading this book was the change in mindset that has happened in the agile community since this book was written, where it says you should implement all of the practices or you are more likely to fail where as today a more evolutionary approach is usually taken where you don’t attempt to implement everything immediately and build up the number practices you implement.&lt;/p&gt;  &lt;p&gt;Due to its length reading this book cover to cover is a real commitment but if you are new to agile it is worth the investment of time, if you are already practicing agile then this book also has a lot to offer as you may discover practices you have never heard of before or find ways to improve the ones you are already doing.&lt;/p&gt;  &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/KSJBMzD-Bdw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/92438189560345458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/06/book-review-art-of-agile-development.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/92438189560345458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/92438189560345458?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/06/book-review-art-of-agile-development.html" title="Book Review: The Art of Agile Development" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A08EQng6fCp7ImA9WhVUEk4.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-3001561315617266111</id><published>2012-05-17T08:30:00.000+01:00</published><updated>2012-05-17T08:30:03.614+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-17T08:30:03.614+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Is definition of done no longer needed?</title><content type="html">&lt;p&gt;A while ago now there was a discussion about “definition of done” (DoD) with critics and supporters alike commenting on how they saw DoD and need or lack of.&lt;/p&gt;  &lt;p&gt;The critics seemed to fall into 2 categories: those that believe work isn’t done until its actually deployed to production and those that did not see a need for DoD at all, where as the supporters generally reiterated the need for DoD and tried to explain its worth (which on twitter in 140 characters can be difficult), the most memorable tweet from these exchanges came from &lt;a href="https://twitter.com/#!/hhariri/status/131373705065533442" target="_blank"&gt;Hadi Hariri&lt;/a&gt; suggesting that DoD was akin to “agile mental masturbation”.&lt;/p&gt;  &lt;p&gt;So are the critics right? is definition done not needed?&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;A definition of done&lt;/h3&gt;  &lt;p&gt;Before we go any further let me offer a definition for DoD:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“A definition of done is a checklist of “things” that need to have been completed before a item is considered finished”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Each teams DoD is likely to differ from each other as they should have been created by the team to meet the requirements/constraints they have in their environment allowing them to be happy a piece of work is complete.&lt;/p&gt;  &lt;p&gt;The key thing with DoD is that everybody involved in the story/feature understands exactly what it means to be done, so no “oh its done but I just need to do &amp;lt;y&amp;gt; first” if you say you are done then you need to have met DoD.&lt;/p&gt;  &lt;h3&gt;The arguments against&lt;/h3&gt;  &lt;h4&gt;Its not done until its deployed to production&lt;/h4&gt;  &lt;p&gt;This is a very powerful statement and goes even further than XP idea of &lt;a href="http://jamesshore.com/Agile-Book/done_done.html" target="_blank"&gt;Done, Done&lt;/a&gt; where the code is not only written but every thing has been completed that is needed to deploy the code, now you cannot say something is done until it is actually in the hands of the users.&lt;/p&gt;  &lt;p&gt;I can see where this sentiment comes from but would humbly suggest that it is dependent on the environment you work in.&amp;#160; If you have a web based application the complexity and overhead deploying the latest version should be low but not everybody is developing web applications.&amp;#160; In one of my presentations on kanban I was asked about this concept, the dev in question created software that still had to be distributed by CD so he wanted to know was his work only done once the CD’s had shipped?&lt;/p&gt;  &lt;h4&gt;There isn’t a need for a definition of done&lt;/h4&gt;  &lt;p&gt;This statement came from people who I know work in highly agile environments that are focused on delivering value to the users, one person said to me “I’ve never seen a definition of done here everybody knows when the work is done”.&amp;#160; &lt;/p&gt;  &lt;p&gt;For an agilista this sounds like nirvana, a team that lives agile to such a degree that they know when the work is done, no need for any checklists or wondering if Sue/Fred/thingy has remembered to do something.&lt;/p&gt;  &lt;p&gt;I think this situation is great, but, what happens if change is introduced into the well known process? what happens when a new dev joins the team?&lt;/p&gt;  &lt;h3&gt;The argument for&lt;/h3&gt;  &lt;p&gt;For me DoD has 2 main benefits:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Transparency &lt;/li&gt;    &lt;li&gt;Communication &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;If you have a DoD in place it is completely transparent about what needs to be done for any story/feature before you can say “I’m done”, this is understood by developers, project managers and other stakeholders, it demonstrates the actual amount of work that is required to complete a piece of work and that it is not just writing the code.&lt;/p&gt;  &lt;p&gt;The DoD should be on display in a prominent position, it is there for everybody to see. If somebody new joins the team/business everybody can see what’s needed to mark a story/feature as done it is very visible for the team and it serves as a reminder of what is expected of them or to a business person what is involved in getting the work done. &lt;/p&gt;  &lt;h3&gt;The Verdict&lt;/h3&gt;  &lt;p&gt;To my mind the need for a DoD is essential, it doesn’t matter if you are doing agile or waterfall, it is having the ability not only as a development team but as a business to understand everything that is required to complete a story/feature.&lt;/p&gt;  &lt;p&gt;The argument that its not done unless its in production is a very powerful one and as I mentioned earlier if you are in an environment where you are able to do that I would suggest that adding “deployed to production” as an item to your DoD. However, if the environment you work in doesn’t allow this then I would suggest you should be including a deployment to staging/testing/UAT to ensure that you can deploy the software and does what you expect.&amp;#160; For me this argument doesn’t replace the need for a DoD but I strongly believe you should be thinking about the idea behind it to understand the need to deliver value to the user for the business.&lt;/p&gt;  &lt;p&gt;I don’t believe the argument that there isn’t a need for a DoD holds any water, the only downside to having a DoD I can see is if it becomes so prescriptive that development is becomes just one of a myriad number of tasks on the list, if that is the case then perhaps the team has missed the point and needs to re-evaluate what their DoD is for.&lt;/p&gt;  &lt;p&gt;So is DoD needed any more? Yes, and IMHO its a key part of the development process that all teams, agile or otherwise, should be looking to use if they don’t already.&lt;/p&gt;  &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/pe17uTtPnFw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/3001561315617266111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/is-definition-of-done-no-longer-needed.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3001561315617266111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3001561315617266111?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/is-definition-of-done-no-longer-needed.html" title="Is definition of done no longer needed?" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DUcEQHg7eCp7ImA9WhVUEEs.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-8677576838042725138</id><published>2012-05-15T08:30:00.000+01:00</published><updated>2012-05-15T08:30:01.600+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-15T08:30:01.600+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><title>Is software craftsmanship a luxury most can’t afford?</title><content type="html">&lt;p&gt;I’m guessing that for a lot of developers out there the idea of software craftsmanship sounds fantastic and that they’d love to be able to do it but everyday they are facing deadlines to deliver software to a client and as such are under pressure to “just do it” rather than taking the care they would wish to.&lt;/p&gt;  &lt;p&gt;I firmly believe that software development is a craft, whilst it has engineering principles it can at the same time be very close to art, much like a master carpenter who when creating furniture has specific techniques for creating different parts of that piece of furniture but what they produce when it is all put together is often viewed as a form of artwork.&lt;/p&gt;  &lt;p&gt;What a master carpenter has though is usually time to exercise his skills to enable him to produce the best “product” that he can, people can see and appreciate what it is he is producing and therefore the time it takes to create it is better understood by the customer as they can see what has gone into the finished product.&lt;/p&gt;  &lt;p&gt;Software, on the other hand, is viewed completely differently.&amp;#160; &lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;How did we get here?&lt;/h3&gt;  &lt;p&gt;When it comes to software how often have you heard the phrase “but its only a web page!” and here lies the problem. Software by its very nature is intangible and the customer is only likely to see whatever they interact with they don’t see all the hard work that has gone into the creation of the “product”.&lt;/p&gt;  &lt;p&gt;Yes you the developer have sweated blood &amp;amp; tears to craft the software to meet your exacting standards meaning its tested, clean code that adheres to SOLID principles to ensure that not only you but those that come after you will be able to easily maintain and evolve the code base and you have delivered it on time as promised.&lt;/p&gt;  &lt;p&gt;The issue is that because the client doesn’t see or appreciate this &lt;strong&gt;they don’t care.&lt;/strong&gt; What they care about is delivery of features/stories/tasks and what they want is more of these delivered, if possible, yesterday because time is money and in the current financial climate there isn’t a lot of it around.&lt;/p&gt;  &lt;h3&gt;And the issue is?&lt;/h3&gt;  &lt;p&gt;At Agile 2011 Jeff Sutherland was quoted as saying “the iron triangle is a relic of the 20th century” and when it comes to larger enterprise development I would hope he is right, it is often far easier with internal “customers” to be able to educate them to flex the scope and ensure you deliver value to the business, but, as I mentioned in &lt;a href="http://designcoderelease.blogspot.co.uk/2011/08/response-to-agility-is-not-enough.html" target="_blank"&gt;this&lt;/a&gt; post then in my opinion if you are working for a small software house, or dealing with external clients, the iron triangle is very much alive and you are expected to meet it.&lt;/p&gt;  &lt;p&gt;Without the support of your management you face the very real prospect of software craftsmanship been seen as a luxury that you cannot afford, and any time taken away from delivering software the “customer” wants is not acceptable.&lt;/p&gt;  &lt;p&gt;I can hear the howls of derision already “you need craftsmanship skills to reduce the number of bugs”, “what happens when the code changes”, etc. and I don’t disagree but I know of more than one developer that has had been told they have to deliver by &amp;lt;x&amp;gt; and the only way they feel it can be done is simply by cranking out the code and worry about the bugs afterwards.&amp;#160; On top of this I’d hazard a guess the number of developers I know in this situation outnumber the developers who are able to exercise there craftsmanship skills by a large number.&lt;/p&gt;  &lt;h3&gt;How do we solve this?&lt;/h3&gt;  &lt;p&gt;For the most part this isn’t a developer problem it is a management problem, developers want to follow craftsmanship practices but it is the management that feel it isn’t a productive use of time.&lt;/p&gt;  &lt;p&gt;Unfortunately the bottom line is money, and if the company you work for is focused on fixed term, fixed price contracts trying to move to using more craftsmanship practices will not be easy. It is usually these environments that use waterfall type methodologies and expect developers to hit the deadlines they are given and it may simply not be possible to change the culture of the company to a more craftsmanship oriented one.&lt;/p&gt;  &lt;p&gt;To help you try and transition towards the right sort of environment where craftsmanship is valued you need to be showing people the value in what you want to do and to do that its about:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Education, of taking your managers and/or customers and showing them that through the use of craftsmanship skills the overall cost of software drops &lt;/li&gt;    &lt;li&gt;Showing managers/customers all that is produced, they don’t have to understand it just be able to appreciate that it “isn’t just a web page” &lt;/li&gt;    &lt;li&gt;Involving managers/customers in the creation process to help them feel like they are part of what is being produced not just a recipient. &lt;/li&gt;    &lt;li&gt;Helping managers/customers to get the most value from the software so that they feel that their money is being well spent &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unsurprisingly agile methodologies value these things and place them at the core of what you are doing, if you are working in an agile environment and you aren’t doing this then may I humbly suggest you aren’t in fact agile, but that’s a post for another day.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/wgVv0DgnDIk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/8677576838042725138/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/is-software-craftsmanship-luxury-most.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/8677576838042725138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/8677576838042725138?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/is-software-craftsmanship-luxury-most.html" title="Is software craftsmanship a luxury most can’t afford?" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUEQn48eSp7ImA9WhVVFEs.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-8834709544219277628</id><published>2012-05-08T08:30:00.000+01:00</published><updated>2012-05-08T08:30:03.071+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-08T08:30:03.071+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile development" /><category scheme="http://www.blogger.com/atom/ns#" term="Window Phone" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><title>Developing my first WP7 app</title><content type="html">&lt;p&gt;Back in February I learned that Nokia &amp;amp; Microsoft had teamed up to provide free phones to developers that could show that they were developing applications for Windows Phone 7 (WP7), so I decided that this was too good an opportunity to miss and set about creating my first application.&lt;/p&gt;  &lt;p&gt;I already had an idea about what I was going to write as had downloaded an application on my existing WP7, a HTC Radar, to help my son with his math but was frustrated by certain shortcomings such as no tombstoning and I believed that I could write my own &lt;a href="http://www.windowsphone.com/en-GB/apps/2e1c8f98-5511-44f2-aac5-e9a8d4d30bba"&gt;app&lt;/a&gt; that would keep all the good parts of the existing app but sort out the things I saw as wrong.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;Getting Started&lt;/h3&gt;  &lt;p&gt;As I already have Visual Studio installed all I needed was to download the WP7 SDK and I was able to start coding.&lt;/p&gt;  &lt;p&gt;I made the assumption that I could unit test my code and added a WP7 class library (normal class libraries not useable)&amp;#160; used NuGet to get XUnit installed and proceeded to write a failing test.&amp;#160; It turns out I was unable to test against classes directly inside the phone application but I wasn’t overly bothered by this as I was trying to write SOLID code so added another WP7 class library and found I was able to write code to satisfy the test and I didn’t need the emulator running to do so.&lt;/p&gt;  &lt;p&gt;I also decided to follow the principle of &lt;a href="http://en.wikipedia.org/wiki/You_ain%27t_gonna_need_it" target="_blank"&gt;YAGNI&lt;/a&gt; and just build what I needed when I needed it rather than looking to use a framework like &lt;a href="http://caliburnmicro.codeplex.com/" target="_blank"&gt;Caliburn.Micro&lt;/a&gt; so that I could get a better grasp on what was needed to build apps for WP7&lt;/p&gt;  &lt;h3&gt;Windows Phone Camp&lt;/h3&gt;  &lt;p&gt;I attended the windows phone camp which was run as part of UK Tech days in Bristol at the end of February, the day had various talks about developing for WP7 as well as a “workshop” area where you could code and receive help from experienced WP7 developers.&lt;/p&gt;  &lt;p&gt;I attended the first talk which was all about Metro and designing an application that would fit with the metro design concept but after that I spent the rest of the day in the workshop area and I’m glad I did.&lt;/p&gt;  &lt;p&gt;Most attendees stayed in the talks which left me with access to the likes of &lt;a href="https://twitter.com/#!/scottisafool" target="_blank"&gt;scottisafool&lt;/a&gt;, &lt;a href="http://appamundi.com/about/" target="_blank"&gt;Peter Foot&lt;/a&gt; and not forgetting &lt;a href="http://appamundi.com/about/" target="_blank"&gt;Pete Vickers&lt;/a&gt; so that’s 2 WP7 MVP’s and a very experienced WP7 with time on there hands which meant that as I coded during the day if I ran into a problem I could grab one or other of them to help me with my app, and I have to say I believe I made more progress with them around in that single day than I could of in solo development in 2 weeks.&lt;/p&gt;  &lt;p&gt;I also got some sage advise from these good fellows which paraphrased was “don’t be afraid to use code behind, you &lt;em&gt;can&lt;/em&gt; do everything in XAML but is the extra time and effort worth it to you?”&lt;/p&gt;  &lt;p&gt;The one thing that I didn’t get from the day which I was really hoping for was a phone, but I had the details of how to apply to get one (the details are &lt;a href="http://mobileworld.appamundi.com/blogs/petevickers/archive/2011/11/13/links-and-resources-from-windows-phone-camps.aspx" target="_blank"&gt;here&lt;/a&gt; just scroll to bottom of the links) and had a fair idea of what was needed to qualify for one.&lt;/p&gt;  &lt;h3&gt;Developing the app&lt;/h3&gt;  &lt;p&gt;Due to the simplistic nature of my UI I came away from the phone camp with the UI almost 100% complete and as the majority of functionality in the app I was writing was located in the model so I was able to use TDD to create the functionality I needed.&amp;#160; &lt;/p&gt;  &lt;p&gt;Where I was disappointed was that in this day and age Microsoft hadn’t created the libraries that you use with WP7 with seams to enable mocking and testing.&amp;#160; It was because of this I ended up creating &lt;a href="http://designcoderelease.blogspot.com/2012/04/windows-phone-7-test-helper.html" target="_blank"&gt;my own helper class&lt;/a&gt; to enable me to mock one specific interaction and necessitating a change in the design of the application to add interfaces to act as seams for testing purposes.&lt;/p&gt;  &lt;p&gt;I was also disappointed by the fact that it is not possible to perform &lt;a href="http://blog.ploeh.dk/2011/03/03/InjectionConstructorsShouldBeSimple.aspx" target="_blank"&gt;constructor injection&lt;/a&gt; on any of the XAML pages, there are alternatives (such as &lt;a href="http://stackoverflow.com/questions/5462040/what-is-a-viewmodellocator-and-what-are-its-pros-cons-compared-to-datatemplates" target="_blank"&gt;ViewModelLocator&lt;/a&gt;) but as I was adhering to YAGNI I didn’t want to have to create the locator class and any additional infrastructure so instead I decided to use Ninject and use a Service Locator pattern.&amp;#160; Whilst I don’t normally like service locator it seemed to me to be the simplest way to achieve composable code in the way I was developing the application.&lt;/p&gt;  &lt;p&gt;My fake/stub/mock library of choice is &lt;a href="http://nsubstitute.github.com/"&gt;NSubstitute&lt;/a&gt; but when I tried to add the package via NuGet I got an error message telling me it was not compatible with WP7 app. I couldn’t see any real reason for this, given I was only trying to test logic, and managed to get around this by simply downloading the latest version from github and referencing it directly from my class library without involving NuGet at all.&lt;/p&gt;  &lt;p&gt;I’d read Scott Hanselmans post &lt;a href="http://www.hanselman.com/blog/FromConceptToCodeIn6HoursShippingMyFirstWindowsPhoneApp.aspx" target="_blank"&gt;&amp;quot;From Concept to Code in 6 hours&amp;quot;&lt;/a&gt; and looked to some of the same tools he had used in his application to help me namely:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://silverlight.codeplex.com/" target="_blank"&gt;Silverlight Toolkit&lt;/a&gt; – provides controls that, in my humble opinion, should be part of the normal SDK &lt;/li&gt;    &lt;li&gt;&lt;a href="http://code.google.com/p/notifypropertyweaver/" target="_blank"&gt;notifypropertyweaver&lt;/a&gt; – just implement INotifyPropertyChanged on a class and at at build time this will add the event and all the necessary plumbing code to the properties. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://ylad.codeplex.com/" target="_blank"&gt;Your Last About Dialog&lt;/a&gt; – provides all you need to painlessly implement an about dialog &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There was one library that Scott Hanselman used that I didn’t want to and that was LittleWatson, not because there was anything inherently wrong with the library, as I didn’t want the user to have to send me an email with all the gory details in it.&amp;#160; I looked around for alternatives and came across the excellent &lt;a href="http://www.bugsense.com/"&gt;bugsense&lt;/a&gt; that not only provides a library to capture the error and transmit it to a web service but the web service to receive the bug report, a database to store the information and a dashboard for me to view any errors!&amp;#160; The price for this? The free price plan gives you up to 500 errors per month and they only hold onto the data for 7 days but it satisfies my requirements at the moment.&lt;/p&gt;  &lt;h3&gt;Publishing the app&lt;/h3&gt;  &lt;p&gt;With the coding done and some graphics created for the app I submitted it to the Windows Phone Marketplace through the App Hub, which in itself was a fairly painless process and I made the app free as I believe that WP7 needs more free apps to compete with the other platforms; I have decided to keep the source closed as it was pointed out to me anybody could simply take my code and with little or no change submit it as a paid version.&lt;/p&gt;  &lt;p&gt;My only issue with the App Hub was that once submitted I had no idea of timescales for the application to work through the stages to be published, it would be nice to have some of indicator of when the app should reach each stage to set a developers expectations.&lt;/p&gt;  &lt;p&gt;The app took just over a day to reach the certification stage but I then had to wait a further 3 days for the certification to be complete and then to be published.&amp;#160; &lt;/p&gt;  &lt;p&gt;What is strange is that 3 days after the app has been published I am unable to find the app in the Marketplace if I search for it by name, instead the only way I can find it is via my name as publisher and I’m not sure why its doesn’t appear under a name search.&lt;/p&gt;  &lt;h3&gt;What now?&lt;/h3&gt;  &lt;p&gt;I’m hoping some people will download the app and get their children to try the application, after all it is aimed at kids not at adults, I’m more interested in what they have to say about the app. You can view the app details and download it from &lt;a href="http://www.windowsphone.com/en-GB/apps/2e1c8f98-5511-44f2-aac5-e9a8d4d30bba"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I already have plans as to how to extend the application but will wait a while and see what feedback I get from the app and see what people actually what before I continue with development.&lt;/p&gt;  &lt;p&gt;After publishing I realised that for whatever reason I never finished the description of the application and that I need a better graphic for the market place&amp;#160; so I’m going to have to find out how to amend a Marketplace listing after the app is published to correct these mistakes.&lt;/p&gt;  &lt;p&gt;I’m also going to investigate why I can’t find the app when searching specifically for it by name since the app has been published for 3 days now and currently you can only find it by search for me as the publisher, I will update this post if I find the reason.&lt;/p&gt;  &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/nmF-S95XzmA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/8834709544219277628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/developing-my-first-wp7-app.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/8834709544219277628?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/8834709544219277628?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/05/developing-my-first-wp7-app.html" title="Developing my first WP7 app" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;DEEBQnk_eCp7ImA9WhVXE00.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4255794272294916124</id><published>2012-04-13T08:30:00.000+01:00</published><updated>2012-04-13T09:44:13.740+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-13T09:44:13.740+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="WinRT" /><category scheme="http://www.blogger.com/atom/ns#" term="mobile development" /><category scheme="http://www.blogger.com/atom/ns#" term="Window Phone" /><category scheme="http://www.blogger.com/atom/ns#" term="Apollo" /><title>Windows Phone &amp; WinRT….why?</title><content type="html">As I mentioned in my last post my free time, when coding, is taken up with getting my first Windows Phone application completed and published.&lt;br /&gt;
&lt;br /&gt;
So whilst doing this and getting to grips with WP7 development I started hearing about how Windows Phone will be changing (Mary Jo-Foley’s &lt;a href="http://www.zdnet.com/blog/microsoft/windows-phone-8-whats-microsofts-developer-story/12353"&gt;blog&lt;/a&gt;, Windows Phone dev &lt;a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2012/04/05/windows-8-and-the-windows-phone-sdk-pt-2.aspx"&gt;blog&lt;/a&gt;) and that for Apollo, the next Windows phone OS release, Microsoft will make Windows Phone use the Windows 8 kernel.&lt;br /&gt;
&lt;br /&gt;
My first reaction is why? why change it, Microsoft as a company need to get as many companies/people developing apps on &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;the platform to make it successful.&amp;nbsp; You may hear the line “its not about the apps” but it really is, with a lot of bigger companies (like Starbucks) having and promoting apps on iOS &amp;amp; Android but nothing on Windows Phone the platform looks weak and that is the last thing Microsoft and Nokia need now.&amp;nbsp; It seems that Nokia need Windows Phone to be a success or they may be in &lt;a href="http://www.theregister.co.uk/2012/04/12/nokia_plan_b/"&gt;trouble&lt;/a&gt; so you would think they wouldn’t be happy with any major change that could effect the adoption of the phone.&lt;br /&gt;
&lt;br /&gt;
I read the blogs and can see and understand that Microsoft wants to have a unified environment across phone, tablet and desktop/laptop but why, when you need to get people developing on a platform, do you change how they develop on it after it being out such a short length of time? Developers have invested time and effort into learning about the phone and its foibles only to now need to look to learn new technology if they wish to continue developing on the platform in the future. Microsoft have said that existing apps, legacy apps, will continue to run on the new platform but no details are forthcoming on this at the moment.&lt;br /&gt;
&lt;br /&gt;
Lets be clear this isn’t a OS tweak this is a major change, Silverlight gone, you can use XAML but you have to learn WinRT, the apparent good news is you should be able to develop native apps in C++, yeah great so excited about that given I last used it in any anger about 10 years ago and was happy to see the back of it, yes I know for low level performance it rocks but for most phone apps is it really needed?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;Update&lt;/i&gt;&lt;/b&gt;: I need to point out that Microsoft has said that any Windows Phone 7/7.5 apps 
will run on Apollo, as devs I think we have to assume that we won't have to do anything since the need to republish apps would not be a good story for Microsoft.&lt;br /&gt;
&lt;br /&gt;
If anybody knows me you’ll know I’m not adverse to new technology but for the life of me I cannot understand why Microsoft would do this, at this time, when they are trying to gain traction in a market dominated by iOS &amp;amp; Android devices.&lt;br /&gt;
&lt;br /&gt;
This now leaves me wondering if I should bother to continue to invest my time in developing apps for Windows Phone 7 or should I now just focus on learning WinRT and preparing for Apollo instead?&lt;br /&gt;
&lt;br /&gt;
My feeling is that a lot of developers who may have thought about doing some Windows Phone development in their spare time will now hold off until Apollo is released and anybody doing development already probably won’t plan on creating lots of new apps either.&amp;nbsp; If this does happen then you could see the number of applications in the market place stall which isn’t a good thing for Microsoft, Nokia or any other handset maker that needs Windows Phone to be successful.&lt;br /&gt;
&lt;br /&gt;
Whilst Microsoft wants a unified platform, and I as I said I understand why, would it not be better to wait and be happy that Win 8 and WinRT is successful with bugs ironed out before rolling it out across all form factors?&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/e0LcWZRNi0c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4255794272294916124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/04/windows-phone-winrtwhy.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4255794272294916124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4255794272294916124?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/04/windows-phone-winrtwhy.html" title="Windows Phone &amp;amp; WinRT….why?" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkEEQXg8eip7ImA9WhVQFU8.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-9219331100407527943</id><published>2012-04-04T08:30:00.000+01:00</published><updated>2012-04-04T08:30:00.672+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-04T08:30:00.672+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unit testing" /><category scheme="http://www.blogger.com/atom/ns#" term="Window Phone" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Windows Phone 7 Test Helper</title><content type="html">&lt;p&gt;Just a short post as currently all my time is taken up trying to get my first Windows Phone 7 app completed which I’ll blog about once its all done.&lt;/p&gt;  &lt;p&gt;When I started my WP7 dev, me being me, I went TDD from the off but ran straight into an issue where I couldn’t fake the IsolsatedStorageSettings.ApplicationSettings which I’ve been using for data storage.&lt;/p&gt;  &lt;p&gt;As I’m new to the platform I decided to live with it but last night I created code that I &lt;em&gt;needed&lt;/em&gt; to test around storing data so I decided enough was enough and created a little wrapper class so I could fake the ApplicationSettings class.&lt;/p&gt;  &lt;p&gt;Thus is born my WP7.TestHelper assembly where I’ll add any other classes that I find where I need to fake them for testing and you can’t do it out of the box.&lt;/p&gt;  &lt;p&gt;As usual you can find the code in a repo on my &lt;a href="https://github.com/NathanGloyn/WP7.TestHelper" target="_blank"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/JnRCn6VAvxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/9219331100407527943/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/04/windows-phone-7-test-helper.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/9219331100407527943?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/9219331100407527943?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/04/windows-phone-7-test-helper.html" title="Windows Phone 7 Test Helper" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak8ERXo6eyp7ImA9WhRbFUw.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-3537855921206381331</id><published>2012-02-06T09:00:00.000Z</published><updated>2012-02-06T09:00:04.413Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-06T09:00:04.413Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>NDepend – final thoughts</title><content type="html">&lt;p&gt;Over the last 4 posts I’ve covered the &lt;a href="http://designcoderelease.blogspot.com/2012/01/introduction-to-ndepend.html"&gt;different editions of NDepend&lt;/a&gt;, &lt;a href="http://designcoderelease.blogspot.com/2012/01/ndependgetting-started.html"&gt;installing and starting off&lt;/a&gt;, the &lt;a href="http://designcoderelease.blogspot.com/2012/02/ndepend-analysis-report.html"&gt;report&lt;/a&gt; and &lt;a href="http://designcoderelease.blogspot.com/2012/02/ndependvisual-ndepend.html"&gt;Visual NDepend&lt;/a&gt; and wanted to just wrap up this series summarising the information and adding some of my own thoughts.&lt;/p&gt;  &lt;h3&gt;The Product&lt;/h3&gt;  &lt;p&gt;I have to say that the fact NDepend offers a free version for individual developers is brilliant, there used to be several tools in the .Net world that did this but gradually they all seem to have become commercial and only offer time limited trial versions.&amp;#160; &lt;/p&gt;  &lt;p&gt;There is a small catch in that the version you download is time limited itself but there is nothing to stop you downloading the another trial edition (web page even tells you when the next free download will be available) but I can imagine this becoming a pain after a while and could lead people to looking for an alternative.&lt;/p&gt;  &lt;p&gt;One thing that surprised me was the amount of help and documentation that is available on the NDepend website ranging from simple FAQ’s to video tutorials which will help with not only how to use NDepend but the information the NDepend provides.&lt;/p&gt;  &lt;h3&gt;The Functionality&lt;/h3&gt;  &lt;p&gt;As I mentioned in my post on the report when you first start using NDepend you are most likely to focus on the data in the report and although it contains a lot of information I still believe that the report is of most benefit in a CI situation allowing you to track the evolution of your code base.&lt;/p&gt;  &lt;p&gt;In day to day work Visual NDepend or the visual studio AddIn is where I believe the most value is to be found for individual developers allowing them to identify the points to focus on. &lt;/p&gt;  &lt;p&gt;Although you can use the stand alone application (Visual NDepend) in my opinion for most developers it is the visual studio integration that will provide the most value since you don’t have to leave the IDE to utilise the functionality.&lt;/p&gt;  &lt;p&gt;The Code Query Language is what differentiates NDepend from other static analysis tools allowing you to understand how it identifies code that violates its rules as well as making it easy to customize existing or create new rules.&lt;/p&gt;  &lt;h3&gt;Configuration/Customization&lt;/h3&gt;  &lt;p&gt;The fact that NDepend provides a way for you to customise the rules that it runs against a code based is, I believe, one of its biggest strengths. You also get fair amount of configuration over how it behaves and looks.&lt;/p&gt;  &lt;p&gt;However, there is no easy way to share this customization/configuration between projects let alone other members of the team.&amp;#160; For me this is probably the biggest failing of NDepend, yes you can manually alter each project and using source control if you add the ndproj file then when the next developer pulls/gets the code they will get the settings. &lt;/p&gt;  &lt;h3&gt;A couple of issues…&lt;/h3&gt;  &lt;p&gt;One issue is that you need to care about what NDepend is showing you about your code base. There is a lot of information it provides and with the amount of help on the website it is fairly easy to understand the various metrics that NDepend rules identify and use.&amp;#160; Even with all this information you have to care about it, for example if you have methods with a high Cyclomatic Complexity although you may understand what it means if you don’t care then the the tool is of little use.&lt;/p&gt;  &lt;p&gt;I feel I have to mention cost, for a larger enterprise organisation the licencing cost is unlikely to be a big issue but for smaller companies &amp;amp; individual developers, or hobbyists, the cost of the professional edition could be just too high.&amp;#160; &lt;/p&gt;  &lt;p&gt;I would also mention that I believe if you want the best results from NDepend you need everybody on your team to have it as just having it on a single machine, even if its the build machine, makes it hard to then follow up and fix violations.&lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;As anybody who knows me will know I’m a big fan of SOLID clean code and I like to be able to use metrics to understand my code and where I may need to improve it, I find that NDepend helps me with this.&lt;/p&gt;  &lt;p&gt;It is simple to get started with but there in lies its deceptive nature as it can not only tell you a lot about your code base but you can also learn more about various principles behind good code bases (I learnt all about the efferent &amp;amp; afferent coupling).&lt;/p&gt;  &lt;p&gt;NDepend is a tool that you need to spend time with to understand what it can show you and how to get the most out of it, if you do decide to invest the time I believe it will repay you in cleaner code and increased knowledge.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: I was provided a copy of the professional edition to review back at the beginning of last year, this hasn’t effected what I have said about the product which hopefully you can see in this series of posts.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/woVRvnSz1qs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/3537855921206381331/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndepend-final-thoughts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3537855921206381331?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3537855921206381331?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndepend-final-thoughts.html" title="NDepend – final thoughts" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0EEQ3s-fyp7ImA9WhRbEkg.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-3848250701058241680</id><published>2012-02-03T09:00:00.000Z</published><updated>2012-02-03T09:00:02.557Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-03T09:00:02.557Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>NDepend–Visual NDepend</title><content type="html">&lt;p&gt;The last post went over the report that NDepend generates, this post is going to focus on Visual NDepend, the stand alone program and the functionality it supports.&lt;/p&gt;  &lt;h3&gt;Interactive&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;The&lt;/strong&gt; difference between the report and Visual NDepend (from now on I’ll just call it NDepend) is that you have much greater ability to drill down into the code base allowing you to jump between various graphs/diagrams, you can then right click on the item and jump to a different view with the specific item the focus of the graph/matrix.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;NDepend Project&lt;/h3&gt;  &lt;p&gt;NDepend, in its various flavours, has its own project file which contains all the settings necessary for NDepend to function. There is no dependency to have the project file sit with code base it related to but I would suggest that it is a good idea to keep it with the solution you are analysing and check it into your VCS as well, especially if you start customising the rules etc.&lt;/p&gt;  &lt;p&gt;Unfortunately because customizations are stored in the individual project files currently it is not easy to share any customizations across projects but in the comments to this &lt;a href="http://danielsaidi.wordpress.com/2011/10/06/ndepend-tweaking-the-cql-rules/"&gt;post&lt;/a&gt; suggest the the makers of NDepend are working on it.&lt;/p&gt;  &lt;h3&gt;Getting started&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-oAg0o7rNhFQ/TysfLqryqqI/AAAAAAAAAI0/UJoce6esab0/s1600-h/NDepend13.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 0px 1px 12px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="NDepend" border="0" alt="NDepend" align="right" src="http://lh5.ggpht.com/-T6qAyu7ilEo/TysfMbHkWHI/AAAAAAAAAI8/XJml5i_xSO8/NDepend_thumb11.png?imgmax=800" width="458" height="279" /&gt;&lt;/a&gt;When you open up NDepend you should feel right at home as it has the distinct look &amp;amp; feel of visual studio.&amp;#160; &lt;/p&gt;  &lt;p&gt;When you first open it you will be presented with a screen that presents you with all the things you are most likely to need – links to videos on the NDepend site, buttons to install the AddIn’s for Visual Studio &amp;amp; Reflector &amp;amp; you will also be able to see if you are running the most up to date version of NDepend.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The left hand area displays recent projects you may have worked on and provides links to create a new project from scratch or analyse existing Visual Studio solution/projects, .Net Assemblies or compare 2 code bases. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-qw8AHzhEYYE/TysfN_-eoEI/AAAAAAAAAJE/ShnhGsMXZaI/s1600-h/image7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px 22px 1px 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/-q1L5EQWv6eg/TysfO7_Tk6I/AAAAAAAAAJM/AUdHhOPVhHY/image_thumb3.png?imgmax=800" width="530" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Once you’ve selected the solution/project to analyse NDepend will perform the analysis and display the results.&lt;/p&gt;  &lt;p&gt;At this point the information that is being displayed is effectively the same as what is contained in the report, it has the summary which contains the same information as the application metrics on the report, its got all the CQL rules that were ran and an indication if they passed similar to the reports menu listing of the rules.&lt;/p&gt;  &lt;h3&gt;Analysis using graphs&lt;/h3&gt;  &lt;p&gt;At this point you are now able to start moving between the different graph’s and matrices to explore the code base. The report just had the images showing the each of the graphs with no additional information, however in NDepend these are interactive and you can get a lot more information out of them.&lt;/p&gt;  &lt;p&gt;For example in the dependency graph hovering over any dependency will highlight the dependencies for that item and the Info panel on the right hand side will be populated with metrics about that item.&amp;#160; When you right click you can then jump to the another view, such as dependency matrix, to see the analysis in relation to that particular view.&lt;/p&gt;  &lt;h3&gt;Analysis by CQL Rule&lt;/h3&gt;  &lt;p&gt;If you select any of the CQL rules that have been run then all of the graphs/matrix will indicate the various parts of the code base that match the rule providing a visual way to allow you to focus on the items that are violating the rules.&lt;/p&gt;  &lt;p&gt;As well as altering the graph the CQL Query Edit will display the rule and show the classes, methods, properties, etc that have violated the code (assuming you have selected a rule that has been violated) and if you double click that item it will open the solution/project, if not already open, and display the code although this hasn’t always worked for me.&lt;/p&gt;  &lt;p&gt;As you select the various rules and navigate the UI you can see that this way of looking at your code base is much easier as it can allow you to focus on the areas identified rather than simply drilling down into the analysis.&lt;/p&gt;  &lt;h3&gt;CQL Querying&lt;/h3&gt;  &lt;p&gt;As impressive as the analysis is in my opinion the ability to generate your own CQL queries to be able to create your own rules, all you need to be able to do is think about what you want to query.&amp;#160; To make it even easier the query editor also has auto complete to help you to construct the queries and shows you live results as you create the query.&lt;/p&gt;  &lt;p&gt;Any queries that you create are saved in the project file and will be run against the code base the next time that NDepend runs an analysis.&lt;/p&gt;  &lt;h3&gt;Options&lt;/h3&gt;  &lt;p&gt;As you would expect you are also able to configure a lot of the behaviour of NDepend through the GUI, such as whether it runs a full or incremental analysis, if a html report is created &amp;amp; displayed, etc.&lt;/p&gt;  &lt;p&gt;There are configurable options for the majority of the functionality within NDepend even down to the colour scheme of the GUI itself and if you want to use a ribbon rather than a toolbar interface.&lt;/p&gt;  &lt;h3&gt;Visual Studio AddIn&lt;/h3&gt;  &lt;p&gt;As well as the stand alone application there is the AddIn for Visual Studio which adds an additional menu item to access&amp;#160; the functionality that is available in NDepend directly in Visual Studio so you get the graphs/matrix, CQL explorer, CQL Query, etc without having to leave the IDE.&lt;/p&gt;  &lt;p&gt;The one additional thing that the AddIn does that NDepend doesn’t do is to allow you to create a NDepend project for the currently loaded solution and it will add that file to solution for you.&lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;What I’ve covered here is really only scratching the surface of what NDepend can do, I haven’t even covered code base comparison or test coverage, both of which are options available to you as well.&lt;/p&gt;  &lt;p&gt;It is this functionality that is of real use to individual developers especially allowing you to jump into the specific bits of code that have been identified as needing attention.&lt;/p&gt;  &lt;p&gt;The ability to create your own CQL queries to investigate your code base is great but the inability to easily share these queries/rules between projects is a issue but hopefully it will be resolved by NDepend soon.&lt;/p&gt;  &lt;h3&gt;What’s next?&lt;/h3&gt;  &lt;p&gt;In my final post I’ll be summarising what I’ve covered and have some general thoughts around NDepend.&lt;/p&gt;  &lt;p&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/ERJCAtXVPRQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/3848250701058241680/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndependvisual-ndepend.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3848250701058241680?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/3848250701058241680?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndependvisual-ndepend.html" title="NDepend–Visual NDepend" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-T6qAyu7ilEo/TysfMbHkWHI/AAAAAAAAAI8/XJml5i_xSO8/s72-c/NDepend_thumb11.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUEQXo7fyp7ImA9WhRbEEQ.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-6202981898212473454</id><published>2012-02-01T10:30:00.000Z</published><updated>2012-02-01T10:30:00.407Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-01T10:30:00.407Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>NDepend – Analysis Report</title><content type="html">&lt;p&gt;In my &lt;a href="http://designcoderelease.blogspot.com/2012/01/ndependgetting-started.html" target="_blank"&gt;last post&lt;/a&gt; I discussed installing NDepend and getting your first report out, this post is about that report.&lt;/p&gt;  &lt;p&gt;I’m not intending to go into every single aspect of the report as it contains a huge amount of information and the report itself provides help and assistance on nearly everything that it contains by linking to resources on the NDepend website.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Note: All details discussed are in relation to the Professional edition of NDepend, it is possible you will not see all this functionality if you are only using the trial edition&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;The Report&lt;/h3&gt;  &lt;p&gt;As I mentioned at the end of the last post with the Visual Studio AddIn in place when you build your application NDepend will automatically kick in, analyse the code and create a report for you detailing metrics, adherence to some standard developer rules, graphs displaying further information about the code base in different formats, etc.&amp;#160; Your browser will be launched and the html based report will be displayed but this isn’t a simple static report as it provides the ability to drill down into various sections to look at the analysis data in more detail.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;Sections&lt;/h3&gt;  &lt;p&gt;The standard NDepend report contains the following sections:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Summary – application name,&amp;#160; report date, etc &lt;/li&gt;    &lt;li&gt;Diagrams – dependency, treemap, etc &lt;/li&gt;    &lt;li&gt;Application Metrics – LoC, no. of classes, etc &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;CQL Rules Summary – &lt;strong&gt;C&lt;/strong&gt;ode &lt;strong&gt;Q&lt;/strong&gt;uery Language rules that the application has broken&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;In addition to these sections you also have a menu that provides access to further information about your code including an easy way to navigate the CQL Rules, I’ll go into more depth on CQL in a bit.&lt;/p&gt;  &lt;h4&gt;Summary &lt;/h4&gt;  &lt;p&gt;This section contains pretty standard stuff such as the date the report was generated, version of NDepend used, and other information about the report rather than the code.&amp;#160; You will also find it contains links to resources specifically for beginners to help understand the report, quick tips (which seems to basically tell you to use Visual NDepend) and a link to the NDepend website.&lt;/p&gt;  &lt;p&gt;When running the report interactively I tend to doubt if this section adds a lot of value as you most likely know everything that it mentions, however, where this section comes into its own is when you generate the report from a CI server and this then allows you to track information about the report making it easier to link report to build and refer back to it at a later date.&lt;/p&gt;  &lt;h4&gt;Diagrams&lt;/h4&gt;  &lt;p&gt;The diagrams that are included in the report are images which helps you to visualize different aspects of the code base such as its dependencies, how abstract it is, etc but that is as far as it goes as the diagrams don’t offer any type of drill down functionality.&lt;/p&gt;  &lt;h4&gt;Application Metrics&lt;/h4&gt;  &lt;p&gt;The metrics contained in this section are things such as &lt;strong&gt;L&lt;/strong&gt;ines &lt;strong&gt;o&lt;/strong&gt;f &lt;strong&gt;C&lt;/strong&gt;ode, number of methods, number of classes, etc all fairly basic metrics and again if you are running it interactively may not be of much interest to you but when you have it generated from a CI build&amp;#160; you can look back over reports and track how a codebase has evolved over time.&lt;/p&gt;  &lt;h4&gt;CQL Rules Summary&lt;/h4&gt;  &lt;p&gt;Code Query Language is unique to NDepend, it is a DSL that allows you to query your code in a similar way that you can write SQL to query databases.&amp;#160; The report comes with many predefined rules that are executed against your codebase and with a simple green, yellow and red indicates the number of rules you’ve passed, violated or have violated a critical rule.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;A quick aside a critical rule is a normal CQL query that you have marked specifically as critical and when integrated into a CI server will cause the build to break if it is violated.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;For me this is the most useful section as it lists all of the rules that you have violated and provides links which take you to details of the rule, the CQL executed and a list of the items that violate the rule be it fields, methods, classes or assemblies.&lt;/p&gt;  &lt;h4&gt;Menu&lt;/h4&gt;  &lt;p&gt;On the left hand side of the report you will also find a menu that allows you to quickly jump to various pieces of information, some of which cannot be accessed elsewhere on the report e.g. Dead Code&lt;/p&gt;  &lt;p&gt;For me one of the nicest things in the menu is a way to move through the various groups of rules and being quickly able to see the number of rules passed/violated in each group and to be able to drill down to any sub/child rules contained within the group. &lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;When you first run NDepend and see the report it offers help for the beginner and it looks fantastic so you delve into it, however, once you’ve been using NDepend for a while for as a single user the report doesn’t offer anywhere near the level of functionality that Visual NDepend or the Visual Studio AddIn provides and I can see the report being largely ignored.&lt;/p&gt;  &lt;p&gt;As I mentioned a couple of times where I believe the report is of real use is when it is generated from a CI server and provides a really good way to track how a code base evolves over time, as well as ensuring that the quality of the code base meets defined rules.&amp;#160; I’m not intending to cover how to integrate NDepend with your CI Server as the NDepend website has really good details on how to do it &lt;a href="http://www.ndepend.com/Tips.aspx#CI" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So you can see what a report looks like I’ve created a report based on my &lt;a href="http://designcoderelease.blogspot.com/2011/12/solid-data-access-layer.html" target="_blank"&gt;ADO.NET DAL&lt;/a&gt; and you can download the files from &lt;a href="http://nrg.im/NDependReport" target="_blank"&gt;here&lt;/a&gt;, then all you have to do is unzip to a folder and open the NDependReport.html.&lt;/p&gt;  &lt;h3&gt;What’s next?&lt;/h3&gt;  &lt;p&gt;In my next post I’m now going to look at Visual NDepend and go through the functionality that it provides.    &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/bKoCTF9pLvM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/6202981898212473454/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndepend-analysis-report.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6202981898212473454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6202981898212473454?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/02/ndepend-analysis-report.html" title="NDepend – Analysis Report" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkEEQXk5fyp7ImA9WhRUE0w.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4345457282462623371</id><published>2012-01-23T10:30:00.000Z</published><updated>2012-01-23T10:30:00.727Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-23T10:30:00.727Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="getting started" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>NDepend–getting started</title><content type="html">&lt;p&gt;In my last &lt;a href="http://designcoderelease.blogspot.com/2012/01/introduction-to-ndepend.html" target="_blank"&gt;post&lt;/a&gt; I outlined the various editions of NDepend that were available, in this post I’m going to go through the install process and first steps with NDepend&lt;/p&gt;  &lt;h3&gt;Installing&lt;/h3&gt;  &lt;p&gt;Open up the Extension Manager in Visual Studio (Tools –&amp;gt; Extension Manager) and search for NDepend,&amp;#160; you should then see the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-QhImevYNuOk/Txx8klEDSYI/AAAAAAAAAII/ogUx-EREGc4/s1600-h/NDepend_ExtManager5.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="NDepend_ExtManager" border="0" alt="NDepend_ExtManager" src="http://lh4.ggpht.com/-y1YW8Uthbwk/Txx8lm_hZhI/AAAAAAAAAIQ/km6TuoCNtls/NDepend_ExtManager_thumb3.png?imgmax=800" width="544" height="350" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;p&gt;Unfortunately if you click the button you won’t get an installer open to install NDepend instead your browser will open on the download page of the &lt;a href="http://www.ndepend.com/NDependDownload.aspx" target="_blank"&gt;website&lt;/a&gt; where you will need to provide an email address to download the trial edition or the Licence ID that you have received to enable you to download the Professional edition.&lt;/p&gt;  &lt;p&gt;When you have provided your email or your licence then you will download a zip file which contains everything you need, all you need to do is extract the files to your location of choice.&lt;/p&gt;  &lt;h3&gt;Configuration&lt;/h3&gt;  &lt;p&gt;Whilst you are now able to use NDepend standalone to get the most out of it you need to enable integration with Visual Studio.&amp;#160; To do this run VisualNDepend.exe and select “Install Visual Studio Addin”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-6RY7dfCQoQw/Txx8ma-OAKI/AAAAAAAAAIY/tlOoWMs2tWA/s1600-h/NDependGUI_addin4.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="NDependGUI_addin" border="0" alt="NDependGUI_addin" src="http://lh5.ggpht.com/-3-7Cie6-y7M/Txx8nSDTndI/AAAAAAAAAIg/5Udz7SE9H4Q/NDependGUI_addin_thumb2.png?imgmax=800" width="449" height="408" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When you click this you will be shown a dialog that will allow you to select which editions of Visual Studio you want to install the AddIn for and the AddIn will then be installed into the appropriate versions of Visual Studio and that is NDepend configured and ready for use.&lt;/p&gt;  &lt;p&gt;Sharp eyed readers will notice the button “Install Reflector AddIn” which, if you have &lt;a href="http://www.reflector.net/" target="_blank"&gt;Reflector&lt;/a&gt; installed, will add an AddIn to reflector which will add a couple of context menu items in reflector allowing you to jump between Visual NDepend and Reflector to explore the code.&amp;#160; Unfortunately I’ve not had a lot of success with this AddIn and am currently in contact with NDepend support to try and rectify the issues I’m experiencing.&lt;/p&gt;  &lt;h3&gt;Getting started&lt;/h3&gt;  &lt;p&gt;With NDepend on your machine and the AddIn installed when you open Visual Studio you will find NDepend as a menu item, this will provide you with one of the main ways to interact with NDepend.&lt;/p&gt;  &lt;p&gt;To now try out NDepend simply open any project you have and then go to the NDepend menu item and select “Attach New NDepend Project to current VS solution”, this will open a dialog with the current project already added, simply click Ok.&lt;/p&gt;  &lt;p&gt;NDepend will start up and run an analysis of the project creating a html report with the results which it will then display in your default browser along with a dialog that offers advice for new users and suggest what you might want to look at next. You’ll also find that the dialog provides a snippet of information about the options to help you decide.&lt;/p&gt;  &lt;h3&gt;Summary&lt;/h3&gt;  &lt;p&gt;Installing NDepend is very easy with very little to go wrong&lt;/p&gt;  &lt;p&gt;My one criticism is that it isn’t an integrated process, you have to download it, then open the application and select to install the VS AddIn I know its not exactly a difficult to do this but It would be really good to be able to do the whole install from the VS Extension manager, including the VS Add-in.&lt;/p&gt;  &lt;h2&gt;What’s next?&lt;/h2&gt;  &lt;p&gt;Next I’m going to go through the report and look at what the report shows you and the information it contains.&lt;/p&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/p6FHi8uJpN4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4345457282462623371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/ndependgetting-started.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4345457282462623371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4345457282462623371?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/ndependgetting-started.html" title="NDepend–getting started" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-y1YW8Uthbwk/Txx8lm_hZhI/AAAAAAAAAIQ/km6TuoCNtls/s72-c/NDepend_ExtManager_thumb3.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUBQ3sycCp7ImA9WhVXEkg.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-2090364790436942879</id><published>2012-01-17T10:30:00.000Z</published><updated>2012-04-12T18:37:32.598+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-12T18:37:32.598+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="introduction" /><category scheme="http://www.blogger.com/atom/ns#" term="NDepend" /><category scheme="http://www.blogger.com/atom/ns#" term="metrics" /><category scheme="http://www.blogger.com/atom/ns#" term="code quality" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>An introduction to NDepend</title><content type="html">This is a series of 5 posts about NDepend:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;An introduction to NDepend&lt;/li&gt;
&lt;li&gt;&lt;a href="http://designcoderelease.blogspot.co.uk/2012/01/ndependgetting-started.html"&gt;NDepend - getting started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://designcoderelease.blogspot.co.uk/2012/02/ndepend-analysis-report.html"&gt;NDepend -&amp;nbsp; Analysis Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://designcoderelease.blogspot.co.uk/2012/02/ndependvisual-ndepend.html"&gt;NDepend - Visual NDepend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://designcoderelease.blogspot.co.uk/2012/02/ndepend-final-thoughts.html"&gt;NDepend - final thoughts&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
Starting with an introduction.... &lt;br /&gt;
&lt;br /&gt;
If you are anything like me then you love to have information about the code you write whether its test coverage, cyclomatic complexity, or other metrics that can give you some insight into your code.&lt;br /&gt;
&lt;br /&gt;
Before the shouting starts I’m not talking about metrics as KPI’s or using them for targets that developers have to meet, I’m simply talking about information &lt;i&gt;you&lt;/i&gt; can use to better understand your code which may in turn help you to improve the code.&lt;br /&gt;
&lt;br /&gt;
If you are lucky enough to have the Premium or Ultimate edition of VS2010 or VS2008 Team Suite/Developer then you get this functionality as part of visual studio, if not then you need another tool to provide you with this information. Even if you do have the native VS analysis functionality you may find that there are tools out there that provide a lot more information that the built in tools.&lt;br /&gt;
&lt;h3&gt;

NDepend&lt;/h3&gt;
&lt;a href="http://nrg.im/AE4KHF" target="_blank"&gt;NDepend&lt;/a&gt; is one such tool it provides metrics on your code but that isn’t all, it will allow you to delve inside the architecture of your application, allow you to diff the code, has test coverage analysis and build server integration built in.&lt;br /&gt;
&lt;br /&gt;
NDepend will also work with VS2005 upwards and as it can be used independently of Visual Studio you can actually use it even if you only have the Express editions of Visual Studio.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Disclaimer: I do &lt;b&gt;not &lt;/b&gt;work for NDepend but I was lucky enough to be provided the software to “play with”, my opinion in this and any subsequent post is my opinion and nobody else’s.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
I'm going to put together a series of posts, this being the first, on NDepend trying to give you an idea of the product and what you can, and can't, do with it.&lt;br /&gt;
&lt;br /&gt;
In this post I’m going to talk about the different editions of NDepend and give some information on each of them:&lt;br /&gt;
&lt;h3&gt;


Editions&lt;/h3&gt;
Currently there are 3 editions of NDepend:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Trial/Open-Source/Academic Edition &lt;/li&gt;
&lt;li&gt;Professional Developer Edition &lt;/li&gt;
&lt;li&gt;Professional Build Machine Edition &lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;


Trial/Open-Source/Academic Edition&lt;/h4&gt;
The Trial/Open-Source/Academic Edition, referred to as Trial from this point, is a good starting place for anybody interested in trying NDepend.&lt;br /&gt;
&lt;br /&gt;
As you may expect though this edition has limited functionality but to be fair to NDepend it provides the majority of features that the Professional Developer edition does so you can get a really good idea of what you can do though there are limitations imposed on the level of functionality supported for each feature.&lt;br /&gt;
&lt;br /&gt;
You are able to use the trial version freely for non-commercial software but it is time limited (current downloadable version will stop working 12th March 2012) although you are able to download another version once the software has past its expiry date. The site provides &lt;a href="http://www.ndepend.com/NDependDownload.aspx" target="_blank"&gt;guidance&lt;/a&gt; on using the trial version so you can decide if you really should be using it or not.&lt;br /&gt;
&lt;h4&gt;


Professional Developer Edition&lt;/h4&gt;
This is the full version that you’ll really want if you like NDepend, not only does it provide unfettered access to the majority of the functionality in the software (more on this in a bit) but also comes with additional features:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Test coverage import – happy to use NCover or Visual Studio Coverage &lt;/li&gt;
&lt;li&gt;Reflector integration – provides an addin to reflector to allow you to jump into NDepend from a context menu entry&lt;/li&gt;
&lt;li&gt;Build Comparison/Code Diff -&amp;nbsp; provides a way to diff code &amp;amp; builds to understand what’s changed &lt;/li&gt;
&lt;/ul&gt;
This edition is the one you’d most likely use day to day to check on how your code is doing and to be able to target any areas that you can see could do with some attention.&lt;br /&gt;
&lt;h4&gt;


Professional Build Machine Edition&lt;/h4&gt;
If you have a Continuous Integration server then you can enhance it with this edition that will allow you to generate reports from NDepend in your build process on the quality of the code when compared with the metrics you’ve defined.&lt;br /&gt;
&lt;br /&gt;
This integration will &lt;b&gt;not&lt;/b&gt; stop your build, it will only generate the report that you have configured.&lt;br /&gt;
&lt;h3&gt;


Edition summary&lt;/h3&gt;
Above I’ve given you a run down of some of the differences between the versions and what they do a full comparison can be found &lt;a href="http://www.ndepend.com/Editions.aspx" target="_blank"&gt;here&lt;/a&gt; on the &lt;a href="http://nrg.im/AE4KHF" target="_blank"&gt;NDepend&lt;/a&gt; site.&lt;br /&gt;
&lt;br /&gt;
As I eluded to the professional version doesn’t appear to support some of the features that the trial version does namely those related to build server integration.&lt;br /&gt;
&lt;br /&gt;
I can understand why this has been done as it allows people to download a single version of the software and try out both the interactive and build integration facets of the application.&lt;br /&gt;
&lt;br /&gt;
It would be nice though to be able to get the Professional edition to do this functionality even if only for trial purposes, it is possible it already does this but the aforementioned comparision chart seems to indicate that it doesn't have those features.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;


What’s next?&lt;/h3&gt;
The next post will probably just be a short one as I’m going to be looking at the installation of NDepend.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/X2IHMnpjqFE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/2090364790436942879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/introduction-to-ndepend.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/2090364790436942879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/2090364790436942879?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/introduction-to-ndepend.html" title="An introduction to NDepend" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CkUMSXsycCp7ImA9WhRWFUQ.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4667396498462285407</id><published>2012-01-03T10:30:00.000Z</published><updated>2012-01-03T11:31:28.598Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-03T11:31:28.598Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="retrospective" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>2011 into 2012</title><content type="html">Just as I did in last years &lt;a href="http://designcoderelease.blogspot.com/2011/01/that-was-2010-here-comes-2011.html" target="_blank"&gt;post&lt;/a&gt; this post is effectively a &lt;a href="http://en.wikipedia.org/wiki/Retrospective" target="_blank"&gt;retrospective&lt;/a&gt; on 2011, including looking at whether I achieved what I wanted to achieve, and some goals for this year.
&lt;br /&gt;
&lt;h3&gt;


2011…&lt;/h3&gt;
&lt;h4&gt;


Goals&lt;/h4&gt;
In my post from last year my goals were:&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;More user group presentations &lt;/li&gt;
&lt;li&gt;More book reviews &lt;/li&gt;
&lt;li&gt;CSP application approval &lt;/li&gt;
&lt;li&gt;Increase amount of code I write&amp;nbsp; including look at Ruby &amp;amp; F# &lt;/li&gt;
&lt;li&gt;Continuous Integration &lt;/li&gt;
&lt;li&gt;Earn MVP &lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;


So how did I do?&lt;/h4&gt;
&lt;u&gt;More user group presentations&lt;/u&gt;&lt;br /&gt;
After being selected for DDD9 I then went on to present at almost every DDD event during the year only missing out on DDD Belfast and DDD Dundee. I also got to present at a couple of user groups it may have been more but being honest I don’t think I put enough effort into letting people who run the groups know that I was available.&lt;br /&gt;
&lt;br /&gt;
One event that I did participate in, and hadn’t anticipated being part of, was the &lt;a href="http://skillsmatter.com/event/open-source-dot-net/progressive-dot-net-tutorials-2011" target="_blank"&gt;Progressive.Net Tutorials&lt;/a&gt; at &lt;a href="http://skillsmatter.com/" target="_blank"&gt;Skills Matter&lt;/a&gt; where I presented &lt;a href="http://skillsmatter.com/podcast/open-source-dot-net/you-think-you-know-agile" target="_blank"&gt;So you think you know agile&lt;/a&gt; which I enjoyed immensely.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Book reviews&lt;/u&gt;&lt;br /&gt;
I only managed to do a single book review last year on the excellent &lt;a href="http://designcoderelease.blogspot.com/2011/04/book-review-dependency-injection-in-net.html" target="_blank"&gt;Dependency Injection in .Net&lt;/a&gt; but for reasons that will become apparent I never managed to find the time to do any more reviews.&lt;br /&gt;
&lt;br /&gt;
Unfortunately I didn’t manage to do a lot of reading this year only perhaps having read 3 books the whole year.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;CSP Application approval&lt;/u&gt;&lt;br /&gt;
My application was approved, I am now both a Certified Scrum Master and Certified Scrum Professional the latter to me being more important as it demonstrates an actual working knowledge and experience of Scrum rather than having just taken a course.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Increase amount of code I write&lt;/u&gt;&lt;br /&gt;
I can confidently say I succeeded in this, partly because I changed job again this year, which for me is very unusual to stay in a job for such a short period of time, and my focus changed from team leadership/management to near enough pure development.&amp;nbsp; This change in job did mean that I no longer commuted by train I had so I lost that time.&lt;br /&gt;
&lt;br /&gt;
I also worked on my own code that I pushed to GitHub and much to my surprise and delight a couple of my repo’s have been forked by other people so it would seem I may be dong something right.&lt;br /&gt;
&lt;br /&gt;
One thing I didn’t spend any time on this year was the OSS project I mentioned in the 2010 post and this will be because of the other code I worked on during the year.&lt;br /&gt;
&lt;br /&gt;
I never managed to look at either Ruby or F# my time being taken up with the code I wrote and pushed to GitHub and also because I simply forgot that I had set myself that goal.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Continuous Integration&lt;/u&gt;&lt;br /&gt;
When I moved jobs I got the opportunity to start using CI and moved from simply automating builds to build and test then build, test &amp;amp; deploy and finally added in the in built code coverage support to show the test coverage of the project being built.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
My experience has solely been with Team City because I found it very easy to work with, especially with help from &lt;a href="http://bit.ly/tHMGLO" target="_blank"&gt;Paul Stack&lt;/a&gt; when I ran into a few issues who helped me sort them out and get everything moving smoothly.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Earn MVP&lt;/u&gt;&lt;br /&gt;
Well I failed at this utterly. I have no idea how you get onto the MVP program and didn’t even attempt to find out.&lt;br /&gt;
&lt;h4&gt;






What else went on?&lt;/h4&gt;
&lt;u&gt;This Blog&lt;/u&gt;&lt;br /&gt;
When I look back at the blog I noticed that I posted far more posts in 2010 than I did in 2011 30 vs 52 but interestingly from the limited metrics that blogger provides the traffic has increased (I have Google analytics in place now but still won’t give me a full years stats).&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
The blog also changed from being purely a brain dump to expressing an opinion on a subject, such as &lt;a href="http://designcoderelease.blogspot.com/2011/07/software-developer-zen-warrior.html" target="_blank"&gt;Software Developer != Zen Warrior&lt;/a&gt;, and telling people about the code I started to push onto GitHub.&lt;br /&gt;
&lt;br /&gt;
&lt;u&gt;Give Camp UK&lt;/u&gt;&lt;br /&gt;
This was a massive event, where developers gave up a weekend to create software for charity. A note here is nowhere near enough to cover it but hopefully my &lt;a href="http://designcoderelease.blogspot.com/2011/11/givecampukone-very-busy-weekend.html" target="_blank"&gt;post&lt;/a&gt; has sufficient detail.&lt;br /&gt;
&lt;h3&gt;






… into 2012&lt;/h3&gt;
I’m again looking to the future here to set myself some goals to try and achieve during the year and this time I’m keeping a note of them on my own kanban board so I can track how I’m getting on.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Blog posts – I’m looking to continue writing blog posts with a series of posts on NDepend coming up soon.&lt;/li&gt;
&lt;li&gt;Read books – I have a list of books that I want to read and am going to try and make time to do so&lt;/li&gt;
&lt;li&gt;Presentations – I have a couple of presentations I want to write and am looking for inspiration for other subjects &lt;/li&gt;
&lt;li&gt;MVP – even if I’m not able to earn one I’ll at least look into how you go about becoming eligible for one.&lt;/li&gt;
&lt;li&gt;Coding – I’m splitting my goals into will do and nice to do:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Will Do&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Concerted effort to finish the OSS project I started about 2 years ago&lt;/li&gt;
&lt;li&gt;Improve my JavaScript – looking at the future of development I know I need to improve my JavaScript skills&lt;/li&gt;
&lt;li&gt;Continue working on my ADO.NET DAL, I have some ideas about it including changing the API&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Nice to do&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Nuget – I would love to put a Nuget package together and get it published&lt;/li&gt;
&lt;li&gt;Learn PowerShell – it seems PowerShell could be massively useful so if I’m able to incorporate learning it in my normal coding activities then I’ll do so.&lt;/li&gt;
&lt;li&gt;Learn Python – over the last year I have seen more and more articles, tweets, etc about python so fancy having a go at coding with it.&lt;/li&gt;
&lt;li&gt;Develop WP7 apps – having purchased a WP7 I would love to be able to develop applications for it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
Now looking at the list I’m already thinking I’m going to be very busy and will need to get some brownie points in with the other half to try and get some time to do all this.&lt;br /&gt;
&lt;br /&gt;
So if you’ve read this far you know what I’m going to be doing in 2012 but what will you be up to?&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/UZiyGDBIPpI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4667396498462285407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/2011-into-2012.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4667396498462285407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4667396498462285407?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2012/01/2011-into-2012.html" title="2011 into 2012" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0QER3o_eip7ImA9WhRWFUk.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-7887728839960505629</id><published>2011-12-31T21:37:00.001Z</published><updated>2012-01-02T23:01:46.442Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T23:01:46.442Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Linq-to-sql" /><category scheme="http://www.blogger.com/atom/ns#" term="Repository" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Entity Framework" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="ORM" /><title>A generic repository</title><content type="html">Way back in &lt;a href="http://designcoderelease.blogspot.com/2011/01/that-was-2010-here-comes-2011.html" target="_blank"&gt;January&lt;/a&gt; I said that I was going to post on a generic repository, due to various other diversions during the year I never managed to get around to completing this work but on the last day of the year it is finally all done and to tick off one of my goals here is the post about it.&lt;br /&gt;
&lt;h3&gt;


What’s it all about?&lt;/h3&gt;
When talking about both Linq to Sql (L2S) and Entity framework (EF) you will frequently hear developers saying that they will be using a &lt;a href="http://martinfowler.com/eaaCatalog/repository.html" target="_blank"&gt;repository&lt;/a&gt; to encapsulate the ORM interactions, what this means in practice is hiding the actual ORM functions and providing a abstract class or interface you can mock to make it easier to test your applications.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
The simplest way of doing this is simply creating a class per entity that implements an interface and allows you to mock/stub/fake the interactions with the ORM allowing for easier unit testing of logic. &lt;br /&gt;
&lt;h4&gt;


Hasn’t this been done before?&lt;/h4&gt;
Yes it has. There are lots of articles on the web in relation to creating repositories and in particular generic repositories.&lt;br /&gt;
The majority of the articles I found were around EF but there were also versions for L2S and NHibernate.&lt;br /&gt;
&lt;h4&gt;


So why did you create one?&lt;/h4&gt;
At the time I started to create my own generic repository I had been using L2S for a while but found it frustrating that although it was useful it made testing very difficult as there was no easy way to mock/stub/fake it.&lt;br /&gt;
So I decided to try and create my own, yes I could have just used one that was already on the internet but doing that I wouldn’t have &lt;i&gt;really&lt;/i&gt; thought about what was needed or what issues I could encounter.&lt;br /&gt;
It would be very churlish of me to pretend that I hadn’t looked at other peoples implementations especially since the issues I was running into may have already been solved by other people (this &lt;a href="http://goneale.com/2009/07/27/linq-to-sql-generic-repository/" target="_blank"&gt;post&lt;/a&gt; in relation to the L2S implementation and this &lt;a href="http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/" target="_blank"&gt;post&lt;/a&gt; in relation to the EF implementation).&lt;br /&gt;
&lt;h4&gt;


Does this code offer anything different?&lt;/h4&gt;
My code has been designed to work with dependency injection and because of this each repository class does not create the context it needs rather it expects it to be injected into it. Its not revolutionary but does allow the developer to control the lifetime of the context rather than relying on the repository to do so.&lt;br /&gt;
The implementations for L2S &amp;amp; EF have been designed to work with entities that have been disconnected from a context rather than simply expecting all the interactions to be done within the scope of a single context which is often an issue in    &lt;br /&gt;
n-tier applications.&lt;br /&gt;
A fair number of the generic repository implementations I found on the web expected you to not only specify the type but also the primary key, my implementations will attempt to determine the primary key of the entity itself removing the need to specify this.&lt;br /&gt;
&lt;h3&gt;


Why use generic repositories?&lt;/h3&gt;
&lt;h4&gt;


The advantages&lt;/h4&gt;
Generic repositories are perfect when building applications using TDD and you need to be able to mock/stub/fake the ORM as a dependency.&amp;nbsp; It is also possible to take a lot of boiler plate code (such as updating changes in a disconnected scenario) and push it into the repository so keeping the code DRY and adhering to SOLID principles.&lt;br /&gt;
The other major advantage is the ability to inject the ORM dependency into other classes allowing you utilise IoC containers to construct whatever object graph is required.&lt;br /&gt;
&lt;h4&gt;


The disadvantages&lt;/h4&gt;
The generic repository as I, and most other examples, have implemented it is a &lt;a href="http://en.wikipedia.org/wiki/Leaky_abstraction" target="_blank"&gt;leaky abstraction&lt;/a&gt; as the entities in the ORM are what the rest of the code uses thereby creating a tight coupling between the application code and the specific ORM.&amp;nbsp; This may or may not be an issue for you depending on whether you are happy to be bound to any specific ORM or if you truly want persistent ignorance.&lt;br /&gt;
Although the generic repository offers a lot of control if your entities contain child objects you still don’t have control over it when how those are loaded, they are still loaded by the ORM and potentially if the entity has been disconnected you could have errors to contend with as it tries to load them without a context.&lt;br /&gt;
By encapsulating the ORM behind a facade interface it is possible you will lose some (all?) of the in built functionality that the ORM provides (self tracking entities is one possible loss) which could render the advantages of using an ORM null and void.&lt;br /&gt;
&lt;h3&gt;


Summary&lt;/h3&gt;
Whilst writing this code it struck me that the generic repository is an imperfect solution to the problem of mocking/stubbing/faking an ORM to reduce the coupling between the layers and since I first starting looking at this various solutions have come about – EF Code First, micro-ORM’s (Massive, Dapper, Simple.Data) and these provide a better solution BUT they rely on dynamic and if you are still working with .Net 3.5 this isn’t available.&lt;br /&gt;
So if you’re on .Net 4 (or above) then look to one of the newer version of ORM or micro-ORM that will easily allow you to mock/stub/fake the data access without the need for this additional coding, however, if you are working with .Net 3.5 then a generic repository may just be what you need to enable you to utilise an ORM, unit test the code and use IoC to create your object graph.&lt;br /&gt;
The code itself is available to download from my GitHub, please go &lt;a href="http://nrg.im/uRHf9r" target="_blank"&gt;here&lt;/a&gt; to download it.&lt;br /&gt;
Note: the code has been written in .Net 4.0 whilst L2S is happy to convert to .Net 3.5 the EF implementation will need rewriting to work.&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/6KagSAdLSv4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/7887728839960505629/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2011/12/generic-repository.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/7887728839960505629?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/7887728839960505629?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2011/12/generic-repository.html" title="A generic repository" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;A0UASH4yeyp7ImA9WhRQEUo.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-5087406512296287540</id><published>2011-12-06T10:00:00.000Z</published><updated>2011-12-06T13:47:29.093Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-06T13:47:29.093Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ADO.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="DAL" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term=".Net" /><category scheme="http://www.blogger.com/atom/ns#" term="SOLID" /><category scheme="http://www.blogger.com/atom/ns#" term="data access" /><title>A S.O.L.I.D data access layer</title><content type="html">A while back I had reason to look at one of my assemblies in my “toolbox” which wrapped the System.Data.SqlClient assembly and as often happens when you look at old code you cringe and wonder what you were thinking when you wrote it, so I decided to refactor the code using &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank"&gt;S.O.L.I.D principles&lt;/a&gt; to make the code easier to understand, test, maintain and extend and so &lt;a href="http://nrg.im/ubLPU8" target="_blank"&gt;ADO.NET DAL&lt;/a&gt; was born.&lt;br /&gt;
&lt;br /&gt;
For those of you who follow on me on Twitter you’ll know I spent a long time trying to ensure that the library had 100% code coverage but unfortunately I never made it, one method still eludes me but 99% coverage is pretty good &lt;img alt="Smile" class="wlEmoticon wlEmoticon-smile" src="http://lh4.ggpht.com/-6XqW26Nm7Dk/Tt1RaL0enYI/AAAAAAAAAH0/IU8ghxC4z-g/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" style="border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none;" /&gt;.&lt;br /&gt;
&lt;h3&gt;

&lt;/h3&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;h3&gt;

A data access layer? really?&lt;/h3&gt;
In this age of ORM’s, micro-ORM’s and &lt;a href="https://github.com/markrendle/Simple.Data" target="_blank"&gt;Simple.Data&lt;/a&gt; are people still using ADO.Net directly? are people writing data access layers which don’t return a fully populated POCO? I can safely say yes to both of those questions having seen code with numerous native ADO.NET calls and various blog and tweets from people that don’t like or want to use an ORM.&lt;br /&gt;
&lt;br /&gt;
For some people ORM’s are seen as an &lt;a href="http://seldo.com/weblog/2011/06/15/orm_is_an_antipattern" target="_blank"&gt;anti-pattern&lt;/a&gt; which actually hinder development as a project becomes more complex, for other people they may be dealing with legacy software that uses ADO.NET extensively and this use of native ADO.NET makes the code hard to test and often the amount of effort required to refactor it is so large it is just left as it is.&lt;br /&gt;
&lt;h3&gt;

Why should I use it?&lt;/h3&gt;
If you are working on legacy software which has ADO.NET code scattered throughout the codebase you’re working on this library should make it easy for you to refactor the code without taking a lot of time, allowing you to write tests for it, and making the code a lot cleaner in the process.&lt;br /&gt;
&lt;br /&gt;
If you don’t want to use an ORM then this library has wrapped the ADO.NET functionality in a nice package that you can just use meaning you don’t have to worry about connection handling, transactions or creation of parameters.&lt;br /&gt;
&lt;h3&gt;

What does it do for me?&lt;/h3&gt;
As mentioned above the library is designed to deal with connection handling, all that you need to do is to provide the Sql, or name of the stored procedure, you want to execute to the appropriate method and the library create the command object, configure it and execute it for you.&lt;br /&gt;
&lt;br /&gt;
The intention behind the code is to simplify the use of ADO.NET by wrapping the boiler plate code and just exposing the core functionality through a &lt;a href="http://en.wikipedia.org/wiki/Facade_pattern" target="_blank"&gt;facade&lt;/a&gt; meaning you can focus on the what you want your code to do rather than the how.&lt;br /&gt;
&lt;br /&gt;
If you have native ADO.NET in your classes you can simply replace blocks of code with calls to the appropriate methods, this means you need make only the minimum of changes to the overall structure of your code without worrying about side effects.&lt;br /&gt;
&lt;br /&gt;
The library is test friendly making it easy to mock/stub/fake the interaction between your code and the database and by ensuring that the code can be tested it is also easy to inject into any classes that may need it using your favourite Inversion of Control container.&lt;br /&gt;
&lt;br /&gt;
To further help with testing the public API uses the &lt;a href="http://msdn.microsoft.com/en-us/library/9tahwysy.aspx" target="_blank"&gt;System.Data.Common&lt;/a&gt; namespace which is designed to work with various data providers and all support generic interfaces that can again be mocked/stubbed/faked.&lt;br /&gt;
&lt;h3&gt;

Show me the code….&lt;/h3&gt;
Here is an example of some pretty standard ADO.NET code that you may find in many code bases:&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; &lt;span style="color: blue;"&gt;using&lt;/span&gt; (var connection = &lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;         &lt;span style="color: blue;"&gt;new&lt;/span&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;span style="color: #006080;"&gt;"theDatabase"&lt;/span&gt;].ConnectionString))&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;     var command = &lt;span style="color: blue;"&gt;new&lt;/span&gt; SqlCommand(&lt;span style="color: #006080;"&gt;"GetValue"&lt;/span&gt;, connection);&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     command.CommandType = CommandType.StoredProcedure;&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;     command.Parameters.Add(&lt;span style="color: blue;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #006080;"&gt;"firstParameter"&lt;/span&gt;, parameterValue));&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;     connection.Open();&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;     result = command.ExecuteScalar();&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
The code above also has a dependency on &lt;a href="http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx" target="_blank"&gt;ConfigurationManager&lt;/a&gt;, whilst I’m not saying this is always the way the configuration string is provided I’ve seen it more times than I’d care to remember.&lt;br /&gt;
&lt;br /&gt;
So what does this look like with the DAL?&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; result = dataAccess.ExecuteScalar(storedProcedureName,&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;                                   dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"firstParameter"&lt;/span&gt;,DbType.Int32,123));&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
you can accomplish the same in a single line…ok so I cheated a little and missed out the creation of the dataAccess object itself but that is just:&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; IDataAccess dataAccess = &lt;span style="color: blue;"&gt;new&lt;/span&gt; DataAccess(connectionString);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
and if you are using dependency injection you’d get your IoC container to do this for you (you are using IoC aren’t you?) which means that you won’t have it scattered throughout the code base.&lt;br /&gt;
&lt;br /&gt;
If you look at the code you’ll see that the main IDataAccess interface has a ParameterFactory object that you use for creation of any parameters that you may need, and because the method calls all take a &lt;a href="http://msdn.microsoft.com/en-us/library/w5zay9db.aspx" target="_blank"&gt;param array&lt;/a&gt; of DbParameters you can simply add more and more in the method call like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; result = dataAccess.ExecuteScalar(storedProcedureName,&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;                                   dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"Parameter1"&lt;/span&gt;,DbType.Int32, 123),&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt;                                   dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"Parameter2"&lt;/span&gt;,DbType.AnsiString,&lt;span style="color: #006080;"&gt;"a"&lt;/span&gt;),&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt;                                   dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"Parameter3"&lt;/span&gt;,DbType.Double,&lt;span style="color: #006080;"&gt;"12.01"&lt;/span&gt;));&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
But equally because its a param array you can call the same method with no parameters at all:&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; result = dataAccess.ExecuteScalar(storedProcedureName);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;

Anything else I should know?&lt;/h3&gt;
The library also provides a basic &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html" target="_blank"&gt;unit of work&lt;/a&gt; implementation through normal ADO.NET transactions:&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; dataAccess.Transactions.BeginTransaction();&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum2" style="color: #606060;"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum3" style="color: #606060;"&gt;   3:&lt;/span&gt; &lt;span style="color: blue;"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum4" style="color: #606060;"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum5" style="color: #606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color: blue;"&gt;int&lt;/span&gt; id = dataAccess.ExecuteScalar(doUpdate, dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"1"&lt;/span&gt;,DbType.Int32,1));&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum6" style="color: #606060;"&gt;   6:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum7" style="color: #606060;"&gt;   7:&lt;/span&gt;     dataAccess.ExecuteNonQuery(doUpdate2,dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"id"&lt;/span&gt;,DbType.Int32,id),&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum8" style="color: #606060;"&gt;   8:&lt;/span&gt;                                          dataAccess.ParameterFactory.Create(&lt;span style="color: #006080;"&gt;"value"&lt;/span&gt;,DbType.String,&lt;span style="color: #006080;"&gt;"abc"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum9" style="color: #606060;"&gt;   9:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum10" style="color: #606060;"&gt;  10:&lt;/span&gt;     dataAccess.Transactions.CommitTransaction();&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum11" style="color: #606060;"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum12" style="color: #606060;"&gt;  12:&lt;/span&gt; &lt;span style="color: blue;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum13" style="color: #606060;"&gt;  13:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum14" style="color: #606060;"&gt;  14:&lt;/span&gt;     dataAccess.Transactions.RollbackTransaction();&lt;/pre&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum15" style="color: #606060;"&gt;  15:&lt;/span&gt;     &lt;span style="color: blue;"&gt;throw&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum16" style="color: #606060;"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
The other feature that you may want to be aware of is that each method has an overload that allows you access to the actual DBCommand that was executed so that if you need to get to the return value, return parameters or anything else on the command you simply provide an out parameter to populate:&lt;br /&gt;
&lt;div id="codeSnippetWrapper" style="background-color: #f4f4f4; border-bottom: silver 1px solid; border-left: silver 1px solid; border-right: silver 1px solid; border-top: silver 1px solid; cursor: text; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 20px 0px 10px; max-height: 200px; overflow: auto; padding-bottom: 4px; padding-left: 4px; padding-right: 4px; padding-top: 4px; text-align: left; width: 97.5%;"&gt;
&lt;div id="codeSnippet" style="background-color: #f4f4f4; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;
&lt;pre style="background-color: white; border-bottom-style: none; border-left-style: none; border-right-style: none; border-top-style: none; color: black; direction: ltr; font-family: 'Courier New', courier, monospace; font-size: 8pt; line-height: 12pt; margin: 0em; overflow: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; width: 100%;"&gt;&lt;span id="lnum1" style="color: #606060;"&gt;   1:&lt;/span&gt; dataAccess.ExecuteNonQuery(&lt;span style="color: blue;"&gt;out&lt;/span&gt; commandToCheck, storedProcedureName);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;

Future plans&lt;/h3&gt;
At the moment the library only supports Sql Server as that was the focus of the original library that I refactored, however, I’m hoping to extend the number of types of database the library supports going forward with the first additional type of database being Sql Compact. &lt;br /&gt;
&lt;br /&gt;
This seemingly simple change will offer plenty of challenges as I would like to keep the public API the same meaning I have to work out which type of database you want under the covers, quite how I’m going to do that I haven’t decided yet.&lt;br /&gt;
&lt;h3&gt;

Feedback please&lt;/h3&gt;
I’d love to hear your thoughts on this, is it something you like? is it something you think you could use? would I be wasting my time extending this further given alternatives that are out there?&lt;br /&gt;
&lt;br /&gt;
Please leave me a comment or contact me about it and feel free to fork the code and have a play.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/CjXQ2kyrPXM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/5087406512296287540/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2011/12/solid-data-access-layer.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5087406512296287540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5087406512296287540?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2011/12/solid-data-access-layer.html" title="A S.O.L.I.D data access layer" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-6XqW26Nm7Dk/Tt1RaL0enYI/AAAAAAAAAH0/IU8ghxC4z-g/s72-c/wlEmoticon-smile%25255B2%25255D.png?imgmax=800" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;DUICRnczeSp7ImA9WhRRF08.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-5740255662999376768</id><published>2011-11-29T08:30:00.001Z</published><updated>2011-12-01T08:19:27.981Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-01T08:19:27.981Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mango" /><category scheme="http://www.blogger.com/atom/ns#" term="Window Phone" /><category scheme="http://www.blogger.com/atom/ns#" term="WP7" /><title>Getting to grips with a Windows Phone 7</title><content type="html">Last Wednesday I became the owner of a windows phone 7 (WP7), a HTC Radar to be precise. My current mobile contract had expired and I had been toying with the idea of getting a WP7 for a while.&amp;nbsp; Unfortunately I was dubious about the platform and didn’t really want to take out a long contract and end up with a phone I didn’t want, and as all my attempts to get a free phone failed I decided to try and buy a SIM free phone. A brand new phone was beyond my budget so I turned to eBay and found a few WP7’s listed and managed to pick up a &lt;a href="http://www.techradar.com/reviews/phones/mobile-phones/htc-radar-1038080/review" target="_blank"&gt;Htc Radar&lt;/a&gt; for about £200 which was a result.&lt;br /&gt;
&lt;h3&gt;


Why a WP7?&lt;/h3&gt;
I have already been asked why I’d want to buy a WP7 and the simple answer is that I am a .Net developer and I want to do some mobile development, not just on the emulator but to be able to actually deploy to the device for testing and ultimately the market place.&amp;nbsp; Whilst I’d already got an Android phone (&lt;a href="http://www.techradar.com/reviews/phones/mobile-phones/htc-desire-679515/review" target="_blank"&gt;HTC Desire&lt;/a&gt;) I was faced with having to find time to learn java or find the money to buy &lt;a href="http://android.xamarin.com/" target="_blank"&gt;MonoDroid&lt;/a&gt; neither of which were likely to happen.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;By having a WP7 I should be able to use my existing skills and create mobile applications without a big learning curve or shelling out extra cash which in theory makes it the ideal choice for my first native mobile apps rather than simply a web application that is able to run on mobiles.&lt;br /&gt;
&lt;h3&gt;


Initial impressions&lt;/h3&gt;
The phone itself seems a nice piece of kit, reviews on it generally like the radar but tend to mark it down on storage and speed but so far with what I’ve being doing I’ve not experienced any noticeable performance problems.&amp;nbsp; As I use it more storage may be an issue but with 8Gb internal storage (double my Desire’s standard 4Gb SD card) hopefully it will take me a while to fill it up.&lt;br /&gt;
The setup was easy, walked through a short wizard with my existing SIM and the phone was working! The only thing I didn’t like was the phone “needing” my Windows Live Id to work and then trying to get me to link it to any and all social networks that I may be part of, call me old fashioned but I tend to keep them separate for a reason and don’t really want Windows Live being linked to all of them.&lt;br /&gt;
First thing I wanted to do was customize the phone a little, my own widgets, ringtones, etc. Imagine my disappointment when I found the most I could do was alter what tiles appeared on the first screen and all my other apps appear in list only if I swipe to the left, this certainly wasn’t the user experience I was used to on my desire.&lt;br /&gt;
It felt like that every application I opened wanted to be able to use my location and transmit that information to Microsoft which I didn’t want to do so I kept having to say no.&lt;br /&gt;
I found the WiFi setup and connected to my router and the phone proceeded to download any contacts I had in Windows Live, which is very few to say the least. I then setup my Gmail and the phone also pulled down my contacts and populated my “People” &lt;br /&gt;
&lt;h3&gt;


The Marketplace&lt;/h3&gt;
With basic connectivity and contacts sorted I proceeded to to Microsoft’s Marketplace to try and get the same or similar apps to those that I already had.&amp;nbsp; &lt;br /&gt;
It was at this point the I noticed the first big difference between Android and WP7 in that it seemed the majority of the highest rated apps available were all paid apps. Don’t get me wrong I have no issue in paying for good software its just that my impression with Android is that the majority of the apps I have and use are free.&lt;br /&gt;
It surprised me how many apps were paid apps, I thought (naively) that as Microsoft wanted to grow the platform as quickly as they could they would have followed the Android model instead it seems that they have decided to mirror Apple’s approach.&amp;nbsp; &lt;br /&gt;
&lt;h3&gt;


Apps &amp;amp; Widgets on WP7&lt;/h3&gt;
Once I had found some apps that I wanted, namely a twitter client, I wanted to try them out and this was my second big difference between Android and WP7 apps generally do not auto refresh or notify you if there are updates to information e.g. tweets.&amp;nbsp; To me this seemed like a massive step backwards, I was used to opening a twitter client and new that when new tweets arrived it would provide both audio and visual cues to tell me updates had been received. I know there are some apps that I have been told do have live tile and toast notifications but I haven’t tried them yet.&lt;br /&gt;
I also found that a few of the apps/widgets I use weren’t available such as the power bar, I like to be able to turn the various functions like WiFi, Mobile Internet, Bluetooth,etc on and off as I want them and on my Desire the power bar allows me to do this but unfortunately there doesn’t appear to be anything remotely similar on the Radar.&lt;br /&gt;
I had a brief twitter conversation with &lt;a href="https://twitter.com/philjones88" target="_blank"&gt;Phil Jones&lt;/a&gt; and &lt;a href="http://jonalb.com/" target="_blank"&gt;JonAlb&lt;/a&gt; both of whom own WP7 and John has already developed applications and published on the Marketplace about the situation and it would seem that some of the things I took for granted on my Desire (such as auto refresh of data in the background) aren’t quite there yet on WP7, they are coming but not there yet.&amp;nbsp; John also went on to point out that I am unlikely to be the target market for the phone and that for the majority of people the things I felt were missing wouldn’t even be seen as an issue.&lt;br /&gt;
&lt;h3&gt;


PC Software&lt;/h3&gt;
The phone told me there was an update available for it and it needed to be connected with the PC to enable it to be updated, so the next day I plugged it into my PC and Windows downloaded and installed the Zune software.&lt;br /&gt;
The Zune software seems easy to use and works well with the phone and compared with the HTC sync that I had for the desire I must say I prefer the Zune software.&amp;nbsp; That being said with the Desire I had the opportunity to just mount it as a USB drive which I don’t get with the Radar so the Zune software will need to be good to overcome what I currently see as a limitation.&lt;br /&gt;
&lt;h3&gt;


Using it as a phone&lt;/h3&gt;
I know its sacrilege but I do tend you actually use my phone as a phone to make phone calls and send texts and for doing this I can’t fault the phone, it works very well.&amp;nbsp; The only issue I have with it is that with the power/USB socket being on the side I am unable to use my car phone cradle to hold the phone and connect a charger at the same time. It may just be me but most phones tend to have the socket at the bottom of the phone and so it is a little strange to see it on the side and unfortunately means I either will have to buy a specialist car cradle or simply have the phone lying around the car if I want it to be charging whilst on the move.&lt;br /&gt;
I was also very pleasantly surprised to find that the Radar comes with voice recognition as standard so when driving I can click my Bluetooth headset and just speak the name of the person to ring, then as I was driving to work a text arrived and the phone read it to me and asked if I wanted it re-read in case I missed something, now that I like.&lt;br /&gt;
The one thing that I have been unable to do is to set a custom ring tone based on an MP3 ring tone I had on my desire, now I don’t think that its being overly geeky to want to set a ring tone to an MP3 but after following Microsofts online instructions and then watching a 3rd party &lt;a href="http://www.youtube.com/watch?v=W2G1cMxCpcY" target="_blank"&gt;YouTube video&lt;/a&gt; on how to change the ring tone I still wasn’t able to do it.&amp;nbsp; This seems way to hard for such a simple task and I sincerely hope it become easier in the future.&lt;br /&gt;
&lt;b&gt;Edit: I managed to get my ring tone working, what wasn’t clear was that when you set the genre on the track so that the phone will recognise it it has to be the text ‘ringtone’ if you don’t put that exact text the phone will not see it.&lt;/b&gt;&lt;br /&gt;
&lt;h3&gt;


What’s next?&lt;/h3&gt;
My first thoughts were “I can’t use the phone” but I’m persevering and have been rewarded by discovering things such as the voice recognition, and my thoughts now are that since I’m a developer and I believe there is functionality missing from the phone I’ll need to roll up my sleeves and write the software that I want.&lt;br /&gt;
I plan to write a few more posts on how I find the phone over the next couple of weeks and hopefully soon I’ll be able to post about my experience in creating apps for WP7.&lt;br /&gt;
&lt;a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag" style="display: none;"&gt;CodeProject&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/iy4R-XI9-AQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/5740255662999376768/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/getting-to-grips-with-windows-phone-7_29.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5740255662999376768?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/5740255662999376768?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/getting-to-grips-with-windows-phone-7_29.html" title="Getting to grips with a Windows Phone 7" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;A0AEQXY-fSp7ImA9WhRSGUk.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-4447280524617125456</id><published>2011-11-22T08:15:00.000Z</published><updated>2011-11-22T08:15:00.855Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-22T08:15:00.855Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Login" /><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="SimpleMembership" /><category scheme="http://www.blogger.com/atom/ns#" term="Bin Deploy" /><title>The resource cannot be found - /Account/Login</title><content type="html">&lt;p&gt;I ran into a problem the other day that I could find very little information about so I thought I’d put a blog post together to &lt;/p&gt;  &lt;p&gt;a) remind me    &lt;br /&gt;b) hopefully help anybody else who runs into this problem.&lt;/p&gt;  &lt;p&gt;I picked the obtuse title as it is very close to the ambiguous error message I got and should hopefully help other people find the solution far faster than I did. &lt;/p&gt;  &lt;p&gt;Recently I was working on a MVC3 application, it was working well and I wanted to sort out dependencies for our CI server so that we didn’t need to have MVC installed on the server for the code to build and intended to do this by adding bin deployable dependencies.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;p&gt;I made a couple of small changes to views, a controller change to home and then clicked “Add Deployable Dependencies…” and when the dialog appeared I selected ASP.NET MVC&lt;/p&gt;  &lt;p&gt;I then did a quick sanity check of build, run tests and run up the application before checking in only to find that when I ran the site up I got a yellow screen of death:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-cqLpfgIFFiI/TsrVx85rcuI/AAAAAAAAAHU/b5_g5oGhucM/s1600-h/image16.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://lh3.ggpht.com/-YvyAIRKCf6Y/TsrVyqPOopI/AAAAAAAAAHc/ZAlf5R69xcs/image_thumb8.png?imgmax=800" width="646" height="181" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;WTF! the unit tests had all passed and I had been testing the views themselves a moment or two ago by logging in and using the site. Unfortunately I hadn’t just made a single change since I last checked in (my bad) so I went back and checked all my changes one at a time to ensure that none of my changes could be causing the problem and found nothing.&lt;/p&gt;  &lt;p&gt;I then took a closer look at the error and saw that the URL it was trying to request was /Account/Login which was incorrect as the name of the view that handled logging in was called Logon.&amp;#160; I checked the web.config and the found the default values hadn’t been changed:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-EKG3vyJWs9w/TsrVzUfCj7I/AAAAAAAAAHk/yJkRVACo6iM/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://lh5.ggpht.com/-BHjNZrNh9uE/TsrV0DHeu_I/AAAAAAAAAHs/ec4KFTpyyZg/image_thumb1.png?imgmax=800" width="363" height="56" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I then tried changing Account to something as abstract as ABCDEF but got a similar error only instead of the requested URL being /Account/Login it was now /ABCDEF/Login. Something was incorrectly getting involved when redirecting to the loginUrl and altering the route to replace Log&lt;strong&gt;on&lt;/strong&gt; with Log&lt;em&gt;in.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I then turned to Google and found…nothing, well nothing that seemed to apply to me that is.&lt;/p&gt;  &lt;p&gt;This only left me with the unthinkable, could it be something to do with the deployable dependencies? I took a closer look at the assemblies that had been added and saw System.Web.Helpers.dll in the bin deployable folder which I know is linked with Web Matrix. I then did a bit of exploration with Reflector turned up no particular dependency on this assembly to any of the other bin deployable dependencies or any of my referenced assemblies and so I removed it and the site started working again!&lt;/p&gt;  &lt;p&gt;A bit more focused Googling then turned up that the behaviour I was seeing was linked to&amp;#160; SimpleMembership in WebMatrix, I also noticed that&amp;#160; if you look at System.Web.Configuration and the FormsAuthentication class you will find that the property LoginUrl has a default value of login.aspx. I haven’t specifically tracked it back to this but it is suspicious and would certainly fit the behaviour I was seeing.&lt;/p&gt;  &lt;p&gt;In my second Google attempt I had also found that if you don’t want to remove the assembly you can add    &lt;br /&gt;&amp;lt;add key=&amp;quot;enableSimpleMembership&amp;quot; value=&amp;quot;false&amp;quot; /&amp;gt; to the AppSettings of your web config and this will also allow the site to work, but why do you have to add this at all?&lt;/p&gt;  &lt;p&gt;From forum posts and some blog posts I found it appears that you would perhaps use System.Web.Helpers in MVC if you wanted to use one of the helpers that you find in WebMatrix such as the Twitter helper and that the SimpleMembership provider was being called by default rather than the normal authentication mechanism in MVC resulting in the behaviour I was seeing.&lt;/p&gt;  &lt;p&gt;IMHO when you add the bin deployable files in VS that includes System.Web.Helpers it should either:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;a) add the missing web.config AppSetting for you      &lt;br /&gt;b) not add the assembly if its not needed       &lt;br /&gt;c) add the functionality &lt;em&gt;without the need for the setting&lt;/em&gt;       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;&lt;/ul&gt;  &lt;p&gt;Hopefully this post may help somebody else who stumbles into this issue and save them the time it took me to work out why my working code suddenly became broken.&lt;/p&gt; &lt;a style="display: none" href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=719235" rel="tag"&gt;CodeProject&lt;/a&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/fvNGl4lAvfI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/4447280524617125456/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/resource-cannot-be-found-accountlogin.html#comment-form" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4447280524617125456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/4447280524617125456?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/resource-cannot-be-found-accountlogin.html" title="The resource cannot be found - /Account/Login" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-YvyAIRKCf6Y/TsrVyqPOopI/AAAAAAAAAHc/ZAlf5R69xcs/s72-c/image_thumb8.png?imgmax=800" height="72" width="72" /><thr:total>16</thr:total></entry><entry gd:etag="W/&quot;CEUEQXo7fSp7ImA9WhRSFE4.&quot;"><id>tag:blogger.com,1999:blog-9220389270062827818.post-6833717506993286867</id><published>2011-11-16T08:30:00.000Z</published><updated>2011-11-16T08:30:00.405Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-16T08:30:00.405Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinion" /><category scheme="http://www.blogger.com/atom/ns#" term="team lead" /><title>What type of team leader are you?</title><content type="html">&lt;p&gt;For a lot of developers the team leader position is a coveted one, it is as if when you become team leader the business is acknowledging you and your skills, but unfortunately for a lot of developers that reach this position it is not always what it seems.&lt;/p&gt;  &lt;p&gt;From my experience the team leader role will usually fall into one of the 3 following categories:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Team leader as Development manager &lt;/li&gt;    &lt;li&gt;“Normal” Team leader &lt;/li&gt;    &lt;li&gt;Team leader as technical lead/architect &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Lets take a quick look at what each of the categories entails.&lt;/p&gt;  &lt;a name='more'&gt;&lt;/a&gt;  &lt;h3&gt;Types of team leader&lt;/h3&gt;  &lt;h4&gt;Team Leader as Development Manager&lt;/h4&gt;  &lt;p&gt;This type of role is often sold as the next type, “Normal” Team Leader, but due to organisational pressures (expectations?) you will find no time available to do any coding, instead you will be pulled into endless meetings, have to deal with process, policy, HR, etc.&lt;/p&gt;  &lt;p&gt;If you decide you want to take a more managerial career path this role will suit you down to the ground, with communication often being the main skill you will need as you will most likely be expected to act as translator to the business in relation to software development and how it benefits/impacts the business.&lt;/p&gt;  &lt;p&gt;On the other hand for those developers that love to code this is the worst type of role they could end up in and will quickly destroy their morale and crush their soul.&lt;/p&gt;  &lt;h4&gt;“Normal” Team Leader&lt;/h4&gt;  &lt;p&gt;The “normal” team leader is where you are told that the role is 50-50 with half your time being spent doing managerial tasks and the other half coding.&lt;/p&gt;  &lt;p&gt;This is often seen as a good compromise by developers as they go into the role expecting to be able to keep hands on coding but accepting the need to perform management related work as a necessary evil.&lt;/p&gt;  &lt;p&gt;Frequently though this role turns out to be a little unbalanced in relation to the amount of “management” that is needed and it may become 70-30 or even 80-20 in relation to managerial work vs coding.&lt;/p&gt;  &lt;h4&gt;Team leader as technical lead/architect&lt;/h4&gt;  &lt;p&gt;The nirvana of developer jobs, all of the prestige, all the authority but no management related work.&lt;/p&gt;  &lt;p&gt;This type of role with near 100% coding (not 100% as we all end up in meeting of one sort or another) is, in my experience, very rare. &lt;/p&gt;  &lt;p&gt;A technical lead role is often an additional responsibility that is given to a senior developer in relation to a project, not a promotion with appropriate salary and benefits. An architect role usually needs the person to be spending a lot of their time talking to people either in a technical or business capacity which will reduce the amount of time they can code (but I firmly believe that architects &lt;strong&gt;&lt;em&gt;should&lt;/em&gt;&lt;/strong&gt; code with the team).&lt;/p&gt;  &lt;h3&gt;What’s my experience?&lt;/h3&gt;  &lt;p&gt;In my career I have experienced both the “Normal” team leader role and the Team leader as Development manager and it was my experience with the latter role that prompted me to take a step back from the managerial career path. I found that to keep my enthusiasm and morale I had to do a lot more coding in my own time which was to me a clear indicator of what I actually enjoyed doing.&lt;/p&gt;  &lt;h3&gt;Do you recognise your role?&lt;/h3&gt;  &lt;p&gt;Have I captured your role in the 3 types above or do you have a completely different role? If you have a different type please leave a comment with the details.&lt;/p&gt;  &lt;p&gt;So, what type of team leader are &lt;strong&gt;you&lt;/strong&gt;?&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/DesignCodeRelease/~4/z2HE_oCawrw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://designcoderelease.blogspot.com/feeds/6833717506993286867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/what-type-of-team-leader-are-you.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6833717506993286867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9220389270062827818/posts/default/6833717506993286867?v=2" /><link rel="alternate" type="text/html" href="http://designcoderelease.blogspot.com/2011/11/what-type-of-team-leader-are-you.html" title="What type of team leader are you?" /><author><name>Nathan</name><uri>http://www.blogger.com/profile/02284010981286464436</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total></entry></feed>
