<?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>Francis Shanahan[.com] &#187; architecture</title>
	<atom:link href="http://francisshanahan.com/index.php/tag/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://francisshanahan.com</link>
	<description>Thoughts on technology from a citizen scientist</description>
	<lastBuildDate>Fri, 27 Jan 2012 14:18:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>ExtJS, Metadata and GWT</title>
		<link>http://francisshanahan.com/index.php/2010/extjs-metadata-gwt/</link>
		<comments>http://francisshanahan.com/index.php/2010/extjs-metadata-gwt/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 01:37:51 +0000</pubDate>
		<dc:creator>Francis</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Headline]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://francisshanahan.com/?p=2478</guid>
		<description><![CDATA[Back around New Years I was looking for a way to simplify creation of cross-browser, DDA accessible HTML. Screens basically. They had to be very rich with lots of bells and whistles and they had to perform. Ideally this system had to be so simple to use that a non-technical person could create XBrowser, DDA compliant screens.  I decided to take a second look at ExtJS and it has come a long way since I&#8217;d seen it last. 
Using ExtJS you can create a screen programmatic-ally using classes and ...]]></description>
			<content:encoded><![CDATA[<p>Back around New Years I was looking for a way to simplify creation of cross-browser, DDA accessible HTML. Screens basically. They had to be very rich with lots of bells and whistles and they had to perform. Ideally this system had to be so simple to use that a non-technical person could create XBrowser, DDA compliant screens.  I decided to take a second look at ExtJS and it has come a long way since I&#8217;d seen it last. </p>
<p>Using ExtJS you can create a screen programmatic-ally using classes and method calls but one of the neat features is that a screen can be entirely described declaratively in JSON notation.  Declarative UI is nice, but a meta-data driven UI is nicer. I&#8217;ve created such systems in the past but always had to spend so much time maintaining the thing that interpreted the metadata (Sapient Powerbuilder Framework anyone???). </p>
<p>With ExtJS this could be avoided by just serializing the JSON into a database and back again. Eureka! I had a pretty nice metadata driven declarative UI with MINIMAL investment in  &#8220;framework&#8221; code. Minimal investment in this type of &#8220;framework wrapper stuff&#8221; corresponds to a good upgrade path, quick time to market and very low likelihood that my &#8220;metadata wrapper&#8221; would break anything in the underlying ExtJS library. </p>
<p>Intrigued and not wanting to practice &#8220;architecture space exploration&#8221; [<a href="http://www.joelonsoftware.com/articles/fog0000000018.html">LINK</a>] I wrote a proof of concept and built some screens out of metadata. </p>
<p>There was just one snag; ExtJS could paint the screen but in order to wire it to data it needed a bit of Javascript code to be written. With a complex screen this JS might grow to as much as 200-300 lines. Debugging JS with Firebug, Dynatrace etc. doesn&#8217;t scare me but it doesn&#8217;t sound good to an architecture review board either.</p>
<p>No good deed goes unpunished. It was mentioned that GWT could be used to write the same thing except instead of Javascript, developers could wire up their screens with Java code. The promise of Eclipse, PMD, FindBug and all that java-y goodness was just too much to argue against so I&#8217;ve spent the last few weeks in GWT hell and finally come full circle. </p>
<p>&lt;rant&gt;Just a second, hey, why did I do this? Well I like to know what I&#8217;m talking about. If I&#8217;m going to be responsible for something I want to know it&#8217;s going to work BEFORE we start. I don&#8217;t want to be an architecture astronaut who just reads the brochure. Everyone can read the brochure. I wouldn&#8217;t follow someone like that and I don&#8217;t expect my team to. &lt;/rant&gt;</p>
<p>GWT (Google Web Toolkit) is essentially a compiler that takes your Java code and instead of byte code produces JavaScript. It does a nice job, traversing code paths so that only the bare minimum Javascript is sent down to the browser. It looks like a dogs dinner though. </p>
<p>Enter Ext GWT, Smart GWT (formerly GWT Ext) and MyGWT. Seems everyone has a GWT library, never a good sign imho. </p>
<p>GWT needs to know every execution path at compile time and hence it doesn&#8217;t support reflection. First problem was how to paint the screens from metadata. This can be achieved with GWT.create() but wiring the widgets to Java code with string literals is not possible. </p>
<p>In my use case, the developer should configure the metadata, the framework should paint the screen, the developer should write some Java code for screen logic, then wire the two together. There&#8217;ll be 300+ developers worldwide of varying experience levels so it&#8217;s gotta be simple to use. </p>
<p>I looked at Deferred Binding; &#8220;Deferred Binding is Google Web Toolkit&#8217;s answer to Java reflection.&#8221; BINGO!!! that&#8217;s got to be exactly what I&#8217;m looking for, it even says &#8220;reflection&#8221; on the box. </p>
<p>From http://code.google.com/webtoolkit/doc/1.6/FAQ_Client.html</p>
<blockquote><p>One way to think of this is as &#8220;dynamic class-loading that occurs at compile time instead of execution time.&#8221; When the GWT Compiler compiles your Java application, it determines all the different &#8220;idiosyncrasies&#8221; that it must support, and generates a separate, tightly streamlined version of the application for that specific configuration. For example, it generates a different version of the application file for Firefox than it does for Opera.</p></blockquote>
<p>reading on&#8230;</p>
<blockquote><p>It&#8217;s probably pretty clear by now that Deferred Binding works a little differently than standard dynamic binding. Conceptually, though, the two concepts are fairly similar, and in practice all you usually need to do is just substitute a GWT method for a Java Reflection method. Instead of Class.forName(&#8220;MyClass&#8221;) you use GWT.create(MyClass).</p></blockquote>
<p>So although Deferred Binding is the GWT&#8217;s answer to reflection, you cannot invoke a method using a string literal, you cannot create a class unless it&#8217;s known at compile time and you cannot hook up to an event without compile-time knowledge of the handler. </p>
<p>This makes metadata a pretty tough proposition. To add to the frustration, examples for Deferred Binding were so thin on the ground that it took me 2 evenings to get something working. I&#8217;ll post an example in the coming days to &#8220;pay it forward&#8221;. </p>
<p>Not to be outdone I looked at Generators. Again, no examples to be found anywhere, I&#8217;ll post one in a day or two. Generators basically let you generate java code at compile time, this code you never see but is then turned into Javascript. Honestly the GWT compiler must make 10 passes. </p>
<p>Generators could work. Using Generators would possibly allow the creation of a metadata UI framework however, it would take an enormous amount of fairly skilled coding to make this happen. They&#8217;d also be very brittle and tough to build; e.g. you have to write out java code using the GWT equivalent of a printf. You&#8217;ve no way of knowing if the code will run or not until it&#8217;s too late. Certainly very little chance of testing it. Rocket [<a href="http://code.google.com/p/rocket-gwt/">LINK</a>] claims to fix this problem but frankly this project is far too immature to be of any use. </p>
<p>Gwittir [<a href="http://code.google.com/p/gwittir/">LINK</a>] is another option that claims to support Reflection. That&#8217;s dependent on GWTx and Google Gears. One of my pet-peeves about the open source world is all the dependencies. Don&#8217;t make me download 10 other things/frameworks just to draw HelloWorld. GGears is not an option for me so Gwittir is out. </p>
<p>Lastly, all these frameworks claim to optimize the Javascript, and they are true to that claim, HOWEVER, the third party libraries like SmartGWT, ExtGWT, etc. don&#8217;t optimize the widget Javascript. If you&#8217;re using SmartGWT&#8217;s grid, guess what, you&#8217;re downloading 500KB of widget JS. </p>
<p>So I&#8217;ve come full circle. For me, ExtJS seems like a good fit, easy to use, easy to drive off metadata and sure I have to write some Javascript but I&#8217;ll take a few lines of Javascript/Firebug over the mess that is Deferred Binding and Printf-style Code Generation anyday. Don&#8217;t knock it OR recommend it until you&#8217;ve tried it and fly safe.</p>
]]></content:encoded>
			<wfw:commentRss>http://francisshanahan.com/index.php/2010/extjs-metadata-gwt/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Logical Fallacies in Software Architecture</title>
		<link>http://francisshanahan.com/index.php/2008/logical-fallacies-in-software-architecture/</link>
		<comments>http://francisshanahan.com/index.php/2008/logical-fallacies-in-software-architecture/#comments</comments>
		<pubDate>Wed, 14 May 2008 06:59:00 +0000</pubDate>
		<dc:creator>Francis</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://francisshanahan.com/www/index.php/2008/logical-fallacies-in-software-architecture/</guid>
		<description><![CDATA[I&#8217;ve been trying to improve my critical thinking abilities of late and to that end, the Skeptic&#8217;s Guide the Universe [LINK] has been very helpful. It&#8217;s through this means I&#8217;ve been re-exposed to the notion of the &#34;logical fallacy&#34;. Here&#8217;s a link if you&#8217;re not familiar with the concept [LINK]. 
&#34;A logical fallacy is a false or incorrect logical principle. An argument  												that is based upon a logical fallacy is therefore not valid.&#34;
Example A=B and B=C therefore A=C. 
A logical fallacy might be A=C and B=D therefore A=B. 
There&#8217;s ...]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been trying to improve my critical thinking abilities of late and to that end, the Skeptic&#8217;s Guide the Universe [<a target="_blank" href="http://www.theskepticsguide.org">LINK</a>] has been very helpful. It&#8217;s through this means I&#8217;ve been re-exposed to the notion of the &quot;logical fallacy&quot;. Here&#8217;s a link if you&#8217;re not familiar with the concept [<a target="_blank" href="http://www.theskepticsguide.org/logicalfallacies.asp">LINK</a>]. </p>
<p><font class="txt_body_8">&quot;A logical fallacy is a false or incorrect logical principle. An argument  												that is based upon a logical fallacy is therefore not valid.&quot;</p>
<p>Example A=B and B=C therefore A=C. </p>
<p>A logical fallacy might be A=C and B=D therefore A=B. </p>
<p>There&#8217;s essentially no basis for this A=B assertion. This is a trivial example and easily pointed out. When you get into things more complex items reflecting items in the real-world it gets harder. </p>
<p>Here are some Logical Fallacies I&#8217;m seeing in software design:  </p>
<p></font><font class="txt_body_8"><font class="txt_darkblue_10">1) </font><strong><font class="txt_darkblue_10">Argument from authority</font>:	</strong>Stating that a claim is true because a person or group of perceived authority says it is true. E.g. &quot;this thing scales, the vendor said so&quot;.</p>
<p>2) <strong>Looks Good on Paper:</strong> A particular design looks elegant and can be easily explained on paper. However is non-performant and entirely unmaintainable in real-life. Example of this is the &quot;enterprise service bus&quot;. <br />
</font><font class="txt_body_8"><br />
3) <strong>Design from Best of Breed: </strong>Identify the functional areas covered by your architecture, then pick best of breed in each area. You end up with a master of all trades, Jack of none. Your system needs to hang together, you can&#8217;t take each area in isolation.&nbsp; These days with software acquisitions you can&#8217;t even be guaranteed that choices from a single vendor will hang together as they might have been developed by different smaller companies. </p>
<p>I probably have a few more if I were to think about it. These sort of build on an earlier post &quot;Vegetable Design Patterns&quot; [<a href="http://francisshanahan.com/detail.aspx?cid=626" target="_blank">LINK</a>]. </p>
<p>More on this later&#8230;<br />
</font></p>
]]></content:encoded>
			<wfw:commentRss>http://francisshanahan.com/index.php/2008/logical-fallacies-in-software-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Citigroup&#8217;s Marc Adler on Enterprise 2.0</title>
		<link>http://francisshanahan.com/index.php/2008/citigroups-marc-adler-on-enterprise-20/</link>
		<comments>http://francisshanahan.com/index.php/2008/citigroups-marc-adler-on-enterprise-20/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 06:36:00 +0000</pubDate>
		<dc:creator>Francis</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://francisshanahan.com/www/index.php/2008/citigroups-marc-adler-on-enterprise-20/</guid>
		<description><![CDATA[My buddy Marc [LINK] is on the panel at next week&#8217;s [LINK] 2008 Web Services/SOA on Wall Street (Monday, February 11th). 
Here is a blurb about the panel:
Beyond Web 2.0&#8230;What Enterprise 2.0 Is&#8230;And What It Means For Wall Street

Beyond Web 2.0, Enterprise 2.0 is about deploying these new technologies and social practices in a corporate business context.
This session will explore the drivers pushing Enterprise 2.0 adoption, survey relevant technologies, and discuss how Wall Street and the financial markets are benefiting.
Tom Steinthal, Managing Director, Financial Services, BSG Alliance (Moderator)
Marc Adler, Senior ...]]></description>
			<content:encoded><![CDATA[<p>My buddy Marc [<a target="_blank" href="http://magmasystems.blogspot.com/">LINK</a>] is on the panel at next week&#8217;s [<a target="_blank" href="http://magmasystems.blogspot.com/2008/01/i-will-be-at-2008web-service-conference.html">LINK</a>] 2008 Web Services/SOA on Wall Street (Monday, February 11th). </p>
<p>Here is a blurb about the panel:</p>
<p><strong><span style="font-size: 130%;">Beyond Web 2.0&#8230;What Enterprise 2.0 Is&#8230;And What It Means For Wall Street<br />
</span></strong><br />
Beyond Web 2.0, Enterprise 2.0 is about deploying these new technologies and social practices in a corporate business context.</p>
<p>This session will explore the drivers pushing Enterprise 2.0 adoption, survey relevant technologies, and discuss how Wall Street and the financial markets are benefiting.</p>
<p><a href="http://www.lighthouse-partners.com/wsonws/del_speakers.htm#Steinthal">Tom Steinthal</a>, Managing Director, Financial Services, BSG Alliance (Moderator)<br />
<strong><a href="http://www.lighthouse-partners.com/wsonws/del_speakers.htm#Adler">Marc Adler</a>, Senior Vice President, Equities and Head of Complex Event Processing, Citigroup</strong><br />
<a href="http://www.lighthouse-partners.com/wsonws/del_speakers.htm#Ogrinz">Michael Ogrinz</a>, Principal Architect for Global Markets, Bank of America<br />
<a href="http://www.lighthouse-partners.com/wsonws/del_speakers.htm#Rochelle">Jonathan Rochelle</a>, Senior Product Manager, Google</p>
<p>Should be an interesting discussion.</p>
]]></content:encoded>
			<wfw:commentRss>http://francisshanahan.com/index.php/2008/citigroups-marc-adler-on-enterprise-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Does the DisplayToken Violate the First Law of Identity?</title>
		<link>http://francisshanahan.com/index.php/2007/does-the-displaytoken-violate-the-first-law-of-identity/</link>
		<comments>http://francisshanahan.com/index.php/2007/does-the-displaytoken-violate-the-first-law-of-identity/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 12:35:00 +0000</pubDate>
		<dc:creator>Francis</dc:creator>
				<category><![CDATA[Digital Identity]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[identity]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://francisshanahan.com/www/index.php/2007/does-the-displaytoken-violate-the-first-law-of-identity/</guid>
		<description><![CDATA[I have been following along with the Identity story for some time now. 
Cardspace as an Identity selector supports two basic models; 

Self-Issued Cards in which essentially you act as your own security token service and
Managed cards &#8211; in which a trusted third party acts as Identity Provider making assertions around your identity.
    

I have seen many examples leveraging self-issued cards but relatively few incorporating managed cards. There is a sample STS available on the http://cardspace.netfx3.com website but due to the complex nature of it I&#8217;ve found ...]]></description>
			<content:encoded><![CDATA[<p>I have been following along with the Identity story for some time now. <br />
Cardspace as an Identity selector supports two basic models; </p>
<ol>
<li>Self-Issued Cards in which essentially you act as your own security token service and</li>
<li>Managed cards &#8211; in which a trusted third party acts as Identity Provider making assertions around your identity.
    </li>
</ol>
<p>I have seen many examples leveraging self-issued cards but relatively few incorporating managed cards. There is a sample STS available on the <a target="_blank" href="http://cardspace.netfx3.com">http://cardspace.netfx3.com</a> website but due to the complex nature of it I&#8217;ve found it challenging to set up and leverage. If you look at the message boards they are full of issues and questions involving managed cards. </p>
<p>To mitigate this I&#8217;ve put together a managed STS and will be hosting it here from my own website in the coming days. It&#8217;ll allow you to setup a relying party, setup claims and test values for same and even download a managed card. </p>
<p>I&#8217;ll also provide a generic test harness that&#8217;ll simulate your relying party and allow you to test the end to end interactions. Last thing it&#8217;ll do is provide you with the RST and RSTR structures passed around in XML as we go. </p>
<p>I hope this&#8217;ll be a useful service and a useful learning tool and there&#8217;ll be more to come on that in a few days. (as a side note I&#8217;m surprised Serrack or Microsoft hasn&#8217;t set this up themselves by now). </p>
<p>But of course there is a selfish agenda to all my work and the main reason I did this is because I wanted to understand the inner workings of a security token service. This (painful) process has shown me&#8230;</p>
<ol>
<li>how it processes the Request for a Security Token</li>
<li>how it generates the Request for a Security Token Response</li>
<li>how the Cardspace Identity Selector will process that and lastly 
    </li>
<li>how to consume the token on the Relying Party side. </li>
</ol>
<p>When an RP indicates it needs a claim, let&#8217;s say <br />
http://schemas.francisshanahan.com/sts/superclaim</p>
<p>Cardspace includes that as a required (or optional) claim in an RST. The Security Token Service reads this, (presumably) locates the value for this claim and then includes that value in an RSTR. </p>
<p>One thing I was surprised to learn is that Cardspace Identity Selector doesn&#8217;t actually display this value! The ID selector actually displays a value from what&#8217;s called a &quot;Display token&quot;. Here&#8217;s where things begin to break down (for me)&#8230;</p>
<p>The values in the Display Token are actually what get displayed to the user.</p>
<p>So tying back to the Laws of Identity: The user should have knowledge and control over what gets sent to any Relying Party. </p>
<p>This Displaytoken seems to violate this as follows&#8230;</p>
<ol>
<li>There is nothing that prevents the STS from including claims in the RSTR that were not requested in the RST.&nbsp; Thus an STS could 
<ul>
<li>ignore the &quot;isOptional&quot; attribute of each claim and include that information regardless.</li>
<li>Or worse still, an STS could include claim values that WERE NEVER requested. I&#8217;ve tried this with my own STS and Cardspace happily forwards these on to the RP for decryption. </li>
</ul>
</li>
<li>There is nothing that prevents the STS from including Values in the Display Token that are DIFFERENT from the values in the actual claims token. So for example, it may be shown to the user that they are passing an email address of &quot;foo@bar.com&quot; but in reality the value being sent to the RP is actually &quot;mypersonal@emailAddress.com&quot;. The user wouldn&#8217;t know at best until the RP processed the RSTR token.</li>
<li>Whilst the Security token is encrypted and bundled up nicely to protect its information, the DisplayToken is sent in clear (to allow the Cardspace selector to display it). Now what&#8217;s the point of protecting your claims in a security token if you go ahead and put those same claims in a Display token? How can we have user control and consent (Law #1) without violating the security of the data itself? 
    </li>
</ol>
<p>So it seems once again I have confounded myself with Identity by delving into the details. Perhaps it would be better to just go along with the whiteboard conversations and ws-trust what I&#8217;m being ws-told rather than ws-implement it? </p>
<p>It would appear based on my rudimentary investigations that there&#8217;s a potential for the first Law to be broken either through <br />
a) Unwittingly implementing an STS that pumps in claims into an RSTR without looking at the RST. <br />
b) A malicious STS mis-representing claims to a end user and secretly passing different information to an RP. </p>
<p>This for me was the kind of &quot;Ahaah&quot; moment that would typically not be uncovered until knee deep in an implementation and could potentially derail a project. I&#8217;m not saying this is the fault of&nbsp; Cardspace, or even the Identity Meta-System. Rather I think this is a problem that&#8217;s just inherent with Law #1. As with anything I tend to find there is a lot of buzz around the high-level solution but sometimes when you dive a level deeper, you come to find out there may actually be a problem [<a target="_blank" href="http://www.francisshanahan.com/detail.aspx?cid=539">LINK</a>]. </p>
<p>That&#8217;s why it&#8217;s always better to be an &quot;I-know-it-works-because-I-tried-it,-look-my-hands-are-dirty&quot; architect than an &quot;I-don&#8217;t-know-what-the-problem-could-be,-it-compiled-on-the-whiteboard&quot; architect.</p>
<p>I will talk to Kim[<a target="_blank" href="http://identityblog.com">LINK</a>] about this&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://francisshanahan.com/index.php/2007/does-the-displaytoken-violate-the-first-law-of-identity/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Vegetable Design Patterns</title>
		<link>http://francisshanahan.com/index.php/2007/vegetable-design-patterns/</link>
		<comments>http://francisshanahan.com/index.php/2007/vegetable-design-patterns/#comments</comments>
		<pubDate>Tue, 18 Sep 2007 06:19:00 +0000</pubDate>
		<dc:creator>Francis</dc:creator>
				<category><![CDATA[General Computing]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://francisshanahan.com/www/index.php/2007/vegetable-design-patterns/</guid>
		<description><![CDATA[Design Patterns are great and you&#8217;ll always hear &#34;architects&#34; throwing words like &#34;pattern&#34;, &#34;model view controller&#34;, &#34;factory&#34;, &#34;singleton&#34;, &#34;observer&#34; and &#34;command&#34; around to give their statements a little more weight.&#160; It&#8217;s rare you hear anti-patterns discussed however. 
A while ago someone made the claim that there was only one way to implement a pattern. This struck me as a remarkable statement as the very word &#34;pattern&#34; implies no specific implementation. A pattern is an abstract notion that has potentially many implementations, that&#8217;s what makes it so useful. Most people start ...]]></description>
			<content:encoded><![CDATA[<p>Design Patterns are great and you&#8217;ll always hear &quot;architects&quot; throwing words like &quot;pattern&quot;, &quot;model view controller&quot;, &quot;factory&quot;, &quot;singleton&quot;, &quot;observer&quot; and &quot;command&quot; around to give their statements a little more weight.&nbsp; It&#8217;s rare you hear anti-patterns discussed however. </p>
<p>A while ago someone made the claim that there was only one way to implement a pattern. This struck me as a remarkable statement as the very word &quot;pattern&quot; implies no specific implementation. A pattern is an abstract notion that has potentially many implementations, that&#8217;s what makes it so useful. Most people start with the GoF Blue Book on patterns but you may prefer the &quot;Non Software Examples of Patterns&quot; [<a target="_blank" href="http://www2.ing.puc.cl/~jnavon/IIC2142/patexamples.htm">LINK</a>]. </p>
<p>Talk to any java person for more than 5 minutes and they&#8217;ll throw up the MVC all over you. This is a nice pattern but many folks don&#8217;t understand it. For example just this morning I heard an &quot;architect&quot; refer to the MVC as Model, View, Controls. They described implementing the View using CSS and the &quot;Controls&quot; using tag libraries. Ho-hum.&nbsp; Even more common is that folks don&#8217;t realize there are two MVC patterns, model 1 and 2. </p>
<p>A lot of Patterns turn into Anti-Patterns because folks blindly follow the pattern without understanding the pattern. For example someone recently told me you shouldn&#8217;t implement the Abstract Factory using reflection. Riiiigghhht. </p>
<p>So maybe a new description of patterns is needed. I&#8217;ll offer this one up using something that&#8217;s easy to understand: Vegetables. </p>
<ol>
<li><strong> The Onion Design Pattern</strong>; This is a &quot;layered architecture&quot;. Instead of 2 or 3 layers, you actually have 20 or 30. Opening it up usually makes you cry. </li>
<li><strong> The Asparagus Design Pattern</strong>; This pattern is generally tasteless. You&#8217;ll think all is fine until hours later when you visit the bathroom. </li>
<li>&nbsp; <strong>The Artichoke</strong>; Another layered design; In this case almost 90% of the code-base can be cut out and discarded. </li>
<li><strong> The Mushroom</strong>; Not a true vegetable design pattern. This one grows up overnight. All is usually fine until you cut into it and millions of spores are released into the air. </li>
<li>&nbsp; <strong>The Sprout</strong>; A malleable design pattern, usually implemented in a &quot;new &amp; fresh&quot; technology like &quot;Ruby on Rails&quot; or &quot;Grails&quot;. Sometimes referred to as &quot;Agile&quot; but unable to support any load. </li>
</ol>
<p>
I&#8217;m sure there are more&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://francisshanahan.com/index.php/2007/vegetable-design-patterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

