<?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: What&#8217;s it like to use those languages?</title>
	<atom:link href="http://blog.tmorris.net/whats-it-like-to-use-those-languages/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/</link>
	<description>The weblog of Tony Morris</description>
	<pubDate>Tue, 07 Feb 2012 18:22:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1764</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Tue, 25 Dec 2007 08:37:14 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1764</guid>
		<description>Hi Reiner,
Please be assured that I certainly do not encourage you to 'shut your trap'. Quite the contrary, I strongly encourage challenging any establishment in the name of progress.

I'd be willing to help you understand software abstraction and all the topics at hand that I am deliberately avoiding; choose your medium. I recently ran a Scala training course for Red Hat/JBoss and I'm running the same course again after Christmas. It was called a 'Scala training course', but really I was teaching advanced concepts with a language that supports some of them (we also touched on Haskell98).

You're not in the area I assume :) but I strongly implore you to seek further and definitely keep your trap yappin' ;)</description>
		<content:encoded><![CDATA[<p>Hi Reiner,<br />
Please be assured that I certainly do not encourage you to &#8217;shut your trap&#8217;. Quite the contrary, I strongly encourage challenging any establishment in the name of progress.</p>
<p>I&#8217;d be willing to help you understand software abstraction and all the topics at hand that I am deliberately avoiding; choose your medium. I recently ran a Scala training course for Red Hat/JBoss and I&#8217;m running the same course again after Christmas. It was called a &#8216;Scala training course&#8217;, but really I was teaching advanced concepts with a language that supports some of them (we also touched on Haskell98).</p>
<p>You&#8217;re not in the area I assume <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> but I strongly implore you to seek further and definitely keep your trap yappin&#8217; <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reinier Zwitserloot</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1760</link>
		<dc:creator>Reinier Zwitserloot</dc:creator>
		<pubDate>Tue, 25 Dec 2007 02:36:23 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1760</guid>
		<description>Yes, because telling me: 'no, no, my language is better, just take it on faith' is nothing at all like managers telling you to stop confusing them with 'complicated', 'unreadable', 'what-the-hell-language-is-that' nice, clean, flexible, maintainable code. None whatsoever.

Your post sort of changes tack, starting with a promise to explain what using more refined languages will be like, but ending with the fairly 'duh - obvious' conclusion that the need to dance to some idiot boss's fiddle is very bad for your codebase. That's the real conclusion of your post, I think - if you get the sense that doing X is the cleaner way, try and fight for it, and don't listen to any book, guru, or bosses premonitions. You might be wrong, but making the mistake is the only way to really learn.

Unfortunately, this puts your last comment in a bit of a bind, as it seems to be telling me to shut my yap and just follow the sheeple - blame languages that lack elegance as the only thing standing between me and the promised land of programming. Thing is, I use many languages, and not one of them magically makes my code jump over the moon, or magically eliminates all bugs. A man can dream, perhaps.

Maybe I need that lecture on category theory. I could maybe compare it to the many tutorials on haskell type classes for kicks.</description>
		<content:encoded><![CDATA[<p>Yes, because telling me: &#8216;no, no, my language is better, just take it on faith&#8217; is nothing at all like managers telling you to stop confusing them with &#8216;complicated&#8217;, &#8216;unreadable&#8217;, &#8216;what-the-hell-language-is-that&#8217; nice, clean, flexible, maintainable code. None whatsoever.</p>
<p>Your post sort of changes tack, starting with a promise to explain what using more refined languages will be like, but ending with the fairly &#8216;duh - obvious&#8217; conclusion that the need to dance to some idiot boss&#8217;s fiddle is very bad for your codebase. That&#8217;s the real conclusion of your post, I think - if you get the sense that doing X is the cleaner way, try and fight for it, and don&#8217;t listen to any book, guru, or bosses premonitions. You might be wrong, but making the mistake is the only way to really learn.</p>
<p>Unfortunately, this puts your last comment in a bit of a bind, as it seems to be telling me to shut my yap and just follow the sheeple - blame languages that lack elegance as the only thing standing between me and the promised land of programming. Thing is, I use many languages, and not one of them magically makes my code jump over the moon, or magically eliminates all bugs. A man can dream, perhaps.</p>
<p>Maybe I need that lecture on category theory. I could maybe compare it to the many tutorials on haskell type classes for kicks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1763</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Mon, 24 Dec 2007 19:43:01 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1763</guid>
		<description>Hi Reiner,
None of the issues that I am alluding to have been addressed. The metaphor is not 'fundamentally flawed', since some of your premises are incorrect. For example, "...in java that requires such preposterous levels of workaround is primitives". I'd be happy to elaborate here, but I fear falling into that 'lecture about Category Theory' that I have so far avoided.

In the meantime, please take my word for it, it's like that :)</description>
		<content:encoded><![CDATA[<p>Hi Reiner,<br />
None of the issues that I am alluding to have been addressed. The metaphor is not &#8216;fundamentally flawed&#8217;, since some of your premises are incorrect. For example, &#8220;&#8230;in java that requires such preposterous levels of workaround is primitives&#8221;. I&#8217;d be happy to elaborate here, but I fear falling into that &#8216;lecture about Category Theory&#8217; that I have so far avoided.</p>
<p>In the meantime, please take my word for it, it&#8217;s like that <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Reinier Zwitserloot</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1762</link>
		<dc:creator>Reinier Zwitserloot</dc:creator>
		<pubDate>Mon, 24 Dec 2007 15:50:17 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1762</guid>
		<description>eclipse-size-plugin.jar would obviously win; it would generate size methods on the fly for all accessible types in the project space :-)

The only thing I can find in java that requires such preposterous levels of workaround is primitives; you can't template on them so if you care enough for e.g. an implemention for IntList and the like, you'd need to write a code generator. Which is exactly what one of those java collections API extensions (apache's, or google's, I can't recall) does. No good, but, fortunately, performance of the wrapper classes is sufficiently close to the primitives themselves that it doesn't really matter.

Therefore, I'd say your metaphor is fundamentally flawed; java's problems lie in its 'half-assed'ness. It has a static, explicit type system, but then the notion of whether or not any variable/attribute/parameter can hold null is completely dynamic. It chooses the 'enumerate all common use cases' vs the 'create meta programming directives like operator overloading and let library builders sort it out' paradigm, which has a few redeeming features to some, but then doesn't do it right, because new and obvious use cases (such as BigInteger and BigDecimal needing operator support) aren't added in a timely fashion.

It has closures, but they carry 4+ lines of cruft just to write them (anonymous inner classes - function pointers that close over lexical scope. That's close enough to 'closure' in my book, but you need to wrap all non-final variables, you have to jump through some hoops to escape from the closure using e.g. a return or break or continue, and, of course, you need to write both the class/interface name and the method name). Discussion to do something about the cruft finally shows up for java7, but then half the proposals act as if anonymous inner classes don't exist and write a new type system instead.

Just point such people to Scala. It doesn't just run on the JVM, like python or ruby - it actually takes some pains to produce class files that look and feel like a java-generated class file from the perspective of a java developer. They have getters and setters and sensical hashCode and equals implementations and such - most of that invisible for scala code, as it should be. You can therefore use scala on a few files in a java-based project and the people you work with (or yourself if you go back to java for some of the files) don't really notice.

Java isn't the only language base that has to deal with lots of conflicting similar implementations of the same concept. Python has a bunch of rails-wannabees, all very very similar and yet all different (TurboGears and Django are virtually the same thing, for example). I imagine its a common problem for any language with such an enormous userbase. Again, though, java doesn't really carry it to its logical conclusion; there is no CPAN-like database for java. There's the maven repository but there are plenty of writings to find online about the many things Maven does very very wrong.

Fortunately to java programmers, and the JVM (which, in my book, is made up mostly of win), recent pressures in programming language world seem to have kickstarted improvements to java into gear. Most of the above issues are now being addressed, though whether it'll help will remain to be seen.</description>
		<content:encoded><![CDATA[<p>eclipse-size-plugin.jar would obviously win; it would generate size methods on the fly for all accessible types in the project space <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
The only thing I can find in java that requires such preposterous levels of workaround is primitives; you can&#8217;t template on them so if you care enough for e.g. an implemention for IntList and the like, you&#8217;d need to write a code generator. Which is exactly what one of those java collections API extensions (apache&#8217;s, or google&#8217;s, I can&#8217;t recall) does. No good, but, fortunately, performance of the wrapper classes is sufficiently close to the primitives themselves that it doesn&#8217;t really matter.</p>
<p>Therefore, I&#8217;d say your metaphor is fundamentally flawed; java&#8217;s problems lie in its &#8216;half-assed&#8217;ness. It has a static, explicit type system, but then the notion of whether or not any variable/attribute/parameter can hold null is completely dynamic. It chooses the &#8216;enumerate all common use cases&#8217; vs the &#8216;create meta programming directives like operator overloading and let library builders sort it out&#8217; paradigm, which has a few redeeming features to some, but then doesn&#8217;t do it right, because new and obvious use cases (such as BigInteger and BigDecimal needing operator support) aren&#8217;t added in a timely fashion.</p>
<p>It has closures, but they carry 4+ lines of cruft just to write them (anonymous inner classes - function pointers that close over lexical scope. That&#8217;s close enough to &#8216;closure&#8217; in my book, but you need to wrap all non-final variables, you have to jump through some hoops to escape from the closure using e.g. a return or break or continue, and, of course, you need to write both the class/interface name and the method name). Discussion to do something about the cruft finally shows up for java7, but then half the proposals act as if anonymous inner classes don&#8217;t exist and write a new type system instead.</p>
<p>Just point such people to Scala. It doesn&#8217;t just run on the JVM, like python or ruby - it actually takes some pains to produce class files that look and feel like a java-generated class file from the perspective of a java developer. They have getters and setters and sensical hashCode and equals implementations and such - most of that invisible for scala code, as it should be. You can therefore use scala on a few files in a java-based project and the people you work with (or yourself if you go back to java for some of the files) don&#8217;t really notice.</p>
<p>Java isn&#8217;t the only language base that has to deal with lots of conflicting similar implementations of the same concept. Python has a bunch of rails-wannabees, all very very similar and yet all different (TurboGears and Django are virtually the same thing, for example). I imagine its a common problem for any language with such an enormous userbase. Again, though, java doesn&#8217;t really carry it to its logical conclusion; there is no CPAN-like database for java. There&#8217;s the maven repository but there are plenty of writings to find online about the many things Maven does very very wrong.</p>
<p>Fortunately to java programmers, and the JVM (which, in my book, is made up mostly of win), recent pressures in programming language world seem to have kickstarted improvements to java into gear. Most of the above issues are now being addressed, though whether it&#8217;ll help will remain to be seen.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John "Z-Bo" Zabroski</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1759</link>
		<dc:creator>John "Z-Bo" Zabroski</dc:creator>
		<pubDate>Sat, 22 Dec 2007 07:15:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1759</guid>
		<description>People only remember embarrassment and accomplishment.  The Parable of the Infinite Jar of Objects is one way to embarrass people: through metaphor.  Design patterns is one way to summarize accomplishments through metaphor.  In embarrassment and accomplishment, people can build a sense of aesthetics that allow them to see past notions like "software development phases", and lift up higher truths about evolving technology.  If it requires The Parable of the Infinite Jar of Objects to see these higher truths in terms of embarrassment, then so be it.  If it requires reading &lt;em&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/em&gt; and &lt;em&gt;Refactoring: Improving the Design of Existing Code&lt;/em&gt; to see these higher truths in terms of accomplishment, then so be it.  However, I'd prefer it if embarrassment and accomplishment were seen as two sides of the same coin.

Metaphors are an important vehicle for accepting each side of the coin, because metaphors aren't too prescriptive.  In written language, we tolerate more complexity, as it requires more time in reading and writing to accomplish the same analysis and design using speech communication.  The subtle nuance suggested in The Parable of the Infinite Jar of Objects is that although you may be forced to express everything as an object in one way or another, having too many objects impedes communication.  The water shed moment comes after the embarrassment, and the opportunity presents itself to illustrate through metaphor how to accomplish &lt;em&gt;agility&lt;/em&gt;: pare down the model.

The first thing that can be taught about analysis is that &lt;em&gt;models are not right or wrong; models are more or less useful&lt;/em&gt;.  How far do you go in modeling?  As far as is useful.  There's always more than one way to model a problem.  There's also no necessary way to begin visualizing a model.  Modeling is an iterative process, and it doesn't need to start at the &lt;em&gt;best place&lt;/em&gt;.  With any reasonable starting place, the model will converge on a similarly useful model.

What is the difference between Euclid's Euclidean geometry and Hilbert's Euclidean geometry?  They both modeled the same problem, but with different perspectives.  Euclid and Hilbert were &lt;em&gt;looking at the same picture, but starting from different angles and distances&lt;/em&gt;.

Sometimes, the modeling path chosen will not end up in a robust model.  Invalid solutions are not necessarily completely discarded.  Although we should heed "plan to throw one away; you will, anyhow", then it is useful to pull back and ask if some of our initial assumptions are invalid.  By teasing away the assumptions that don't apply to the particular problem, the model becomes more robust.

A good example of design patterns capturing higher truths is the Sorting Pattern: implementing a sorting algorithm using a divide-and-conquer approach.  All shuffling algorithms can be decomposed into Split and Join semantics.  The number of shuffles it takes to sort a list depends upon the splitting decision.  Selection Sort splits a list into two elements: the first element, and the rest of the list.  Merge Sort splits a list into two halves.  Quick Sort varies in how it splits a list, but makes a best effort to split a list evenly.  The ingenuity behind C.A.R. Hoare's design of Quick Sort is that all of the complexity is in the Split: there is no Join code.  The Split/Join model is a very robust model that separates the model into two models for improved decision-making.  We can see the advantage of the robustness of this model in Introspection Sort (IntroSort) used in the SGI implementation of the C++ Standard Library: IntroSort combines Quick Sort, Heap Sort and Insertion Sort.</description>
		<content:encoded><![CDATA[<p>People only remember embarrassment and accomplishment.  The Parable of the Infinite Jar of Objects is one way to embarrass people: through metaphor.  Design patterns is one way to summarize accomplishments through metaphor.  In embarrassment and accomplishment, people can build a sense of aesthetics that allow them to see past notions like &#8220;software development phases&#8221;, and lift up higher truths about evolving technology.  If it requires The Parable of the Infinite Jar of Objects to see these higher truths in terms of embarrassment, then so be it.  If it requires reading <em>Design Patterns: Elements of Reusable Object-Oriented Software</em> and <em>Refactoring: Improving the Design of Existing Code</em> to see these higher truths in terms of accomplishment, then so be it.  However, I&#8217;d prefer it if embarrassment and accomplishment were seen as two sides of the same coin.</p>
<p>Metaphors are an important vehicle for accepting each side of the coin, because metaphors aren&#8217;t too prescriptive.  In written language, we tolerate more complexity, as it requires more time in reading and writing to accomplish the same analysis and design using speech communication.  The subtle nuance suggested in The Parable of the Infinite Jar of Objects is that although you may be forced to express everything as an object in one way or another, having too many objects impedes communication.  The water shed moment comes after the embarrassment, and the opportunity presents itself to illustrate through metaphor how to accomplish <em>agility</em>: pare down the model.</p>
<p>The first thing that can be taught about analysis is that <em>models are not right or wrong; models are more or less useful</em>.  How far do you go in modeling?  As far as is useful.  There&#8217;s always more than one way to model a problem.  There&#8217;s also no necessary way to begin visualizing a model.  Modeling is an iterative process, and it doesn&#8217;t need to start at the <em>best place</em>.  With any reasonable starting place, the model will converge on a similarly useful model.</p>
<p>What is the difference between Euclid&#8217;s Euclidean geometry and Hilbert&#8217;s Euclidean geometry?  They both modeled the same problem, but with different perspectives.  Euclid and Hilbert were <em>looking at the same picture, but starting from different angles and distances</em>.</p>
<p>Sometimes, the modeling path chosen will not end up in a robust model.  Invalid solutions are not necessarily completely discarded.  Although we should heed &#8220;plan to throw one away; you will, anyhow&#8221;, then it is useful to pull back and ask if some of our initial assumptions are invalid.  By teasing away the assumptions that don&#8217;t apply to the particular problem, the model becomes more robust.</p>
<p>A good example of design patterns capturing higher truths is the Sorting Pattern: implementing a sorting algorithm using a divide-and-conquer approach.  All shuffling algorithms can be decomposed into Split and Join semantics.  The number of shuffles it takes to sort a list depends upon the splitting decision.  Selection Sort splits a list into two elements: the first element, and the rest of the list.  Merge Sort splits a list into two halves.  Quick Sort varies in how it splits a list, but makes a best effort to split a list evenly.  The ingenuity behind C.A.R. Hoare&#8217;s design of Quick Sort is that all of the complexity is in the Split: there is no Join code.  The Split/Join model is a very robust model that separates the model into two models for improved decision-making.  We can see the advantage of the robustness of this model in Introspection Sort (IntroSort) used in the SGI implementation of the C++ Standard Library: IntroSort combines Quick Sort, Heap Sort and Insertion Sort.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Sohail</title>
		<link>http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1761</link>
		<dc:creator>Sohail</dc:creator>
		<pubDate>Thu, 20 Dec 2007 00:14:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/whats-it-like-to-use-those-languages/#comment-1761</guid>
		<description>I totally understand what you're saying except I'm not so harsh ("sigh and keep going") though I end up doing the same thing. Eventually they are forced to do whatever I am doing :-)</description>
		<content:encoded><![CDATA[<p>I totally understand what you&#8217;re saying except I&#8217;m not so harsh (&#8221;sigh and keep going&#8221;) though I end up doing the same thing. Eventually they are forced to do whatever I am doing <img src='http://blog.tmorris.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
</channel>
</rss>

