<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Exercising Dynamic Web Frameworks, or, How Do I Test These Friggin&#8217; Controllers Anyway?</title>
	<atom:link href="http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/feed/" rel="self" type="application/rss+xml" />
	<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/</link>
	<description>Robert Fischer and Brian Hurt on Punditry, Programming Languages, and Other Religious Issues</description>
	<pubDate>Thu, 20 Nov 2008 18:24:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
		<item>
		<title>By: Upped The Recent Post/Popular Post Widget Count &#124; Enfranchised Mind</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-33669</link>
		<dc:creator>Upped The Recent Post/Popular Post Widget Count &#124; Enfranchised Mind</dc:creator>
		<pubDate>Tue, 12 Aug 2008 19:33:41 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-33669</guid>
		<description>[...] Exercising Dynamic Web Frameworks, or, How Do I Test These Friggin&#8217; Controllers Anyway? [...]</description>
		<content:encoded><![CDATA[<p>[...] Exercising Dynamic Web Frameworks, or, How Do I Test These Friggin&#8217; Controllers Anyway? [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Hamlet D'Arcy</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32836</link>
		<dc:creator>Hamlet D'Arcy</dc:creator>
		<pubDate>Wed, 19 Mar 2008 02:18:53 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32836</guid>
		<description>I can appreciate the argument that an open language encourages BBoMs. But, in a weird way, I think closed languages may also actively promote BBoMs. One of the benefits of a statically typed languages is that tool support is much easier to add because it's easier to reason about the structure of the code. Java has given rise to amazing tools like Eclipse and IDEA, which makes traversing large, dependency riddled code bases simple. In Java, a minor BBoM isn't that tough to work with. But at some point your tool may lull you into creating a big mess. So when you say "Culture X" may promote BBoMs, I read that to say both "the culture of Java+Eclipse" or "the culture of Ruby+Open Classes". In the end it seems that some person has to be fanatical about dependency management to divert the disaster, regardless of the platform.</description>
		<content:encoded><![CDATA[<p>I can appreciate the argument that an open language encourages BBoMs. But, in a weird way, I think closed languages may also actively promote BBoMs. One of the benefits of a statically typed languages is that tool support is much easier to add because it&#8217;s easier to reason about the structure of the code. Java has given rise to amazing tools like Eclipse and IDEA, which makes traversing large, dependency riddled code bases simple. In Java, a minor BBoM isn&#8217;t that tough to work with. But at some point your tool may lull you into creating a big mess. So when you say &#8220;Culture X&#8221; may promote BBoMs, I read that to say both &#8220;the culture of Java+Eclipse&#8221; or &#8220;the culture of Ruby+Open Classes&#8221;. In the end it seems that some person has to be fanatical about dependency management to divert the disaster, regardless of the platform.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32830</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Mon, 17 Mar 2008 21:34:43 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32830</guid>
		<description>I actually had that problem with my first attempt at an open source piece of software.  I implemented BigInteger and BigDecimal using &lt;a href="http://gmplib.org/" rel="nofollow"&gt;GMP&lt;/a&gt;, but there was no concept of "structurally equivalent, but not inheriting from".

As far as I can tell, the whole nominal typing thing is a failure.  Inheritance is simply fraught with problems which make it extremely subtly wrong in many, many cases.  There's still a lot to be said for the correctness guaranties of static typing, but making all of that nominal and not structural is just wrong.

BTW, String isn't too far from an interface these days -- check out CharSequence that came in with 1.5.  Of course, people still accept "String"s all the time when they could perfectly well expect "CharSequence"s, so the kind of thing where Sun is paddling upstream.  But, if you hit a small piece of code or are working on a library and you want to be really nice to future maintainers, there you go.</description>
		<content:encoded><![CDATA[<p>I actually had that problem with my first attempt at an open source piece of software.  I implemented BigInteger and BigDecimal using <a href="http://gmplib.org/" rel="nofollow">GMP</a>, but there was no concept of &#8220;structurally equivalent, but not inheriting from&#8221;.</p>
<p>As far as I can tell, the whole nominal typing thing is a failure.  Inheritance is simply fraught with problems which make it extremely subtly wrong in many, many cases.  There&#8217;s still a lot to be said for the correctness guaranties of static typing, but making all of that nominal and not structural is just wrong.</p>
<p>BTW, String isn&#8217;t too far from an interface these days &#8212; check out CharSequence that came in with 1.5.  Of course, people still accept &#8220;String&#8221;s all the time when they could perfectly well expect &#8220;CharSequence&#8221;s, so the kind of thing where Sun is paddling upstream.  But, if you hit a small piece of code or are working on a library and you want to be really nice to future maintainers, there you go.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reg Braithwaite</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32828</link>
		<dc:creator>Reg Braithwaite</dc:creator>
		<pubDate>Mon, 17 Mar 2008 18:41:07 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32828</guid>
		<description>p.s. Of course, if I could rewrite Java history, String would be an interface. But then again, most Java programmers are class-oriented, not interface-oriented.</description>
		<content:encoded><![CDATA[<p>p.s. Of course, if I could rewrite Java history, String would be an interface. But then again, most Java programmers are class-oriented, not interface-oriented.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reg Braithwaite</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32827</link>
		<dc:creator>Reg Braithwaite</dc:creator>
		<pubDate>Mon, 17 Mar 2008 18:39:47 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32827</guid>
		<description>"Can you describe situations when this is enormously frustrating in the earlier case? I’ve never bumped into a problem and went, 'Boy, y’know what I need to do? I need to globally mess with the way this class works.'"

In Java, not open a class but subclass a class. For example, it would be nice to use the type checking system to enforce certain encoding issues. Let's use a trivial case: to have two kinds of String, HTMLString where HTML entities are already converted and PlainString where they are not.

if you can subclass String, you can use Java's strong, static type checking to ensure that you do not accidentally pass a PlainString to a method expecting an HTMLString. But since you cannot subclass String, nor is it an interface you can implement, you must write a container class and constantly reference and dereference an instance member.

Some folks argue this is a good thing, because if they write a method expecting a String, they want a guarantee it is a String and not something else I have deemed to have Liskov equivalence to a String.</description>
		<content:encoded><![CDATA[<p>&#8220;Can you describe situations when this is enormously frustrating in the earlier case? I’ve never bumped into a problem and went, &#8216;Boy, y’know what I need to do? I need to globally mess with the way this class works.&#8217;&#8221;</p>
<p>In Java, not open a class but subclass a class. For example, it would be nice to use the type checking system to enforce certain encoding issues. Let&#8217;s use a trivial case: to have two kinds of String, HTMLString where HTML entities are already converted and PlainString where they are not.</p>
<p>if you can subclass String, you can use Java&#8217;s strong, static type checking to ensure that you do not accidentally pass a PlainString to a method expecting an HTMLString. But since you cannot subclass String, nor is it an interface you can implement, you must write a container class and constantly reference and dereference an instance member.</p>
<p>Some folks argue this is a good thing, because if they write a method expecting a String, they want a guarantee it is a String and not something else I have deemed to have Liskov equivalence to a String.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32826</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Mon, 17 Mar 2008 18:33:55 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32826</guid>
		<description>Can you describe situations when this is enormously frustrating in the earlier case?  I've never bumped into a problem and went, "Boy, y'know what I need to do?  I need to globally mess with the way this class works."  The closest I've come is appreciating some features of Rails inflections, but that's nothing a set of utility functions wouldn't solve.  Actually, the whole enterprise makes me appreciate Ocaml's module approach a lot more -- this is kinda funny, because I really hated on the module approach when I first picked up Ocaml.

I suppose, at the end of the day, I'm just not a fan of running with scissors into production.</description>
		<content:encoded><![CDATA[<p>Can you describe situations when this is enormously frustrating in the earlier case?  I&#8217;ve never bumped into a problem and went, &#8220;Boy, y&#8217;know what I need to do?  I need to globally mess with the way this class works.&#8221;  The closest I&#8217;ve come is appreciating some features of Rails inflections, but that&#8217;s nothing a set of utility functions wouldn&#8217;t solve.  Actually, the whole enterprise makes me appreciate Ocaml&#8217;s module approach a lot more &#8212; this is kinda funny, because I really hated on the module approach when I first picked up Ocaml.</p>
<p>I suppose, at the end of the day, I&#8217;m just not a fan of running with scissors into production.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reg Braithwaite</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32819</link>
		<dc:creator>Reg Braithwaite</dc:creator>
		<pubDate>Mon, 17 Mar 2008 16:43:38 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32819</guid>
		<description>I didn't invent the BBoM acronym, I have seen it for a while. I'm sure you've read:

http://www.laputan.org/mud/

The shared dependencies issue with Ruby is well-known. It actually reminds me of "DLL Hell" in Windows. If you think of modified classes as versions, you have a version control problem. OTOH, you also have an opportunity to reach out and modify other people's code without their permission, which is a no-no to some people and a blessing to others.

For example, you may want to modify a base class and make sure that another piece of code you didn't write uses your modified class. For example, you could wrap some AOP around various method calls and what-not.

Is that a worthwhile trade-off? I don't know yet. I know that Java takes a very strong position on this: not only can you not modify core classes without magic (I speak as a magician, I have written code that uses a custom class loader to modify the byte codes of classes on the fly), but you also cannot subclass certain core classes like String.

That has been enormously frustrating for certain work I have done, but the powers-that-be have decided that they want to turn the knob over to "safe." Matz has explicitly said that Ruby is a pair of scissors and Ruby programmers are encouraged to run with them.

Good idea? Bad idea? I honestly do not think the matter can be decided by simple inspection and reasoning. My experience with open classes in Ruby so far is mixed. There are things I like and things that concern me. My experience with Java so far is that I dislike its locked down approach. I am interested in how languages liek Scala are approaching these issues.

BTW, this problem is much bigger than just Open Classes. I recall an exchange of blog posts over final classes and final methods. Declaring that nobody can subclass your class is really very similar to declaring that nobody can open your class.</description>
		<content:encoded><![CDATA[<p>I didn&#8217;t invent the BBoM acronym, I have seen it for a while. I&#8217;m sure you&#8217;ve read:</p>
<p><a href="http://www.laputan.org/mud/" rel="nofollow">http://www.laputan.org/mud/</a></p>
<p>The shared dependencies issue with Ruby is well-known. It actually reminds me of &#8220;DLL Hell&#8221; in Windows. If you think of modified classes as versions, you have a version control problem. OTOH, you also have an opportunity to reach out and modify other people&#8217;s code without their permission, which is a no-no to some people and a blessing to others.</p>
<p>For example, you may want to modify a base class and make sure that another piece of code you didn&#8217;t write uses your modified class. For example, you could wrap some AOP around various method calls and what-not.</p>
<p>Is that a worthwhile trade-off? I don&#8217;t know yet. I know that Java takes a very strong position on this: not only can you not modify core classes without magic (I speak as a magician, I have written code that uses a custom class loader to modify the byte codes of classes on the fly), but you also cannot subclass certain core classes like String.</p>
<p>That has been enormously frustrating for certain work I have done, but the powers-that-be have decided that they want to turn the knob over to &#8220;safe.&#8221; Matz has explicitly said that Ruby is a pair of scissors and Ruby programmers are encouraged to run with them.</p>
<p>Good idea? Bad idea? I honestly do not think the matter can be decided by simple inspection and reasoning. My experience with open classes in Ruby so far is mixed. There are things I like and things that concern me. My experience with Java so far is that I dislike its locked down approach. I am interested in how languages liek Scala are approaching these issues.</p>
<p>BTW, this problem is much bigger than just Open Classes. I recall an exchange of blog posts over final classes and final methods. Declaring that nobody can subclass your class is really very similar to declaring that nobody can open your class.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32818</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Mon, 17 Mar 2008 16:30:53 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32818</guid>
		<description>Wow.  We've acronymed "big ball of mud".  Does that make it an industry-standard term?

You're right in that my second sentence in that post was an unsubstantiated conjecture.  What about the hidden dependencies assertion?  That's an actual example of a difference between Java and Ruby which provides a clear protection against code interdependency.</description>
		<content:encoded><![CDATA[<p>Wow.  We&#8217;ve acronymed &#8220;big ball of mud&#8221;.  Does that make it an industry-standard term?</p>
<p>You&#8217;re right in that my second sentence in that post was an unsubstantiated conjecture.  What about the hidden dependencies assertion?  That&#8217;s an actual example of a difference between Java and Ruby which provides a clear protection against code interdependency.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reg Braithwaite</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32817</link>
		<dc:creator>Reg Braithwaite</dc:creator>
		<pubDate>Mon, 17 Mar 2008 16:27:26 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32817</guid>
		<description>"you can write a Java program that’s a ball of mud, but it takes a lot more effort than to write a Ruby ball of mud"

I think we are bandying unsubstantiated opinions around. I find it very hard to believe that any programming language gracefully guides programmers to creating programs with well-separated concerns.

My conjecture (and I admit it is a conjecture) is that if (If!!!) you were to examine a bunch of actual projects in language X and another bunch of actual projects in language Y and you found that X had more BBoMs than Y, the cultures of X and Y would have a much bigger impact than the features of X and Y.

But I can tell you from observation that if it is difficult to write a BBoM in Java, the Java programmers I have met have proven their prowess :-)</description>
		<content:encoded><![CDATA[<p>&#8220;you can write a Java program that’s a ball of mud, but it takes a lot more effort than to write a Ruby ball of mud&#8221;</p>
<p>I think we are bandying unsubstantiated opinions around. I find it very hard to believe that any programming language gracefully guides programmers to creating programs with well-separated concerns.</p>
<p>My conjecture (and I admit it is a conjecture) is that if (If!!!) you were to examine a bunch of actual projects in language X and another bunch of actual projects in language Y and you found that X had more BBoMs than Y, the cultures of X and Y would have a much bigger impact than the features of X and Y.</p>
<p>But I can tell you from observation that if it is difficult to write a BBoM in Java, the Java programmers I have met have proven their prowess :-)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32816</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Mon, 17 Mar 2008 16:22:28 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/2008/03/14/exercising-dynamic-web-frameworks-or-how-do-i-test-these-friggin-controllers-anyway/#comment-32816</guid>
		<description>@Reg

I think there's a problem which you're glossing over.  Sure, you &lt;em&gt;can&lt;/em&gt; write a Java program that's a ball of mud, but it takes a lot more effort than to write a Ruby ball of mud.

Particularly when you factor in "hidden dependencies" like external mangling of the classes (e.g. Logger, Symbol), it becomes very hard very quickly to see what all the dependencies are for a given piece of code.  At least in Java, I &lt;em&gt;can&lt;/em&gt; lock down my code and know that it's going to work on any JVM, no matter what other code has been executed beforehand.  That's not something I've got in Ruby -- that kind of code safety is simply not supported by the language.</description>
		<content:encoded><![CDATA[<p>@Reg</p>
<p>I think there&#8217;s a problem which you&#8217;re glossing over.  Sure, you <em>can</em> write a Java program that&#8217;s a ball of mud, but it takes a lot more effort than to write a Ruby ball of mud.</p>
<p>Particularly when you factor in &#8220;hidden dependencies&#8221; like external mangling of the classes (e.g. Logger, Symbol), it becomes very hard very quickly to see what all the dependencies are for a given piece of code.  At least in Java, I <em>can</em> lock down my code and know that it&#8217;s going to work on any JVM, no matter what other code has been executed beforehand.  That&#8217;s not something I&#8217;ve got in Ruby &#8212; that kind of code safety is simply not supported by the language.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
