<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Development</title>
        <link>http://www.ayende.com/Blog/category/467.aspx</link>
        <description>Development</description>
        <language>en-US</language>
        <copyright>Ayende Rahien</copyright>
        <managingEditor>Ayende@ayende.com</managingEditor>
        <generator>Subtext Version 1.9.3.51</generator>
        <item>
            <title>Zero Friction &amp; Maintainability</title>
            <link>http://ayende.com/Blog/archive/2008/05/16/Zero-Friction--Maintainability.aspx</link>
            <description>&lt;p&gt;You probably heard me talk about zero friction and maintainability often enough in the past. But they were always separate subjects. When I prepared for my Zero Friction talk, I finally figured out what is the relation between the two.&lt;/p&gt;
&lt;p&gt;I talk about zero friction as a way to reduce pain points in development. And I talk about maintainability as a way to ensure that we build sustainable solutions.&lt;/p&gt;
&lt;p&gt;Let us go back a step and try to realize why we even have the issue of maintainability. Bits do not rot, why am I so worried about proactively ensuring that we will keep the code in a good shape?&lt;/p&gt;
&lt;p&gt;As it turn out, while code may not rot, the &lt;span style="font-style: italic;"&gt;design of the application &lt;strong&gt;does&lt;/strong&gt;&lt;/span&gt;. But why?&lt;/p&gt;
&lt;p&gt;If you have an environment that has friction in it, there is an incentive for the developers to subvert the design in order to produce a quick fix or hack a solution to solve a problem. Creating a zero friction environment will produce a system where there is no incentive to corrupt the design, the easiest thing to do is the right thing to do.&lt;/p&gt;
&lt;p&gt;By reducing the friction in the environment, you increase the system maintainability&lt;/p&gt;
&lt;img src="http://ayende.com/Blog/aggbug/10226.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/05/16/Zero-Friction--Maintainability.aspx</guid>
            <pubDate>Fri, 16 May 2008 16:25:27 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10226.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/05/16/Zero-Friction--Maintainability.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10226.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Actively enforce your conventions</title>
            <link>http://ayende.com/Blog/archive/2008/05/05/Actively-enforce-your-conventions.aspx</link>
            <description>&lt;p&gt;Glenn posted about a test I wrote &lt;a href="http://codebetter.com/blogs/glenn.block/archive/2008/05/04/prismshouldnotreferenceunity.aspx"&gt;PrismShouldNotReferenceUnity&lt;/a&gt;, in which I codified an assumption that the team made.&lt;/p&gt;
&lt;p&gt;This is something that I try to do whenever I decide that I will have some sort of convention. If at all possible, I will try to make sure that the compiler will break if you don't follow the convention, but that is often just not possible, therefor, tests and active enforcement of the system convention fill that place.&lt;/p&gt;
&lt;p&gt;Wait a minute, I haven't even defined what a convention is! By convention, I means things like:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;All services should have a Dispose() method - add a Dispose abstract method to AbstractService&lt;/li&gt;

  &lt;li&gt;All messages should be serializable - create a test that scan the message assemblies and check for non serializable messages.&lt;/li&gt;

  &lt;li&gt;You may only call the database twice per web request - create an http module that will throw an exception if you call it more than that&lt;/li&gt;

  &lt;li&gt;A request should take less than 100 milliseconds - add an interceptor that would fail if this is not the case.&lt;/li&gt;

  &lt;li&gt;The interface assembly may not contain logic - add a test that would fail if it find a class with a method on the interface assembly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of those are ways to increase the feedback speed. This is especially true if there is some extra step that you need to perform, or you want to draw a line in the sand, from which you will not deviate.&lt;/p&gt;
&lt;p&gt;Actively enforced conventions keep you honest.&lt;/p&gt;&lt;br /&gt;
&lt;img src="http://ayende.com/Blog/aggbug/10208.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/05/05/Actively-enforce-your-conventions.aspx</guid>
            <pubDate>Mon, 05 May 2008 07:51:12 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10208.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/05/05/Actively-enforce-your-conventions.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10208.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Go with High End Solutions</title>
            <link>http://ayende.com/Blog/archive/2008/05/03/Go-with-High-End-Solutions.aspx</link>
            <description>&lt;p&gt;About a year and a half ago, I start an exciting new project (there is a demo of the actual project &lt;a href="http://comserveguide.comverse.com/"&gt;here)&lt;/a&gt;. The actual application is fairly complex, and has some it gave me the chance to explore some very interesting ideas. Rhino Security is a generalization of the security scheme used in this project, and it is pretty much the driving force for Rhino Igloo. But that is not what I want to talk about.&lt;/p&gt;
&lt;p&gt;What I do want to talk about is the infrastructure that we used for the project. We used IoC, OR/M, AoP, MVC and many other buzz worthy TLD. It was the first time that I had the chance in implementing real high end complexity reduction techniques. I left the team 10 months ago. In the meantime, the application was under active development, got a few new team members and had two major releases.&lt;/p&gt;
&lt;p&gt;I am really proud of that system.&lt;/p&gt;
&lt;p&gt;A few weeks ago I got a phone call from the current team lead, asking me about the windsor.boo file that is sitting there. The last time anyone touched it was shortly after I left, after which, it just... existed. I had the chance to do a code review on the new stuff that the team developed, about three months ago. I couldn't find any real difference between the code develop before and after I left.&lt;/p&gt;
&lt;p&gt;Anyway, I had to spend 15 minutes on the phone, explaining the process that was going on there. Before I left (and during the time I was the team lead), I made sure that I passed on all the knowledge that I had about the system, the design decisions and the overall picture. However, there was a period of nearly three months in which &lt;span style="font-style: italic;"&gt;I&lt;/span&gt; forgot that we even had this infrastructure, because we hadn't have to deal with it for that time period. After I left...&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;9 months.&lt;/li&gt;

  &lt;li&gt;2 major releases.&lt;/li&gt;

  &lt;li&gt;Zero issues with the infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I asked the team lead what she thinks about that. Since it is her project now, and if she thinks that it was the right decision to make. She love the infrastructure, and wouldn't hear about using a lower end solution. Most of what we did was actually going over the file and explaining historical decisions, for that matter.&lt;/p&gt;
&lt;p&gt;As an additional data point, I was able to look at a piece of code I have last seen over a year ago and figure out not only what it does, but the how and why of it with no ramp up time.&lt;/p&gt;
&lt;p&gt;I consider this a success.&lt;/p&gt;
&lt;img src="http://ayende.com/Blog/aggbug/10204.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/05/03/Go-with-High-End-Solutions.aspx</guid>
            <pubDate>Sat, 03 May 2008 11:00:54 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10204.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/05/03/Go-with-High-End-Solutions.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10204.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Frequent check ins frequent integration</title>
            <link>http://ayende.com/Blog/archive/2008/03/28/Frequent-check-ins-frequent-integration.aspx</link>
            <description>&lt;p&gt;A few days ago there was a &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/4707"&gt;thread&lt;/a&gt; in the ALT.Net mailing list about the frequency of check ins.&lt;/p&gt;  &lt;p&gt;Here is my opinion in this matter:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Frequentcheckinsfrequentintegration_136EB/image_2.png"&gt;&lt;img height="427" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Frequentcheckinsfrequentintegration_136EB/image_thumb.png" width="825" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10132.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/03/28/Frequent-check-ins-frequent-integration.aspx</guid>
            <pubDate>Fri, 28 Mar 2008 19:07:04 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10132.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/03/28/Frequent-check-ins-frequent-integration.aspx#feedback</comments>
            <slash:comments>15</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10132.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The best checkin comment ever</title>
            <link>http://ayende.com/Blog/archive/2008/03/28/The-best-checkin-comment-ever.aspx</link>
            <description>&lt;p&gt;Is this one:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thebestcheckincommentever_135FF/image_2.png"&gt;&lt;img height="42" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thebestcheckincommentever_135FF/image_thumb.png" width="512" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10131.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/03/28/The-best-checkin-comment-ever.aspx</guid>
            <pubDate>Fri, 28 Mar 2008 19:03:04 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10131.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/03/28/The-best-checkin-comment-ever.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10131.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The devil is in the details</title>
            <link>http://ayende.com/Blog/archive/2008/03/26/The-devil-is-in-the-details.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_6.png"&gt;&lt;img height="480" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_thumb_2.png" width="427" align="right" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Quite often, I hear about a new approach or framework, and they are interesting concepts, with obviously trivial implementations.&lt;/p&gt;  &lt;p&gt;In fact, the way I usually learn about new approach is by writing my own spike to explore how such a thing can work. (As an alternative, I will go and read the code, if it is an OSS project).&lt;/p&gt;  &lt;p&gt;The problem is that obviously trivial implementations tends to ignore a lot of the fine details. Even for the trivial things, there are a lot of details to consider before you can call something production ready.&lt;/p&gt;  &lt;p&gt;Production ready is a tough concept to define, but it is generally means that you have taken into account things like:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Performance&lt;/li&gt;    &lt;li&gt;Error handling&lt;/li&gt;    &lt;li&gt;Security&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And many, many more. &lt;/p&gt;  &lt;p&gt;One of the release criteria of Rhino Mocks is the ability to mock IE COM interfaces, as a simple example. That is actually much tougher than it looks (go figure out what RVA is and come back to tell me), as a good example;&lt;/p&gt;  &lt;p&gt;But mocking is a complex issue as it is, let us take unit testing as an example, it is very simple concept, after all. How hard is it to build? Let us see:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; MyUnitTestingFramework
{
	&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;[] args)
	{
		&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; file &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; args)
		{
			&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(Type type &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; Assembly.Load(file).GetTypes())
			{
				&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(MethodInfo method &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; type.GetMethods())
				{
					&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(IsTest(method)==&lt;span style="color: #0000ff"&gt;false&lt;/span&gt;)
						&lt;span style="color: #0000ff"&gt;continue&lt;/span&gt;;
					&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;
					{
						&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; instance = Activator.CreateInstance(type);
						method.Invoke(instance, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[0]);
					}
					&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;(Exception e)
					{
						Console.WriteLine("&lt;span style="color: #8b0000"&gt;Test failed {0}, because: {1}&lt;/span&gt;", method, e);
					}
				}
			}
		}
	}
	
	&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsTest(MethodInfo method)
	{
		&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; att &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; method.GetCustomerAttributes(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;))
		{
			&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;(att.GetType().Name == "&lt;span style="color: #8b0000"&gt;Test&lt;/span&gt;")
				&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;
		}
		&lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;;
	}
}&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah, I have created Rhino Unit!&lt;/p&gt;

&lt;p&gt;Well, not hardly.&lt;/p&gt;

&lt;p&gt;I can write an OR/M, IoC container and Proxies in an hour (each, not all of them). Knowing how to do this is important, but doing so for real is generally a mistake. I am currently using a homegrown-written-in-an-hour IoC container, I really don't like it. I keep hitting the limitations, and the cost of actually getting a container up to par with the standard expectation is huge. I &lt;em&gt;know&lt;/em&gt; that I can't use a written-in-an-hour-OR/M without sedation. &lt;/p&gt;

&lt;p&gt;Here is the general outline of the cost to feature ratio for doing this on any of the high end tools:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_16.png"&gt;&lt;img height="291" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_thumb_7.png" width="483" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;There really isn't much of a complexity involved, just a lot of small details that you need to take care of, which is where all the cost goes.&lt;/p&gt;

&lt;p&gt;One thing that I am not telling you is that I didn't show the entire graph, here is the same graph, this time with more of the timeline shown. After a while, the complexity tends to go away (if it isn't, the project fails and dies, see previous graph).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_20.png"&gt;&lt;img height="291" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/WindowsLiveWriter/Thedevilisinthedetails_13EBA/image_thumb_9.png" width="483" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Nevertheless, the initial cost for rolling your own like this is significant. This is also the reason why I wince every time someone tells me that they just write their own everything. (yeah, I know, I am not one that can point fingers. I think that I mentioned before that I feel no overwhelming need to be self consistent).&lt;/p&gt;

&lt;p&gt;My own response for those graphs tend to follow the same path almost invariably:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Build my own spike code to understand the challenges involved in building something like this.&lt;/li&gt;

  &lt;li&gt;Evaluate existing players against &lt;a href="http://www.ayende.com/Blog/archive/2007/07/27/Evaluating-a-Business-Platform.aspx"&gt;my criteria&lt;/a&gt;.&lt;/li&gt;

  &lt;li&gt;Evaluate comparability with the rest of my stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it passes my criteria, I'll tend to use that over building my own. If it doesn't, well, at least I have a good reason to do it.&lt;/p&gt;

&lt;p&gt;Programming to learn is a good practice, one that is important not to lose. At the same time, it is crucial to remember that you shouldn't take out the toys to play in front of the big boys unless you carry a big stick and are not afraid to use it.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10122.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/03/26/The-devil-is-in-the-details.aspx</guid>
            <pubDate>Wed, 26 Mar 2008 20:40:36 GMT</pubDate>
            <wfw:comment>http://ayende.com/Blog/comments/10122.aspx</wfw:comment>
            <comments>http://ayende.com/Blog/archive/2008/03/26/The-devil-is-in-the-details.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10122.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Zero Friction and why Defaults Matters</title>
            <link>http://ayende.com/Blog/archive/2008/02/25/Zero-Friction-and-why-Defaults-Matters.aspx</link>
            <description>&lt;p&gt;Several times recently I had to answer why I care so much for defaults if they are something that I can change. My answer is usually a derivative of "defaults matters". I have come to understand that this is not a sufficient answer and I need to clarify it. &lt;/p&gt;  &lt;p&gt;I have talked extensively about Zero Friction environment and why I care so much about it. It is about how much I have to fight the tools that I have in order to get what I want.&lt;/p&gt;  &lt;p&gt;I spent much of yesterday moving Rhino Tools from MsBuild to NAnt, because MsBuild doesn't have any way to get the current framework version. That is a big task, and considering that I can add this functionality to MsBuild in a few minutes, why did I do that?&lt;/p&gt;  &lt;p&gt;Again, it had to do with the fact that when I need a solution, I had to work hard for it. With NAnt, it is just there. For most of everything, in NAnt, it is just there. Between the two, NAnt is the tool with less friction. In the long run, this mean that I would be able to work more efficiently.&lt;/p&gt;  &lt;p&gt;How does this related to defaults? Well, consider this, if I have to extend / change something to get something that I consider a baseline functionality, this is a problem. This is friction, and if it generating that much friction early on, I can safely assume that it will generate much more friction when I want to do the advance stuff.&lt;/p&gt;  &lt;p&gt;At that point, thanks but no thanks.&lt;/p&gt;  &lt;p&gt;To put it in more familiar terms, whatever defaults you have are the Out Of The Box Experience that you have for your software. If you missed the default, it is as if you just hand me a product in one of those ugly and hard plastic shell (the ones that you need scissors just to open) and told me that I can put it in a pretty designer box.&lt;/p&gt;  &lt;p&gt;Yes, I can, but you missed your chance to get me.&lt;/p&gt;  &lt;p&gt;And that is ignoring the fact that default, for most people, are what is happening. You &lt;em&gt;need&lt;/em&gt; good defaults.&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10070.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/02/25/Zero-Friction-and-why-Defaults-Matters.aspx</guid>
            <pubDate>Sun, 24 Feb 2008 23:41:56 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2008/02/25/Zero-Friction-and-why-Defaults-Matters.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10070.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Handling dependencies in a one assembly</title>
            <link>http://ayende.com/Blog/archive/2008/02/22/Handling-dependencies-in-a-one-assembly.aspx</link>
            <description>&lt;p&gt;There were several comments for my recent post about the disadvantages of creating a single assembly for a project, instead of the more common multiply ones.&lt;/p&gt;  &lt;p&gt;The main one seems to be related to dependency management. How you can be sure that the UI isn't accessing the database, and other fun violations of layering.&lt;/p&gt;  &lt;p&gt;I have to say that I don't really have much issue with that. I want good layering, but I find that code style in a project tend to keep consistent over a long period of time in any reasonable time. As such, once you have sufficient size, it will more or less manage itself.&lt;/p&gt;  &lt;p&gt;That isn't going to be an acceptable answer for a lot of the people that want to have more control over that, I know. There are two answers to that, the first is from the human perspective, the second is from enforcement perspective. Let us deal with the first one first.&lt;/p&gt;  &lt;p&gt;Make it easy to do the right thing. I seem to be saying that a lot lately, but this is a core concept that all developers needs to assimilate.&lt;/p&gt;  &lt;p&gt;If loading a user from the database is as simple as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;usersRepository.Load(userID);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then you can be certain that no one will try to write this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;using(SqlConnection connection = new SqlConnection("Data Source=LocalHost;Initial Catalog=MyAppDB;"))&lt;/p&gt;    &lt;p&gt;{&lt;/p&gt;    &lt;p&gt;    connection.Open();     &lt;br /&gt;    SqlCommand cmd = connection.CreateCommand();      &lt;br /&gt;    cmd.CmmandText = "SELECT * FROM Users WHERE Id = " +userId;&lt;/p&gt;    &lt;p&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Yes, it is that simple. And yes, this assume non malicious people in the team. If you have those, termination is recommended. It is your choice whatever it would be of them or their employment.&lt;/p&gt;  &lt;p&gt;Enforcement is easy as well. Get &lt;a href="http://www.ndepend.com/Features.aspx"&gt;NDepends&lt;/a&gt; and setup the appropriate CQL queries. Something like: error if class in "MyApp.UI" references "MyApp.Infrastructure".&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10065.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/02/22/Handling-dependencies-in-a-one-assembly.aspx</guid>
            <pubDate>Fri, 22 Feb 2008 10:32:13 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2008/02/22/Handling-dependencies-in-a-one-assembly.aspx#feedback</comments>
            <slash:comments>18</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10065.aspx</wfw:commentRss>
        </item>
        <item>
            <title>The two project solution</title>
            <link>http://ayende.com/Blog/archive/2008/02/22/The-two-project-solution.aspx</link>
            <description>&lt;p&gt;Back to technical content :-)&lt;/p&gt; &lt;p&gt;This &lt;a href="http://codebetter.com/blogs/kyle.baley/archive/2008/02/11/how-do-you-build-your-application.aspx"&gt;post&lt;/a&gt; from &lt;a href="http://codebetter.com/blogs/kyle.baley/"&gt;Kyle Baley&lt;/a&gt; got me thinking about my last few projects. In them, I trended toward the assembly per logical layer of the app. So I had things like:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;MyApp.Model&lt;/li&gt; &lt;li&gt;MyApp.Web&lt;/li&gt; &lt;li&gt;MyApp.Services&lt;/li&gt; &lt;li&gt;MyApp.Infrastructure&lt;/li&gt; &lt;li&gt;MyApp.Tests&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;It worked, but at one point I found myself managing 18 projects solutions, and that was only because I was committed to reducing the number (otherwise it would have been much higher). I hear about people talking about 30 - 60 projects in a single solution, and there are people with more. Considering the cost of just managing that (not to mention the cost for compilation per project), that sounds like a very bad approach.&lt;/p&gt; &lt;p&gt;Right now, I think that on the next project I'll have the following structure:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;MyApp&lt;/li&gt; &lt;ul&gt; &lt;li&gt;/Model&lt;/li&gt; &lt;li&gt;/Web&lt;/li&gt; &lt;li&gt;/Services&lt;/li&gt; &lt;li&gt;/Infrastructure&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;MyApp.Tests&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Everything that the application does will be in a single project, without the need to split it off to a lot of separate projects. I found that the vaunted isolation that we seem to seek is achievable easily without forcing artificial barriers between the different parts of the application. It also means shorter compilation times and easier deployment mode.&lt;/p&gt; &lt;p&gt;More than everything else, it means that I have less noise to deal with.&lt;/p&gt; &lt;p&gt;I would extend that to an assembly per physical location, so assuming that I had a smart client application, I would use the following scheme:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;MyApp.Server&lt;/li&gt; &lt;li&gt;MyApp.Interfaces&lt;/li&gt; &lt;li&gt;MyApp.Client&lt;/li&gt; &lt;li&gt;MyApp.Tests&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;And that would be it.&lt;/p&gt; &lt;p&gt;Thoughts?&lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10064.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/02/22/The-two-project-solution.aspx</guid>
            <pubDate>Thu, 21 Feb 2008 22:09:23 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2008/02/22/The-two-project-solution.aspx#feedback</comments>
            <slash:comments>37</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10064.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Disinterest in technology</title>
            <link>http://ayende.com/Blog/archive/2008/02/11/Disinterest-in-technology.aspx</link>
            <description>&lt;p&gt;I just and took a look at the recent Dot Net Rocks show, as a way to look at "what the market is thinking about". I got some interesting responses from looking at the titles. I haven't listen to all of them (not by far), but I won't let that stop me from commenting.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=314"&gt;Adam Nathan on Popfly and Silverlight&lt;/a&gt;&lt;br /&gt;Not interested at all. Something that belongs to another planet as far as I am concerned. Combining Popfly (some sort of purple duck, I understand) and Silverlight puts it on the far reaches of Saturn, as far as I am concerned.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=313"&gt;Miguel de Icaza and Geoff Norton on Mono&lt;/a&gt;&lt;br /&gt;Defiantly interesting, I have been keeping an eye on Mono for a while, I am waiting to see how it works on the Mac, and I argued for Mono based deployment in several projects in the past. EC2 + Mono seems like a very interesting option.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=312"&gt;Andy Leonard on Unit Testing your Database&lt;/a&gt;&lt;br /&gt;Seems interesting, but mostly my answer to that is: Use in-memory database for that. Oh, and don't use SSIS. Rhino ETL is trivially testable, by the way.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=311"&gt;Kirk Munro on Powershell and PowerGUI&lt;/a&gt;&lt;br /&gt;Not interested in PowerShell beyond the most cursory of glances. If I want scripting, I got Boo. &lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=310"&gt;Simon Peyton Jones on Haskell and Functional Programming&lt;/a&gt;&lt;br /&gt;This is something that I have yet to listen, but it is interesting, mostly because it is a totally different mind-set than the one I usually use.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=309"&gt;Les Pinter Looks Back&lt;/a&gt;&lt;br /&gt;That was a fun show, not technical content, but really good to listen to it.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=308"&gt;Aaron Skonnard puts BizTalk and WCF Together&lt;/a&gt;&lt;br /&gt;I get the shivers just thinking about the subject, next.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=307"&gt;Sahil Malik Shares the Point&lt;/a&gt;&lt;br /&gt;And I'll keep on going missing the point. &lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=306"&gt;David Aiken on Bridging the Gap between Dev and IT&lt;/a&gt;&lt;br /&gt;This looks like an interesting show. &lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=305"&gt;Steven Lees on FeedSync&lt;/a&gt;&lt;br /&gt;Not interested, I even took a look at the description to ensure that I am not interested.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=304"&gt;Kathleen Dollard on the Evolution of Software Development&lt;/a&gt;&lt;br /&gt;That was a fun show.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=303"&gt;Ken Levy on Visual Studio Extensibility (VSX)&lt;/a&gt;&lt;br /&gt;I need to be interested in that, because I have a chapter about IDEs that I need to write, but... that is not an interesting topic to me. Go write in notepad.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=302"&gt;Jeff Prosise Goes Deep on Silverlight&lt;/a&gt;&lt;br /&gt;Did I mention that it is not interesting?&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=301"&gt;Joe Duffy on the Task Parallel Library&lt;/a&gt;&lt;br /&gt;That was a good show, and something that I actively looking at.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=300"&gt;Richard Campbell Tells All!&lt;/a&gt;&lt;br /&gt;Very good show.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=299"&gt;Jeff Palermo on ASP.NET MVC&lt;/a&gt;&lt;br /&gt;It was a good show, but the topic is not interesting, as far as I am concerned.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=298"&gt;Gael Fraiteur on PostSharp&lt;/a&gt;&lt;br /&gt;PostSharp is something that I keep looking at, haven't found the need for it, but it is an interesting project, and surprisingly outside my usual circles.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=297"&gt;Tomas Petricek on PHP in ASP.NET and Silverlight! &lt;/a&gt;&lt;br /&gt;Yawn, yawn. &lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=296"&gt;Open Source Panel Discussion at DevTeach, Vancouver&lt;/a&gt;&lt;br /&gt;I refer to this episode as the "if loop" show.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=295"&gt;Naveen Yajaman on Visual Studio Tools for Applications&lt;/a&gt;&lt;br /&gt;Through this show, I kept thinking: Or they could use Boo, get everything that they want and not have to pay "undisclosed" amount in licensing.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=294"&gt;Colin Miller and the .NET Micro Framework!&lt;/a&gt;&lt;br /&gt;Interesting in the abstract, not sure of its utility.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=293"&gt;F# Moves Forward&lt;/a&gt;&lt;br /&gt;I have this low level urge to look at F#, but I am just not interested enough.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=292"&gt;Dot Net Nuke Discussion Panel&lt;/a&gt;&lt;br /&gt;Not interested.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=291"&gt;Kent Alstad at Dev Connections!&lt;/a&gt;&lt;br /&gt;This should be a scalability show, which are generally interesting, except that I am sick of hearing about "don't use view state", or the fallacy of "scalability means that you can't use convient idioms"&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=290"&gt;Tim Sneath and Ian Ellison-Taylor on Windows Past, Present and Future&lt;/a&gt;&lt;br /&gt;That should be interesting. &lt;/li&gt; &lt;li&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=289"&gt;Pablo Castro on Astoria&lt;/a&gt;&lt;br /&gt;If I recall correctly, &lt;a href="http://andersnoras.com/blogs/anoras/archive/2007/07/12/the-mean-fiddler-plays-on.aspx"&gt;Anders Norås&lt;/a&gt; wrote an equivalent for that in a few hours. Not really interested.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I think that I'll leave interpretation of those for the comments, but it looks to me like technology topics are growing very old, very fast. &lt;/p&gt;&lt;img src="http://ayende.com/Blog/aggbug/10041.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ayende Rahien</dc:creator>
            <guid>http://ayende.com/Blog/archive/2008/02/11/Disinterest-in-technology.aspx</guid>
            <pubDate>Mon, 11 Feb 2008 21:52:34 GMT</pubDate>
            <comments>http://ayende.com/Blog/archive/2008/02/11/Disinterest-in-technology.aspx#feedback</comments>
            <slash:comments>19</slash:comments>
            <wfw:commentRss>http://ayende.com/Blog/comments/commentRss/10041.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>