<?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>I am Zef &#187; webdsl</title>
	<atom:link href="http://zef.me/tag/webdsl/feed" rel="self" type="application/rss+xml" />
	<link>http://zef.me</link>
	<description>Technology, Me, You.</description>
	<lastBuildDate>Mon, 30 Aug 2010 13:30:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<atom:link rel='hub' href='http://zef.me/?pushpress=hub'/>
		<item>
		<title>The Point of WebDSL</title>
		<link>http://zef.me/2683/the-point-of-webdsl</link>
		<comments>http://zef.me/2683/the-point-of-webdsl#comments</comments>
		<pubDate>Wed, 13 Jan 2010 15:49:27 +0000</pubDate>
		<dc:creator>Zef</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[webdsl]]></category>

		<guid isPermaLink="false">http://zef.me/?p=2683</guid>
		<description><![CDATA[&#160;Jay asks in the comments:

I don't mean to be m [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;Jay <a href="http://zef.me/2600/adia-a-week-with-clojure-and-mongodb#comment-28381384">asks in the comments</a>:</p>

<blockquote>
<p>I don&#8217;t mean to be mean, because I really like your blog and I read it all the time&#8230; but could you just explain to me the point of WebDSL? I honestly don&#8217;t mean it in any kind of negative way, I&#8217;m just wondering why you&#8217;re dedicating your valuable time to building something like that when RoR, php, et al. already exist.</p>
<p>Just from a cursory look, it seems like the syntax is halfway between Visual Basic (yikes!) and C. Why do you prefer that type of syntax to the Lisp-style syntax of Clojure/Compojure?</p>
</blockquote>

<p>Good questions!</p>

<p><a href="http://www.webdsl.org">WebDSL</a> was started about 3 years ago by <a href="http://www.eelcovisser.org">Eelco Visser</a>&nbsp;as an exercise the the design and implementation of domain-specific languages. His focus up to then had been on <a href="http://strategoxt.org/Sdf/WebHome">parsing</a> and <a href="http://www.strategoxt.org">meta-programming</a>, but it was time to focus on a new domain: the web. When he started Eelco had never built a web application. He investigated a number of Java frameworks as a basis and eventually decided to use <a href="http://www.jboss.com/products/seam/">JBoss Seam</a> as a target.</p>

<p>The goal of WebDSL is to get rid of the boilerplate code you would have to write when building a Java application and raise the level abstraction. The vision was to have simple, domain-specific sub-languages that allow a programmer to specify a certain aspect of the application and the WebDSL compiler would generate all the implementation code for that aspect. Initially there were three sub-languages: a data modeling language, a user interface language and a simple action language to specify logic. As others joined the project (including myself), we added more sub-languages and more features: access control, workflow, data validation, ajax support and more recently search. Work is also done in the area of data evolution (i.e. migrating databases as you change your data model).</p>

<p>Although WebDSL is mainly <a href="http://swerl.tudelft.nl/">a research project</a>, we are increasingly working to make it useable by anybody with some programming experience. We currently have a few websites in production built using WebDSL (<a href="http://researchr.org">researchr</a>, <a href="http://tweetview.net">tweetview</a>, <a href="http://www.webdsl.org">webdsl.org</a> and <a href="http://pil-lang.org/">pil-lang.org</a>) and the <a href="http://webdsl.org/indexpage/Manual">manual</a> is growing.</p>

<p>The idea of building abstractions for the web itself is hardly novel. As Jay mentions, there are many web frameworks that already do this: Rails, Django and so on. There are a few things that we do differently in WebDSL, compared to existing frameworks:</p>

<ul>
    <li>We create our own <em>custom syntax</em>. Whereas Rails and Django are struggling to express everything using Ruby and Python, respectively, we designed our own clean syntax. Whether you like this syntax is a matter of taste. Personally I like it, although, indeed, it inconsistent here and there.</li>
    <li>WebDSL <em>is a statically typed and checked language</em>. I <a href="http://zef.me/2308/when-rails-fails">wrote</a> <a href="http://zef.me/2355/a-when-rails-fails-follow-up">a</a> <a href="http://zef.me/2333/when-jboss-seam-fails">number</a> <a href="http://zef.me/2371/when-scala-dsls-fail">of</a> <a href="http://zef.me/2409/static-verification-an-external-dsl-advantage">posts</a> about this issue and its advantages.</li>
    <li>WebDSL compiles to low-level Java code, which has <em>good performance characteristics</em>. The code we generate does not rely on run-time meta-programming and reflection features of the language which are typically rather slow.</li>
    <li>WebDSL <em>is platform independent</em>. We generate Java code now, but it can be ported relatively easily to .NET, Python or PHP. We have prototypes of this utilizing the <a href="http://zef.me/2218/on-the-pil">PIL language that I developed</a>.</li>
    <li>Within the next few months WebDSL will have <a href="http://blog.eelcovisser.net/uploads/webdsl-editor.png"><em>excellent IDE support</em></a> for Eclipse, built using <a href="http://strategoxt.org/Stratego/Spoofax-IMP">Spoofax/IMP</a>. My colleagues are working on this. It will feature syntax highlighting, as-you-type error reporting, code completion and eventually refactoring support.</li>
</ul>

<p>A drawback that WebDSL has today is that it&#8217;s not trivial to install, but with the IDE plug-in and Java-version that should become a lot easier soon.</p>

<p>So, why am I putting so much effort into this? As you may be aware I&#8217;m doing a Ph.D. in the area of domain-specific languages, so we investigate how to best build them. WebDSL is a case study for us. Soon I intend to work on another DSL, in the domain of mobile applications (yes, a DSL to build iPhone and Android applications, people!). It&#8217;s interesting from a research perspective to see how to best do this.</p>

<p>In addition I regularly experiment with alternative ways of creating DSLs, like <a href="http://zef.me/2600/adia-a-week-with-clojure-and-mongodb">in Clojure</a>&nbsp;and <a href="http://zef.me/2371/when-scala-dsls-fail">Scala</a>. I&#8217;d like to see how far you can push these languages to build the DSLs you like. Clojure allows you to define your own custom syntax, in some sense, as long as you adhere to the rule of the parenthesis. Static error checking is much more problematic. Clojure is also rather tied to one platform, sure, there&#8217;s also <a href="http://github.com/richhickey/clojure-clr">ClojureCLR</a>, but to write programs that work on both CLR and JVM is, well, challenging. IDE support for a Clojure DSL is also non-trivial.</p>

<p>On the other hand, the flexibility of a DSL like WebDSL also has its downsides. Basically you can design the language any way you like, both its syntax and semantics, you don&#8217;t get much for free. Whereas an internal DSL built on Clojure or Scala gets a lot for free: some error reporting, support for namespaces (something we still don&#8217;t have in WebDSL), a type system (in Scala&#8217;s case), an escape to a powerful language (Clojure or Scala) and a rich set of libraries you can use. In WebDSL we have to design all of this from scratch.</p>

<p>So in the end both approaches have their advantages and disadvantages. I intend to continue to explore them both.</p>
]]></content:encoded>
			<wfw:commentRss>http://zef.me/2683/the-point-of-webdsl/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Static Verification: An External DSL Advantage</title>
		<link>http://zef.me/2409/static-verification-an-external-dsl-advantage</link>
		<comments>http://zef.me/2409/static-verification-an-external-dsl-advantage#comments</comments>
		<pubDate>Mon, 16 Nov 2009 11:17:21 +0000</pubDate>
		<dc:creator>Zef</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[webdsl]]></category>

		<guid isPermaLink="false">http://zef.me/?p=2409</guid>
		<description><![CDATA[Last week I wrote a number of posts about web developme [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I wrote a number of posts about web development &quot;languages&quot; developed as internal DSLs. An internal DSL is a set of libraries written on top of a host language that, through the use of meta programming facilities, looks a lot like a <a href="http://en.wikipedia.org/wiki/Domain-specific_language">domain-specific language</a>. I <a href="http://zef.me/2308/when-rails-fails">looked at Ruby on Rails</a> as a prime example of an internal DSL built on a dynamic language, at <a href="http://zef.me/2333/when-jboss-seam-fails">JBoss Seam</a> as a framework built on Java, and then at <a href="http://zef.me/2371/when-scala-dsls-fail">Lift and my own little page language as examples of internal DSLs in Scala</a>.</p>

<p>This order was on purpose. I started with the most dynamic, catch-any-error-at-runtime language and ended with the most strongly typed we-try-to-find-any-mistake-at-compile-time solution. I&#8217;ve been accused of bashing these languages just for the heck of it, but there was a point to this, and it&#8217;s more than promoting <a href="http://www.webdsl.org">WebDSL</a>.</p>

<p>But let&#8217;s talk a little about WebDSL anyway.&nbsp;WebDSL is an external DSL for developing data-rich web applications. &quot;External DSL&quot; means that it is not built on top of an existing language like Ruby or Java, but that it has its own syntax and compiler. Developing such an external DSL is typically more work than developing an internal DSL, which is a disadvantage, but external DSLs have their advantages too.</p>

<p>Whenever we present WebDSL to people that have done some web development before, we get asked &quot;Why is this better than Rails? Why not an internal DSL?&quot; Although we always have problems answering this question, because none of us are very experience Rails developers, our answer comes down to a few general things that potentially apply to any external DSL:</p>

<ol>
    <li>We have a nicer syntax, as an external DSL we&#8217;re not limited to encoding things in a Ruby or Scala way</li>
    <li>Being platform independent, we can generate Java, PHP, Python and C# code if we want to</li>
    <li>An external DSL compiler can&nbsp;<em>statically analyze your application to find common programmer mistakes</em></li>
</ol>

<p>There&#8217;s also the runtime performance issue, but I don&#8217;t want to get into that.</p>

<p>DSLs built on modern languages like Ruby and Scala look pretty natural. But from time to time you gotta wonder, why do I have to put a colon in front of this word, why do I have to use quotes here? Because you are building on top of a host language, you have to obey that language&#8217;s syntax and evaluation rules, whether you like it or not. External DSLs do not have this restriction, they define their own syntax and interpretation of that syntax.&nbsp;</p>

<p>The second advantage is clear, our language does not rely on any platform in particular and we could therefore <a href="http://zef.me/2218/on-the-pil">generate code for any web platform</a>. With Ruby on Rails you&#8217;re limited to, well, Ruby. Admittedly, there are Ruby implementations for the <a href="http://jruby.org/">JVM</a> and <a href="http://ironruby.net/">.NET</a> now, but what about my little brother who can only afford cheap PHP hosting, should he just use&#8230; PHP?</p>

<p>We felt that the current state of the art in web frameworks is not very resilient to programmer mistakes. Typos lead to enormous stack traces and are often difficult to track down, right? That&#8217;s the thing I tried to verify last week.</p>

<p>It turned out we were pretty right. Although <a href="http://zef.me/2355/a-when-rails-fails-follow-up">not everybody agrees</a>.</p>

<p><strong>Static verification of external DSLs</strong></p>

<p>WebDSL is a statically typed language. It consists of a number of sub-languages. Currently we have a language for defining <a href="http://webdsl.org/selectpage/Manual/Pages">user interfaces</a>, <a href="http://webdsl.org/selectpage/Manual/Entities">data models</a>, <a href="http://webdsl.org/selectpage/Manual/ActionCode">business logic</a>, <a href="http://webdsl.org/selectpage/Manual/AccessControl">access control</a>, <a href="http://webdsl.org/selectpage/Manual/Validation">data validation</a> and <a href="http://researchr.org/publication/HemelVV08">workflows</a>.</p>

<p>To get a flavor of it, here&#8217;s an example entity definition. It defines a task entity:</p>

<p style="margin-left: 40px; "><code><strong>entity</strong> Task {<br />
&nbsp;&nbsp;name &nbsp; &nbsp; &nbsp; &nbsp;:: String<br />
&nbsp;&nbsp;description :: Text<br />
&nbsp;&nbsp;done &nbsp; &nbsp; &nbsp; &nbsp;:: Bool<br />
&nbsp;&nbsp;archived &nbsp; &nbsp;:: Bool<br />
&nbsp;&nbsp;user &nbsp; &nbsp; &nbsp; &nbsp;-&gt; User (<strong>inverse</strong>=User.tasks)<br />
}</code></p>

<div>and a page definition:</div>

<div>&nbsp;</div>

<div>
<div style="margin-left: 40px; "><code><strong>define page</strong> tasks(user : User) {</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp;section {</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;header{&quot;Tasks for &quot; output(user.username) }</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;table{</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp;<strong>for</strong>(task : Task <strong>in</strong> user.todo) {</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;row{&nbsp;</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;output(task.done)</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;output(task)</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp; &nbsp;}</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;}</code></div>
<div style="margin-left: 40px; "><code>&nbsp;&nbsp;}</code></div>
<div style="margin-left: 40px; ">}</div>
<div>&nbsp;</div>
<div>and an access control rule that matches any page whose name starts with edit.</div>
<div>&nbsp;</div>
<div>
<div style="margin-left: 40px; "><code><strong>rule page</strong> edit*(*) {<br />
&nbsp;&nbsp;loggedIn<br />
}&nbsp;</code></div>
</div>
</div>

<p>The nice thing is that we can detect all kinds of mistakes in WebDSL code at compile time. For instance, what if the inverse property of user in the Task entity does not exist?</p>

<p style="margin-left: 40px; "><code>$ webdsl build<br />
</code><code>Loading application settings (application.ini)...<br />
</code><code>[ webdslc | info ] stage 1: parsing webtasks.app<br />
</code><code>[ webdslc | info ] stage 2: importing modules<br />
</code><code>[ webdslc | info ] stage 3: typechecking<br />
</code><code>* webtasks.app:21/25: error: The field User.tasks does not exist<br />
</code><code>inverse = User.tasks</code></p>

<p>It points to exactly the right file, line number and column number. Or let&#8217;s say we misspell a property name in a page definition:</p>

<p>
<meta charset="utf-8">        </meta>
</p>

<div style="margin-left: 40px; "><code><strong>for</strong>(task : Task&nbsp;<strong>in</strong>&nbsp;user.todo) {</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp;row{&nbsp;</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;output(task.<span style="color: rgb(255, 0, 0); ">don</span>)</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;output(task)</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp;}</code></div>

<div style="margin-left: 40px; "><code>}</code>&nbsp;</div>

<p>Result:</p>

<p style="margin-left: 40px; "><code>* webtasks.app:119/15: error: No property don defined for Task<br />
task.don</code></p>

<p>Or, mistype a template name:</p>

<p>
<meta charset="utf-8">  </meta>
</p>

<div style="margin-left: 40px; "><code><strong>for</strong>(task : Task&nbsp;<strong>in</strong>&nbsp;user.todo) {</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp;row{&nbsp;</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;<span style="color: rgb(255, 0, 0); ">outputt</span>(task.done)</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp; &nbsp;output(task)</code></div>

<div style="margin-left: 40px; "><code>&nbsp;&nbsp;}</code></div>

<div style="margin-left: 40px; "><code>}</code>&nbsp;</div>

<p>&nbsp;</p>

<p>The error we get at compile time is as follows:</p>

<p>&nbsp;</p>

<p style="margin-left: 40px; "><code>* webtasks.app:39/14: error: Template with this signature not defined&nbsp;<br />
outputt(task.done)</code></p>

<div>Note the use of domain-speak. This <em>template</em> is not defined, not value or method, but <em>template</em>.</div>

<p>&nbsp;</p>

<p>What if we define an access control rule for a page, or set of pages that does not exist:</p>

<p style="margin-left: 40px; "><code>Access control warning: unused rules:&nbsp;<br />
&nbsp;&nbsp;rule page edit*(*)</code></p>

<p>We are currently working to also add more thorough checks for page element compositions. For instance, are <code>row</code>s defined within <code>table</code>s, <code>listitem</code>s within <code>list</code>s and so on. We&#8217;re also working on IDE integration, so that your WebDSL programs are checked as you type.</p>

<p>No matter if you like the WebDSL language and its syntax or not, love or hate the formatting and wording of its error messages, abstract from all of that and the opportunity is clear:</p>

<p><strong>An external DSL compiler can detect mistakes early and its error messages can be very clear and domain-specific.</strong></p>

<p>Because we&#8217;re building our own syntax, compilers and typecheckers it is <em>quite easy</em> to add checks like these. Detecting mistakes in this manner is either not feasible, or at the very least more difficult in internal DSLs. In dynamically typed languages it&#8217;s extremely hard because of the language&#8217;s dynamic nature, in statically typed languages like Scala it may require building a compiler extension, which is also a non-trivial exercise.</p>

<p>Although you may say you would never make mistakes that are caught by checks like these, they have turned out to be extremely useful to us, as WebDSL users ourselves. But then again, that may be because we&#8217;re just all a bunch of <a href="http://zef.me/2378/i-am">NNPP</a>s.</p>
]]></content:encoded>
			<wfw:commentRss>http://zef.me/2409/static-verification-an-external-dsl-advantage/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>A &#8216;When Rails Fails&#8217; Follow-up</title>
		<link>http://zef.me/2355/a-when-rails-fails-follow-up</link>
		<comments>http://zef.me/2355/a-when-rails-fails-follow-up#comments</comments>
		<pubDate>Thu, 12 Nov 2009 09:17:57 +0000</pubDate>
		<dc:creator>Zef</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[webdsl]]></category>

		<guid isPermaLink="false">http://zef.me/?p=2355</guid>
		<description><![CDATA[About 18 hours ago I posted When Rails Fails, in which  [...]]]></description>
			<content:encoded><![CDATA[<p>About 18 hours ago I posted <a href="http://zef.me/2308/when-rails-fails">When Rails Fails</a>, in which I showed what happens if you make simple mistakes in your Ruby on Rails code. The response was pretty massive. 30 comments were left on the post itself, and more discussion takes place on <a href="http://www.reddit.com/r/programming/comments/a3945/when_rails_fails/">reddit</a> and <a href="http://news.ycombinator.com/item?id=936657">hacker news</a>, plus I received some messages on twitter. Most memorable is <a href="http://twitter.com/mrkris/status/5637650910">this one</a>.</p>

<p>Criticism of the article falls into a number of categories.</p>

<p><strong>Category #1: Denial</strong></p>

<blockquote>
<p>You are talking crap, those error messages are pretty good!</p>
</blockquote>

<p>It saddens me that these error messages are perceived as &quot;pretty good&quot;. It tells you something about the state of tools today. If we go back to more basic programming, for instance in Java. You write code which contains errors. You compile the code, the compiler tells you &quot;this objects has no such method at &#8230;&quot;. &quot;That class does not exist at&#8230;&quot;, &quot;variable not declared at &#8230;&quot; You may hate Java and everything it stands for, but admit it, having this type of error messages is pretty convenient, isn&#8217;t it? Wouldn&#8217;t you prefer clear to-the-point domain-specific error messages over a stack trace with an obscure error message? If you say that the error message makes perfect sense, that&#8217;s only because you&#8217;ve encountered it before and remember how to resolve it, not that the error message is in fact clear.</p>

<p>When I mistype the name of a controller in <code>routes.rb </code>and the error I get is &quot;uninitialized constant HommeController&quot;, that is a bad error message. Better would be &quot;At line &#8230; you refer to controller &#8216;homme&#8217;, but no such controller exists.&quot; Are you honestly going to argue with that? You may say, &quot;sure that would be great, but this is enough for me, I can handle these types of error messages.&quot; And sure, you may find these errors acceptable and trade off well with the advantages of Rails as a whole, but do not tell me these error messages are perfectly fine.</p>

<p><strong>Category #2: You think this is bad, try a Java framework!</strong></p>

<p>Tell me about it. I have no intention of singling out Ruby on Rails here. I&#8217;m in no way a Rails hater. Rails was simply my first example to uncover there is a problem here. Later today I&#8217;ll publish a similar post about the Java Seam framework. <strong>Update</strong>: Here it is: <a href="http://zef.me/2333/when-jboss-seam-fails">When JBoss Seam Fails</a>.</p>

<p><strong>Category #3: You are simply a bad programmer!</strong></p>

<blockquote>
<p>I can&#8217;t help but immediately judge the author to be one of those <a href="http://en.wikipedia.org/wiki/NNPP">NNPP</a>&#8216;s who spends days tripping over ridiculously simple issues because they never really grokked how to debug in the general sense. I&#8217;m not claiming the author is an NNPP, I&#8217;m just saying when you get hung up on the basics like this that&#8217;s the impression that is conveyed.</p>
</blockquote>

<p>Another:</p>

<blockquote>
<p>I hate rails for several reasons but either you just started programming, or you are trolling.</p>
</blockquote>

<p>I like these, especially since I clearly pointed out:</p>

<blockquote>
<p>To test this out, I followed Rails&#8217; &quot;Getting Started&quot; guide and made &quot;accidental&quot; mistakes along the way, to see how the system would react.</p>
</blockquote>

<p>I made these mistakes &quot;accidentally&quot; (note the quotes). Quotes imply sarcasm here. And I&#8217;m not even going to defend my programming abilities.</p>

<p><strong>Category #4:&nbsp;Poor attention to detail is going to bite you in the ass as a programmer no matter what technology you&#8217;re using</strong></p>

<p>True, but it is the tool&#8217;s job to help you as much as possible when you do screw up, which you inevitably will. Rails (as shown) does a fairly bad job at that. However, not everybody seems to agree, from the comments:</p>

<blockquote>
<p>Wrong. It&#8217;s not the framework&#8217;s job to do anything. Rails isn&#8217;t for lazy people.</p>
</blockquote>

<p>It&#8217;s not the framework&#8217;s job to do anything? Are you serious? Why do you use it? Isn&#8217;t the point of Rails to do less work, to make web development fun, to make work more productive? Isn&#8217;t making mistakes part of that?</p>

<p><strong>Category #5: Where are your tests?</strong></p>

<p>Would my error messages be less obscure if I uncovered them by writing unit tests? At most it would make localizing errors easier.</p>

<p><strong>Category #6: If you don&#8217;t like it, go use Java! Screw you!</strong></p>

<p>Very mature. When I post my article about Java Seam today I expect far less response, or at least far less radical responses like these. People tend to get religious about their programming language. Today Ruby on Rails is their God, so whomever says a bad thing about it, shall be damned. And screw you too, for that matter.</p>

<p><strong>Category #7: Let me help you</strong></p>

<p>There were a number of people that offered me help, teaching me how to debug these issues even offering to contact me and help me out. I appreciate that a lot. It&#8217;s sweet. And it&#8217;s great that there are such friendly Rails people. I am not a struggling Rails developer however. I am interested in Rails, because we&#8217;re developing <a href="http://www.webdsl.org">WebDSL</a>, a Rails competitor. I&#8217;m looking at various web frameworks and observed that simple programming mistakes are often fairly difficult to track down. In WebDSL we attempt to solve this problem. I appreciate the intent, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://zef.me/2355/a-when-rails-fails-follow-up/feed</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Communicating our Work</title>
		<link>http://zef.me/2294/communicating-our-work</link>
		<comments>http://zef.me/2294/communicating-our-work#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:12:56 +0000</pubDate>
		<dc:creator>Zef</dc:creator>
				<category><![CDATA[Because I care]]></category>
		<category><![CDATA[webdsl]]></category>

		<guid isPermaLink="false">http://zef.me/?p=2294</guid>
		<description><![CDATA[Yesterday we participated in the Delft Design &#38; Eng [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday we <a href="http://zef.me/2253/vote-for-webdsl">participated</a> in the <a href="http://www.tudelft.nl/live/pagina.jsp?id=4bd8ed50-15a7-46be-8fa5-a5071c1d9f78&amp;lang=en">Delft Design &amp; Engineering Award</a> event. We were among the <a href="http://www.tudelft.nl/live/pagina.jsp?id=8ceaa9e0-49d5-4346-a23d-01a83966d062&amp;lang=en">20 semi-finalists</a> with our <a href="http://webdsl.org">WebDSL</a> project. This award is a university-wide event of <a href="http://www.tudelft.nl">our university</a>. A notable few co-semi-finalists were:</p>

<ul>
    <li>The adaptive robot hand, a robot hand that can pick up any smallish object without breaking it, especially useful for picking up fruits en vegetables</li>
    <li>Delfi-n3xt, a mini satellite that they are going to launch a couple hundred of next year</li>
    <li>Bio-concrete, self-healing concrete (for streets and stuff)</li>
    <li>VertiGO, an electronic motorcycle that&#8217;s fast and good-looking</li>
    <li>DelFly Micro, a tiny electronic &quot;insect&quot;-like device, that can fly into dangerous areas and deliver streaming video</li>
    <li>DAISY, a technique to more effectively solve strabismus (cross-eyedness) in children</li>
</ul>

<p>See what I did there? I explained in one sentence what these projects were in language that your mother would understand. Everybody will immediately see the opportunity and social impact of these inventions. Cure poor cross-eyed children, streets that <strong>frickin&#8217; repair themselves</strong>, <em>satellites, </em>world peace!</p>

<p>Oh yeah, another project:</p>

<ul>
    <li>WebDSL, a domain-specific language to reduce the amount of code you have to write for web applications, thereby reducing costs dramatically</li>
</ul>

<p>Sure. That&#8217;s ok. But does it cure babies? Can you send it to space? Does it solve the climate problem?</p>

<p>Nah. It&#8217;s computer stuff, it&#8217;s supposed to be used by nerds that build web applications.</p>

<p><a href="http://zef.me/wp-content/uploads/2009/11/boring.jpg"><img alt="boring" title="boring" width="284" height="422" class="alignnone size-full wp-image-2295" src="http://zef.me/wp-content/uploads/2009/11/boring.jpg" /></a></p>

<p>No, we didn&#8217;t win the award.&nbsp;</p>

<p>A week ago we were at my parents&#8217;, a friend of theirs that I hadn&#8217;t seen for a few years was there to visit.</p>

<p>&quot;So Zef, I hear you&#8217;re doing a Ph.D., what is it about?&quot;</p>

<p>Now, in situations like this I no longer panic. Early on I came up with an analogy that seems to work:</p>

<blockquote>
<p>You know how before before constructing a building, an architect makes an architecture of the building, right? So he draws pictures of what the building should look like and how it is structured. When this is done, the construction company takes those drawings and builders build the actual building.</p>
<p><a href="http://zef.me/wp-content/uploads/2009/11/building-construction-service_10748672.jpg"><img alt="building-construction-service_10748672" title="building-construction-service_10748672" width="250" height="250" class="alignnone size-full wp-image-2302" src="http://zef.me/wp-content/uploads/2009/11/building-construction-service_10748672.jpg" /></a></p>
<p>Building software is much the same: people first draw pictures of how the software should work and then programmers actually implement this architecture. This programming takes up a lot of time and money, similar to the construction of buildings. So what we try to do is skip the programming/construction parts and let the computer do that for us. So we take the pictures that lay out what the software should do and <em>generate</em> all the programming code to make it work. It&#8217;s like letting a big machine automatically build the building for you, without human intervention.</p>
</blockquote>

<p>People typically appreciate this explanation, as generic and oversimplified as it is.</p>

<p>&quot;So you actually draw pictures of software?&quot;</p>

<p>&quot;Well, we represent those pictures as text in practice, that&#8217;s what many software programmers prefer.&quot;</p>

<p>And confused faces return.</p>

<p><strong>People do not understand software, or the effort it takes to produce it.</strong></p>

<p>It doesn&#8217;t speak to people, it&#8217;s too abstract. It&#8217;s not something they have been confronted with or are likely to be confronted with in the future. Unless your research focusses on preventing their Windows to crash or killing computer viruses. And even if it doesn&#8217;t, they&#8217;ll conclude: &quot;Right&#8230; so you know about computers, right? Because I have this problem with Word&#8230;&quot;</p>

<p>A project like ours is never going to win a design &amp; engineering award because it&#8217;s too abstract, people simply do not care.</p>
]]></content:encoded>
			<wfw:commentRss>http://zef.me/2294/communicating-our-work/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Vote for WebDSL!</title>
		<link>http://zef.me/2253/vote-for-webdsl</link>
		<comments>http://zef.me/2253/vote-for-webdsl#comments</comments>
		<pubDate>Tue, 27 Oct 2009 12:21:07 +0000</pubDate>
		<dc:creator>Zef</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[webdsl]]></category>

		<guid isPermaLink="false">http://zef.me/?p=2253</guid>
		<description><![CDATA[&#160;We are a semi-finalist in the for the Delft Desig [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;We are a semi-finalist in the for the Delft Design Award. <a href="http://www.ddea.nl/Voteforadesign/tabid/587/ContestantID/19/Title/WebDSL/Default.aspx">Please vote for us</a>! It only takes a few seconds.</p>

<p><object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/6XkqbL80BTI&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=nl&amp;feature=player_embedded&amp;fs=1" />
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" /><embed src="http://www.youtube.com/v/6XkqbL80BTI&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=nl&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://zef.me/2253/vote-for-webdsl/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->