<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://agile.codebetter.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jeremy D. Miller -- The Shade Tree Developer</title><link>http://agile.codebetter.com/blogs/jeremy.miller/default.aspx</link><description>Under the hood and working with .Net, TDD, Software Design, and Agile Stuff

</description><dc:language>en</dc:language><generator>CommunityServer 2007 (Build: 20416.853)</generator><item><title>My friend needs some help on an article</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/05/07/my-friend-needs-some-help-on-an-article.aspx</link><pubDate>Wed, 07 May 2008 05:03:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:177769</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>37</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=177769</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/05/07/my-friend-needs-some-help-on-an-article.aspx#comments</comments><description>&lt;p&gt;I would never do this, but a &amp;quot;friend&amp;quot; of mine has procrastinated entirely too long and let a deadline for an article sneak up on him.&amp;nbsp; Here&amp;#39;s a couple ideas that my friend has for his next article.&amp;nbsp; The article has to be on design fundamentals from a relatively ideology agnostic standpoint (not overtly pro-Agile or TDD in other words).&amp;nbsp; His first article in the series on the Open/Closed Principle will appear next month.&amp;nbsp; Please think about which topics would benefit your team members too, Mr. &amp;quot;I know the basics cold&amp;quot; Alpha Geek.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;quot;Design Vectors&amp;quot; / &amp;quot;It&amp;#39;s the Little Things&amp;quot; / &amp;quot;A title that doesn&amp;#39;t stink&amp;quot; -- Why do you care about Encapsulation, Coupling, and Cohesion.&amp;nbsp;&amp;nbsp; Then follow up with some heuristics to push your design towards these qualities.&amp;nbsp; Tell, Don&amp;#39;t Ask, Law of Demeter, Don&amp;#39;t Repeat Yourself, and a bit on some Code Smells.&amp;nbsp; My friend wants to sneak in an example of using a lambda expression to remove duplication.&amp;nbsp; Yes, Mr. Alpha Geek, you&amp;#39;ve read the Pragmatic Programmer front ways, backwards, and sideways, but this is for a more general audience.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Creational Patterns -- Builder, Factory, Abstract Factory.&amp;nbsp; Then talk about using an IoC tool as a generic way to implement these patterns.&amp;nbsp; The importance of separating functionality from the grunge work of assembling object graphs.&amp;nbsp; My friend isn&amp;#39;t that excited about this one.&lt;/li&gt;&lt;li&gt;Object Stereotypes -- An introduction to the idea of object stereotypes from Responsibility Driven Design.&amp;nbsp; Apply these stereotypes to some bigger patterns like MVC/MVP.&amp;nbsp; It&amp;#39;s an under appreciated topic.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Inversion of Control as a Pattern -- Forget the IoC/DI tooling.&amp;nbsp; Let&amp;#39;s talk about how, why, and when this pattern is useful.&lt;/li&gt;&lt;li&gt;Patterns for Persistence and Data Access -- Lots of stuff from Fowler&amp;#39;s PEAA book.&amp;nbsp; Unit of Work, Database Mapper, Active Record, Row &amp;amp; Table Gateway. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Anything sound good to you?&amp;nbsp; My &amp;quot;friend&amp;quot; would appreciate some opinions here.&lt;br /&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=177769" width="1" height="1"&gt;</description></item><item><title>Would you do it differently today?</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/05/01/would-you-do-it-differently-today.aspx</link><pubDate>Thu, 01 May 2008 15:04:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:177513</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=177513</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/05/01/would-you-do-it-differently-today.aspx#comments</comments><description>&lt;p&gt;A year and a half ago I wrote a post called &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/10/02/My-Gameplan-for-Starting-a-New-Project-from-Scratch.aspx"&gt;My Gameplan for Starting a New Project from Scratch&lt;/a&gt; that just detailed my thoughts on starting up a new project.&amp;nbsp; I was asked via email last week if I had any changes to that post.&amp;nbsp; Yes, absolutely:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Follow it Through!&lt;/b&gt; &lt;/p&gt;&lt;p&gt;Don&amp;#39;t jump into the work too early without a good story backlog definition, an understanding of the goals of the system, and some inkling of the expectations of the client (which are undoubtedly going to turn out to be ridiculously unrealistic).&lt;/p&gt;&lt;p&gt;All processes, even XP and Scrum, have some sort of fuzzy project conception phase.&amp;nbsp; The activities that you perform in that phase are crucial to the success of the project by preparing the field, but easy to neglect because there isn&amp;#39;t much pressure upfront and the feedback loop that says &amp;quot;you&amp;#39;re wrong!&amp;quot; hasn&amp;#39;t started yet.&amp;nbsp; On the other hand, I think you need to work with a sense of purpose early in the project to get through that initial phase and get started.&amp;nbsp; In My Gameplan post I talked about the importance of getting momentum early on in the project.&amp;nbsp; That&amp;#39;s largely based on my experiences in a large organization that let the early phases drag on way too long.&amp;nbsp; After doing three projects and starting a fourth since that post, I&amp;#39;d still err a little bit on the side of starting the coding in earnest too early rather than too late.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I did have some issues with coding outrunning the build, test, and deployment infrastructure.&amp;nbsp; Take care of that stuff as early as possible.&amp;nbsp; Especially early on the project, if you see chances to add some automation to reduce friction, do it right then.&amp;nbsp; Investments early on pay off more in the lifecycle of a project.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=177513" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/Starting+a+new+Project/default.aspx">Starting a new Project</category></item><item><title>Agile Antipatterns discussion</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/30/agile-antipatterns-discussion.aspx</link><pubDate>Wed, 30 Apr 2008 21:36:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:177484</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=177484</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/30/agile-antipatterns-discussion.aspx#comments</comments><description>&lt;p&gt;From the Java side of the world, a dead on discussion on &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=49239"&gt;Agile Anti-Patterns&lt;/a&gt;.&amp;nbsp; Been there, done that, gotten the tee shirt.&amp;nbsp; I think I&amp;#39;d add:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Overly long stand up meetings and/or iteration planning meetings&lt;/li&gt;&lt;li&gt;Contention in iteration meetings&lt;/li&gt;&lt;li&gt;Not doing retrospectives or not acting on retrospectives.&amp;nbsp; It&amp;#39;s easy to skip when you&amp;#39;re under duress, but you shouldn&amp;#39;t. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Not doing estimation together&lt;/li&gt;&lt;li&gt;Not getting concrete acceptance criteria for a user story&lt;/li&gt;&lt;li&gt;Not pushing completed stories to testing until late in the iteration&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=177484" width="1" height="1"&gt;</description></item><item><title>A Train of Thought -- ALT.NET Seattle Edition</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/30/a-train-of-thought-alt-net-seattle-edition.aspx</link><pubDate>Wed, 30 Apr 2008 14:18:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:177440</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>28</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=177440</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/30/a-train-of-thought-alt-net-seattle-edition.aspx#comments</comments><description>&lt;p&gt;Yeah, I&amp;#39;m a week late with this recap, but I&amp;#39;ve had writer&amp;#39;s block.&amp;nbsp; The Seattle ALT.NET Open Spaces event&amp;nbsp;was awesome.&amp;nbsp; The open spaces format is by far and away my favorite format now for developer gatherings.&amp;nbsp; I love the interactive aspect of this format.&amp;nbsp; We jumped right into a great set of topics without getting hung up in useless, angsty &amp;quot;What is ALT.NET all about?&amp;quot; discussions.&amp;nbsp; I love catching up with people that I&amp;#39;ve met at other conferences and meeting more of my blogroll.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4&gt;Ready or Not, Here comes the Polyglot Programming Reality&lt;/h4&gt; &lt;p&gt;A major topic in Seattle was the &lt;a href="http://memeagora.blogspot.com/2006/12/polyglot-programming.html"&gt;Polyglot Programming&lt;/a&gt; trend (I know it was a big topic because I have&amp;nbsp;a lot of notes that I can&amp;#39;t read under the heading &amp;quot;Polyglot *********&amp;quot;).&amp;nbsp; Right now there seems to be an explosion in new programming languages or at least interest in different programming languages.&amp;nbsp; &lt;/p&gt;&lt;p&gt;There was a lot of discussion both about doing some or all project work with alternative languages like F# or IronRuby when it hits.&amp;nbsp; The general idea being that you would probably write infrastructure code in C#, then use a more dynamic language like IronRuby for business logic and &amp;quot;glue&amp;quot; code in the upper layers.&amp;nbsp; More on this later, but I think it&amp;#39;s somewhat comical that we&amp;#39;re calling C# the infrastructure language when a few short years ago it was C++ for infrastructure and C# was the high productivity language in the upper layers. &lt;/p&gt;&lt;p&gt;Would you mix languages on the same project, and if so, is that a good thing?&amp;nbsp; There were a lot of mixed opinions on this subject.&amp;nbsp; On one side is the fear that multiple languages will make a system harder to understand and require more skilled people to work on the system.&amp;nbsp; Then there&amp;#39;s the other side that thinks we&amp;#39;ll get more productivity by having multiple languages that are specialized for certain tasks.&amp;nbsp; Personally, I know I&amp;#39;d like to be able to easily mix and match C# and IronRuby on projects. &lt;/p&gt;&lt;p&gt;Complicating the discussion is the idea of little Domain Specific Languages that aren&amp;#39;t even remotely Turing complete.&amp;nbsp; To this point, I&amp;#39;ve been mostly interested in&amp;nbsp;internal DSL&amp;#39;s&amp;nbsp;using Fluent Interfaces in C#.&amp;nbsp;&amp;nbsp;I look at that technique as merely a stopgap until we get IronRuby and its far superior language support for DSL&amp;#39;s.&amp;nbsp; The next bit of evolution is dabbling the toes into creating an external DSL.&amp;nbsp; I&amp;#39;ve always been leery of trying out&amp;nbsp;some sort of lexical parser ala YACC or ANTLR, but the &lt;a href="http://www.martinfowler.com/articles/languageWorkbench.html"&gt;Language Workbench&lt;/a&gt; idea coming from the &lt;a href="http://www.jetbrains.net/confluence/display/MPS/Welcome+to+JetBrains+MPS+Early+Access+Program"&gt;JetBrains MPS&lt;/a&gt; product is very intriguing.&amp;nbsp; Imagine being able to write your own focused mini-language for test automation or configuration without losing Intellisense or basic refactoring.&amp;nbsp; That&amp;#39;s what the Language Workbench products will eventually do for us.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There&amp;#39;s a rumor that Microsoft might be interested in creating some sort of Language Workbench as part of their DSL efforts.&amp;nbsp; Thumbs up from me, but please don&amp;#39;t ruin it by making us use XAML.&lt;/p&gt;&lt;p&gt;Before you panic about the difficulty in learning new languages, think about this:&amp;nbsp; is a tightly focused mini-language DSL going to be any harder to learn than the equivalent new API in C# or VB.NET?&amp;nbsp; In many cases I&amp;#39;d argue that an internal DSL is preferable to an old fashioned API in C#.&amp;nbsp; Web programming with HTML and CSS was brought up as an antipattern because of the 3+ languages you have to know to develop.&amp;nbsp; I&amp;#39;d turn that around and say that web programming is a great example of polyglot programming.&amp;nbsp; Try to imagine what the C# equivalent would be like for replacing HTML and CSS.&amp;nbsp; I think I&amp;#39;ll take HTML and CSS, thank you.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4&gt;Quick Hits&lt;/h4&gt; &lt;p&gt;These should be on Twitter but I just feel weird shooting these things out in 140 characters at a time. &lt;/p&gt;&lt;p&gt;Code Generation versus Code Synthesis.&amp;nbsp; I think that one of the big debates in software development over the next couple years is going to be over pursuing better productivity through external tools like software factories and large scale code generation or by using different programming languages (I.e. not Java/C#/VB.Net) that have facilities to write much less code.&amp;nbsp; In this corner is &lt;a href="http://msmvps.com/blogs/kathleen/"&gt;Kathleen Dollard&lt;/a&gt; on &lt;a href="http://www.intellectualhedonism.com/2008/02/09/dnrTV102KathleenDollardOnCodeGenerationInNET.aspx"&gt;Code Generation&lt;/a&gt;.&amp;nbsp; And in the far corner is &lt;a href="http://www.agiledeveloper.com/blog/"&gt;Venkat Subramaniam&lt;/a&gt; on &lt;a href="http://searchsoftwarequality.techtarget.com/news/interview/0,289202,sid92_gci1297829,00.html"&gt;Code Synthesis&lt;/a&gt; (using Metaprogramming and language oriented programming to pack more punch with less code).&amp;nbsp; I&amp;#39;m with Venkat on this one.&amp;nbsp; Why do I want to muck with a separate model outside of code, then run the code generator if I can work at the same high level directly in the code itself?&amp;nbsp; Of course, to be a loud debate, the two sides of the issue would have to know that the other side even exists.&amp;nbsp; Today, code generation probably seems like the default choice in .Net development because we don&amp;#39;t have programming languages that support Venkat&amp;#39;s vision of Code Synthesis.&amp;nbsp; When IronRuby, IronPython, and F# are ready for production, Code Synthesis in the .Net space can be a reality.&lt;/p&gt;&lt;p&gt;Microsoft employees are a little too cloistered for their (our)&amp;nbsp;own good.&amp;nbsp; Not all mind you, but many of the blue badges I interacted with didn&amp;#39;t have very much prior exposure to many of the topics that come up frequently in ALT.NET settings.&amp;nbsp; I get it, it&amp;#39;s a big campus full of smart people and you&amp;#39;re probably heads down on your own project.&amp;nbsp; Case in point, in ALT.NET circles we seem to be much more enthusiastic about Language Oriented Programming with textual DSL&amp;#39;s (or at least that&amp;#39;s my position, preference, and observation).&amp;nbsp; In Redmond, DSL == graphical tooling backed up by code generation. &lt;/p&gt;&lt;p&gt;After this weekend, I really think the concentrated&amp;nbsp;blogging communities like &lt;a href="http://www.lostechies.com/"&gt;Los Techies&lt;/a&gt;, &lt;a href="http://elegantcode.com/"&gt;Elegant Code&lt;/a&gt;, and yes, &lt;a href="http://codebetter.com"&gt;CodeBetter&lt;/a&gt;, are a very positive thing.&lt;/p&gt;&lt;p&gt;Why are teams still writing persistence code by hand?&amp;nbsp; There&amp;#39;s a bazillion persistence tools out there that all save development costs in some way over writing data access code by hand.&amp;nbsp;&amp;nbsp;With very few exceptions, I&amp;#39;d say that&amp;nbsp;at this point&amp;nbsp;that if you&amp;#39;re writing ADO.Net code or SQL by hand, you&amp;#39;re stealing money from your employer.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I wasn&amp;#39;t there, but there was a session roughly titled &amp;quot;Are Auto Mocking Containers Evil?&amp;quot;&amp;nbsp; I had this argument a little bit with Scott Bellware the other night, but it came down to a problem with wording.&amp;nbsp; He heard the word &amp;quot;container&amp;quot; and had awful images of Xml configuration hell.&amp;nbsp; All an AMC does&amp;nbsp;for you is look at&amp;nbsp;the constructor of a concrete class and use Dependency Injection to stuff in test doubles for all of the parameters in the constructor function.&amp;nbsp;&amp;nbsp;I&amp;#39;d urge you to approach an auto mocking container (AMC)&amp;nbsp;as simply a tool to reduce the mechanical cost of setting up interaction tests.&amp;nbsp; I&amp;nbsp;initially resisted the AMC idea because I thought it would obscure the unit tests, but I&amp;#39;m sold on the AMC technique after using&amp;nbsp;it for awhile on a project.&amp;nbsp; A class with a lot of collaborators &lt;b&gt;is&lt;/b&gt; a code smell, but remember that code smell doesn&amp;#39;t automatically mean there&amp;#39;s a problem.&amp;nbsp; Some Controller-type classes do absolutely nothing but coordinate other classes.&amp;nbsp; Unit testing those classes will require two or more mocks in a single test.&lt;/p&gt;&lt;p&gt;I seriously think you should seldom&amp;nbsp;use your IoC container inside unit tests.&amp;nbsp; The mass majority of interaction&amp;nbsp;unit tests should be easy to set up with pure DI.&amp;nbsp; I say this for two reasons.&amp;nbsp; First, the IoC container is infrastructure code and you want as little code as possible directly coupled to the container.&amp;nbsp; Second, using a container inside of a unit test greatly ratchets up the risk of test data from a previous unit test polluting the results of a later unit test.&amp;nbsp; Unit tests need to be isolated for effectiveness, and using an IoC container in unit tests can easily&amp;nbsp;abrogate that isolation.&lt;/p&gt; &lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=177440" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/ALT.NET/default.aspx">ALT.NET</category></item><item><title>StructureMap and StoryTeller plans</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/23/structuremap-and-storyteller-plans.aspx</link><pubDate>Wed, 23 Apr 2008 13:24:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176966</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176966</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/23/structuremap-and-storyteller-plans.aspx#comments</comments><description>&lt;p&gt;Just a quick update on stuff because I got a lot of questions about &lt;a href="http://storyteller.tigris.org"&gt;StoryTeller&lt;/a&gt; over the weekend.&amp;nbsp; I&amp;#39;m currently focusing my attention on &lt;a href="http://structuremap.sourceforge.net"&gt;StructureMap&lt;/a&gt;.&amp;nbsp; I&amp;#39;m giving it the Python 3000 treatment and pretty well gutting some of the internals to clean up the structure.&amp;nbsp; I&amp;#39;ve eliminated some obscure features, but you&amp;#39;re perfectly safe if you use the documented public interfaces.&amp;nbsp; Once that&amp;#39;s done, I&amp;#39;ve got just a little bit more functionality to add and I need to rewrite the documentation.&amp;nbsp; I gave an impromptu (and it showed) session at ALT.NET Seattle on my lessons learned for extending a framework over 4+ years.&amp;nbsp; I&amp;#39;ll write a paper of some sort on that this spring.&lt;/p&gt;&lt;p&gt;As for StoryTeller, I got quite a bit of interest in it over the weekend and I&amp;#39;ve had a couple emails lately as well.&amp;nbsp; I was close to giving up, but some of the things on the horizon that I thought would eliminate its usefulness turned out to be Java only or so far over the horizon to be effectively nonexistent.&amp;nbsp; The engine such as it is has been done for almost a year.&amp;nbsp; I&amp;#39;m going to rewrite the skin of the UI in WPF just to get my hands a bit dirtier with WPF.&amp;nbsp; I&amp;#39;ve done enough experimentation with some crude Intellisense for Fit tests to say that I&amp;#39;ll be able to make Fit test editing much more efficient.&amp;nbsp; I&amp;#39;ll update again later this spring.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176966" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/StoryTeller/default.aspx">StoryTeller</category><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/StructureMap/default.aspx">StructureMap</category></item><item><title>A Train of Thought -- MVP Summit 2008 Edition</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/23/a-train-of-thought-mvp-summit-2008-edition.aspx</link><pubDate>Wed, 23 Apr 2008 12:04:53 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176952</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176952</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/23/a-train-of-thought-mvp-summit-2008-edition.aspx#comments</comments><description>&lt;p&gt;Just jotting down my notes from the MVP Summit (so I can get on with ALT.NET commentary).&amp;nbsp; I haven&amp;#39;t seen anything revolutionary, but the conversations are always the best thing anyway.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I&amp;#39;ll sum up the entire summit in one word:&amp;nbsp; positive.&amp;nbsp; I thought that the interaction I saw with Microsoft was simply positive across the board.&amp;nbsp; Not perfect mind you, but I&amp;#39;m content.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s what I saw (no names and some specifics omitted for NDA compliance):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;I&amp;#39;m still not thrilled with the Entity Framework and the direction they locked themselves into, but the EF team came prepared to talk about some compromises that might start pushing EF into the usable category for me.&amp;nbsp; I honestly wouldn&amp;#39;t care about the EF, but I&amp;#39;ll probably be back in consulting at some point in the next 5 years at a shop that will only use Microsoft tooling.&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/dsimmons/"&gt;Daniel Simmons&lt;/a&gt; gets the &amp;quot;Thickest Skin of the Year&amp;quot; award.&amp;nbsp; Not the Hyperion/Endymion Dan Simmons though.&lt;/li&gt; &lt;li&gt;I enjoyed the IronRuby and IronPython talks&lt;/li&gt; &lt;li&gt;The Parallels extensions to .Net are intriguing, but I wish they&amp;#39;d shown more code and fewer slides&lt;/li&gt; &lt;li&gt;A version of the Open Spaces format was used for some of the MVP Summit.&amp;nbsp; It wasn&amp;#39;t the real deal, but I&amp;#39;d say that it was an improvement.&amp;nbsp; I really appreciate the more interactive formats as opposed to passive watching the slides go by talks.&lt;/li&gt; &lt;li&gt;Getting asked for some real feedback.&amp;nbsp; Ayende &amp;amp; I got to see behind the curtains on some internal work in the .Net framework that I was pretty happy about.&lt;/li&gt; &lt;li&gt;I did hear about one thing in the works that has the potential for some community backlash, but they seemed to be interested in reaching out to defuse that backlash.&lt;/li&gt; &lt;li&gt;The language teams are very serious about ramping up the coding centric features in the Visual Studio IDE.&amp;nbsp; I know a lot of .Net developers think that Visual Studio is the greatest thing since sliced bread, but it&amp;#39;s coding features badly lag Eclipse or IntelliJ from the Java world.&amp;nbsp; It&amp;#39;s nice to see Microsoft starting to work on that gap.&amp;nbsp; I don&amp;#39;t know if they&amp;#39;ll do anything that isn&amp;#39;t already in ReSharper, but I&amp;#39;m looking forward to seeing where they&amp;#39;ll go.&lt;/li&gt; &lt;li&gt;Listening to no less than Brad Abrams say that they&amp;#39;re taking testability into consideration on all .Net framework design now.&amp;nbsp; Cool.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h4&gt;What I want for Christmas from Redmond&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;IronRuby!&amp;nbsp; Even without Rails, I&amp;#39;d love to use RSpec for testing&amp;nbsp;.Net code and writing specs.&amp;nbsp; DSL construction on the CLR, here we come!&lt;/li&gt; &lt;li&gt;I don&amp;#39;t know if it&amp;#39;ll ever catch on, but F# looks seriously cool&lt;/li&gt; &lt;li&gt;Transparent lazy loading in the Entity Framework.&amp;nbsp; If they want the Entity Framework to be usable in constructing rich Domain Models, they&amp;#39;re going to have to do this.&amp;nbsp; &lt;/li&gt; &lt;li&gt;A hook in the Basic Class Library to make the choice of IoC container pluggable.&amp;nbsp; I think it makes a lot of sense for the .Net framework to have some sort of IoC container capability built into the framework, and you know they&amp;#39;re going to do it at some point.&amp;nbsp; Acropolis needs it.&amp;nbsp; Prism needs it.&amp;nbsp; MVC needs it.&amp;nbsp; Heck, even plain jane WPF could use it.&amp;nbsp; Just please make it pluggable when you do that at some point in time.&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176952" width="1" height="1"&gt;</description></item><item><title>Rightsizing your approach</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/22/rightsizing-your-approach.aspx</link><pubDate>Tue, 22 Apr 2008 14:52:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176892</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176892</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/22/rightsizing-your-approach.aspx#comments</comments><description>&lt;p&gt;My last post, &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/04/20/i-might-be-an-elitist-but-you-re-a-misanthrope.aspx"&gt;I might be an elitist, but you&amp;#39;re a misanthrope&lt;/a&gt;, has kicked up a great conversation in the comments.&amp;nbsp; There&amp;#39;s one viewpoint in the comments that I&amp;#39;d like to challenge a little bit. What if I&amp;#39;m working on small projects with very tight timelines?&amp;nbsp; Many of the subjects that fall under the ALT.NET umbrella of interest like IoC, ORM, and AOP wouldn&amp;#39;t seem to be justified on a smaller project.&amp;nbsp; Fine, maybe not, but the more basic design fundamentals that ALT.NET is also championing definitely apply to every project longer than a couple hours.&lt;br /&gt; &lt;/p&gt;&lt;p&gt;I&amp;#39;ve seen plenty of systems that were negatively impacted by code quality or a miscast application architecture.&amp;nbsp; Roughly, I&amp;#39;d say that the two worst type of offenders fall into two general camps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Overengineered.&amp;nbsp; Way too many abstractions that didn&amp;#39;t add value but did add complexity.&amp;nbsp; Some of the problem is just creating the wrong abstractions and the wrong model, but much of that could be explained by using the tools from a large, complex development project on a smaller project where the tools weren&amp;#39;t justified.&lt;/li&gt;&lt;li&gt;Underengineered.&amp;nbsp; Brute force coding with little or no thought for abstraction or layering.&amp;nbsp; By only using simplistic techniques or straight up procedural programming you may be writing way too much code and exerting too much energy.&amp;nbsp; On a larger project finding the pertinent code can be a major challenge in its own right.&amp;nbsp; Just throwing all the code into a bag full of very large coding modules isn&amp;#39;t going to scale.&amp;nbsp; The danger to me in that &amp;quot;just Git&amp;#39;R Done&amp;quot; mentality is the fact that that attitude fails when you hit a bigger project.&amp;nbsp; The biggest mess of a system I&amp;#39;ve ever encountered was a VB6 COM(+) system that began its life as a prototype and was rushed into becoming the shipping automation system for a Fortune 100 company.&amp;nbsp; Typical circa 1998 VB6 methods of code construction didn&amp;#39;t scale to a system with 250,000 lines of code.&amp;nbsp; Sometimes you need to reach for the more advanced techniques.&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Admittedly, most of the biggest and craziest messes I&amp;#39;ve seen (including one of mine) fell into the first category, but the &amp;quot;under&amp;quot; category is just as much a source of wasted effort in software development today -- even on smaller projects.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Most of us live under unreasonable timelines and expectations (do remember that Agile project management was partially created to give us a saner control over those very expectations).&amp;nbsp; Yes, I think that the scale of smaller projects and problems doesn&amp;#39;t justify many of the same design patterns that I&amp;#39;d call mandatory on a larger project.&amp;nbsp; I&amp;#39;ve reviewed several smaller solutions lately that were churned out in a hurry.&amp;nbsp; In many cases I found places where the author of the code just plain wrote too much code.&amp;nbsp; There were opportunities to pull out commonality into shared code (&lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;Don&amp;#39;t Repeat Yourself&lt;/a&gt;).&amp;nbsp; Using the &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/12/03/Composed-Method-Pattern.aspx"&gt;Composed Method&lt;/a&gt; pattern would have made the code much easier to follow when that code needed to be modified 6 months later.&amp;nbsp; IoC/DI/AOP/DDD wouldn&amp;#39;t have been very useful in these projects, but a true working competency with OOP fundamentals would have cut the effort required to execute these projects.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;My only point is that even small and quick projects can benefit from developers with a better skillset and knowledge.&amp;nbsp; At a bare minimum, just knowing about existing libraries for common tasks would be helpful so you spend time solving the actual problem instead of rewriting log4net (true story) or wasting time writing ADO.NET code by hand (I honestly think I can use NHibernate easily enough that I would still use it on small projects).&amp;nbsp; Even simpler projects need to be approached from a &amp;quot;Work smart, not hard&amp;quot; perspective.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To this quote from &lt;a href="http://andrewtokeley.net/"&gt;Andrew Tokely&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Should an application that has to be built
in a month, will only be used by a handful of people, that will be
rebuilt by something newer and better within a year or so, that doesn&amp;#39;t
have complex workflow or business logic, that really only needs to
persists data back to a datastore... really need to contain the level
of abstraction and testability of other projects? &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;No, the system he describes doesn&amp;#39;t need quite as much abstraction and layers and whatnot.&amp;nbsp; Testability in some ways equals &amp;quot;the ability to quickly gain feedback on the correctness of the code,&amp;quot; so yes, you definitely want &amp;quot;Testability&amp;quot; in order to work efficiently at any time.&amp;nbsp; In the case of a smaller system just pressing F5 might achieve the goal of quick feedback just fine -- but if F5 isn&amp;#39;t enough feedback, you do need to care about &amp;quot;Testability&amp;quot; in design.&amp;nbsp; Duplication of code, verbose code, and poor structure can still hamper even the smallest, simplest application in a way that detracts from your ability to execute in a timely manner.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176892" width="1" height="1"&gt;</description></item><item><title>I might be an elitist, but you're a misanthrope</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/20/i-might-be-an-elitist-but-you-re-a-misanthrope.aspx</link><pubDate>Sun, 20 Apr 2008 15:21:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176805</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>39</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176805</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/20/i-might-be-an-elitist-but-you-re-a-misanthrope.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been in Seattle the past week, first at the MVP Summit and now at the ALT.NET event.&amp;nbsp; It&amp;#39;s been good to rub shoulders with folks from outside our little ALT.NET cocoon to hear other points of view, but there&amp;#39;s a particularly common refrain that bugs me a little bit.&amp;nbsp; It goes something like &amp;quot;that&amp;#39;s great and all for you alpha geeks, but what about Joe Schmoe corporate developer at BIG CO?&amp;quot;&amp;nbsp; The obvious implication is that the average .Net developer just isn&amp;#39;t capable of grokking things like OOP fundamentals and some of the coding techniques we use in Agile development.&amp;nbsp; My pre-canned response is generally something along the lines of &amp;quot;if they can truly understand the page event lifecycle in ASP.NET WebForms, they can learn anything!&amp;quot;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;In all seriousness, &lt;b&gt;every shop that I&amp;#39;ve worked in or with that cared about the strength of their people had plenty of strong people&lt;/b&gt;.&amp;nbsp; Some of that was due to hiring practices, but a lot of that can be attributed to a culture that enabled and encouraged developers to get better and learn new things.&amp;nbsp; I think there&amp;#39;s a little bit to the idea that people perform up to or down to the expectations placed upon them.&amp;nbsp; If you really say to a developer that I think you should know some design fundamentals, I think the average developer would very quickly know those design fundamentals.&amp;nbsp; I&amp;#39;d really like to see the .Net community as a whole start to be a little more optimistic about the abilities of the average .Net developer so we can get on with the business of getting better collectively.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176805" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/altnetconf/default.aspx">altnetconf</category></item><item><title>See you next week in Seattle</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/11/see-you-next-week-in-seattle.aspx</link><pubDate>Fri, 11 Apr 2008 15:33:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176600</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176600</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/11/see-you-next-week-in-seattle.aspx#comments</comments><description>&lt;p&gt;I was originally only going to the ALT.NET event in Seattle next weekend, but now it looks like I will get to attend the MVP Summit as well.&amp;nbsp; See you there!&amp;nbsp;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176600" width="1" height="1"&gt;</description></item><item><title>Things really are changing in the .Net community</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/07/things-really-are-changing-in-the-net-community.aspx</link><pubDate>Mon, 07 Apr 2008 15:58:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176445</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176445</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/07/things-really-are-changing-in-the-net-community.aspx#comments</comments><description>&lt;p&gt;Check out &lt;a href="http://www.ddj.com/windows/207002116?cid=RSSfeed_DDJ_All"&gt;this article&lt;/a&gt; about the rationale for the ASP.NET MVC framework on Dr. Dobbs.&amp;nbsp; Absolutely nothing you haven&amp;#39;t heard before, but it&amp;#39;s written by Dino Esposito.&amp;nbsp; It&amp;#39;s fine and all to hear this sort of thing from ALT.NET leaning outliers, but Dino Esposito is virtually Mr. Mainstream in the .Net developer community.&amp;nbsp; Cool.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176445" width="1" height="1"&gt;</description></item><item><title>So what am I doing for my first week of blissful unemployment?</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/06/so-what-am-i-doing-for-my-first-week-of-blissful-unemployment.aspx</link><pubDate>Sun, 06 Apr 2008 14:24:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176381</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176381</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/06/so-what-am-i-doing-for-my-first-week-of-blissful-unemployment.aspx#comments</comments><description>&lt;p&gt;I sat down this morning with my notes for the StructureMap 2.5 release to reacquaint myself with the remaining work I wanted to do before the release.&amp;nbsp; I wanted to just work through the punchlist, but this irresistible voice started saying &amp;quot;rewrite the InstanceMemento/MementoSource mess.&amp;quot;&amp;nbsp; So apparently, the answer to what I&amp;#39;m going to do today and tomorrow is &amp;quot;rewrite a significant piece of the StructureMap core code that&amp;#39;s accumulated trash code over 4 years.&amp;quot;&amp;nbsp; The usage of the tool and what I want it to do is so different from where I started in the summer of &amp;#39;03 that it&amp;#39;s amazing that that code lasted this long.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Before I even start, let&amp;#39;s say hooray for Subversion and automated test coverage, cause I bet there&amp;#39;ll be some misfires along the way.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;That&amp;#39;s step 1.&amp;nbsp; Step 2 is to take the family to the San Antonio zoo on some random day during the middle of the week.&amp;nbsp; Life is good.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176381" width="1" height="1"&gt;</description></item><item><title>The unmentionable subject</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/06/the-unmentionable-subject.aspx</link><pubDate>Sun, 06 Apr 2008 14:00:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176374</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176374</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/06/the-unmentionable-subject.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been accidentally cut off from the altdotnet discussion group over the past couple days and I wanted to catch up this morning.&amp;nbsp; Unfortunately, the first thing I see is a conversation about to Stored Procedure or not.&amp;nbsp; Not gonna join in or even going to read.&amp;nbsp; There&amp;#39;s been absolutely nothing new written or thought about the subject of sproc&amp;#39;s for years.&amp;nbsp; I&amp;#39;m happy to agree to disagree with the sproc advocates and peacefully go on our separate ways.&amp;nbsp; There was something in the water about 3-4 years ago that allowed some of us in the Microsoft developer camp to convert away from sprocs, but those conditions are apparently gone now.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Just let it go.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176374" width="1" height="1"&gt;</description></item><item><title>I'm a free agent</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/04/02/i-m-a-free-agent.aspx</link><pubDate>Wed, 02 Apr 2008 19:21:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176231</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>14</slash:comments><description>&lt;p&gt;I quit my job today, and it&amp;#39;s been one of the best days I&amp;#39;ve ever had.&amp;nbsp; It&amp;#39;s felt like a large weight lifting off of my chest.&lt;/p&gt;&lt;p&gt;EDIT 4/5/2008:&amp;nbsp; Chad &amp;amp; I are still getting some nasty emails, so I&amp;#39;ve removed everything that could possibly give our former boss anything to complain about.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Anyway, no worries on my account, this couldn&amp;#39;t have possibly have happened at a better time personally, and I&amp;#39;ve already had some good looking leads and a very positive interview earlier today.&amp;nbsp; If you&amp;#39;re interested in engaging a Shade Tree Developer for short term consulting, feel free to drop me a line.&amp;nbsp; I&amp;#39;ve got to go permanent at some point before August (mortgage lender wants me to be a perm), but I&amp;#39;d really like to try the solo thing for a little while.&amp;nbsp; I&amp;#39;ve got some downtime, so I might finally get to finish some side project work.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I might even manage to start answering emails in a timely manner....&amp;nbsp;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176231" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/Featured/default.aspx">Featured</category></item><item><title>In honor of Greg Young</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/03/30/in-honor-of-greg-young.aspx</link><pubDate>Mon, 31 Mar 2008 00:41:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176084</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176084</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/03/30/in-honor-of-greg-young.aspx#comments</comments><description>&lt;p&gt;&lt;img src="http://www.dilbert.com/comics/dilbert/archive/images/dilbert2008033349280.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176084" width="1" height="1"&gt;</description></item><item><title>We need ALT.NET to supplement the traditional .Net leadership</title><link>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/03/30/we-need-alt-net-to-supplement-the-traditional-net-leadership.aspx</link><pubDate>Sun, 30 Mar 2008 20:34:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:176078</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>49</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://agile.codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=176078</wfw:commentRss><comments>http://agile.codebetter.com/blogs/jeremy.miller/archive/2008/03/30/we-need-alt-net-to-supplement-the-traditional-net-leadership.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;One of the roles I’d like &lt;a href="http://ALT.NET"&gt;ALT.NET&lt;/a&gt; fulfill within the greater .Net community is to be a second pole of leadership and thought. I say a “second” pole, because the .Net community already has a long standing traditional leadership --&amp;nbsp;the book authors, the MVP’s*, the INETA speakers, and whatnot. They’ve done plenty of good in regards to explaining how to best use existing and forthcoming Microsoft tools, but I think there are a lot of valuable subjects and viewpoints that are&amp;nbsp;largely missing from the mainstream .Net dialogue. Specifically, I’d like to see &lt;a href="http://ALT.NET"&gt;ALT.NET&lt;/a&gt; start to fill what I see as a void for information and leadership on: &lt;/p&gt;&lt;ul&gt; &lt;li&gt;OOP fundamentals. I think we as a community would achieve far more benefits on our projects from a stronger base of OOP design knowledge than we do for learning new API’s like WCF or LINQ. Learning the fundamentals will make us far better able to choose and use these new API’s.&lt;br /&gt;&lt;/li&gt; &lt;li&gt;Development processes and practices. Microsoft builds and sells tools, and they naturally see tools as the solution to most problems. We the community should be completely in charge of determining our best practices because we are the ones out there building software. Go to a .Net centric development conference. Outside of some token Agile track, you will not see very much about configuration management, project management, requirements, testing, or the all important people issues. A lot of Linq to&amp;nbsp;XYZ talks, but not much about running successful software projects.&lt;br /&gt;&lt;/li&gt; &lt;li&gt;Alternative tools. Some of the tools Microsoft makes are great, but some are inferior to non-Microsoft&amp;nbsp;options. Some of these alternative tools open up entirely new possibilities in how we can work.&amp;nbsp; I’d like to see the entire .Net community to simply broaden its horizons to be more accepting of tools originating from outside of Redmond. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;Two recent podcast&amp;#39;s illustrate to me why I think something like &lt;a href="http://ALT.NET"&gt;ALT.NET&lt;/a&gt; has some value to offer the community by filling holes in the dialogue.&amp;nbsp; First up was &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=319"&gt;Lerman on the Entity Framework on DotNetRocks&lt;/a&gt;. I promised Julie that I wouldn’t burn her in effigy here, so I’ll just say that I think that podcast&amp;nbsp;covered the Entity Framework from a&amp;nbsp;very data centric viewpoint that skated over some important concerns about using any persistence framework.&amp;nbsp; Namely, what does&amp;nbsp;this tool&amp;nbsp;do to my business layer and the application as a whole?&amp;nbsp; How much does the tool intrude on the rest of the application?&amp;nbsp;&amp;nbsp;From my own, very different viewpoint, the Entity Framework is conceptually flawed in some significant ways and won&amp;#39;t let me work in the way that *I* think makes me the most successful:  &lt;/p&gt;&lt;ul&gt; &lt;li&gt;In my opinion the new “conceptual model” in the Entity Framework that allows you to treat the database more as a set of hierarchical entities is a poor substitute for fullblown OOP programming. I think the conceptual model is unnecessary complexity that detracts from the usability of the EF. &lt;br /&gt;&lt;/li&gt; &lt;li&gt;The lack of transparent “lazy loading” in the Entity Framework is a dealbreaker for me. The need to explicitly say “Order.LineItems.Load()” makes the EF a very poor fit for Test Driven Development by making the EF objects difficult or nearly impossible to use independently of the database. Lazy loading should be completely transparent to the business logic, and I should be able to completely express the business logic without letting infrastructure concerns leak in (that Separation of Concerns thing). The podcast completely whiffed on this topic in the discussion of “POCO” objects at the end of the episode. &lt;br /&gt;&lt;/li&gt; &lt;li&gt;At this point, EF couples you very tightly to the database. Support is very weak at this point for Domain Driven Design techniques. I really don’t think the EF is usable without using codegen to bake in the change tracking code that EF wants to be in the objects. Codegen-ing your business objects pretty well eliminates evolutionary design or keeping your domain logic in these classes. I know you can use partial classes for the business logic, but that&amp;#39;s sooooo clumsy. Besides, the codegen is more or less optimized for scenarios where you merely replicate the structure of the database in the object model. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Many people don’t feel that the EF picture is all that rosy, but those concerns simply aren’t getting much attention or understanding from our traditional community leadership.&amp;nbsp; &lt;br /&gt;&lt;/p&gt; &lt;p&gt;The second podcast was .Net author &lt;a href="http://www.lhotka.net/weblog/"&gt;Rocky Lhotka&lt;/a&gt;&amp;nbsp;&lt;a href="http://hanselminutes.com/default.aspx?showID=123"&gt;being interviewed on&amp;nbsp;Hanselminutes&lt;/a&gt;&amp;nbsp;about data access issues.&amp;nbsp; I&amp;nbsp;mostly agree with Rocky on the general goals, but I think there&amp;#39;s better mechanical ways to achieve an effective object model strategy than what Rocky was espousing on the show.&amp;nbsp; Rocky gets some serious points from me for talking about Responsibility Driven Design (my choice for the single most effective design technique) and the Single Responsibility Principle (SRP). &amp;nbsp;Ironically enough though, I advise people against using his CSLA.Net framework in no small measure because I think CSLA violates the Single Responsibility Principle.** It may be that Rocky and I have vastly different interpretations of the SRP, but that again points to the validity of a second pole of thought and discussion because I really don&amp;#39;t think that Rocky (or any one else including me) gets to be the sole voice who gets to define design best practices. &lt;/p&gt;&lt;p&gt;One of the other things Rocky said was that ORM tools tightly bind your object model to the database. His suggestion was to use an ORM as just a data access layer and manually write mapping code within your business objects to translate between the database model persisted by the ORM&amp;nbsp;and your own domain model classes. I thought this was terrible advice in most situations&amp;nbsp;because it&amp;#39;s unnecessary, and putting that mapping code inside your business objects&amp;nbsp;let’s infrastructure concerns bleed into my your domain logic code (a clear SRP violation).&amp;nbsp; When I use NHibernate, I can write my business objects in a structure that fits the behavior of the business logic the way Rocky&amp;nbsp;and I both want to, but I can also persist these objects to a database structure that makes sense for the database with very little impact on the business objects. &amp;nbsp;I do not have any need to write all of that tedious mapping object-to-object code that Rocky was suggesting.&amp;nbsp; I don&amp;#39;t know if Rocky was purposely overlooking the capabilities of NHibernate or the WilsonORMapper in favor of his traditional CSLA approach, doesn&amp;#39;t believe in ORM, or if he just flat out doesn&amp;#39;t know.&amp;nbsp; Either way, we need&amp;nbsp;some alternative sources of information, and dare&amp;nbsp;I say it, visible authority figures&amp;nbsp;in the community. &lt;/p&gt;&lt;h4&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;Sometimes the Microsoft solution isn’t the best&lt;/h4&gt; &lt;p&gt;Both podcast&amp;#39;s were lacking in well informed opinions about alternatives to the Microsoft tooling on data access, and I think that&amp;#39;s probably my biggest reason for writing this post.&amp;nbsp;&amp;nbsp;If&amp;nbsp;my choice was really a binary decision between Linq to SQL or Linq to Entities and rolling naked ADO.Net code, heck yes I&amp;#39;d jump for joy about the EF.&amp;nbsp; Fortunately for us, that&amp;#39;s not the case.&lt;/p&gt; &lt;p&gt;The biggest problem for me with the EF is that I think there are simply better existing tools for the vast majority of projects. For simpler CRUD or reporting applications, SubSonic is basically the exact same kind of “generate strongly typed object wrappers around the database tables” solution as the EF and Linq to SQL, but I bet&amp;nbsp;SubSonic would be much easier to use. LLBLGen Pro is much more feature rich than the Entity Framework. NHibernate is vastly better if you want to use a rich Domain Model approach for your design and/or want to most effectively utilize TDD. iBatis.Net will probably be easier to use for nastier legacy database schemas and give you ultimate control over the SQL with lighter weight mapping than the EF. Heck, LLBLGen Pro and NHibernate&amp;nbsp;are well on their way to&amp;nbsp;having full&amp;nbsp;LINQ support, and SubSonic has a strongly typed query language, so shoot down that advantage for EF.&amp;nbsp; My preference is NHibernate, but I was very happy with my usage of the Java version of iBatis. &lt;/p&gt;&lt;p&gt;I honestly believe that if we don’t have any useful alternative to the traditional .Net leadership, all of these arguably superior tools will be shoved to the sideline in favor of the deeply flawed Entity Framework. Worse yet is that we might not get better tools because I don’t think our traditional leadership does a very good job of giving useful feedback to Microsoft to help make these tools better. I really do believe that our traditional leadership largely sees new tooling as simply opportunities to write articles, books, and be visible conference speakers rather than something that needs to be carefully evaluated and possibly rejected. I want leadership that can help us make good judgements about how and with what we should build software instead of just relaying the guidance from our toolmaker. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;h4&gt;Summing Up&lt;/h4&gt; &lt;p&gt;I didn&amp;#39;t say here that I think we need to completely swap out our entire leadership clique.&amp;nbsp; All I want is an additional set of leadership types who are discussing other points of view to give us a more rounded conversation.&amp;nbsp; To some degree, I think we might just need a new generation of leadership that didn&amp;#39;t come up through Windows DNA programming.&amp;nbsp; Lastly, I don’t really care if it’s the &lt;a href="http://ALT.NET"&gt;ALT.NET&lt;/a&gt;&amp;nbsp;movement specifically that starts to fill this void as long as it’s filled by somebody in a useful way.&lt;/p&gt; &lt;p&gt;When&amp;nbsp;some .Net poobah says that every class should be accessed through WCF, someone else should&amp;nbsp;speak up and say&amp;nbsp;&amp;quot;that&amp;#39;s insanely stupid,&amp;quot; but&amp;nbsp;in &lt;a href="http://udidahan.weblogs.us/2007/12/29/wcf-everywhere-not-on-my-watch/"&gt;a reasoned, adult like manner&lt;/a&gt;.&amp;nbsp;&amp;nbsp;And if any MVP speaker type says you should be using the Entity Framework/WF/putting all your business logic into XAML/whatever, I want to see some dissenting opinions too.&lt;/p&gt; &lt;p&gt;Comments are open. Feel free to disagree with me. &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;p&gt;*To be fair, many of the most visible &lt;a href="http://ALT.NET"&gt;ALT.NET&lt;/a&gt; members, including myself and many other CodeBetter bloggers, are also MVP’s of one sort of another. I’d still say that we make up a very small minority of the total MVP lineup.  &lt;/p&gt;&lt;p&gt;** To the CSLA proponents out there, I’m going to issue you a challenge. Run static code analysis numbers on your CSLA “business” objects. I’ll betcha that the &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity&lt;/a&gt; numbers are uncomfortably far into the dangerous zone – and yes, if this is so, this is something you should be concerned about.&lt;/p&gt;&lt;img src="http://agile.codebetter.com/aggbug.aspx?PostID=176078" width="1" height="1"&gt;</description><category domain="http://agile.codebetter.com/blogs/jeremy.miller/archive/tags/Featured/default.aspx">Featured</category></item></channel></rss>