<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>thinking in geek &#187; architecture</title>
	<atom:link href="http://joshrobb.com/blog/category/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://joshrobb.com/blog</link>
	<description>tagline's are so web2.0</description>
	<lastBuildDate>Wed, 02 Jun 2010 14:47:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ASP.NET == Usability disaster?</title>
		<link>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/</link>
		<comments>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 09:24:08 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/?p=18</guid>
		<description><![CDATA[[This has been in the queue for a long time - over 12 months - codebetter just tipped me over the edge!] Peter Van Dijck asks: I’ve only worked twice with companies using .NET for web interfaces, and in both cases the UI was a disaster and the usability problems guaranteed lots of consulting hours.. [...]]]></description>
			<content:encoded><![CDATA[<p>[This has been in the queue for a long time - over 12 months - codebetter just tipped me over the edge!]</p>
<p><a href="http://poorbuthappy.com/ease/archives/2007/05/01/3626/3626">Peter Van Dijck asks</a>:</p>
<blockquote><p>I’ve only worked twice with companies using .NET for web interfaces, and in both cases the UI was a disaster and the usability problems guaranteed lots of consulting hours.. Why is that? Or was that a fluke? (2 cases is hardly proof of anything) I know it’s possible to make usable and elegant web UI with any technology, but does .NET somehow encourage bad UI?</p></blockquote>
<p>This is a great question and in my opinion &#8211; the answer is yes. (Assuming that Peter really means WebForms.)  <img style="float:right" title="spike pit of death" src="http://www.hotkey.net.au/~marshalle/booby/pit.gif" alt="spike pit of death" width="350" height="321" /></p>
<p>This is demonstrated in so many small ways by framework defaults which are totally brain dead (__doPostBack anyone?). Rather than lead dev&#8217;s into the <a href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx">pit of success</a> &#8211; the framework leads devs to the spiky elephant trap of death. </p>
<p> <br />
What&#8217;s that &#8211; an example? How about the &lt;customErrors&gt; defaults. When an error occurs during processing an ASP.NET request &#8211; the <strong>default</strong> behavior of a new web.config is to redirect the user to another URL. This is what a new web.config looks like in VS2k5. </p>
<p>        &lt;customErrors mode=&#8221;RemoteOnly&#8221; defaultRedirect=&#8221;GenericErrorPage.htm&#8221;&gt;</p>
<p>            &lt;error statusCode=&#8221;403&#8243; redirect=&#8221;NoAccess.htm&#8221; /&gt;</p>
<p>            &lt;error statusCode=&#8221;404&#8243; redirect=&#8221;FileNotFound.htm&#8221; /&gt;</p>
<p>        &lt;/customErrors&gt;</p>
<div>This is really brain dead behavior! Let&#8217;s count the ways: </div>
<div>1. There&#8217;s no way to change the HTTP status code from a html page. (E.g. &#8211; should be 404, 500 etc). This is just flat out bad &#8211; status codes are important for lots of reasons.</div>
<div>2. The <strong><em>effing</em></strong> URL will change. This makes it difficult to correct typing errors or retry a request in case of a server error (500). </div>
<div>3. Those files don&#8217;t even exist! You can get a 404 when the real error is a 500 because the file that your getting redirected to don&#8217;t <strong>effing</strong> exist! </div>
<div>This just happened to me &#8211; I was just wondering if there is a port of the monorail SmartGridComponent to ASP.NET MVC. I do a Google search and get a <a href="http://devlicio.us/blogs/billy_mccafferty/archive/2008/08/10/41786.aspx">likely looking result for Billy McCafferty&#8217;s blog</a>. I click on the link and I get the following page: </div>
<div>
<blockquote>
<div><strong>Oops something went wrong!</strong></div>
<div>Either the site is offline or an unhandled error occurred. We apologize and have logged the error. Please try your request again or if you know who your site administrator is let them know too.</div>
</blockquote>
</div>
<p> </p>
<p>The URL in the browsers address bar is: </p>
<blockquote><p>http://devlicio.us/error.htm?aspxerrorpath=/themes/blogs/default/post.aspx</p></blockquote>
<div>HOW the F$%K do I try my request again?</div>
<div>If I&#8217;ve opened this result in a new tab (which is my habbit) I&#8217;m screwed! There is no back button, refresh (F5 or whatever) just reloads the error page and will <em>never</em> show me the correct page.</div>
<div>If I just clicked the link &#8211; the back button takes me back to my google search where I can click on the link again &#8211; refresh is still borked. </div>
<p>Another example? Linkbutton? Anyone who&#8217;s tried to open a link in a new tab/window and got a blank window with a URL like: javascript:__doPostBack(&#8216;ctl00$Masthead1$LocaleManagement$ctl00$ctl05&#8242;,&#8221;) &#8211; knows the pain I&#8217;m talking about. </p>
<p>Go on &#8211; right now &#8211; go try and open a MSDN library page in different language in a new tab. (It&#8217;s the little menu up the top right where it says (e.g.): United States &#8211; English). </p>
<p>In my apps &#8211; I fix this by disabling customErrors and writing new error handling code which both maintains the url and returns the correct HTTP statuses &#8211; but this is code which I should not have to write. This is code which all web servers/apps need to implement correctly &#8211; it should be automatic. We shouldn&#8217;t have to write custom code to get a HTTP/404 returned when an app encounters a missing file!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crappystrano</title>
		<link>http://joshrobb.com/blog/2008/01/02/crappystrano/</link>
		<comments>http://joshrobb.com/blog/2008/01/02/crappystrano/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 23:37:42 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[deployment]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2008/01/02/crappystrano/</guid>
		<description><![CDATA[Note: After I started this series Jeremy Miller has posted a very relevant article about source code hygiene issues. (This is the third part in a series &#8211; you should probably read part one and two first.) Today I&#8217;ll present a sanitised copy of my deployment script. I&#8217;ve based the design of deploy.cmd on Capistrano1 [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: After I started this series <a href="http://codebetter.com/blogs/jeremy.miller/">Jeremy Miller</a> has posted a very relevant <a href="http://codebetter.com/blogs/jeremy.miller/archive/2007/12/06/do-you-really-know-where-that-code-has-been.aspx">article about source code hygiene</a> issues. </em></p>
<p>(This is the third part in a series &#8211; you should probably read <a href="/blog/2007/11/30/automated-deployment-ci-for-operations/">part one</a> and <a href="/blog/2007/12/12/a-deployment-process/">two</a> first.)</p>
<p>Today I&#8217;ll present a sanitised copy of my deployment script.  I&#8217;ve based the design of deploy.cmd on Capistrano<sup>1</sup> . The script is nicknamed &#8220;Crappystrano&#8221;. Here&#8217;s the output (pretty htmlized <a href="/blog/wp-content/uploads/2007/11/deploy.html">source is here</a>):</p>
<blockquote><p>&gt;deploy.cmd</p>
<p>Crappystrano &#8211; the shit script which (sort of) deploys stuff</p>
<p>deploy.cmd staging|live [branchpath]</p></blockquote>
<p>Here&#8217;s breakdown of the steps<sup>2</sup> &#8211; skipping some error checking<sup>3</sup>. :</p>
<ol>
<li>Do we have the required dependencies<sup>4</sup> on the path? If we don&#8217;t copy them to the path if they&#8217;re just 1 exe &#8211; otherwise exit with an error.</li>
<li>Check the command line parameters. We must have the environment we&#8217;re releasing to? Are we releasing from the trunk or from a SVN branch?</li>
<li>Construct a release time stamp. This is YYYYMMDDHHMMSSMS.</li>
<li>Perform a &#8220;svn export&#8221; from the trunk/branch to %tmp%\staging|live%timestamp%. [E]</li>
<li>Use msbuild to build the solution. [E]</li>
<li>Rearrange the folder structure so we only get the artefacts we need in the release package.</li>
<li>Zip up the release package using the environment name + time stamp.</li>
<li>move the release package back to the root directory of the project and delete the export from %tmp%.</li>
<li>Make a SVN tag (svn copy trunk/branch /tags/environment-timestamp).</li>
</ol>
<p>I&#8217;ve <a href="/blog/wp-content/uploads/2007/11/deploy.zip">uploaded a zip file </a>with the script and folder structure + a little readme. This is not the best way of doing things &#8211; it&#8217;s just a very lightweight way. Comments, questions, feedback etc&#8230; are gratefully received.</p>
<ol class="footnotes"><li id="footnote_0_46" class="footnote">http://www.capify.org/ &#8211; I know some people are going to say &#8211; just use Capistrano. There are two reasons for me not to: 1. I&#8217;m the only person in my team familiar with Ruby. 2. Even if you argue that they don&#8217;t need to understand ruby to run a cap deployment recipe &#8211; they still have to have it installed. It&#8217;s just yet another dependency which I&#8217;m not willing to take currently. </li><li id="footnote_1_46" class="footnote">This is all simplified as the actual script supports a SaaS product which has multiple instances &#8211; one per client</li><li id="footnote_2_46" class="footnote">noted with [E]</li><li id="footnote_3_46" class="footnote">gnu zip.exe, svn</li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2008/01/02/crappystrano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A deployment process</title>
		<link>http://joshrobb.com/blog/2007/12/12/a-deployment-process/</link>
		<comments>http://joshrobb.com/blog/2007/12/12/a-deployment-process/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 11:57:51 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[deployment]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/12/12/a-deployment-process/</guid>
		<description><![CDATA[I know I said my next post would be my deployment script but after posting &#8211; I realised that I should do a 1000 foot overview of what I&#8217;m trying to achieve. For me &#8211; a successful deployment has a number of components: Build Code successfully builds&#160; tests pass. Versioning I know exactly which revision [...]]]></description>
			<content:encoded><![CDATA[<p>I know I said my next post would be my deployment script but after posting &#8211; I realised that I should do a 1000 foot overview of what I&#8217;m trying to achieve.
<p>For me &#8211; a successful deployment has a number of components:
<ul>
<li>Build
<ol>
<li>Code successfully builds&nbsp;
<li>tests pass.</li>
</ol>
<li>Versioning
<ol>
<li>I know exactly which revision was deployed from subversion.
<li>I know what environment it was deployed to.</li>
</ol>
<li>Deployment Safety
<ol>
<li>
<p>On my server I have the ability to rollback a deployment. </p>
</li>
</ol>
<li>Support
<ol>
<li>I can compare the current deployed version to previous releases when I need to do post-deployment production debugging. </li>
</ol>
</li>
</ul>
<p>To achieve this I use a number of conventions which I&#8217;ve borrowed and adapted from Capistrano. </p>
<p>My Subversion repository is structured so that every release get&#8217;s it&#8217;s own tag &#8211; including the environment which the release was made to<sup>1</sup> :</p>
<p><a href="http://joshrobb.com/blog/wp-content/uploads/2007/12/subversion-release-structure.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="subversion-release-structure" src="http://joshrobb.com/blog/wp-content/uploads/2007/12/subversion-release-structure-thumb.png" width="211" border="0"></a> </p>
<p>The tags are kind of self explanatory &#8211; the format is: </p>
<blockquote><p><font color="#333333">[environment]-YYYYMMDDHHMMSSMS</font>&nbsp;</p>
</blockquote>
<p>This is much easier than trying to remember that version 2.54.33.2 was released on Tuesday to client X. </p>
<p>In a deployment environment (staging or live) &#8211; each release is unpacked into it&#8217;s own folder.<sup>2</sup></p>
<p><a href="http://joshrobb.com/blog/wp-content/uploads/2007/12/iis-release-folders.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="52" alt="iis-release-folders" src="http://joshrobb.com/blog/wp-content/uploads/2007/12/iis-release-folders-thumb.png" width="204" border="0"></a></p>
<p>After a deployment package has been unpacked on the server there will be a new folder for the release. Making a release active involves a couple of (currently) non-automated steps:</p>
<ol>
<li>Updating the database connection details (this is a matter of copying a database.config into the release folder<sup>3</sup> ).&nbsp;
<li>running a DB upgrade
<li>changing the webroot in IIS </li>
</ol>
<p>People who are paying attention will notice that this process is not necessarily atomic. Depending on the DB changes &#8211; it&#8217;s possible that the old/new code cannot run on the same database &#8211; in this case I drop a app_offline.htm &#8211; into the previous release folder before I run the DB upgrade. </p>
<ol class="footnotes"><li id="footnote_0_45" class="footnote">The folders in /tags are client names. This is because our SaaS app is released per-client &#8211; not multi tenanted. i.e. Each client is running a different version at any given time &#8211; and is upgraded to the latest trunk as necessary.</li><li id="footnote_1_45" class="footnote">The occluded bits are the client name &#8211; this is for convenience in managing release packages (zip files) as the server has a folder for each client</li><li id="footnote_2_45" class="footnote">this is the only thing on the server which is not versioned in subversion. My web.config has the following: &lt;connectionStrings configSource=&#8221;database.config&#8221;/&gt; &#8211; this file just contains the connection details for the application. </li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/12/12/a-deployment-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ControllerAction] and sane defaults</title>
		<link>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/</link>
		<comments>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 02:04:35 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/</guid>
		<description><![CDATA[[Ed: For anyone who's living under a bush Microsoft have released a CTP of the new ASP.NET MVC framework. ] I&#8217;m reluctant to get involved in this &#8211; but I feel like there&#8217;s another side to this story which is worth considering. Since it was first presented at altnetconf &#8211; the decision to require users1 [...]]]></description>
			<content:encoded><![CDATA[<p>[Ed: For anyone who's living under a bush Microsoft have released a CTP of the new ASP.NET MVC framework. ]</p>
<p>I&#8217;m reluctant to get involved in this &#8211; but I feel like there&#8217;s another side to this story which is worth considering.</p>
<p>Since it was first presented at altnetconf &#8211; the decision to require users<sup>1</sup> to have to specify which methods on controllers are available to be routed to ([ControllerAction]) and which view (RenderView()) to render has come in for <a href="http://www.lostechies.com/blogs/sean_chambers/archive/2007/12/08/phil-haack-posts-about-asp-net-mvc.aspx">a</a> <a href="http://tech.groups.yahoo.com/group/altnetconf/msearch?query=%5BControllerAction%5D&amp;submit=Search&amp;charset=ISO-8859-1">lot </a>of <a href="http://ayende.com/Blog/archive/2007/12/08/Configuration-over-Convention.aspx">criticism</a>.</p>
<p>Lots of the brightest and best minds in the .net world are screaming about this in various forums. Claiming that it violates:</p>
<ul>
<li> the DRY principle</li>
<li>convention over configuration</li>
<li>best practice in other frameworks</li>
<li>commonly accepted laws of physics</li>
</ul>
<p>Not one of the people complaining is going to use this framework vanilla. They are going to add their own layer of behavior over the top. It&#8217;s been designed to make it easy (trivial in this case) to extend and change the policy.</p>
<p>Sane defaults are <strong>really</strong> important for frameworks. Yes they get in the way of power users.  Yes it normally takes a power user 10 minutes to work around them and add that piece of code to their toolbox from then on.</p>
<p>I don&#8217;t know how many people were following the emergent rails community back in 2005 when the Google <a href="http://www.37signals.com/svn/archives2/google_web_accelerator_hey_not_so_fast_an_alert_for_web_app_designers.php">Web Accelerator</a> was <a href="http://radar.oreilly.com/archives/2005/05/google_web_acce_1.html">released</a> &#8211; but many of them (including the <a href="http://www.loudthinking.com/arc/000454.html">smartest</a><sup>2</sup> ) got a <a href="http://www.intertwingly.net/blog/2005/05/06/This-Stuff-Matters">salient</a> <a href="http://www.intertwingly.net/blog/2005/10/24/Theyre-baaaaaaack">lesson</a> in <a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html">GET idempotence</a>. (i.e. GET Order?id=23&amp;action=delete &#8211; should <em>never</em> delete anything).</p>
<p>Here was a situation where the framework (rails) came with not so safe defaults and bad example code which encouraged doing the wrong thing.  These days &#8211; rails has absorbed this lesson so completely that it could be described as a REST server and in some ways leads developers into following best practices for web apps by default.</p>
<p>I really don&#8217;t understand what the huge deal is here? This seems as clear cut to me as the built in RequestValidation in ASP.NET or automatically escaping SqlParameters for SQL injection. Sure &#8211; if your a power user it can be a pain &#8211; but it takes 10 seconds to turn off and then your responsible when your site get p0wn&#8217;d.</p>
<p>It&#8217;s not like ControllerBase is sealed.</p>
<ol class="footnotes"><li id="footnote_0_48" class="footnote">by default &#8211; but <a href="http://haacked.com/archive/2007/12/09/extending-asp.net-mvc-to-add-conventions.aspx">easily modifiable</a></li><li id="footnote_1_48" class="footnote">or is that loudest?</li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated deployment == CI for Operations</title>
		<link>http://joshrobb.com/blog/2007/11/30/automated-deployment-ci-for-operations/</link>
		<comments>http://joshrobb.com/blog/2007/11/30/automated-deployment-ci-for-operations/#comments</comments>
		<pubDate>Fri, 30 Nov 2007 17:20:00 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[deployment]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/11/30/automated-deployment-ci-for-operations/</guid>
		<description><![CDATA[Deployment is a subject that is near and dear to my heart. I&#8217;m almost always the guy who gets to debug production problems, deployment problems and generally wears a developer + infrastructure hat.1 When it comes to web applications &#8211; most teams don&#8217;t bother automating their deployment processes. This is something that I think is [...]]]></description>
			<content:encoded><![CDATA[<p>Deployment is a subject that is near and dear to my heart. I&#8217;m almost always the guy who gets to debug production problems, deployment problems and generally wears a developer + infrastructure hat.<sup>1</sup></p>
<p>When it comes to web applications &#8211; most teams don&#8217;t bother automating their deployment processes. This is something that I think is in the process of changing<sup>2</sup> &#8211; but is not yet a generally accepted practice on a par with TDD, user stories or iterations.</p>
<p>At a minimum &#8211; it should be possible to:</p>
<ol>
<li>Issue a single command which creates a release package for your project. (i.e. built, tested, tagged in subversion and zipped up). For me &#8211; this tool/command is called: deploy.cmd and is just a batch file.</li>
<li>Issue another command in your deployment environment which will configure the new release. (i.e. update IIS root, upgrade the database, update connection strings + any other configuration required).</li>
</ol>
<p>In my current project I&#8217;ve built 1. For me 2 does not exist as a single command line (It&#8217;s currently a combination of several tools &#8211; this should be changed!).</p>
<p>In my next post I&#8217;ll outline my very simple solution for this. Just to get the conversation started.</p>
<ol class="footnotes"><li id="footnote_0_26" class="footnote">Ten years ago &#8211; part of my job was building deployment packages for desktop applications (this is pre MSI). Identifying all the dependencies of an app and scripting them into an install package and testing the deployment was at times almost a full time job.</li><li id="footnote_1_26" class="footnote">there have been a couple of good threads about this on the <a href="http://tech.groups.yahoo.com/group/altnetconf/">altnetconf mailing list</a></li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/11/30/automated-deployment-ci-for-operations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enterprise plaforms &#8211; teaching new dogs old tricks</title>
		<link>http://joshrobb.com/blog/2007/11/19/enterprise-plaforms-teaching-new-dogs-old-tricks/</link>
		<comments>http://joshrobb.com/blog/2007/11/19/enterprise-plaforms-teaching-new-dogs-old-tricks/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 23:23:19 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/11/19/enterprise-plaforms-teaching-new-dogs-old-tricks/</guid>
		<description><![CDATA[Oren is talking about building a substrate for an enterprise platform. This has been something I&#8217;ve wanted to do since I first got my hands on c# and the rest of the .net framework in 2001. I&#8217;ve never done it because it always seemed that a one size fits all solution would be unworkable. At [...]]]></description>
			<content:encoded><![CDATA[<p>Oren is talking about building a <a href="http://ayende.com/Blog/archive/2007/11/17/A-vision-of-enterprise-platform.aspx">substrate for an enterprise platform</a>. This has been something I&#8217;ve wanted to do since I first got my hands on c# and the rest of the .net framework in 2001. I&#8217;ve never done it because it always seemed that a one size fits all solution would be unworkable.</p>
<p>At the time &#8211; the best web architecture I knew of was the <a href="http://en.wikipedia.org/wiki/ArsDigita_Corporation">ArsDigita</a> <a href="http://en.wikipedia.org/wiki/ArsDigita_Community_System">Community System</a> (still available and maintained as <a href="http://openacs.org/">OpenACS</a>). What Oren is describing sounds similar in many ways.</p>
<p>The ACS architecture is based on the days when Oracle and TCL were good options for building web based systems&#8230;. but the underlying design is still very very good (e.g. it was the first place I every saw the Party pattern). They were focused on designing good data models and separating concerns.</p>
<p>They have the following available in their <a href="http://openacs.org/doc/current/kernel-doc.html">kernel</a>:</p>
<ul>
<li><a href="http://openacs.org/doc/current/parties.html">Parties</a>, Users and <a href="http://openacs.org/doc/current/groups-design.html">(nestable) groups</a></li>
<li><a href="http://openacs.org/doc/current/permissions-tediously-explained.html">A permissions system</a> which supports per &#8220;<a href="http://openacs.org/doc/current/objects.html">object</a>&#8221; (think row) permissions.</li>
<li>A <a href="http://openacs.org/doc/current/apm-design.html">package manager</a> which allows you to install (and remove) modules of functionality into an existing system (including schema changes, new routes etc). e.g. adding a e-commerce, blogging or threaded discussion module is a matter of clicking in a web ui.</li>
<li><a href="http://openacs.org/doc/current/tutorial-schedule-procs.html">Scheduled tasks</a></li>
</ul>
<p>This thing was and is pretty scalable (it runs the <a href="http://photo.net">photo.net</a> community).</p>
<p>It&#8217;s over 10 years old still a source of good ideas. I recommend taking a poke around their documentation and seeing what you can learn.</p>
<p>(I remember reading once that Philip Greenspun &#8211; the original ACS designer was asked by Microsoft to build a new version while the .net framework 1.0 was in development as a showpiece. For some reason he didn&#8217;t but I always felt that it was a shame this never happened).</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/11/19/enterprise-plaforms-teaching-new-dogs-old-tricks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eric Evans on over-design and intrinsic complexity</title>
		<link>http://joshrobb.com/blog/2007/11/07/eric-evans-on-over-design-and-intrinsic-complexity/</link>
		<comments>http://joshrobb.com/blog/2007/11/07/eric-evans-on-over-design-and-intrinsic-complexity/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 17:13:18 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/11/07/eric-evans-on-over-design-and-intrinsic-complexity/</guid>
		<description><![CDATA[Just watched a great presentation by Eric Evans (of Domain Driven Design fame) called: Strategic Domain-Driven Design &#8211; Effective Modelling for Larger Projects. I highly recommend it. Here&#8217;s a couple of great quotes (It&#8217;s worth noting that he&#8217;s talking about large projects): Not everything is going to be well designed. You may have a part [...]]]></description>
			<content:encoded><![CDATA[<p>Just watched a great presentation by <a href="http://domainlanguage.com/about/ericevans.html">Eric Evans</a> (of <a href="http://domaindrivendesign.org/books/index.html#DDD">Domain Driven Design</a> fame) called: <a href="http://www.parleys.com/display/PARLEYS/Strategic%20Domain-Driven%20Design%20-%20Effective%20Modeling%20for%20Larger%20Projects?showComments=true">Strategic Domain-Driven Design &#8211; Effective Modelling for Larger Projects</a>. I highly recommend it.</p>
<p>Here&#8217;s a couple of great quotes (It&#8217;s worth noting that he&#8217;s talking about large projects):</p>
<blockquote><p>Not everything is going to be well designed.</p></blockquote>
<blockquote><p>You may have a part [of a system] which is not complex &#8211; or is just straight forward data collection. You&#8217;ve got a lot of screens , a lot of fields. You&#8217;ve got to put it into the data base and do a simple report on it.</p>
<p>Don&#8217;t spent a lot of effort modelling these things. Just find some simple technology that&#8217;s good at that stuff.</p></blockquote>
<blockquote><p><font color="#003330">The idea that the entire system is going to be based on an object oriented model is I think is a highly questionable assumption. </font></p></blockquote>
<p>It&#8217;s a really interesting perspective &#8211; and a great antidote to some of the discussion at the moment which almost treats DDD as a silver bullet.</p>
<p>Anyone who&#8217;s feeling guilty because they don&#8217;t have their solutions structured into Core, Model, Services, Presentation, UI layers &#8211; or even worse is using a SqlDataSource control in their app &#8211; should watch it. It&#8217;s an excellent dose of pragmatism.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/11/07/eric-evans-on-over-design-and-intrinsic-complexity/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
