<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://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://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>Microsoft doing Language Oriented Programming with Oslo?  Are they serious about it, or just taunting me?</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/09/07/microsoft-doing-language-oriented-programming-with-oslo-are-they-serious-about-it-or-just-taunting-me.aspx</link><pubDate>Sun, 07 Sep 2008 22:46:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182602</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182602</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/09/07/microsoft-doing-language-oriented-programming-with-oslo-are-they-serious-about-it-or-just-taunting-me.aspx#comments</comments><description>&lt;p&gt;Ok, I was totally ready to dismiss Oslo out of hand as yet another &amp;quot;Visual Programming&amp;quot; silver bullet wannabe from Microsoft that helps teams quickly create unmaintainable code, but I saw this little line in &lt;a href="http://douglaspurdy.com/2008/09/06/what-is-oslo/"&gt;Doug Purdy&amp;#39;s post on Oslo&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A &lt;b&gt;language&lt;/b&gt; that helps people create and use textual domain-specific 
languages and data models&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now I&amp;#39;m paying attention.&amp;nbsp; Attending PDC certainly isn&amp;#39;t within my budget, so you folks that are going, please blog it out.&amp;nbsp; I&amp;#39;d really love to hear if Oslo has some capabilities similar to &lt;a href="http://www.jetbrains.com/mps/"&gt;JetBrains MPS&lt;/a&gt; product, but for .Net.&lt;/p&gt;&lt;p&gt;I&amp;#39;m about to do a total reboot of my StoryTeller project, but this time I&amp;#39;m ready to ditch the FitnesseDotNet engine* altogether and replace it with something from scratch.&amp;nbsp; I love the concept of Fit, but the implementation just flat out sucks in complex usage.&amp;nbsp; What I do love about Fit at its best is the ability to create &lt;a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;External DSL&amp;#39;s&lt;/a&gt; for testing specifications of your system (largely using the &lt;a href="http://fitnesse.org/FitNesse.FitLibraryUserGuide.DoFixture"&gt;DoFixture&lt;/a&gt;).&amp;nbsp; I want to use External DSL&amp;#39;s for testing because they are much more readable and intention revealing than writing the test out in normal code, even with tools like MSpec or RSpec.&amp;nbsp; The problem is that building an External DSL is &lt;a href="http://www.ayende.com/Blog/archive/2007/12/12/Building-an-External-DSL.aspx"&gt;relatively expensive&lt;/a&gt; compared to an internal DSL or just using a &amp;quot;push button&amp;quot; API for testing (I have heard other people say that it&amp;#39;s easy, but I&amp;#39;m dubious).&amp;nbsp; With Fit testing the problem is both in authoring the testing DSL because the DoFixture and the engine itself is limited in its expressiveness, and also because writing and editing the tests in Fitnesse Wiki format or HTML is time consuming and error prone.&amp;nbsp; What I&amp;#39;d like to do with StoryTeller is create a poor man&amp;#39;s language workbench specifically for the creation and editing of external DSL&amp;#39;s.&amp;nbsp; Specifically, I want a sort of intellisense or guided editing for the testing languages I would be creating with StoryTeller.&amp;nbsp; I&amp;#39;ll be interested to see if the Oslo tooling could help in that regard.&lt;/p&gt;&lt;p&gt;In the meantime, I&amp;#39;m going to continue on my StoryTeller reboot, and try to get some help from an F# guru for some language parsing help.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Thoughts anybody? &lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182602" width="1" height="1"&gt;</description></item><item><title>What would you like to see at the Continuous Improvement Workshops?</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/09/04/what-would-you-like-to-see-at-the-continuous-improvement-workshops.aspx</link><pubDate>Thu, 04 Sep 2008 16:47:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182504</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>22</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182504</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/09/04/what-would-you-like-to-see-at-the-continuous-improvement-workshops.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m supposed to turn in the title and abstract for the workshop I&amp;#39;m giving as part of the &lt;a href="http://kaizenconf.com/"&gt;Continuous Improvement in Software Development Conference&lt;/a&gt; in Austin (what an awkward name, but Kaizenconf sounds even sillier).&amp;nbsp; There is going to be a series of free (as in beer) &lt;a href="http://kaizenconf.com/workshops"&gt;workshops&lt;/a&gt; on the Thursday and Friday before the open spaces event starts.&amp;nbsp; I&amp;#39;ve got two options in mind for my workshop, but I&amp;#39;d love to hear from anybody who&amp;#39;s planning to be there what they might like.&amp;nbsp; We&amp;#39;ll try to get some or all of it recorded regardless.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Opening the Kimono:&amp;nbsp; Chad Myers and I will open up our current architecture for our discussion.&amp;nbsp; We&amp;#39;ll talk about constructing and using internal DSL&amp;#39;s in C#, how we use the MVC framework, opinionated software design applied, and how we go about doing automated testing of the full application and our BDD flavored approach.&amp;nbsp; We&amp;#39;ll probably also talk about how we&amp;#39;re incorporating Fluent NHibernate, advanced IoC tool usage, and how to exploit many of the new C# 3 language features to your advantage.&amp;nbsp; I personally feel like the ASP.NET MVC framework is way too vanilla out of the box for efficient development, so I&amp;#39;d like to talk about adding &amp;quot;opinions&amp;quot; to the MVC to make it more efficient for your project.&amp;nbsp; In other words, you need to pimp out your MVC tool.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Patterns for Composite Applications.&amp;nbsp; More of Build Your Own CAB, but this time it&amp;#39;ll be more WPF specific and I&amp;#39;ll get into many more of the actual patterns for coordinating screens and building a pluggable application.&amp;nbsp; Frankly, it&amp;#39;s to help me out with getting my book going, but I think I can make it worth the time.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Any thoughts?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182504" width="1" height="1"&gt;</description></item><item><title>The State of IronRuby on the ALT.NET Podcast</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/28/the-state-of-ironruby-on-the-alt-net-podcast.aspx</link><pubDate>Thu, 28 Aug 2008 19:54:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182375</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182375</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/28/the-state-of-ironruby-on-the-alt-net-podcast.aspx#comments</comments><description>&lt;p&gt;Mike apparently took some time off from being a new Dad to gather up the latest news on IronRuby.&lt;/p&gt;&lt;p&gt;&lt;a href="http://altnetpodcast.com/episodes/9-state-of-ironruby"&gt;The State of IronRuby &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182375" width="1" height="1"&gt;</description></item><item><title>A Train of Thought – August 24th, 2008 Edition</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/24/a-train-of-thought-august-24th-2008-edition.aspx</link><pubDate>Sun, 24 Aug 2008 21:05:17 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182217</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>26</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182217</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/24/a-train-of-thought-august-24th-2008-edition.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Thank God I don’t have my old 3 hours a day of commuting into Manhattan, but I needed to spit out some little blog postlets in more than 140 characters at a time, so I present to you the latest Train of Thought.&amp;#160; Opinionated blathering ahead, comments are always open at the bottom.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Don’t Overreach in Your Designs&lt;/h3&gt;  &lt;p&gt;One of my older posts on &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/01/18/136648.aspx"&gt;The Last Responsible Moment&lt;/a&gt; and another post on evolutionary design were recently linked on some of the DZone/DotNetKicks sites and got some traffic.&amp;#160; I got some comments and emails to the effect of “we did evolutionary design and it bit us in the ass with all that refactoring and rewriting.”&amp;#160; Maybe, but let’s talk about how to do evolutionary design in a way that minimizes outright rework.&amp;#160; From my experience, the worst rework results from choosing elaborate abstractions upfront that turn out to be harmful.&amp;#160; The analogy that I like is trying to walk on slippery ground.&amp;#160; Anybody who’s walked across an icy patch or a muddy field this knows that the way to do it is to keep your feet as close to your center of gravity as possible by taking short steps.&amp;#160; If you take a big step you’re much more likely to slip and fall.&amp;#160; Design is the same way.&amp;#160; Bad things happen when you allow your design thinking and abstractions get ahead of your development and requirements.&lt;/p&gt;  &lt;p&gt;We’re doing evolutionary design, and yes we have had to rewrite some functionality when we’ve found shortcomings in the design or simply found a better way to do it.&amp;#160; I would attribute the worst example of avoidable rework on our project to overreaching with some infrastructure outside of user stories.&amp;#160; We’re using the new ASP.Net MVC framework, and we didn’t like the way that it handles (or really doesn’t handle) the “M” part of the MVC triad.&amp;#160; We had one of those conversations that starts with “wouldn’t it be cool if…” and ended with one or both of us spending days of architectural spiking on an approach for screen synchronization – before we created our first web page.&amp;#160; We created the idea of a “ViewModel” that would represent screen state and help us to move data between the web page form elements and our Domain Model objects.&amp;#160; We wrote a very elaborate code generation scheme to automate a lot of the grunt coding.&amp;#160; As soon as we started to work on our first couple web pages we quickly realized that much of our ViewModel infrastructure was unnecessary or just plain wrong.&amp;#160; We effectively rewrote the ViewModel code generation in a simpler way and got on with the project.&amp;#160; Since then, we’ve extended the ViewModel code generation to add new behaviors on an as needed basis, but we haven’t had to rewrite any of it.&lt;/p&gt;  &lt;p&gt;Just to head off the comments, I didn’t know about the BindingHelperExtensions in the MVC at the time (shame on me).&amp;#160; I don’t regret rolling our own infrastructure at all because I don’t think that BindingHelperExtensions is adequate, but I wish we’d played it a little smarter and put off the ViewModel code generation until we had a couple working pages to point out the real patterns.&lt;/p&gt;  &lt;p&gt;What I’m trying to say here is to avoid speculative abstractions and fancy patterns outside of feedback from the real features and needs of the system.&amp;#160; It’s relatively painless to extend simple code for more elaborate usages than its original intentions, but it hurts to throw out or change elaborate code.&amp;#160; You can hedge your design bets by (almost) always starting simple.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Enabling Evolutionary Design&lt;/h3&gt;  &lt;p&gt;So, how do you do evolutionary design without incurring a lot of rework?&amp;#160; Here’s my recipe:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Worry a lot about cohesion and coupling as you work.&amp;#160; &lt;/li&gt;    &lt;li&gt;Follow the &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc546578.aspx"&gt;Open/Closed Principle&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Follow the Single Responsibility Principle&lt;/li&gt;    &lt;li&gt;Use TDD or BDD for low level design.&amp;#160; First because it does more to ensure good cohesion and coupling on a class by class basis than any other technique, but also because the automated unit testing coverage left behind enables changes in the code to be cheaper in many cases.&amp;#160; Regression testing is a cost and risk associated with changing code is a considerable road block to making design improvements midstream.&amp;#160; If you reduce that cost and risk, evolutionary approaches are a lot more attractive.&amp;#160; That test coverage is one of the ways that TDD/BDD is more valuable a practice than merely applying some unit tests after the fact to strategic areas of the code.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2005/07/20/129540.aspx"&gt;From an old post:&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;One way to think about TDD is an analogy to Lego blocks. The Lego sets I had as a child were the very basic block shapes. Using a lot of little Lego pieces, you can build almost anything your imagination can create. If you buy a fancy Lego set that has a single large piece shaped like a pirate&amp;#39;s ship, all you can make is a variation of a pirate ship.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In that context I was talking about TDD, but I feel like the analogy holds very true for doing evolutionary design effectively.&amp;#160; Composing your system of small Lego pieces that can be rearranged is much better than using big monolithic pieces of code that are more likely to be modified later.&lt;/p&gt;  &lt;p&gt;In the end, it really amounts to just design things well, all the time.&amp;#160; Unsurprisingly, I think that teams with strong software design skills are best equipped to do evolutionary design.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;On Software Factories&lt;/h3&gt;  &lt;p&gt;Last week I was at an Open Spaces event in Colorado with a very diverse group of folks in a session that rambled around until “Software Factories” came up.&amp;#160; I stated, and not for the first time, that Software Factories are often Big Design Upfront dressed up in sexier new clothes.&amp;#160; I definitely think the software factory idea can work (with Ruby on Rails as exhibit A), but I think the activity of defining elaborate project and class templates upfront is risky or at least unoptimal.&amp;#160; A project team’s is going to have much less willingness to reconsider designs if design changes require changing the software factory templates.&amp;#160; To me, software factory techniques will succeed if and only if it’s easy to modify the factory automation guidance as the team works and learns more about their system.&lt;/p&gt;  &lt;p&gt;My other point with software factories was that I think micro code generation (live templates, file templates, ReSharper tricks, scaffolding, etc.) where the developer is in complete control has a much better chance of succeeding than the elaborate factories that try to generate most of the application for you.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Opinionated Software&lt;/h3&gt;  &lt;p&gt;Ruby on Rails introduced “Opinionated Software” into the common lexicon, but it’s been around for a while.&amp;#160; I think that my team is gaining some advantages from our design’s “opinions,” but what if you don’t like the opinions of your chosen framework?&amp;#160; Take CSLA.Net as an example.&amp;#160; I want absolutely nothing to do with CSLA.Net because I think its basic model is severely flawed, but I bet that it’s providing a lot of value for many teams.&amp;#160; That value is largely because CSLA.Net has firmly engrained “opinions” about how almost every common development task should be done.&amp;#160; I can’t use CSLA.Net, and a lot of the Microsoft tooling for that matter, because I don’t agree with the “opinions” baked into that tooling.&amp;#160; I’ll happily build my own infrastructure to support the way that *I* feel software should be created, or go around a piece of infrastructure I don’t agree with.&amp;#160; Heck, the MVC framework isn’t even released and we’ve already considerably diverged from its opinions.&amp;#160; Other developers will simply go with the flow of whatever tooling that their using and invest time into learning the idioms of that particular tool and not waste time questioning that tool.&amp;#160; &lt;/p&gt;  &lt;p&gt;I think this comes down to a question of “go with the flow or change the course of the river.”&amp;#160; I’m a “change the course of the river” to the optimal path kind of guy, but I frequently wonder if it would be better to just give up and go with the flow.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;TypeMock is only a Bullet of Ordinary Composition&lt;/h3&gt;  &lt;p&gt;I was out of pocket last week at a little open spaces event, so I missed most of the latest Twitter and blogging flareup of the TypeMock question.&amp;#160; I’ll repeat my opinion that there’s nothing inherently wrong with TypeMock itself, but I think that the rhetoric from TypeMock proponents is often harmful to the greater discussion of software design and practices.&lt;/p&gt;  &lt;p&gt;TypeMock might be a better mocking framework than Rhino Mocks or Moq, but it does NOT change the fundamental rules of mock object usage.&amp;#160; Just because you can use TypeMock to mock a dependency doesn’t mean that it’s the right thing to do.&amp;#160; Let’s remember some of my rules of mock object usage:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Don’t ever try to mock chatty interfaces like ADO.Net or anything related to HttpContext because the effort to reward ratio is all wrong and you can never read those tests anyway.&amp;#160; &lt;/li&gt;    &lt;li&gt;Be extremely cautious of mocking interfaces that you do not understand.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The only thing that TypeMock changes is *how* the mock object is introduced into the code being tested.&amp;#160; If you really think that having separate interface definitions plus Dependency Injection is hard, then yeah, use TypeMock (an assertion that I would obviously dispute in this age of auto wiring, auto mocking containers, ReSharper, and convention driven configuration of IoC containers).&amp;#160; Just remember a couple things please:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mocking in general isn’t going to be an effective technique with classes that aren’t cohesive or have a lot of semantic coupling with their dependencies.&amp;#160; In other words, interaction testing with any mock object is going to be painful with badly written code.&amp;#160; TypeMock simply doesn’t change that equation.&amp;#160; I’ve heard TypeMock put forward as a solution for unit testing legacy code.&amp;#160; In theory yes, but the reality that I’ve found is that interaction testing inside Legacy Code is an exercise in pain.&amp;#160; Most legacy code (and I’m using the Feathers definition of legacy code here) has very poor internal structure and poor separation of concerns.&amp;#160; Exactly the kind of code that you shouldn’t bother using interaction testing on.&amp;#160; I’d instead recommend surrounding Legacy Code with more coarse grained integration tests to preserve behavior first, then trying to modify the internal code to a better structure before writing fine grained unit tests.&amp;#160; Yes, it is possible to use TypeMock to “unit test” typical legacy code, but those tests would almost automatically be the type of overspecified unit tests that cause more harm than good.&amp;#160; The problem with legacy code is often the structure of the code more than the fact that it doesn’t have any unit tests.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Yes, you can unit test the class in question that news up its own dependencies and calls static methods, but you still have a very tight runtime coupling to those dependencies and the static method calls.&amp;#160; Regardless of your ability to unit test the class in question, that tight coupling can often be a problem.&amp;#160; Your ability to reuse those classes is compromised by the tight dependencies.&amp;#160; Your ability to practice evolutionary design is compromised because of the tight coupling.&amp;#160; Remember that Dependency Inversion and Inversion of Control have other benefits than just unit testing.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think the TypeMock proponents are too focused on unit testing in a way.&amp;#160; I firmly believe that code that can’t be efficiently unit tested is almost automatically bad code (to me, testability == productivity).&amp;#160; However, code that &lt;strong&gt;can&lt;/strong&gt; be unit tested isn’t necessarily good.&lt;/p&gt;  &lt;p&gt;To recap, I don’t think there’s anything wrong with TypeMock per se, but I think that much of the TypeMock proponent’s &lt;strong&gt;rhetoric&lt;/strong&gt; is irresponsible.&amp;#160; Just because TypeMock *can* do something, doesn’t mean that doing that something is a good idea.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;In Tribute to George Carlin&lt;/h3&gt;  &lt;p&gt;I couldn’t think of 7, and it’s a couple months late for a Carlin tribute, but here’s my list of the words or phrases that are henceforth banned from appearing in my blog or presence (starting right now).&amp;#160; Almost no conversation is going to be useful if it includes one of these words:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mort – Apparently Microsoft is now referring to the developer formerly known as “Mort” as “Pragmatic Developers.”&amp;#160; Puh-leeze.&amp;#160; Everybody in the world thinks that they’re pragmatic, but yet we disagree on many significant directions in the best way to build software.&amp;#160; I was dead set against ALT.NET getting renamed “Pragmatic.Net” for the same reasons.&amp;#160; I gotta say though, “Pragmatic Developer” is much less a pejorative than “Mort” became and the typical “Joe Schmoe Developer who builds LOB apps at General Motors” line you hear from Microsoft employees.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Entity Framework – At least until there’s something new to say.&amp;#160; I’m liking that my attention lately has been on the advance of Fluent NHibernate instead of worrying about a tool that I’m very unlikely to use in the next 2-3 years.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Stored Procedures – I’ve seen nothing to change my opinion about sprocs for several years (good for edge cases and utility database scripts, bad everywhere else, i.e. 95%+ of the time I think sprocs are unnecessary)     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;TypeMock     &lt;br /&gt;&amp;#160;&lt;/li&gt;    &lt;li&gt;“Vietnam of Software Development” – Most&amp;#160; overblown and misused analogy this side of Software as Construction.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“Software as Construction” – I worked on the engineering side of construction projects measured in the 100’s of million dollars and even billion dollar+ projects (and this was in the pre-W days when the USD was more than paper money), plus I worked for my father building houses as well.&amp;#160; I feel perfectly qualified to say that the “Software as Construction” analogy is an extremely poor fit.&amp;#160; Software as Manufacturing is better, but I bet that somebody will write a rant about that comparison in the next couple years.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Foo Considered Evil – It’s a cliche now     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“Cargo Cult” – used as a magic talisman to win any argument, regardless of whether the use of the phrase is applicable or not.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“Your Emperor has no Clothes” – see above     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“Jumped the Shark” – see above     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“You should just use whatever is best for your project” – The intellectual equivalent of empty calories     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“You’re just being dogmatic!” – Lamest way to try to win an argument.&amp;#160; Basically, this is code for “I’m pissed that you don’t agree with me so I’m just going to call you names and declare victory, so there!”     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt; “You can just Refactor it later” – You can write simplistic code upfront and say you’ll refactor it later to eliminate duplication or handle more complicated cases as those cases arise, but you don’t write bad code on purpose.&amp;#160; You certainly don’t use Refactoring as an excuse to just not think about design.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;“We’re refactoring” when the team really means “we’re rewriting that code altogether.”&amp;#160; There’s no such thing as a big refactoring.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Okay, I’m done.&amp;#160; Your turn:&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182217" width="1" height="1"&gt;</description></item><item><title>“SmartInstance” in StructureMap 2.5</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/20/smartinstance-in-structuremap-2-5.aspx</link><pubDate>Wed, 20 Aug 2008 18:43:40 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182147</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182147</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/20/smartinstance-in-structuremap-2-5.aspx#comments</comments><description>&lt;p&gt;From the feedback on the &lt;a href="http://groups.google.com/group/structuremap-users?hl=en"&gt;StructureMap Google group&lt;/a&gt;, Chad and I have hashed out a new Fluent Interface expressions for explicitly defining constructor arguments and setter values (I still think Setter Injection is a design smell, but I’ve been vociferously voted down).&amp;#160; The problems in the current version is that SetProperty() is overloaded to mean either setter or constructor arguments.&amp;#160; The underlying mechanisms in StructureMap stores the information the same way, but the API was causing real confusion.&amp;#160; So, to alleviate that confusion and also to utilize some of the new .Net 3.5 goodness, I present the new language:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Defining primitive constructor arguments&lt;/strong&gt; -- WithCtorArg(“name”).EqualTo(“value”)&amp;#160; or&amp;#160; WithCtorArg(“name”).EqualToAppSetting(“key”)&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color:#2b91af;"&gt;Test&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; DeepInstanceTest_with_SmartInstance()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assertThingMatches(registry =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; registry.ForRequestedType&amp;lt;&lt;span style="color:#2b91af;"&gt;Thing&lt;/span&gt;&amp;gt;().TheDefault.Is.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Thing&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;.WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;Jeremy&amp;quot;&lt;/span&gt;)&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;count&amp;quot;&lt;/span&gt;).EqualTo(4)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;average&amp;quot;&lt;/span&gt;).EqualTo(.333)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .SetterDependency&amp;lt;&lt;span style="color:#2b91af;"&gt;Rule&lt;/span&gt;&amp;gt;().Is(x =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;WidgetRule&lt;/span&gt;&amp;gt;().SetterDependency&amp;lt;&lt;span style="color:#2b91af;"&gt;IWidget&lt;/span&gt;&amp;gt;().Is(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c =&amp;gt; c.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;ColorWidget&lt;/span&gt;&amp;gt;().WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;color&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;yellow&amp;quot;&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Defining primitive setter properties&lt;/strong&gt; – just uses a Lambda expression that will be applied to the object as soon as it’s built.&amp;#160; Intellisense and compiler safety are good things, so you might as well use it.&amp;#160; StructureMap now supports optional setter injection, meaning that you no longer need to do the [Setter] attributes in the concrete classes.&amp;#160; If you specify the value of a setter, StructureMap will use that value regardless of whether or not the [Setter] property exists.&amp;#160; The same rule applies to non-primitive setter dependencies.&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt; instance.SetProperty(x =&amp;gt; x.Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Jeremy&amp;quot;&lt;/span&gt;)&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overriding Constructor Dependencies&lt;/strong&gt; – Only when you want to override the auto wiring behavior.&amp;#160; I’ve chosen to use a &lt;a href="http://martinfowler.com/dslwip/NestedClosure.html"&gt;Nested Closure&lt;/a&gt; for defining the child instance of the IWidget constructor argument below.&amp;#160; You could also replace x.Object() with x.OfConcreteType&amp;lt;T&amp;gt; or x.ConstructedBy(Func&amp;lt;T&amp;gt;) or other options inside the Is() method.&amp;#160; I chose this solution because I thought it would make it easier to guide the user to the possible options.&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt; instance.CtorDependency&amp;lt;&lt;span style="color:#2b91af;"&gt;IWidget&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;widget&amp;quot;&lt;/span&gt;).Is(x =&amp;gt; x.Object(widget))&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Overriding Setter Dependencies&lt;/strong&gt; – Setter dependencies (non-primitive types) are specified much like constructor arguments.&amp;#160; Your options are to say:&amp;#160; .SetterDependency&amp;lt;T&amp;gt;().Is(whatever) or .SetterDependency&amp;lt;T&amp;gt;(x =&amp;gt; x.Setter).Is(whatever).&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; registry.ForRequestedType&amp;lt;&lt;span style="color:#2b91af;"&gt;Thing&lt;/span&gt;&amp;gt;().TheDefault.Is.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Thing&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;Jeremy&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;count&amp;quot;&lt;/span&gt;).EqualTo(4)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;average&amp;quot;&lt;/span&gt;).EqualTo(.333)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .SetterDependency&amp;lt;&lt;span style="color:#2b91af;"&gt;Rule&lt;/span&gt;&amp;gt;().Is(x =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;WidgetRule&lt;/span&gt;&amp;gt;().SetterDependency&amp;lt;&lt;span style="color:#2b91af;"&gt;IWidget&lt;/span&gt;&amp;gt;().Is(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c =&amp;gt; c.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;ColorWidget&lt;/span&gt;&amp;gt;().WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;color&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;yellow&amp;quot;&lt;/span&gt;));&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Explicitly defining an array of dependencies&lt;/strong&gt; – I get into this scenario with configuring business rules.&amp;#160; Let’s say you have a class that depends on an array of some other type of service.&amp;#160; That syntax looks like:&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; registry.ForRequestedType&amp;lt;&lt;span style="color:#2b91af;"&gt;Processor&lt;/span&gt;&amp;gt;().TheDefault.Is.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Processor&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;Jeremy&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .TheArrayOf&amp;lt;&lt;span style="color:#2b91af;"&gt;IHandler&lt;/span&gt;&amp;gt;().Contains(x =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.References(&lt;span style="color:#a31515;"&gt;&amp;quot;Two&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.References(&lt;span style="color:#a31515;"&gt;&amp;quot;One&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;or&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;IContainer&lt;/span&gt; container = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Container&lt;/span&gt;(r =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; r.ForRequestedType&amp;lt;&lt;span style="color:#2b91af;"&gt;Processor&lt;/span&gt;&amp;gt;().TheDefault.Is.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Processor&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;Jeremy&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .TheArrayOf&amp;lt;&lt;span style="color:#2b91af;"&gt;IHandler&lt;/span&gt;&amp;gt;().Contains(x =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Handler1&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Handler2&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;Handler3&lt;/span&gt;&amp;gt;();&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In this case, I was lazy and made no distinction between constructor arguments and setter arguments.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Adding additional instances of a given type&lt;/strong&gt; – Sometimes you’re adding more than one instance of a given service type to StructureMap.&amp;#160; You may be fetching by ObjectFactory.GetNamedInstance&amp;lt;T&amp;gt;(name) or by ObjectFactory.GetAllInstances&amp;lt;T&amp;gt;().&amp;#160; Either way, this syntax will work.&lt;/p&gt;  &lt;div style="border-right:black thin solid;border-top:black thin solid;font-size:10pt;background:white;border-left:black thin solid;color:black;border-bottom:black thin solid;font-family:courier new;"&gt;   &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; registry.ForRequestedType&amp;lt;&lt;span style="color:#2b91af;"&gt;IService&lt;/span&gt;&amp;gt;().AddInstances(x =&amp;gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;ColorService&lt;/span&gt;&amp;gt;().WithName(&lt;span style="color:#a31515;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;color&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style="color:#a31515;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.Object(&lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ColorService&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;)).WithName(&lt;span style="color:#a31515;"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.ConstructedBy(() =&amp;gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ColorService&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Purple&amp;quot;&lt;/span&gt;)).WithName(&lt;span style="color:#a31515;"&gt;&amp;quot;Purple&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x.OfConcreteType&amp;lt;&lt;span style="color:#2b91af;"&gt;ColorService&lt;/span&gt;&amp;gt;().WithName(&lt;span style="color:#a31515;"&gt;&amp;quot;Decorated&amp;quot;&lt;/span&gt;).WithCtorArg(&lt;span style="color:#a31515;"&gt;&amp;quot;color&amp;quot;&lt;/span&gt;).EqualTo(&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;Orange&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }));&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thoughts?&amp;#160; Comments?&amp;#160; I should say here that StructureMap 2.5 will be about 95% backwards compatible with the existing FI, so no worries about converting.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It’s funny, but I generally think that with few exceptions the Constructor Injection is the preferable approach, but I continuously read that the Java guys are exactly the opposite.&amp;#160; To each his or her own I guess.&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182147" width="1" height="1"&gt;</description></item><item><title>Continuous Improvement in .NET Software Development</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/19/continuous-improvement-in-net-software-development.aspx</link><pubDate>Tue, 19 Aug 2008 04:20:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182092</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182092</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/19/continuous-improvement-in-net-software-development.aspx#comments</comments><description>&lt;p&gt;The website is up for the &amp;quot;Continuous Improvement in .Net Software Development&amp;quot; conference has been posted at &lt;a href="http://kaizenconf.com/"&gt;http://kaizenconf.com/&lt;/a&gt;.&amp;nbsp; It&amp;#39;s a bit different in scope than ALT.NET Seattle in that there will be free workshops before the open spaces event over the weekend.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I&amp;#39;ve been instructed to say that the information on the website is of yet incomplete, so watch that website for more information. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182092" width="1" height="1"&gt;</description></item><item><title>The Null Pattern is a Good Thing</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/18/the-null-pattern-is-a-good-thing.aspx</link><pubDate>Mon, 18 Aug 2008 13:13:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182056</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182056</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/18/the-null-pattern-is-a-good-thing.aspx#comments</comments><description>&lt;p&gt;That&amp;#39;s all I&amp;#39;ve got to say this morning.&amp;nbsp; Check it our here:&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Null_Object_pattern"&gt;http://en.wikipedia.org/wiki/Null_Object_pattern &lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182056" width="1" height="1"&gt;</description></item><item><title>It's time for IoC Container Detente</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx</link><pubDate>Sat, 16 Aug 2008 15:51:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:182011</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>36</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=182011</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/16/it-s-time-for-ioc-container-detente.aspx#comments</comments><description>&lt;p&gt;I was perusing the &lt;a href="http://weblogs.asp.net/bsimser/archive/2008/08/16/alt-net-canada-day-1-the-marketplace.aspx"&gt;session list for ALT.NET Canada&lt;/a&gt; this morning (sorry I couldn&amp;#39;t make it guys) and saw this session title that reflects something I&amp;#39;ve had quite a few conversations about this year. &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Building extensible frameworks leveraging framework consumer selectable IoC containers.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;As long as we&amp;#39;re going to work in static typed languages, it&amp;#39;s a major advantage to achieve extensibility and pluggability by utilizing an existing Inversion of Control container.&amp;nbsp; I&amp;#39;ll make the statement that starting with an existing IoC tool makes framework construction far simpler and cheaper than it was before.&amp;nbsp; The problem with that is that there are multiple IoC containers out there, and tying your framework to any of those containers is bound to irritate a big swath of people.&amp;nbsp; &lt;/p&gt;&lt;p&gt;When we were deciding between Ruby on Rails, the ASP.Net MVC, and MonoRail for our project architecture in June, I dismissed MonoRail in small part because I didn&amp;#39;t want to be forced to use Windsor as our IoC tool (for some reason). We&amp;#39;re perfectly content with the MVC framework at the moment*, but after reading through the MVC code and the way that they pass around dependencies through the myriad SomethingContext objects, I think the MVC team could streamline their own code quite a bit by using an IoC tool to resolve dependencies.&amp;nbsp; Now, that brings up a contentious issue, which container would they use?&amp;nbsp; The answer is that they can&amp;#39;t use any specific container.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When I was building the initial code that has became Fluent NHibernate there were a couple places where I needed to use an IoC container to resolve NHibernate objects and deal with configuration.&amp;nbsp; I obviously chose StructureMap and buried a couple hard references to ObjectFactory.GetInstance&amp;lt;T&amp;gt;() in the code.&amp;nbsp; The coupling to StructureMap doesn&amp;#39;t particularly concern &lt;b&gt;me&lt;/b&gt;, but when the code first went public, &lt;a href="http://kohari.org/"&gt;Nate Kohari&lt;/a&gt; (author of Ninject) lamented on Twitter that the tool was coupled to StructureMap.&lt;/p&gt;&lt;p&gt;So, to make it safe for both Nate and myself to use the IoC of our choice, what I&amp;#39;d really like to see is a common interface to represent the very baseline functionality of an IoC container so that we could build and release frameworks that utilize an IoC container without forcing a particular choice of tool onto the development teams. A couple people are already going down the path of abstracting an IoC container with one off solutions.&amp;nbsp; Off the top of my head I can think of at least three:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;MVCContrib&lt;/li&gt;&lt;li&gt;Caliburn&lt;/li&gt;&lt;li&gt;Whatever boring name that Prism is now called (and I owe P&amp;amp;P a reference implementation of Prism with StructureMap.&amp;nbsp; I&amp;#39;m getting there)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All of these frameworks have a more or less similar interface for the container, then an adapter for most of the major IoC tools.&amp;nbsp; I&amp;#39;d like to propose, and I&amp;#39;m not the first, that a new Service Locator abstraction be added to the .Net Framework itself as a first class citizen and publicized a little bit so framework builders can take advantage of a common interface.&amp;nbsp; I&amp;#39;d like to start a new petition to make this little, itty bitty work be a part of the MEF project within Microsoft.&amp;nbsp; All I think it needs to do is provide an interface with:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;GetInstance&amp;lt;T&amp;gt;()&lt;/li&gt;&lt;li&gt;GetInstance&amp;lt;T&amp;gt;(name)&lt;/li&gt;&lt;li&gt;GetAllInstances&amp;lt;T&amp;gt;()&lt;/li&gt;&lt;/ol&gt;and leave the registration completely alone because it&amp;#39;s so radically different from one tool to another.&amp;nbsp; Then, give us something like Thread.CurrentPrincipal for a wellknown place to put the container.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;*Honestly, we&amp;#39;ve replaced a fair amount of the MVC framework with our own stuff, but that&amp;#39;s a post for another day.&amp;nbsp; The best thing about the MVC is that it&amp;#39;s so small and fairly modular, so it&amp;#39;s relatively easy to swap in your own &amp;quot;special sauce&amp;quot; to embed conventions and more opinionated structures.&lt;img src="http://codebetter.com/aggbug.aspx?PostID=182011" width="1" height="1"&gt;</description></item><item><title>Dovetail is looking for a Junior to Midlevel Developer</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/12/dovetail-is-looking-for-a-junior-to-midlevel-developer.aspx</link><pubDate>Tue, 12 Aug 2008 14:38:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181843</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181843</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/12/dovetail-is-looking-for-a-junior-to-midlevel-developer.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Edit 8/22/2008:&amp;nbsp; We had a good response to this and other postings, and we&amp;#39;ve filled the position.&amp;nbsp; I&amp;#39;m sorry, but I don&amp;#39;t expect us to grow again anytime soon.&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The take away from this is that we have an open slot for a junior developer, and we’d like to fill that slot with somebody who wants to grow.&amp;nbsp; Josh and I were talking yesterday about our experiences coming up and how we effectively received zero mentorship.&amp;nbsp; I think our Dovetail team is positioned to be a great place for developers to grow in skill and experience.&amp;nbsp; For that matter, Austin is a great place to be a .Net developer because of the richness of our developer community.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/blogs/chad_myers/"&gt;I’m just going to copy Chad’s announcement&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;Work for one of the most progressive development shops in the US. This is an opportunity to work with some of the leaders in the .NET/C# space including Jeremy Miller and our recent addition, Joshua Flanagan – both senior designers and architects with tons of experience. We’re building a new software product line using pioneering practices and technologies, such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Test-driven development &lt;/li&gt;    &lt;li&gt;Continuous integration &lt;/li&gt;    &lt;li&gt;Behavior-driven design &lt;/li&gt;    &lt;li&gt;Domain-driven design &lt;/li&gt;    &lt;li&gt;HTML, CSS, Javascript &lt;/li&gt;    &lt;li&gt;ASP .NET MVC &lt;/li&gt;    &lt;li&gt;C# 3.0, .NET 3.5, Visual Studio 2008 &lt;/li&gt;    &lt;li&gt;SQL 2005 &lt;/li&gt;    &lt;li&gt;NHibernate 2.x &lt;/li&gt;    &lt;li&gt;LINQ2NHibernate &lt;/li&gt;    &lt;li&gt;StructureMap &lt;/li&gt;    &lt;li&gt;WatiN &lt;/li&gt;    &lt;li&gt;StoryTeller, FIT &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;Who we’re looking for&lt;/b&gt; || Dovetail Software is staffing a new team for an innovative software project. We’re looking for junior- to mid-level software developers with demonstrable C# (preferably .NET 2.0 or later) and HTML/CSS experience (not necessarily ASP.NET, just web development in general). Any experience with test-driven development or automated unit testing in general is a huge plus.&amp;nbsp; Also, participation in the community (attendance of events, avid blog reader + commenter, or maybe you even have a blog yourself) will put you firmly in the running for this position. We’re looking for people that believe learning and continuous improvement are primary responsibilities of a software developer. We’re hiring motivated people for a terrific opportunity with a team of recognized .NET and agile community leaders.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Our development methodology&lt;/b&gt; || We are an Agile shop (Scrum/XP). We work in short iterations, not long crushing release cycles. We have a collaborative relationship with our customers. We write tests before we write functional code to clarify our design intentions. We keep the build clean. We work in an environment that maximizes communication to minimize the volume of spec documents. We build software that can effectively respond to change. We use open source tools where appropriate, and Microsoft tools where they make sense. We have executive support and visibility all the way up to the owner of the company. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;About Dovetail Software&lt;/b&gt; || Serving companies since 1995, Dovetail Software develops CRM products for global 1000 enterprises. Our product, Dovetail CRM, is a comprehensive customer service and support, logistics management, customer self service, and knowledge management suite. Dovetail is a small company with big customers and great benefits for its employees. Our outstanding compensation package includes company-assisted health, dental, and life insurance, matching 401k, and more. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;About Austin&lt;/b&gt; || Placing second in the Large Cities Creativity Ranking, Austin is recognized as a city with a thriving music scene, ethnic and cultural diversity, endless outdoor recreations, and a great nightlife. It’s a nationally recognized center for technology innovation—home to 3,200 tech companies with 98,000 employees. &lt;/p&gt;  &lt;p&gt;Email us and tell us why you’d make a great addition to our team: &lt;a href="mailto:tech-jobs@dovetailsoftware.com"&gt;tech-jobs@dovetailsoftware.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181843" width="1" height="1"&gt;</description></item><item><title>Dovetail welcomes the Flim Flam Man</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/11/dovetail-welcomes-the-flim-flam-man.aspx</link><pubDate>Mon, 11 Aug 2008 20:04:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181803</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181803</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/11/dovetail-welcomes-the-flim-flam-man.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://chadmyers.lostechies.com"&gt;Chad&lt;/a&gt; &amp;amp; I have gotten tired of being an old married couple, so we&amp;#39;ve brought in reinforcements.&amp;nbsp;&amp;nbsp; Today we welcomed &lt;a href="http://flimflan.com/blog/"&gt;Josh Flanagan&lt;/a&gt; (developer extraordinaire and StructureMap committer) to the Dovetail team.&amp;nbsp; Welcome aboard Josh!&lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181803" width="1" height="1"&gt;</description></item><item><title>Shame Card 2008</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/11/shame-card-2008.aspx</link><pubDate>Mon, 11 Aug 2008 19:55:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181801</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181801</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/11/shame-card-2008.aspx#comments</comments><description>&lt;p&gt;Our new shame card:&amp;nbsp; If you break the build somebody writes you up on Twitter where the world can mock you.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;No, we don&amp;#39;t really do this, but...&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181801" width="1" height="1"&gt;</description></item><item><title>Say Hello to Fluent NHibernate</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/08/introducing-fluent-nhibernate.aspx</link><pubDate>Fri, 08 Aug 2008 18:30:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181745</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181745</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/08/08/introducing-fluent-nhibernate.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ll let James Gregory do &lt;a href="http://blog.jagregory.com/2008/08/08/introducing-fluent-nhibernate/"&gt;the introduction for Fluent NHibernate here&lt;/a&gt;.&amp;nbsp; I think this project has a lot of potential to dramatically reduce the difficulties teams face when working with NHibernate.&amp;nbsp; The initial focus is on a fluent interface mechanism for NHibernate configuration, but I&amp;#39;m hopeful that it grows into the easiest way to use NHibernate&lt;br /&gt; &lt;/p&gt;&lt;p&gt;In a nutshell, what if...&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You could configure NHibernate with Intellisense and zero, I said zero, Xml? &lt;br /&gt;&lt;/li&gt;&lt;li&gt;You had some easy tooling for testing out NHibernate mappings?&lt;/li&gt;&lt;li&gt;You could make significant shortcuts in your persistence mapping by setting sensible project conventions once and only once?&lt;/li&gt;&lt;li&gt;You could start with a reference architecture for a Repository?&lt;/li&gt;&lt;li&gt;You had sample &amp;quot;recipes&amp;quot; for bootstrapping NHibernate with the common IoC tools?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The guys doing Fluent NHibernate are going gangbusters getting this thing ready to go.&amp;nbsp; Nice job guys.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181745" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/jeremy.miller/archive/tags/Database+and+Persistence/default.aspx">Database and Persistence</category><category domain="http://codebetter.com/blogs/jeremy.miller/archive/tags/IOC/default.aspx">IOC</category></item><item><title>The great thing about me is that there's so many of me</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/29/the-great-thing-about-me-is-that-there-s-so-many-of-me.aspx</link><pubDate>Tue, 29 Jul 2008 20:21:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181323</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>26</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181323</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/29/the-great-thing-about-me-is-that-there-s-so-many-of-me.aspx#comments</comments><description>&lt;p&gt;Geek points for identifying the movie quote from the title.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Okay, I&amp;#39;m going to get this completely out of my system in one go and not do it anymore.&amp;nbsp; I used to roll my eyes at people that only use their blog for &amp;quot;look at me, I&amp;#39;m speaking at such and such on this date and I just published this or that,&amp;quot; but it appears that I&amp;#39;m one of those people now.&amp;nbsp; I swear, I&amp;#39;m writing up original blog posts with real content after this one -- and finishing some useful StructureMap documentation.&lt;/p&gt;&lt;p&gt;First, my latest article for MSDN Magazine is up today on &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc721605.aspx"&gt;Object Role Stereotypes&lt;/a&gt;.&amp;nbsp; I was excited to write this article because I&amp;#39;m a huge fan of Rebecca Wirfs-Brock and her work on Responsibility Driven Design.&amp;nbsp; UML might be great at helping you visualize an existing or proposed design, but Responsibility Driven Design can help you figure out what the design should be and understand existing designs.&amp;nbsp; I&amp;#39;ve always thought RDD was undervalued in the clamor for fancy visual modeling tools.&amp;nbsp; I&amp;#39;m going to follow up pretty shortly with some material that got cut from this article for length.&amp;nbsp; I got quite a bit of inspiration for my recent StructureMap rearchitecture work from the research I did for this article.&amp;nbsp; I&amp;#39;d like to share that as well for more examples.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I&amp;#39;m going to be speaking this November at &lt;a href="http://qconsf.com/sanfrancisco-2008/conference/"&gt;QCon San Francisco&lt;/a&gt; on my lessons learned about design, TDD, and framework usability from 5+ years of evolving the StructureMap code.&amp;nbsp; It&amp;#39;s a tremendous lineup of speakers for the conference and I&amp;#39;m just thrilled to be there.&amp;nbsp; I&amp;#39;m especially looking forward to the tracks on DSL&amp;#39;s, the &amp;quot;Architectures you&amp;#39;ve always wondered about,&amp;quot; and the track on Functional Programming.&amp;nbsp; Not to mention just being in San Francisco itself.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A short article I wrote earlier this year for &lt;a href="http://www.code-magazine.com/"&gt;CoDe Magazine&lt;/a&gt; entitled &lt;a href="http://www.devx.com/codemag/Article/38684"&gt;Using Continuous Integration to Reduce Project Friction&lt;/a&gt; is up on DevX.&amp;nbsp; If you need some help convincing your team or management to adopt Continuous Integration, this might give you some ammunition. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And finally, I&amp;#39;ve got a few last things to work out, but I&amp;#39;m finally going to start my &amp;quot;Presentation Patterns&amp;quot; book for Addison Wesley.&amp;nbsp; I&amp;#39;m effectively redoing the content from &amp;quot;&lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx"&gt;Build Your Own CAB&lt;/a&gt;&amp;quot; plus the material I never got around to and making that a real book.&amp;nbsp; As of now, the proposed Table of Contents is:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;What’s
     so hard about building a User Interface?&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Look
      at everything that’s going on here&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;How
      do I test this?&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;How
      do I connect all this together?&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Separated
     Presentation&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;The
      travails of using Active View&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;The
      Humble Dialog Box (narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Separated
      Presentation (narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;GUI
      Architectures (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Passive
      View&lt;span&gt;&amp;nbsp; &lt;/span&gt;(pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Supervising
      Controller (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Presentation
      Model (Model-View-ViewModel) (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Communication
      between the View and Presenter (narrative)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;

&lt;p class="MsoNormal" style="margin-left:1.5in;text-indent:-1.5in;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:navy;"&gt;&lt;span&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;font-size-adjust:none;font-stretch:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;i.&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;font-size-adjust:none;font-stretch:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:navy;"&gt;By events&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin-left:1.5in;text-indent:-1.5in;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:navy;"&gt;&lt;span&gt;&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;font-size-adjust:none;font-stretch:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;ii.&lt;span style="font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;font-size:7pt;line-height:normal;font-size-adjust:none;font-stretch:normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;color:navy;"&gt;Direct communication&lt;/span&gt;&lt;/p&gt;

&lt;ol style="margin-top:0in;" start="2"&gt;&lt;ol style="margin-top:0in;" start="9"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;What’s
      the Model? (long narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Model
      Based Validation with the Notification Pattern&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;The
     Mechanics of the View&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Managing
      Screen State (narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Flow
      Synchronization (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Observer
      Synchronization (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Flattener
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;MicroControllers
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Embedded
      Controller (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Screen&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt; State&lt;/span&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt; (pattern)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Complex
     Screens&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Composite
      Controller (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Layout
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Messaging&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;The
     Application Shell&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Coordination
      between Screens (narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Screen
      Activation Lifecycle (narrative)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Presenter
      First&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Application
      Shell&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Application
      Controller&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Screen
      Collection&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Screen
      Subject&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Layer
      SuperType&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Event
     Coordination&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Coordination
      between Screens&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Latch
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Event
      Aggregator (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Command
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Crafting
     a Domain Specific Language (not well defined yet)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Modularity&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Using
      an Inversion of Control Tool&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Bootstrapper
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Registry
      (pattern)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Communicating
     with the Server&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;MORE
      DEFINITION HERE&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Command
      Executor (pattern)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Automated
     Testing&lt;/span&gt;&lt;/li&gt;&lt;ol style="margin-top:0in;" start="1"&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Unit
      testing the Presenter layer&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Unit
      testing the View&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Subcutaneous
      Testing&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Strategies
      for User Interface Testing&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="color:navy;"&gt;&lt;span style="font-family:&amp;#39;Arial&amp;#39;,&amp;#39;sans-serif&amp;#39;;"&gt;Screen
      Driver (pattern)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;

&lt;p&gt;From the early feedback, it looks like I&amp;#39;ll move the testing material up and I think I&amp;#39;m going to include some discussion of &amp;quot;Mobile Objects&amp;quot; ala CSLA vs DTO&amp;#39;s / Bounded Context / Separate Domain Model for client &amp;amp; server.&amp;nbsp; I&amp;#39;d also like to talk about using an ESB like nServiceBus or Mass Transit for client to server communication. &amp;nbsp; The examples will primarily be WPF, but I&amp;#39;ll include some WinForms, Java Swing, and probably Flex.&amp;nbsp; I thought hard about using Cocoa examples, but for all of its cool features, I cannot read Objective C code.&amp;nbsp; The focus is on patterns and design rather than specific technologies.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Okay, I&amp;#39;m done with the self promotion now.&amp;nbsp; I promise.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181323" width="1" height="1"&gt;</description></item><item><title>My friend Weston is looking for some good Agile .Net developers in Austin</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/28/my-friend-weston-is-looking-for-some-good-agile-net-developers-in-austin.aspx</link><pubDate>Mon, 28 Jul 2008 17:49:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181287</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181287</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/28/my-friend-weston-is-looking-for-some-good-agile-net-developers-in-austin.aspx#comments</comments><description>&lt;p&gt;My friend Weston Binford is looking for some good .Net developers in Austin.&amp;nbsp; Austin.&amp;nbsp; Agile.&amp;nbsp; Place where they actually care about doing things well.&amp;nbsp; Maybe go to JP&amp;#39;s &amp;quot;I will make you awesome in one absurdly action-packed week&amp;quot; class.&amp;nbsp; What&amp;#39;s not to like?&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;From the &lt;a href="http://jobs.joelonsoftware.com/default.asp?3968"&gt;job posting&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="description"&gt; I manage a software development team creating
internal business applications. Two years ago, I took over the team and
we switched our project management from Waterfall to Scrum with four
week sprints. We have created a WebForms application tied to a database
using an object/relational mapper. The application still has &amp;quot;legacy&amp;quot;
C# code and some modules written in stored procedures before we
embraced domain-driven design. We have used Model-View-Presenter to
ease unit testing, but we are acutely aware of the pain of WebForms
development and are looking to move to Model-View-Controller using
ASP.NET MVC or, perhaps, Monorail.&lt;br /&gt;
&lt;br /&gt;
We have embraced collective code ownership, continuous integration,
unit testing, code coverage, domain-driven design, and sustainable
pace. Creating maintainable software is our primary goal. We are
committed to continuous learning and are empowered to get the tools
that we need. For example, the company paid for J.P. Boodhoo&amp;#39;s Nothin&amp;#39;
but .NET Developer Boot Camp (highly recommended) and we have dual
monitor (moving to tri-monitor) workstations and a copy of Resharper.
We work together in a team room to maximize communication.&lt;br /&gt;
&lt;br /&gt;
Based on the success of the first application, we have a mandate to
develop two other applications from scratch in .NET 3.5 using agile
techniques. The development is long-term and strategic for the company.
We are looking for three senior developers with strong object-oriented
skills and experience with extreme programming or other agile
development techniques to join our team as full-time employees.&lt;br /&gt;
&lt;br /&gt;
You can get more details about our business at our web site, &lt;a href="http://www.mvbalaw.com/" rel="nofollow"&gt;http://www.mvbalaw.com/&lt;/a&gt;.
We are a stable, family-oriented business. We provide benefits
including company-paid health insurance for the whole family, 401(k)
match, vacation and holidays. &lt;/div&gt;
		
		
			&lt;h3 id="toapply"&gt;
				Interested?
			&lt;/h3&gt;
			&lt;div id="directions"&gt;
				If so, individuals only (no recruiters, please) e-mail me directly at developerjobs@mvbalaw.com.  &lt;br /&gt;
&lt;br /&gt;
Thanks,&lt;br /&gt;
Weston M. Binford III&lt;br /&gt;
Director of Software Development&lt;br /&gt;
McCreary, Veselka, Bragg &amp;amp; Allen, P.C.
			&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181287" width="1" height="1"&gt;</description></item><item><title>Ward &amp; I talk over the EF Vote of No Confidence Document</title><link>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/22/ward-amp-i-talk-over-the-ef-vote-of-no-confidence-document.aspx</link><pubDate>Tue, 22 Jul 2008 15:46:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:181108</guid><dc:creator>Jeremy D. Miller</dc:creator><slash:comments>27</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codebetter.com/blogs/jeremy.miller/rsscomments.aspx?PostID=181108</wfw:commentRss><comments>http://codebetter.com/blogs/jeremy.miller/archive/2008/07/22/ward-amp-i-talk-over-the-ef-vote-of-no-confidence-document.aspx#comments</comments><description>&lt;p&gt;The second part of &lt;a href="http://altnetpodcast.com/episodes/8-vote-of-no-confidence"&gt;Ward Bell &amp;amp; I&amp;#39;s conversation on ORM is up at the ALT.NET Podcast&lt;/a&gt;.&amp;nbsp; In this part we dive right into the vote of no confidence document that kicked up so (much more than was justified) fuss and racket about a month ago.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We recorded it a couple weeks back, and I&amp;#39;ve spent a little time thinking about the EF VoNC. At this point I&amp;#39;d say that:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;After looking more at it, EF v1 is actually worse than I thought it was&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No, I don&amp;#39;t regret signing and helping to write the no confidence thing.&amp;nbsp; I wish it had unfolded differently and I&amp;#39;m disappointed at the negativity around it, but I still think it was worth doing.&amp;nbsp; I still don&amp;#39;t think the wording of the document was very inflammatory, but I guess the idea of openly criticizing a Microsoft product is still taboo for big areas of the .Net community.&amp;nbsp; If nothing else, it&amp;#39;s actually sparked something of a real dialog between two or more camps of development that rarely communicate with each other&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;What I&amp;#39;ve heard from EF v2 (&lt;a href="http://codebetter.com/blogs/gregyoung/archive/2008/07/19/bellware-driven-design.aspx"&gt;Mr. Bellware goes to Redmond, Washington&lt;/a&gt;) sounds pretty good.&lt;/b&gt;&amp;nbsp; The EF team might have already been on the cleaner POCO path anyway.&amp;nbsp; I really wish they&amp;#39;d been a bit more transparent and upfront about that.&amp;nbsp; From all appearances, it&amp;#39;s always looked like the EF team was completely blowing off our original concerns about the usability of EF.&amp;nbsp; Anyway, here&amp;#39;s to hoping the EF team&amp;#39;s new openness and transparency leads to a better relationship from now on.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I think EF v2 sounds like it might be usable from my perspective, so would I recommend using EF v1 if you want all that EDM stuff and migrate to the POCO model in v2 later?&amp;nbsp; I&amp;#39;m going to make the sure to be controversial standpoint that it&amp;#39;ll be easier to start with NHibernate now and migrate to EF v2 later than it would be to start with EF v1.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Regardless of what they do, I think the EF is unlikely to completely succeed.&amp;nbsp; The EF is getting yanked into way too many directions to make everybody happy.&amp;nbsp; Look at their fancy advisory council.&amp;nbsp; Some DDD guys, an Agile guru, a database weenie who wants to write all his code in T-SQL sprocs like it&amp;#39;s 1995, and an MDA guy.&amp;nbsp; How could one single tool make all of those different people happy without collapsing under its own complexity?&amp;nbsp; Oh, and tou think ALT.NET whines about the EF?&amp;nbsp; On a couple different occasions I&amp;#39;ve watched data centric guys yell at the EF team for perceived shortcomings in stored procedure support.&amp;nbsp; I couldn&amp;#39;t tell you the specifics of their complaints though, because I snoozed off as soon as I heard the words &amp;quot;stored procedure.&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ALT.NET gets a rap for bad behavior, but in the wake of the VoNC document, I thought the traditionalists (the TechEd/INETA/Regional Director types) behaved poorly as well.&amp;nbsp; The kicker for me was &lt;a href="http://www.stephenforte.net/PermaLink,guid,1f988309-0969-4115-8e09-77c746a32f57.aspx"&gt;Stephen Forte&amp;#39;s crack&lt;/a&gt; that developers want ORM&amp;#39;s because they&amp;#39;re too stupid and lazy to learn set-based algebra, then says that he hopes &amp;quot;cooler heads&amp;quot; will prevail later in the exact same post.&amp;nbsp; Um, rank hypocrisy anyone?&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=181108" width="1" height="1"&gt;</description><category domain="http://codebetter.com/blogs/jeremy.miller/archive/tags/Database+and+Persistence/default.aspx">Database and Persistence</category></item></channel></rss>