<?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>Sadek Drobi's Blog &#187; Domain Driven Design</title>
	<atom:link href="http://sadekdrobi.com/category/agile-programming/domain-driven-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://sadekdrobi.com</link>
	<description>Sadek Drobi</description>
	<lastBuildDate>Tue, 08 Mar 2011 22:56:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DCI in Real World: Domain Context and Interaction with Scala in a Real World Project</title>
		<link>http://sadekdrobi.com/2009/06/10/dci-in-real-world-domain-context-and-interaction-with-scala-in-a-real-world-project/</link>
		<comments>http://sadekdrobi.com/2009/06/10/dci-in-real-world-domain-context-and-interaction-with-scala-in-a-real-world-project/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 22:40:09 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Coplien]]></category>
		<category><![CDATA[DCI]]></category>
		<category><![CDATA[Delivering Value]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Domain-Context-Interaction]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[Multi-languages projects]]></category>
		<category><![CDATA[Polyglot Programming]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[back-to-oop]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2009/06/10/dci-in-real-world-domain-context-and-interaction-with-scala-in-a-real-world-project/</guid>
		<description><![CDATA[Those that follow my twitter @sadache , me @infoQ or my blog have certainly already noticed that I am quite interested in Scala on languages&#8217; axis and in Domain Context Interaction DCI pattern on architecture axis. I always search new ways for delivering quality code which is modular and concise. Modularity offers the opportunity to [...]]]></description>
			<content:encoded><![CDATA[<p>Those that follow <a href="http://twitter.com/sadache">my twitter @sadache</a> , <a href="http://www.infoq.com/author/sadek-drobi">me @infoQ</a> or my blog have certainly already noticed that I am quite interested in Scala on languages&#8217; axis and in <a href="http://www.artima.com/articles/dci_vision.html">Domain Context Interaction DCI</a> pattern on architecture axis. I always search new ways for delivering quality code which is modular and concise. Modularity offers the opportunity to think about the problem in parts, which is typical of the way brains work, whereas conciseness makes use of imaginary system (reading code blocks like images). </p>
<p>Recently, I&#8217;ve been working on a Web Api system where, thanks to support of <a href="http://twitter.com/morlhon">@jeanlaurent</a> <a href="http://morlhon.net/blog/">http://morlhon.net/blog/</a>, I used Scala applying DCI architecture in a real world project. This post is about reporting benefits of using this approach. Other posts will follow that will be more focused on the use of Scala and Functional Programming in that project. Code included is a bit simplified and parts of the system that are not of interest are omitted.</p>
<p><span id="more-638"></span>
<p>The concerned part of the system is an API for logging a Web API usage and using it for showing interesting statistics to users and for implementing a Web 2.0 business model authorization.</p>
<p>The story starts with an API key passed as a parameter in the requested URI something like <em>product/1234?api_key=AFFSEFFVFE2344</em></p>
<p>I create an object that represents the API user containing the key: (did I tell I like one liners?)</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb.png" width="260" height="40"></a>&nbsp; </p>
<p>This is a class of an object that holds the apiKey, now I need a method that I will call to log the use of product/123 for user represented by the apiKey AFFSEFFVFE2344. What could be quite convenient and OOP-iesh is to call a <em>record</em> method on the apiKey instance, something like <em>apiUser.record(&#8230;) .</em> The problem with this, as explained in the original DCI article, is that adding these methods to the domain objects adds noise in other contexts for which recording is not relevant such as authorization and statistics, as we will see later. I would rather use here the DCI&#8217;s <em>role</em> concept (or <em>context</em>). Doing so I would say <em>(apiUser in recording role).record(&#8230;) . </em>This pseudo code tends to be very close to mixins implemented in Scala language and will look like following in real world Scala code:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image1.png"></a><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image2.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb1.png" width="617" height="57"></a>&nbsp; </p>
<p>Here the ApiUser object doesn&#8217;t contain a record method by default and so it can be shared in different contexts. In other words we kept our domain objects pure yet not scarifying OOP convenience. Now the <em>Recorder</em> is a trait that minds only business in the context of recording. The definition looks like the following:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image3.png"></a><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image4.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb2.png" width="281" height="108"></a>&nbsp; </p>
<p>Another view of the system is the end user&#8217;s statistics. Statistics should be represented in a meaningful way to the user and the user can&#8217;t care less about how the recording is done. So, it is quite desirable not to have the noise of recording when talking about the statistics view context. Here is how the call looks like in our example in Scala:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image5.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb3.png" width="667" height="63"></a> </p>
<p>Again what we are doing here looks merely like saying: I want to use the ApiUser in a statistics context and I choose to call method getRequestsPerMonthForLast12Months. I guess the convenience brought by using this approach is obvious. This is how the Statistics trait looks like:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image6.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb4.png" width="647" height="150"></a> </p>
<p>Note that as in the Recording trait, the <em>ApiUser</em> object is not passed as an explicit parameter but rather as an implicit receiver parameter (something like <em>this</em> for an object). To access it we use <em>Self</em> that refers to it<em>.</em></p>
<p>The third view of the system is what allows us to provide an authorization mechanism based on user&#8217;s activities for a business plan they choose (be it a quota per day, per month or other interesting combinations). It could be quite convenient to have the call looking like <em>apiUser.isAuthorized . </em>We get pretty close with DCI without polluting our domain object with a specific context logic:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image7.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb5.png" width="540" height="66"></a> </p>
<p>Like the previous, the Authorizer trait looks straightforward :</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image8.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb6.png" width="454" height="207"></a> </p>
<p>Now that we looked at the three views of our system introducing three examples of &#8220;<em>Context</em>&#8221; from DCI pattern we can go beyond that to discover how we use nested <em>contexts</em> (or <em>roles</em>). </p>
<p>Looking at the Authorizer trait, the ApiUser referred to by <em>Self,</em> doesn&#8217;t tell us much about<em> </em>how many requests the user did today or this month. And for authorizing user one needs a richer ApiUser that can give the necessary information that live themselves in a file or a database. But once again, we don&#8217;t want to pollute our domain object with Data Access code that varies on a different axis than the domain object itself.&nbsp; Introducing a nested context/role that adds the Data Access logic would pretty convenient here:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image9.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb7.png" width="473" height="56"></a> </p>
<p>Here <em>Self </em>is a richer ApiUser that carries Requests Data Access logic defined in the RequestsDataAccessor trait:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image10.png"></a><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image11.png"></a><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image12.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb8.png" width="848" height="193"></a>&nbsp;&nbsp; </p>
<p>And the implementation of the Authorizer trait defined in terms of <em>ApiUser with RequestsDataAccessor</em>:</p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image13.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb9.png" width="468" height="373"></a> </p>
<p>In the same way we implement the <em>Statistics</em> and <em>Recorder</em> traits using <em>ApiUser with RequestsDataAccessor:</em></p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image14.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb10.png" width="451" height="148"></a> </p>
<p><a href="http://sadekdrobi.com/wp-content/uploads/2009/06/image15.png"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://sadekdrobi.com/wp-content/uploads/2009/06/image-thumb11.png" width="581" height="295"></a> </p>
<p>If you are not familiar with generics ( getRequestsPer[Day] ) you can ignore them since they are not central to the subject of this post and simply use their readability to understand the purpose of the method. The use of generics in this project will be the subject of a future post.</p>
<h3>Encapsulation Test!</h3>
<p>Now in the first version of the system, the ApiKey was passed in clear in the service URI. This is not very secured as it is quite easy to get the key and use it for using the API. We might prefer to encrypt the key in some way. This fortunately changes nothing for any of our traits implementations since the decryption of the key is the responsiblity of the ApiUSer object and all what our traits need is to get the concerned ApiKey from that object which can be easily done with pattern matching. Same thing if we want to replace database logging with file system in RequestsDataAccessor. Modularity and separation of concerns are apparent in this DCI architecture implementation.</p>
<p>&nbsp;</p>
<h3>Conclusion</h3>
<p>This is a refreshing approach to OOP. The <strong>Domain Context Interaction</strong> pattern allowed us to restore interesting properties of real OOP approach yet not sacrificing modularity and separation of concerns. This simple view of &#8220;an object in several contexts&#8221; helps quite much in thinking explicitly about and understanding context boundaries. Note that an object(instance) is not defined by a single class but each instance curries the necessary context. This is essential to OOP which is NOT COP (for Class Oriented Programming ;) )</p>
<p>&nbsp;</p>
<p>Feel free to ask questions and/or comment about this implementation. Refer to original papers for more in-depth explanation of the pattern. </p>
<p>Thanks to JetBrains&#8217; IDEA and the Scala plug-in that helped me programming in Scala.</p>
<p>&nbsp;</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7cedd753-901b-4d50-b76a-a7c30a681f4e" class="wlWriterSmartContent">Mots clés Technorati : <a href="http://technorati.com/tags/DCI" rel="tag">DCI</a>,<a href="http://technorati.com/tags/Coplien" rel="tag">Coplien</a>,<a href="http://technorati.com/tags/OOP" rel="tag">OOP</a>,<a href="http://technorati.com/tags/Scala" rel="tag">Scala</a>,<a href="http://technorati.com/tags/J2EE" rel="tag">J2EE</a>,<a href="http://technorati.com/tags/Domain-Context-Interaction" rel="tag">Domain-Context-Interaction</a>,<a href="http://technorati.com/tags/Architecture" rel="tag">Architecture</a>,<a href="http://technorati.com/tags/Multi-Paradigm-Design" rel="tag">Multi-Paradigm-Design</a></div>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2009/06/10/dci-in-real-world-domain-context-and-interaction-with-scala-in-a-real-world-project/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>RefX:: ORMs, Relational Data, Mismatch, LinQ and DSLs</title>
		<link>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/</link>
		<comments>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 02:42:22 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile in the Enterprise]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[D90]]></category>
		<category><![CDATA[DOTNET]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[LinQ]]></category>
		<category><![CDATA[Mapping]]></category>
		<category><![CDATA[Model Mismatch]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Polyglot Programming]]></category>
		<category><![CDATA[Productivity]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/</guid>
		<description><![CDATA[   
Having worked with several Object-Relational mapping frameworks in the last few years, I got to a point where I couldn&#8217;t justify their complexity in my project. We often talk about the mismatch between the database and the object worlds, and that is where ORMs are often stated and referenced for &#8220;bridging the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2008/11/raw000781.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="361" alt="Raw00078" src="http://sadekdrobi.com/wp-content/uploads/2008/11/raw00078-thumb1.jpg" width="534" border="0"></a> <a href="http://sadekdrobi.com/wp-content/uploads/2008/11/raw001701.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="379" alt="Raw00170" src="http://sadekdrobi.com/wp-content/uploads/2008/11/raw00170-thumb1.jpg" width="258" border="0"></a> <a href="http://sadekdrobi.com/wp-content/uploads/2008/11/dsc-01911.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="378" alt="DSC_0191" src="http://sadekdrobi.com/wp-content/uploads/2008/11/dsc-0191-thumb1.jpg" width="257" border="0"></a> </p>
<p>Having worked with several Object-Relational mapping frameworks in the last few years, I got to a point where I couldn&#8217;t justify their complexity in my project. We often talk about the mismatch between the database and the object worlds, and that is where ORMs are often stated and referenced for &#8220;bridging the gap&#8221;!</p>
<p>Well I prefer to call it lifting the gap, or highering the gap, to have it now between DAOs and the rest of the code than having it between database and code.But I wouldn&#8217;t call this in any way reducing the gap.</p>
<p><span id="more-538"></span></p>
<p>First thing to mention here, is that data structures are not evil. We often deal with XML data structure but we absolutely refuse to deal with relational data structures. The problem might be related to time, XML came with a whole arsenal of managed APIs that represent its model in a way that makes it more comfortable for you to manipulate these documents. All together with transformation APIs that made it a lot easier to fill your object model out of an XML. Relational data structure on the other hand did not have the luxury of standard APIs and representation models in mainstream languages, and that made dealing with a database request result so arbitrary (Datasets existed in .Net but they have been cursed heavily and has been forced out of the cool toolbox, do not know yet why!) .&nbsp; </p>
<p>In some way, I guess that the &#8220;mismatch&#8221; between Relational data structures and objects exists much similarly between XML and objects, however we didn&#8217;t think for so long of a doing a mapping between XML and object OXM? (no we are starting to do so, writing some XML to map XML to objects!).</p>
<p>With the experience I had with mapping technologies, I can say that they do not solve the problem for me. They merely add yet another useless level of abstraction where your domain types look nothing like relational data structures, but yet nothing like your target domain model! They have gone a half way, and now its your turn to poison your application with a lot of absurd ORM code trying to stretch this bridge to reduce the gap&#8230; </p>
<p>Geeks love talking about intrusivty of an ORMs and compare level of intrusivty in different terms. Intrusivty is much more than the lack of an interface or methods to implement in your domain objects. I guess I am ok to deal with that kind of intrusivity. However all ORMs I tried do not give me the opportunity to express my domain model in the way I would like to. I have to deal with notions of Lazy Loading, Attached/Detached entities, Entity sets, ids, back fields and a lot of other things that I don&#8217;t want to appear in my model and that make the resulting code so ugly and complex that I don&#8217;t wish to visit soon.</p>
<p>As Bob Martin said before, we are missing the opportunity to do oop, I would enforce and say we are missing the opportunity to model at all. And I guess we have gone too far with ORMs and it is time to go back to the basics, in the same way we have done after the EJB great abstraction.</p>
<p>It is very contradictory, while we are so excited about DSLs and the goodness they can potentially bring to enterprise development that results in a declarative semanticful style of programming, we can&#8217;t help but to engage all of our means in trying to bury SQL (and effective, semanticful, declarative powerful domain specific language) behind a dumb API to &#8220;abstract database access&#8221;! I guess we got to chose one strategy, either we keep SQL and we&nbsp; keep marketing DSLs or we hope for a new advanced GPL compiler that will hide all of this in the same way modern languages did with garbage collection, concurrency and synchronization.</p>
<p>Since I am not yet a compiler writer, and I aint got around an effective way of integrating database in mainstream languages (there is actually a very productive in memory database on Haskell that worth trying), I decide to keep the DSL, and to work with them without the need to hide them, but rather to get a better tooling to help converting between difference data structures.</p>
<p>I guess you&#8217;ve guessed it by now. For me LinQ is the mid-term solution for the data structure mismatch. No not LinQ to sql, nor Ado.Net entities (they are helpful and we might use them but lets focus on the solution). LinQ is a very productive tool that halps effectively transform anything to anything in few lines of code. I mean that I can still use powerful SQL to get data effeciently and then convert them with one line of LinQ into the destination data structure. No abstraction leak, less complexity: Use the right tool where it applies. </p>
<p>So what I would actually do is to use a framework that will execute my SQL or SQL like query on the database and get me the records in much the same way they are in the database,Much in the same way Active Record gets you records as they are in the database. No useless efforts from the framework to bend the data to make it look untruthfully like the destination model.&nbsp; I guess I know better my domain model, and with this better tooling I can get it done with no problem.</p>
<p>&nbsp;</p>
<div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f663d4e1-de43-4d9c-9f89-7b45ec5b5a86" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Mots clÃ©s Technorati : <a href="http://technorati.com/tags/mapping" rel="tag">mapping</a>,<a href="http://technorati.com/tags/orm" rel="tag">orm</a>,<a href="http://technorati.com/tags/linq" rel="tag">linq</a>,<a href="http://technorati.com/tags/mismatch" rel="tag">mismatch</a>,<a href="http://technorati.com/tags/relational.%20data%20structure" rel="tag">relational. data structure</a>,<a href="http://technorati.com/tags/abstraction" rel="tag">abstraction</a>,<a href="http://technorati.com/tags/domain%20model" rel="tag">domain model</a>,<a href="http://technorati.com/tags/deseign" rel="tag">deseign</a></div>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/11/10/refx-orms-relational-data-mismatch-linq-and-dsls/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paradigm based Polyglot Programming</title>
		<link>http://sadekdrobi.com/2008/09/25/paradigm-based-polyglot-programming/</link>
		<comments>http://sadekdrobi.com/2008/09/25/paradigm-based-polyglot-programming/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 07:08:16 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[InfoQ]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[Multi-Paradigm Design]]></category>
		<category><![CDATA[Multi-languages projects]]></category>
		<category><![CDATA[Polyglot Programming]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/09/25/paradigm-based-polyglot-programming/</guid>
		<description><![CDATA[ 
How many languages are you using on the same project? If you go counting you will see that they are many. I mean XML, Java, XSLT, HTML, CSS&#8230; etc. But the reason why you are using almost all of them is that they happen to be mainstream and, oftentimes, they are the only language [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sadekdrobi.com/wp-content/uploads/2008/09/dsc-01721.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="429" alt="DSC_0172" src="http://sadekdrobi.com/wp-content/uploads/2008/09/dsc-0172-thumb1.jpg" width="640" border="0"></a> </p>
<p>How many languages are you using on the same project? If you go counting you will see that they are many. I mean XML, Java, XSLT, HTML, CSS&#8230; etc. But the reason why you are using almost all of them is that they happen to be mainstream and, oftentimes, they are the only language choice for a needed framework. You are actually almost obliged to use them. <em>The choice is done for you. Style? CSS. Configuration? Often XML. Web interface description? Html.</em> However, if you want to adopt true polyglot programming, you will have to face inevitable decision of language choice.</p>
<p><span id="more-517"></span></p>
<p><a href="http://www.infoq.com/articles/paradigm-based-polyglot-prog">Read my article on Paradigm based Polyglot Programming at InfoQ.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/09/25/paradigm-based-polyglot-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Insights: You don&#8217;t need your DSL to be English-like</title>
		<link>http://sadekdrobi.com/2008/03/28/insights-you-dont-need-your-dsl-to-be-english-like/</link>
		<comments>http://sadekdrobi.com/2008/03/28/insights-you-dont-need-your-dsl-to-be-english-like/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 19:49:13 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Useability]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/03/28/insights-you-dont-need-your-dsl-to-be-english-like/</guid>
		<description><![CDATA[There is a widespread opinion that a good DSL has to be English-like. Dave Thomas advocates against such approach asserting that DSL are not about getting as close as possible to natural languages and that having this as a guiding principle of DSL design can be rather detrimental. He also highlights what he believes is [...]]]></description>
			<content:encoded><![CDATA[<p>There is a widespread opinion that a good DSL has to be English-like. Dave Thomas advocates against such approach asserting that DSL are not about getting as close as possible to natural languages and that having this as a guiding principle of DSL design can be rather detrimental. He also highlights what he believes is important in DSL design and provides some examples of successful DSL.</p>
<p><span id="more-459"></span></p>
<p><a title="http://www.infoq.com/news/2008/03/dsls-are-not-natural-languages" href="http://www.infoq.com/news/2008/03/dsls-are-not-natural-languages">http://www.infoq.com/news/2008/03/dsls-are-not-natural-languages</a></p>
<p>There is a widespread opinion that a good DSL has to be English-like in order to be readable for non-programmers. Dave Thomas advocates against such approach asserting that <a href="http://pragdave.blogs.pragprog.com/pragdave/2008/03/the-language-in.html">DSL are not about getting as close as possible to natural languages</a>. Moreover, he argues that having this as a guiding principle of DSL design can be rather detrimental. He also highlights what he believes is important in DSL design and provides some examples of successful DSL that do not necessarily reed like English. </p>
<p>According to Dave, DSL don&#8217;t need to be close to English or any other natural language because they targets a very specific category or users &#8211; domain experts &#8211; who actually don&#8217;t speak a natural language</p>
<blockquote><p>Domain experts [&#8230;] are speaking jargon, a specialized language that they&#8217;ve invented as a shorthand for communicating effectively with their peers. Jargon may use English words, but these words have been warped into having very different meanings&#8212;meanings that you only learn through experience in the field.</p>
</blockquote>
<p>Hence, DSL should reflect this jargon and express the expertise of domain specialists in a concise way. Make for dependency management, Groovy builders for expressing data in code and Active record declaration for data modeling in Ruby are a few successful examples of such DSL that respond to domain experts needs without necessarily being English-like. Even though some statements in Active record declaration may look like English, e.g. has_many or belongs_to, they actually are not: &#8220;they are jargon from the world of modeling&#8221; and &#8220;they have a specific meaning in that context.&#8221;</p>
<p>Another important point raised by Dave is that, in his opinion, &#8220;domain experts&#8221; should not be understood as business users but rather as people who are writing specs. These people are programmers. They do not really need an English-like language. Dave actually believes that the notion of fluent interface is often misunderstood: &#8220;the fluency here is programmer fluency, not English fluency. It&#8217;s writing succinct, expressive code&#8221;. </p>
<p>Dave Thomas argues that not only isn&#8217;t it necessary trying to get closer to a natural language, but it can also be detrimental. Natural languages are imprecise. This makes their power in the real world but this cannot apply to programming. This is why, &#8220;whenever we try to create a DSL that looks like a natural language, we fall short&#8221;. However hard one tries, syntax tends to remain &#8220;very unEnglish like&#8221;. And this gap is rather confusing: </p>
<blockquote><p>There&#8217;s a major cognitive dissonance&#8212;I have to take ideas expressed in a natural language (the problem), then map them into an artificial language (the AppleScript programming model), but then write something that is a kind of faux natural language.</p>
</blockquote>
<p>To illustrate the possible confusion, Dave gives an example of piece code from a test written using the test/spec framework and analyses one expression: </p>
<p><em>@result.should.be.a.kind.of String</em></p>
<blockquote><p>It reads like English. But it isn&#8217;t. The words are separated by periods, except the last two, where we have a space. As a programmer, I know why. But as a user, I worry about it. In the first example, we write @result.should.be.a.kind_of. Why not kind.of? If I want to test that floats are roughly equal, I&#8217;d have said @result.should.be.close value. Why not close.to value? </p>
<p>Trivial details, but it means that I can&#8217;t just write tests using my knowledge of English&#8212;I have to look things up. And if I have to do that, why not just use a language/API that is closer to the domain of specifications and testing?</p>
</blockquote>
<p>It is true that English-like DSL may be more readable, but Dave argues that &#8220;the attempt to create a natural language feel in the DSL leads to all sorts of leaks in the abstraction&#8221;. It might add to readability of code but it would &#8220;be taking away from its writability&#8221; and &#8220;adding uncertainty and ambiguity&#8221;: </p>
<blockquote><p>The second you find yourself writing </p>
</p>
<p>&#160; <em>def a       <br />&#160;&#160;&#160;&#160; self        <br />&#160; end</em></p>
</p>
<p>so that you can use &quot;a&quot; as a connector in </p>
</p>
<p><em>add.a.diary.entry.for(&quot;Lunch&quot;).for(August.10.at(3.pm))</em></p>
</p>
<p>you know you&#8217;ve crossed a line. This is not longer a DSL. It&#8217;s broken English. </p>
</blockquote>
<p>One of commentators, Has, also believes that trying to make a language readable to non-programmers one risks to end up with a &quot;read-only language&#8221;. He takes the example of AppleScript. To improve its readability, it was necessary to remove &#8220;most of the usual symbolic cues that describe a language&#8217;s semantics&#8221;. As a result, &#8220;the syntax effectively obfuscates, not clarifies, the language semantics&#8221;. If &#8220;it&#8217;s very easy to read an AppleScript and understand _what_ it does, it&#8217;s damnably hard to figure out exactly _how_ it does it&#8221;. </p>
<p>Has highlights another issue that may result from using an English-like DSL: users might assume that &#8220;because it _looks_ like English, it will also _behave_ like it&#8221; and &#8220;form all sorts of very strong associations and conclusions about its nature, which then have to be undone the long, hard way&#8221;. Hence, according to Has, English-like appearance &#8220;accidentally encourages unrealistic user assumptions&#8221;</p>
<p>If DSL readability and expressiveness are of interest for you, find more examples and comments on <a href="http://pragdave.blogs.pragprog.com/pragdave/2008/03/the-language-in.html">Dave&#8217;s blog post</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/03/28/insights-you-dont-need-your-dsl-to-be-english-like/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Obsev:: Mutability is addictive like drugs, Mutation can become a cancer!</title>
		<link>http://sadekdrobi.com/2008/03/09/obsev-mutability-is-addictive-like-drugs-mutation-can-become-a-cancer/</link>
		<comments>http://sadekdrobi.com/2008/03/09/obsev-mutability-is-addictive-like-drugs-mutation-can-become-a-cancer/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 23:51:46 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Decipline]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Mutability]]></category>
		<category><![CDATA[Paradigm Oriented Programming Language]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2008/03/08/obsev-mutability-is-addictive-like-drugs-mutation-can-become-a-cancer/</guid>
		<description><![CDATA[This is really crazy! 
The first time I got introduced to mutation, I had a bad feeling. How can x:=x+1 be logical at all?
It felt so unnatural, scary, or maybe like a hack. Then, because of society constrains, I got to forget the bad feeling about that. Well, my mind started to tolerate with counter-logic [...]]]></description>
			<content:encoded><![CDATA[<p>This is really crazy! </p>
<p>The first time I got introduced to mutation, I had a bad feeling. How can x:=x+1 be logical at all?</p>
<p>It felt so unnatural, scary, or maybe like a hack. Then, because of society constrains, I got to forget the bad feeling about that. Well, my mind started to tolerate with counter-logic logic. And that is how I became an enterprise developer. I am not sure how proud I am with this title anyway. I feel that tolerating and accepting the counter-logic logic is one, and most important one, of the prerequisite to this title.</p>
<p><span id="more-454"></span></p>
<p>Nowadays, I am working on a project that has to process a huge number of data to do calculations on it and produce results that make sense to the user. Performance is a constraint. And I decided this time to do it the right way, the way that I believe is right. The logical way.</p>
<p>I decided to the calculations with no mutable state. I wanted immutability to be my guarantee to safety. Mutability breaks logic, and so produces bugs. But I couldn&#8217;t imagine how hard this choice can be. You tend all the time to feel that it is easier to introduce a mutable object, mutable flags, temporary mutable containers inside loops. Imperative programming is so tempting. Just like drugs. It feels so strange and weird in the first time, but then, it becomes a habit, a bad one, and you can&#8217;t help but to break into it. Mutation and imperative programming is the simplest thing that work in some way.</p>
<p>Today, I am happy I almost finished the whole calculation logic I had to model ( and it is quite a complex one). And I am proud that I could resist introducing mutability in the algorithm. Yet, I did some experiments along the way to introduce just a bit of state, kind of just what I need to introduce faster one kind of calculation. This very small mutation just breaks it all. It just breaks the whole modularity of the algorithm, and just makes the whole calculation much less generic, and more importantly less maintainable and evolutive. Such a small mutation, like introducing a mutable flag, or a global variable, just breaks the whole logic of my calculation, and drives me far away from a good modular calculation, with a good design based on plain old principles of separation of concerns. It just makes impossible to go further with the implementation! It is like a cancer of code&#8230;</p>
<p>Now, after the discipline and the resistance to a mutable state, we are so happy with the resulting code that yet needs polishing, makes it very easy to parameter more calculations and so add more desired functionality to the program. And just for fun, we compared it to the same calculation done with imperative programming. It is much more concise, intention concealing, and as a result, surprisingly we paid no performance cost for a much more declarative code.</p>
<p>I owe a lot to Erik Meijer, Paul Hudak, Linq, and Haskell :)</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2008/03/09/obsev-mutability-is-addictive-like-drugs-mutation-can-become-a-cancer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Driven Testing: Using tests as specifications of systemâ€™s invariants and contracts design</title>
		<link>http://sadekdrobi.com/2007/09/29/draft-design-driven-testing-using-tests-as-specifications-of-system%e2%80%99s-invariants-and-contracts-design/</link>
		<comments>http://sadekdrobi.com/2007/09/29/draft-design-driven-testing-using-tests-as-specifications-of-system%e2%80%99s-invariants-and-contracts-design/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 16:44:02 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Agile Programming]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[JAOO]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/09/29/draft-design-driven-testing-using-tests-as-specifications-of-system%e2%80%99s-invariants-and-contracts-design/</guid>
		<description><![CDATA[
	
I just got back from JAOO2007. One session of the conference was James Coplien&#8217;s &#8220;Scrum Architecture&#8221;. After this session, a discussion took place about Coplien&#8217;s statement that &#8220;TDD harms your architecture&#8221;! This discussion continued afterwards as an Open Spaces debate. I had the chance then, with the help of Floyd Marinescu, to organize a filmed [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://sadekdrobi.com/wp-content/uploads/2007/09/092907-1644-designdrive1.jpg" alt=""/>
	</p>
<p>I just got back from JAOO2007. One session of the conference was James Coplien&#8217;s &#8220;Scrum Architecture&#8221;. After this session, a discussion took place about Coplien&#8217;s statement that &#8220;TDD harms your architecture&#8221;! This discussion continued afterwards as an Open Spaces debate. I had the chance then, with the help of <a href="http://dynamicsemantics.blog-city.com/">Floyd Marinescu</a>, to organize a filmed debate at InfoQ&#8217;s studio between Bob Martin and James Coplien on the same topic. I really enjoyed this debate which really showed a high quality spirit of discussion from both sides. Both had their arguments. I will not tell my opinion but rather let you judge yourself once the video is out on <a href="http://www.InfoQ.com">www.InfoQ.com</a> .
</p>
<p>Recently, I posted about the fact that <a href="http://sadekdrobi.com/2007/09/22/i-always-write-tests-before-code-but-i-don%e2%80%99t-do-test-driven-development/">I always write tests before code, but I don&#8217;t do Test Driven Development</a> where I discussed the way I view testing. Yet I don&#8217;t guess I&#8217;ve been clear enough, so I decided to write few lines trying to better reflect the way I view a testing approach.
</p>
<p>When I have a domain problem at hand, first what I think about is partitioning and abstraction, which means dividing the domain into sub-domains. This partitioning procedure is not driven by any tests, but rather by domain knowledge acquired from domain experts. This is extremely important; the architecture/design should reflect the domain/sub-domain problem it is trying to solve. This helps the software be flexible adopting business changes, as it was designed from a business perspective. A book that explains very well this approach is Eric Evans&#8217;s <a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bbs_sr_1/105-9757497-9626842?ie=UTF8&amp;s=books&amp;qid=1191078586&amp;sr=8-1">Domain Driven Design</a>.
</p>
<p>This Up-Front analysis is not defining the full up-front architecture, far from it, rather defining good bases for an architecture that maps to business. It shouldn&#8217;t take much time, just enough to help going forward with an iterative approach. This should define, either in code or in a tinny UML sketch, an object structure that forms the basic sub-domain&#8217;s components.
</p>
<p>After defining the main structure of the sub-domain&#8217;s solution, I follow an iterative process as follows:
</p>
<p>1: Driven by the business knowledge crunching, I define a component&#8217;s contract with its invariants and conditions
</p>
<p>2: I write a test that forms the specification of this contract and its invariants
</p>
<p>3: I start the implementation to satisfy the specifications I defined in the test
</p>
<p>A very important note here is that the contract specifications should be readable, very clear and explicit. This explicitness helps to have a better vision of the whole system while reading the contracts-invariants of its defined components. This also helps spot bugs without the painful debugging: this approach of Design by Contract reflects developers understanding of the business domain in a more explicit way, so it makes it easier to spot misjudgments developers might have done in their implementation. This intention revealing method of development highlights important business rules, rather than letting them hidden behind an abstraction. Abstractions should not hide any important business concern as an implementation details. Explicit contracts and invariants allow business experts to have a look on what is going on inside the software. For an example of bugs that result from developer&#8217;s misjudgment see <a href="http://weblog.raganwald.com/2007/09/you-suck.html">Reganwald&#8217;s recent post</a> .
</p>
<p>Of course unit tests are not the best tools for this approach. They work fine if we emphasize on methods and class naming for readability and visibility of invariants and rules. Still I prefer tools like BDD or Eiffel/Spec# Design by Contract. Hope we will have some more support for such tools in the industry soon.
</p>
<p>A metaphor James Coplien used to illustrate the problem in Test Driven Development approach, which made sense to me, is a test driven course in a school. It&#8217;s about a teacher that finds that most of his students fail in the final test. So to make things work better, he decided to ask the students to write themselves their tests by the beginning of the semester, and then to let them pass these tests by the end of that semester! Hence, they might get better grades, but that doesn&#8217;t mean they got better knowledge at all.
</p>
<p>
Â </p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/09/29/draft-design-driven-testing-using-tests-as-specifications-of-system%e2%80%99s-invariants-and-contracts-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Charles Simonyi reveals production use of Intentional Software @ JAOO</title>
		<link>http://sadekdrobi.com/2007/09/24/charles-simonyi-reveals-production-use-of-intentional-software-jaoo/</link>
		<comments>http://sadekdrobi.com/2007/09/24/charles-simonyi-reveals-production-use-of-intentional-software-jaoo/#comments</comments>
		<pubDate>Mon, 24 Sep 2007 22:31:56 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Conferences]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/09/24/charles-simonyi-reveals-production-use-of-intentional-software-jaoo/</guid>
		<description><![CDATA[
	
Floyd Marinescu did a good summary of Simonyi&#8217;s presentation on JAOO and posted it on IinfoQ

http://www.infoq.com/news/2007/09/intentional-at-jaoo
	
It seems that guys at Intentional software are having something that works seriously, in real world business.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://sadekdrobi.com/wp-content/uploads/2007/09/092407-2231-charlessimo11.jpg" alt=""/>
	</p>
<p>Floyd Marinescu did a good summary of Simonyi&#8217;s presentation on JAOO and posted it on IinfoQ
</p>
<p><a href="http://www.infoq.com/news/2007/09/intentional-at-jaoo">http://www.infoq.com/news/2007/09/intentional-at-jaoo</a>
	</p>
<p>It seems that guys at Intentional software are having something that works seriously, in real world business.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/09/24/charles-simonyi-reveals-production-use-of-intentional-software-jaoo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I always write tests before code, but I donâ€™t do Test Driven Development</title>
		<link>http://sadekdrobi.com/2007/09/22/i-always-write-tests-before-code-but-i-don%e2%80%99t-do-test-driven-development/</link>
		<comments>http://sadekdrobi.com/2007/09/22/i-always-write-tests-before-code-but-i-don%e2%80%99t-do-test-driven-development/#comments</comments>
		<pubDate>Sat, 22 Sep 2007 23:35:00 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/09/22/i-always-write-tests-before-code-but-i-don%e2%80%99t-do-test-driven-development/</guid>
		<description><![CDATA[
	
I am not driven by tests, my code neither. Actually my code is rather driven by design. I do use a test first approach, but I use for a contract first disciplineÂ in orderÂ to test that my decoupling works. Yes, I think about decoupling first, and then I write tests. I design, and then I write [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://sadekdrobi.com/wp-content/uploads/2007/09/092207-2334-ialwayswrit12.jpg" alt=""/>
	</p>
<p>I am not driven by tests, my code neither. Actually my code is rather driven by design. I do use a test first approach, but I use for a contract first disciplineÂ in orderÂ to test that my decoupling works. Yes, I think about decoupling first, and then I write tests. I design, and then I write tests. Of course I don&#8217;t take a lot of time in my design reflection. But I am not driven by anyÂ Â force other than my experience and the contextÂ at hand. I do abstractions and I validate them with tests. Actually, I use test first approach to specify my design. I don&#8217;tÂ write any piece of code without a failed test waiting for it, but still I prefer to call that a test-first approach than the confusing &#8220;test-driven development&#8221;!
</p>
<p>More about this approach to testing in my newer post <a href="http://sadekdrobi.com/2007/09/29/draft-design-driven-testing-using-tests-as-specifications-of-system%e2%80%99s-invariants-and-contracts-design/">Design Driven Testing: Using tests as specifications of system&#8217;s invariants and contracts design</a>â€¦</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/09/22/i-always-write-tests-before-code-but-i-don%e2%80%99t-do-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Domain Specific Languages are technology-agnostic, a more mature representation of their specific domain</title>
		<link>http://sadekdrobi.com/2007/09/19/domain-specific-languages-are-technology-agnostic-a-more-mature-representation-of-their-specific-domain/</link>
		<comments>http://sadekdrobi.com/2007/09/19/domain-specific-languages-are-technology-agnostic-a-more-mature-representation-of-their-specific-domain/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 07:02:51 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/09/19/domain-specific-languages-are-technology-agnostic-a-more-mature-representation-of-their-specific-domain/</guid>
		<description><![CDATA[
One of the most important properties of Domain Specific Languages is that it is an abstraction which is technology-agnostic. We know how often technology changes, adopting new frameworks, discarding old used ones. DSLs keep evolving to be a more and more mature abstraction of the domain. And integration of the new technologies and frameworks becomes [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://sadekdrobi.com/wp-content/uploads/2007/09/091907-0702-domainspeci1.jpg" /></p>
<p>One of the most important properties of Domain Specific Languages is that it is an abstraction which is technology-agnostic. We know how often technology changes, adopting new frameworks, discarding old used ones. DSLs keep evolving to be a more and more mature abstraction of the domain. And integration of the new technologies and frameworks becomes nothing more than implementation details behind this abstraction. It forms a kind of specification of the sub domains.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/09/19/domain-specific-languages-are-technology-agnostic-a-more-mature-representation-of-their-specific-domain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DSLs bringing the end of single language development?</title>
		<link>http://sadekdrobi.com/2007/08/07/dsls-bringing-the-end-of-single-language-development/</link>
		<comments>http://sadekdrobi.com/2007/08/07/dsls-bringing-the-end-of-single-language-development/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 17:20:55 +0000</pubDate>
		<dc:creator>Sadache</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[DSL]]></category>
		<category><![CDATA[Domain Driven Design]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Martin Fowler]]></category>

		<guid isPermaLink="false">http://sadekdrobi.com/2007/08/07/dsls-bringing-the-end-of-single-language-development/</guid>
		<description><![CDATA[My second contribution in InfoQ. An interesting news post about DSLs, and language oriented programming.
http://www.infoq.com/news/2007/08/multi-lingual-programming
]]></description>
			<content:encoded><![CDATA[<p>My second contribution in InfoQ. An interesting news post about DSLs, and language oriented programming.</p>
<p><a href="http://www.infoq.com/news/2007/08/multi-lingual-programming">http://www.infoq.com/news/2007/08/multi-lingual-programming</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sadekdrobi.com/2007/08/07/dsls-bringing-the-end-of-single-language-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

