<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.conchango.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Simon Brown's Blog</title><subtitle type="html" /><id>http://blogs.conchango.com/simonbrown/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.conchango.com/simonbrown/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.conchango.com/simonbrown/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.20423.1">Community Server</generator><updated>2008-10-04T15:09:00Z</updated><entry><title>VMWare AddIn Crashes Visual Studio</title><link rel="alternate" type="text/html" href="http://blogs.conchango.com/simonbrown/archive/2008/12/03/vmware-addin-crashes-visual-studio.aspx" /><id>http://blogs.conchango.com/simonbrown/archive/2008/12/03/vmware-addin-crashes-visual-studio.aspx</id><published>2008-12-03T10:39:00Z</published><updated>2008-12-03T10:39:00Z</updated><content type="html">&lt;p&gt;Just a note of caution to anybody out there who is installing VMWare 
Workstation on a PC with Visual Studio installed.&lt;/p&gt;
&lt;p&gt;Part of the VMWare install is to add the VMDebugger add-in to Visual 
Studio.&lt;/p&gt;
&lt;p&gt;On my machine I was able to open Visual Studio but as soon as I tried to open 
or create a new project Visual Studio would crash.&lt;/p&gt;
&lt;p&gt;I narrowed the issue down to the VMDebugger add-in.&lt;/p&gt;
&lt;p&gt;To rectify the issue, go to Tools | Add-in Manager in Visual Studio and 
uncheck the VMDebugger add-in and Startup checkboxes.&lt;/p&gt;
&lt;p&gt;It should look like this:&lt;/p&gt;&lt;img src="http://blogs.conchango.com/photos/conchango_bloggers/images/13508/original.aspx" title="Visual Studio 2008 Add-In Manager" alt="Visual Studio 2008 Add-In Manager" height="360" width="542"&gt;&lt;br&gt;&lt;p&gt;I found this to be an issue in both Visual Studio 2005 and 2008.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=13506" width="1" height="1"&gt;</content><author><name>simon.brown</name><uri>http://blogs.conchango.com/members/simon.brown.aspx</uri></author><category term="Visual Studio" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Visual+Studio/default.aspx" /><category term="Crash" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Crash/default.aspx" /><category term="VMWare" scheme="http://blogs.conchango.com/simonbrown/archive/tags/VMWare/default.aspx" /><category term="VMDebugger" scheme="http://blogs.conchango.com/simonbrown/archive/tags/VMDebugger/default.aspx" /></entry><entry><title>MSDN Roadshow Re-Run</title><link rel="alternate" type="text/html" href="http://blogs.conchango.com/simonbrown/archive/2008/11/08/msdn-roadshow-re-run.aspx" /><id>http://blogs.conchango.com/simonbrown/archive/2008/11/08/msdn-roadshow-re-run.aspx</id><published>2008-11-08T23:41:00Z</published><updated>2008-11-08T23:41:00Z</updated><content type="html">&lt;p&gt;I recently attended a re-run of the &lt;a href="http://blogs.msdn.com/ukdevevents/" target="_blank"&gt;MSDN Roadshow&lt;/a&gt; at Microsoft's office in Victoria, London.&lt;/p&gt;  &lt;p&gt;It was an overview of the latest offerings from Microsoft in the development space.&lt;/p&gt;  &lt;p&gt;The agenda was as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ADO.Next - Entity Framework and ADO.NET Data Services - &lt;a href="http://blogs.msdn.com/ericnel/" target="_blank"&gt;Eric Nelson&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;ASP.Next - ASP.NET 3.5 SP1 and MVC - &lt;a href="http://blogs.msdn.com/mikeormond/" target="_blank"&gt;Mike Ormond&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Silverlight V2 - &lt;a href="http://mtaulty.com/communityserver/blogs/mike_taultys_blog/default.aspx" target="_blank"&gt;Mike Taulty&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Visual Studio Team Suite - &lt;a href="http://blogs.msdn.com/neilkidd/default.aspx" target="_blank"&gt;Neil Kidd&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The most interesting bit for me was the first session on the &lt;a href="http://msdn.microsoft.com/en-us/library/aa697427%28VS.80%29.aspx" target="_blank"&gt;Entity Framework&lt;/a&gt; and ADO.NET Data Services.&amp;nbsp; Entity Framework is an Object Relational Mapper (ORM) and Microsoft's answer to the hugely popular &lt;a href="http://www.nhibernate.org" target="_blank"&gt;nHibernate&lt;/a&gt;.&amp;nbsp; The Entity Framework still has a few quirks and is lacking in certain areas, and Microsoft seem to acknowledge this fact to their credit. It definitely seemed like a move in the right direction though with some pretty neat features.&lt;/p&gt;  &lt;p&gt;As you would expect, Microsoft have included a wizard in Visual Studio (Entity Data Model Wizard) which you can point to a database, select the tables you're interested in, and it will generate your Entity Data Model for you.&amp;nbsp; The data model consists of three different layers, each having it's own XML file and generated classes as follows:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Conceptual layer - The business entity model which is defined in an XML file using the Conceptual Schema Definition Language (CSDL) &lt;/li&gt;    &lt;li&gt;Storage layer - A representation of the database schema which is defined in an XML file using the Store Schema Definition Language (SSDL)&lt;/li&gt;    &lt;li&gt;Mapping layer - The mapping between the Conceptual and Storage layers which is defined in an XML file using the Mapping Schema Language (MSL)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;An entity class is generated for each table in the database and also handles relationships by for example adding an Orders property (collection of Order objects) on the Customer class.&amp;nbsp; Once the Entity Data Model has been generated it can then be manipulated by changing the XML files or the entity classes.&lt;/p&gt;  &lt;p&gt;The Conceptual layer of the data model is queried by the developer using either Entity SQL (T-SQL like syntax for querying entities) or Linq (Linq for Entities). I can't imagine that anybody is going to be using Entity SQL when they can use Linq with it's expressive fluent interface.&amp;nbsp; Eric recommended a tool to assist with writing Linq queries called &lt;a href="http://www.linqpad.net/" target="_blank"&gt;LinqPad&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The Entity Framework also handles updates to the database including features such as Unit of Work and Identity Tracking (handling dirty data - updates which have occurred since the last database read) and Lazy Loading (this is possible, but not out-of-the-box, Eager Loading is the default mode).&lt;/p&gt;  &lt;p&gt;I'm not sure whether Microsoft have done enough to convince nHibernate users to convert to using Entity Framework.&lt;/p&gt;  &lt;p&gt;When Eric then went on to talk about ADO.NET Data Services that's when I started to see some real benefit to using the Entity Framework instead of nHibernate.&amp;nbsp; Eric demonstrated the creation of a fully RESTful service with only a couple of lines of code.&amp;nbsp; You can essentially just create a service which inherits from your Entity Data Model and "Hey Presto!" you have a RESTful service covering all CRUD operations throughout your entire data model!&amp;nbsp; No need to create services anymore with methods like GetProductsById() or GetProductsByUserIdSortedByDate() or AddProduct() for each entity. This is all handled by ADO.NET Data Services.&amp;nbsp; Very impressive stuff indeed!&lt;/p&gt;  &lt;p&gt;I was even more impressed when Mike Ormond went on to talk about &lt;a href="http://www.asp.net/dynamicdata/" target="_blank"&gt;ASP.NET Dynamic Data&lt;/a&gt;.&amp;nbsp; You can register your Entity Framework Data Model with Dynamic Data and a fully functional CRUD website with friendly urls is created for you using data driven page templates.&amp;nbsp; RequiredFieldValidators are added for non-nullable fields, entry is limited to the number of characters the field can hold in the database, different controls are rendered based on the type of the field (e.g. check boxes for boolean values). This would be great for getting a fully functional site up and running really quickly, maybe for a prototype, or for a back end administration or simple Call Centre application.&lt;/p&gt;  &lt;p&gt;To me this is where Microsoft really starts to excel.&amp;nbsp; Their development teams seem to be working towards a common goal, with each product being built on a common framework. They develop functionality which can be utilised across their range of products.&amp;nbsp; They make it easy for developers to get up and running really quickly and concentrate on delivering real business value, rather than writing boilerplate code. My only worry with this approach is that it's fine for simple applications but when things become more complex you start to hit problems.&amp;nbsp; I'll have to give Microsoft the benefit of the doubt on that one as I haven't started to use any of this in anger yet!&lt;/p&gt;  &lt;p&gt;There were some other interesting features demonstrated by Mike Ormond such as the AJAX history control, a preview of ASP.NET MVC and it's routing engine (which is also used for DynamicData), and the Silverlight ASP.NET controls &amp;lt;asp:Silverlight&amp;gt; and &amp;lt;asp:MediaPlayer&amp;gt;.&lt;/p&gt;  &lt;p&gt;Mike Taulty discussed Silverlight 2 and Deep Zoom, and developed some Media Player Silverlight applications.&amp;nbsp; He also showed us some good examples of Silverlight/Deep Zoom applications (&lt;a href="http://memorabilia.hardrock.com/" target="_blank"&gt;Hard Rock Cafe&lt;/a&gt;, Media Toaster and &lt;a href="http://www.microsoft.com/beta/downloads/" target="_blank"&gt;Microsoft Downloads&lt;/a&gt;).&amp;nbsp; He talked about the use of the HTMLPage and HTMLElement classes which can be used to manipulate the web page DOM from within a Silverlight application, retrieving data using limited SOAP or JSON services, and the storage of data on the client's machine using Isolated Storage.&lt;/p&gt;  &lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;   &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;IsolatedStorageFile.GetUserStoreForApplication();&lt;br&gt;IsolatedStorageSettings.ApplicationSettings[&lt;span&gt;"SettingName"&lt;/span&gt;];&lt;br&gt;IsolatedStorageSettings.ApplicationSettings.Save();&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Neil Kidd then went on to give a demonstration of the Visual Studio Team Suite.&amp;nbsp; This was mainly a demonstration of the test tools which have been around for a while now but also Database Professional (previously Data Dude) which was hugely impressive.&amp;nbsp; Database Professional creates a separate file for each artifact (table, index, constraint, stored procedure etc) and contains impressive refactoring capabilities.&amp;nbsp; You can change the name of a field in a table and it will automatically change the name in each of the places this is used (stored procedures, constraints etc). You can use the tool to compare the database project to an existing instance of the database and it will create update scripts for you to deploy changes. Neil also demonstrated writing database unit tests for testing stored procedures. DBA's have no excuses now!&amp;nbsp; Database Professional also has an impressive tool for generating large amounts of varied test data based on rules you can specify.&amp;nbsp; Very useful for performance testing.&amp;nbsp; All-in-all a very nice looking product.&lt;/p&gt;

&lt;p&gt;So, to conclude it was a very good event, with some very impressive new technology demonstrated, especially around Entity Framework, ADO.NET Data Services and ASP.NET Dynamic Data.&amp;nbsp; Lots more for me to look at in my quest for continuous improvement!&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=13145" width="1" height="1"&gt;</content><author><name>simon.brown</name><uri>http://blogs.conchango.com/members/simon.brown.aspx</uri></author><category term="ASP.NET" scheme="http://blogs.conchango.com/simonbrown/archive/tags/ASP.NET/default.aspx" /><category term="Team Suite" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Team+Suite/default.aspx" /><category term="LinqPad" scheme="http://blogs.conchango.com/simonbrown/archive/tags/LinqPad/default.aspx" /><category term="Entity Framework" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Entity+Framework/default.aspx" /><category term="Silverlight" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Silverlight/default.aspx" /><category term="ADO.NET Data Services" scheme="http://blogs.conchango.com/simonbrown/archive/tags/ADO.NET+Data+Services/default.aspx" /><category term="Dynamic Data" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Dynamic+Data/default.aspx" /><category term="Linq" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Linq/default.aspx" /><category term="Team System" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Team+System/default.aspx" /><category term="Database Professional" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Database+Professional/default.aspx" /><category term="MSDN" scheme="http://blogs.conchango.com/simonbrown/archive/tags/MSDN/default.aspx" /></entry><entry><title>Castle Windsor - Fluent Interface</title><link rel="alternate" type="text/html" href="http://blogs.conchango.com/simonbrown/archive/2008/10/28/castle-windsor-fluent-interface.aspx" /><id>http://blogs.conchango.com/simonbrown/archive/2008/10/28/castle-windsor-fluent-interface.aspx</id><published>2008-10-28T11:47:00Z</published><updated>2008-10-28T11:47:00Z</updated><content type="html">&lt;p&gt;I attended a &lt;a href="http://skillsmatter.com/" title="Skills Matter" target="_blank"&gt;Skills Matter&lt;/a&gt; event recently on Castle Windsor.&amp;nbsp; The presenters of the session were &lt;a href="http://mikehadlow.blogspot.com/" target="_blank"&gt;Mike Hadlow&lt;/a&gt; and &lt;a href="http://gojko.net/" target="_blank"&gt;Gojko Adzic&lt;/a&gt;. Slides, code samples and screencasts of the event can be found on their blogs.&amp;nbsp; Mike's session was a very good introduction to dependency injection with IoC and Gojko tackled some of the more advanced features of Windsor such as facilities.&lt;/p&gt;  &lt;p&gt;I've been using Castle Windsor for a while now on my current project favouring the use of a configuration file rather than registering components using code.&lt;/p&gt;  &lt;p&gt;However, those of you who prefer registering your components in code will be pleased to find out that Castle have added a fluent interface to their API for Windsor.&amp;nbsp; I've included an example below:&lt;/p&gt;  &lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;   &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;var container = &lt;span&gt;new&lt;/span&gt; WindsorContainer();&lt;br&gt;container.Register(Component.For&amp;lt;ICatalogService&amp;gt;().ImplementedBy&amp;lt;MyCatalogService&amp;gt;().Lifestyle.Singleton);&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The fluent interface is only available in the trunk version, so you'll need to download the source and compile it yourself.&lt;/p&gt;

&lt;p&gt;I've been injecting all of my dependencies using the constructor but Mike also pointed out that Windsor also supports injecting dependencies using a property setter. This is useful if the dependency is optional. The configuration required to achieve this is the same as for constructor injection.&amp;nbsp; In the following example catalogRepository is a constructor parameter and Logger is a property on the MyCatalogService class.&lt;/p&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;container&lt;/span&gt;  &lt;span&gt;id&lt;/span&gt;&lt;span&gt;="MyCatalogService"&lt;/span&gt; &lt;br&gt;            &lt;span&gt;service&lt;/span&gt;&lt;span&gt;="MyNamespace.ICatalogService, MyAssembly"&lt;/span&gt; &lt;br&gt;            &lt;span&gt;type&lt;/span&gt;&lt;span&gt;="MyNamespace.MyCatalogService, MyAssembly"&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;parameters&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;catalogRepository&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;${MyCatalogRepository}&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;catalogRepository&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Logger&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;${MyLogger}&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Logger&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;parameters&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Something else mentioned was Windsor's support for generics.&amp;nbsp; This is something I've had to tackle recently on my own project and is especially useful for mapping classes. The following is an example of how register a class (MyProductTypeMapper) which inherits from interface IMapper&amp;lt;Input, Output&amp;gt;.&lt;/p&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;interface&lt;/span&gt; IMapper&amp;lt;Input, Output&amp;gt;&lt;br&gt;{&lt;br&gt;    Output Map(Input input);&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; MyProductTypeMapper : IMapper&amp;lt;DBProductType, EntityProductType&amp;gt;&lt;br&gt;{&lt;br&gt;    &lt;span&gt;public&lt;/span&gt; EntityProductType Map(DBProductType input)&lt;br&gt;    {&lt;br&gt;        ...&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;
  &lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;container&lt;/span&gt;  &lt;span&gt;id&lt;/span&gt;&lt;span&gt;="MyProductTypeMapper"&lt;/span&gt; &lt;br&gt;            &lt;span&gt;service&lt;/span&gt;&lt;span&gt;="MyNamespace.IMapper`2[[MyNamespace.DBProductType, MyAssembly],[MyNamespace.EntityProductType, MyAssembly]], MyAssembly"&lt;/span&gt; &lt;br&gt;            &lt;span&gt;type&lt;/span&gt;&lt;span&gt;="MyNamespace.MyProductTypeMapper, MyAssembly"&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;container&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Mike also mentioned the new &lt;a href="http://www.codeplex.com/CommonServiceLocator" target="_blank"&gt;Common Service Locator&lt;/a&gt; library which is available on Codeplex.&amp;nbsp; It is an abstraction around your IoC container of choice (Castle Windsor, Spring, Unity, StructureMap etc).&amp;nbsp; &lt;/p&gt;

&lt;p&gt;Also covered at the event was the use of Castle Windsor facilities.&amp;nbsp; Castle provide a set of facilities out of the box including Logging, FactorySupport and NHibernate.&amp;nbsp; There is also a &lt;a href="http://using.castleproject.org/display/Contrib/Castle.Facilities.MethodValidator" target="_blank"&gt;MethodValidator&lt;/a&gt; facility available which allows you to add Design by Contract style functionality into your applications.&amp;nbsp; An example was given using the &lt;a href="http://castleproject.org/container/facilities/trunk/startable/index.html" target="_blank"&gt;StartableFacility&lt;/a&gt; which can be used to add standard functionality before and after each method call.&amp;nbsp; This could be used for instance to log the entry and exit of each method. It is also possible to create custom facilities.&lt;/p&gt;

&lt;p&gt;This is just a subset of the areas covered in the session.&amp;nbsp; If you're interested in Castle Windsor then I'd urge you to watch the &lt;a href="http://gojko.net/2008/11/04/dependency-injection-with-castle-windsor-video/" target="_blank"&gt;screencast&lt;/a&gt; of the session on Gojko's blog.&lt;/p&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=12971" width="1" height="1"&gt;</content><author><name>simon.brown</name><uri>http://blogs.conchango.com/members/simon.brown.aspx</uri></author><category term="Setter Injection" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Setter+Injection/default.aspx" /><category term="MethodValidator" scheme="http://blogs.conchango.com/simonbrown/archive/tags/MethodValidator/default.aspx" /><category term="StartableFacility" scheme="http://blogs.conchango.com/simonbrown/archive/tags/StartableFacility/default.aspx" /><category term="Common Service Locator" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Common+Service+Locator/default.aspx" /><category term="IoC" scheme="http://blogs.conchango.com/simonbrown/archive/tags/IoC/default.aspx" /><category term="Castle Windsor" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Castle+Windsor/default.aspx" /><category term="Generics" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Generics/default.aspx" /><category term="Fluent Interface" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Fluent+Interface/default.aspx" /><category term="Design by Contract" scheme="http://blogs.conchango.com/simonbrown/archive/tags/Design+by+Contract/default.aspx" /></entry><entry><title>Continuous Improvement</title><link rel="alternate" type="text/html" href="http://blogs.conchango.com/simonbrown/archive/2008/10/04/continuous-improvement.aspx" /><id>http://blogs.conchango.com/simonbrown/archive/2008/10/04/continuous-improvement.aspx</id><published>2008-10-04T14:09:00Z</published><updated>2008-10-04T14:09:00Z</updated><content type="html">Sometimes in life you really come down to earth with a bump!&lt;br&gt;&lt;br&gt;This is what happened to me on the first day of J.P. Boodhoo's recent &lt;a href="http://blog.jpboodhoo.com/NothinButNetDuesseldorfRecap.aspx"&gt;Nothin But .NET bootcamp in Dusseldorf&lt;/a&gt;.&lt;br&gt;&lt;br&gt;I like to think that I've been developing applications in the right way.&amp;nbsp; I've been trying to follow good design principles, using design patterns and following best practice agile processes such as automated unit testing.&amp;nbsp; Not only that, but trying to encourage others to do the same and championing some of these processes within my project.&amp;nbsp; I don't think I'm the best developer in the world but I do pride myself on developing quality solutions in a professional manner.&amp;nbsp; I try to keep up with new trends, tools and techniques and new language features and products. &lt;br&gt;&lt;br&gt;This is however, a very fast moving industry and it doesn't take long to fall behind.&amp;nbsp; This was the first lesson I learnt on day 1 of JP's course.&lt;br&gt;&lt;br&gt;JP is a consummate professional.&amp;nbsp; He is probably the most capable developer I have ever met.&amp;nbsp; All of the course attendees were in awe of him, and these are no ordinary developers.&amp;nbsp; The attendees were all very talented developers too, some of the best in Europe. JP writes code at the speed of light, having complete command of the keyboard (he never uses a mouse).&amp;nbsp; In fact it seems that the only thing that's slowing him down is the speed of the virtual machine which is struggling to keep up with the ferocious battering of the keyboard.&amp;nbsp; This is not only due to the fact that JP is fast at typing but more due to the fact that he has configured his development environment for optimum performance, using any tools at his disposal and learning every aspect of them.&amp;nbsp; Resharper is his main tool of choice, as it is for many of us, but JP knows it inside out.&amp;nbsp; He has an encyclopedic knowledge of keyboard shortcuts, it's a joy to watch.&lt;br&gt;&lt;br&gt;Not only is he fast but the quality and design of the code is very high.&amp;nbsp; JP is very well read and has extensive knowledge of design patterns and OO design principles, but the impressive bit is that he knows exactly when to use them.&amp;nbsp; In the past I've worked with developers who have learnt a new pattern and then decided to use it everywhere like it's a silver bullet.&amp;nbsp; Not so with JP.&amp;nbsp; So what do we end up with?&amp;nbsp; A very well designed application.&amp;nbsp; Small classes containing small methods adhering to the Single Responsibility and Open Closed principles amongst others.&lt;br&gt;&lt;br&gt;The way JP works is also very efficient.&amp;nbsp; He takes a top down approach to development, starting with the UI, working down to the domain layer, introducing stubs as early as possible.&amp;nbsp; Taking this approach the client gets very early visibility to the UI and is able to see if it works for them.&amp;nbsp; Let's face it, a lot of the time the UI is the main part of the application that the client is interested in, so it makes sense to get this to them as early as possible.&amp;nbsp; And let me be clear here, we're not talking about a prototype UI, but production quality code.&amp;nbsp; Once the UI is finished, we can then move on to the Service and Domain layers.&amp;nbsp; Taking a top down approach also stops you from over engineering a solution and being too reliant on underlying legacy data structures.&lt;br&gt;&lt;br&gt;JP is also a vociferous proponent of Test Driven Design, or more specifically Behaviour Driven Design.&amp;nbsp; Not only does he "talk the talk" but he also "walks the walk".&amp;nbsp; JP never writes a line of production code without first writing a failing test, no excuses.&amp;nbsp; In the past I’ve worked with developers who are very resistant to concepts such as TDD and good design principles, always having an excuse for not doing it (haven’t got enough time, the managers/clients aren’t interested etc.).&amp;nbsp; This is not the case with JP. The tests are written using human readable English and fluent interfaces and constructed using interfaces and mocks meaning even the least technical of us can understand the functionality of the code we are testing.&amp;nbsp; Writing the tests in this way helps to flesh out the design.&lt;br&gt;&lt;br&gt;By now you're probably thinking that JP's bootcamp course is some kind of a cult, and this is the start of a big recruitment drive!&amp;nbsp; Well, you'd be wrong.&amp;nbsp; In fact one of the things that JP discourages is putting people on a pedestal.&amp;nbsp; It's not healthy and it holds you back.&amp;nbsp; Everybody has something to offer and improvements can always be made.&lt;br&gt;&lt;br&gt;I learnt an awful lot about C#, OO Design, patterns, and best practice development on the course, and got to spend the week with a fantastic group of talented developers.&amp;nbsp; However, the main thing I've learnt is that you can't rest on you laurels or past glories in this industry.&amp;nbsp; Every single one of us can improve.&amp;nbsp; We'll never know everything, we may never be a big shot in the industry, but that shouldn't stop us putting in the effort to improve ourselves.&lt;br&gt;&lt;br&gt;Attending JP's course was like a big kick up the backside for me.&amp;nbsp; That's enough talking for now.&amp;nbsp; I'm wasting valuable study time! &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;For a more detailed and humorous account of JP's Dusseldorf course, checkout Michel Grootjans blog at &lt;a href="http://geekswithblogs.net/alternativedotnet"&gt;http://geekswithblogs.net/alternativedotnet&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Talking of humour, I said I'd dedicate my first blog post to my good friend Ciaran Roarty, a fellow developer and the hottest new act on the Glasgow comedy scene!&amp;nbsp; Check out his blog at &lt;a href="http://www.ciaranroarty.com"&gt;http://www.ciaranroarty.com&lt;/a&gt;. &lt;br&gt;&lt;img src="http://blogs.conchango.com/aggbug.aspx?PostID=12684" width="1" height="1"&gt;</content><author><name>simon.brown</name><uri>http://blogs.conchango.com/members/simon.brown.aspx</uri></author><category term="TDD" scheme="http://blogs.conchango.com/simonbrown/archive/tags/TDD/default.aspx" /><category term="bootcamp" scheme="http://blogs.conchango.com/simonbrown/archive/tags/bootcamp/default.aspx" /><category term="BDD" scheme="http://blogs.conchango.com/simonbrown/archive/tags/BDD/default.aspx" /><category term="J.P. Boodhoo" scheme="http://blogs.conchango.com/simonbrown/archive/tags/J.P.+Boodhoo/default.aspx" /><category term="improvement" scheme="http://blogs.conchango.com/simonbrown/archive/tags/improvement/default.aspx" /></entry></feed>