<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.0.3" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: Simplicity rules - in the right place</title>
	<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/</link>
	<description>Everything and the kitchen sink</description>
	<pubDate>Wed, 09 Jul 2008 01:57:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.3</generator>

	<item>
		<title>by: cdegroot</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-10177</link>
		<pubDate>Sun, 30 Dec 2007 13:02:20 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-10177</guid>
					<description>Funny - somehow another analogy than the human/donkey one struck me, closer to home: you write and deploy a website on a stand-alone Linux box with basic LAMP stack. Then you write and deploy a second website on another stand-alone Linux box with basic LAMP stack. 

Of the total code base of these boxes, what percentage is different? 0.1%, maybe? Yet that one percent makes all the difference between the two sites. 

It could be argued that these LAMP boxes have &quot;too rich API's&quot; and that it should be trimmed down to just the bare necessities. Somehow, though, I'd think it'd be harder to do this trimming down and rebuild your Linux box &quot;just for that single site&quot; with simple building blocks all the way up from the kernel (I'm a systems thinker, so I look at systems :-))...</description>
		<content:encoded><![CDATA[<p>Funny - somehow another analogy than the human/donkey one struck me, closer to home: you write and deploy a website on a stand-alone Linux box with basic LAMP stack. Then you write and deploy a second website on another stand-alone Linux box with basic LAMP stack. </p>
<p>Of the total code base of these boxes, what percentage is different? 0.1%, maybe? Yet that one percent makes all the difference between the two sites. </p>
<p>It could be argued that these LAMP boxes have &#8220;too rich API&#8217;s&#8221; and that it should be trimmed down to just the bare necessities. Somehow, though, I&#8217;d think it&#8217;d be harder to do this trimming down and rebuild your Linux box &#8220;just for that single site&#8221; with simple building blocks all the way up from the kernel (I&#8217;m a systems thinker, so I look at systems <img src='http://www.cdegroot.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> )&#8230;
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Global Nerdy &#187; Blog Archive &#187; Monkey Knife Fight! (or: Not Much Has Changed)</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-9249</link>
		<pubDate>Thu, 27 Sep 2007 17:10:47 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-9249</guid>
					<description>[...] Cees deGroot: &amp;#8220;My favorite analogy here: the difference between a human and a donkey is maybe 5% in genes. I like to think that a good object system works the same - the difference in behaviour between my classes, if you count everything they inherit, is typically 1-5%. Just a handful of methods, with usually a couple of lines of code because the base classes are so rich. Now, that is where simplicity rules.&amp;#8221; [...]</description>
		<content:encoded><![CDATA[<p>[&#8230;] Cees deGroot: &#8220;My favorite analogy here: the difference between a human and a donkey is maybe 5% in genes. I like to think that a good object system works the same - the difference in behaviour between my classes, if you count everything they inherit, is typically 1-5%. Just a handful of methods, with usually a couple of lines of code because the base classes are so rich. Now, that is where simplicity rules.&#8221; [&#8230;]
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Tucows Services &#187; Tucows Developer Blog &#62; Blog Archive &#187; Monkey Knife Fight! (or: Not Much Has Changed)</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-9248</link>
		<pubDate>Thu, 27 Sep 2007 17:03:44 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-9248</guid>
					<description>[...] Cees deGroot: &amp;#8220;My favorite analogy here: the difference between a human and a donkey is maybe 5% in genes. I like to think that a good object system works the same - the difference in behaviour between my classes, if you count everything they inherit, is typically 1-5%. Just a handful of methods, with usually a couple of lines of code because the base classes are so rich. Now, that is where simplicity rules.&amp;#8221; [...]</description>
		<content:encoded><![CDATA[<p>[&#8230;] Cees deGroot: &#8220;My favorite analogy here: the difference between a human and a donkey is maybe 5% in genes. I like to think that a good object system works the same - the difference in behaviour between my classes, if you count everything they inherit, is typically 1-5%. Just a handful of methods, with usually a couple of lines of code because the base classes are so rich. Now, that is where simplicity rules.&#8221; [&#8230;]
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: cdegroot</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8838</link>
		<pubDate>Sun, 19 Aug 2007 01:13:08 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8838</guid>
					<description>@truth machine: sorry for the truncation. It seems to be a standard Wordpress feature, you're the first one to hit it. 

About 0-vs-1 indexing: you made a point about the C family. That doesn't mean it's a valid point across all languages. 

Oh - and please keep your ad-hominem attack mode in check. Calling people stupid is at best counterproductive in *any* discussion :)</description>
		<content:encoded><![CDATA[<p>@truth machine: sorry for the truncation. It seems to be a standard Wordpress feature, you&#8217;re the first one to hit it. </p>
<p>About 0-vs-1 indexing: you made a point about the C family. That doesn&#8217;t mean it&#8217;s a valid point across all languages. </p>
<p>Oh - and please keep your ad-hominem attack mode in check. Calling people stupid is at best counterproductive in *any* discussion <img src='http://www.cdegroot.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: truth machine</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8442</link>
		<pubDate>Sun, 05 Aug 2007 02:03:15 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8442</guid>
					<description>&quot;Whether the numbering contract is 0-based or 1-based is really a separate question. There’s no arguing taste.&quot;

It's not a matter of taste.  If C had used 1-indexing, then a pointer to an array would have had to point to the element preceding the array ... which would have been a different address depending on the type of the pointer (so, e.g., casting int* to char* would have required runtime arithmetic).  This obviously would have been insane.  Java is derived from and is supposed to resemble C, so it would obviously have been a very bad idea to switch from 0-indexing to 1-indexing, and of course interfacing with the OS or C extensions would have been error-prone.  These are just the most obvious reasons why 0-indexing is /objectively/ superior, for those languages at least.  (There are numerous other cases where it's useful for &quot;index of&quot; and &quot;offset to&quot; to be the same thing.)</description>
		<content:encoded><![CDATA[<p>&#8220;Whether the numbering contract is 0-based or 1-based is really a separate question. There’s no arguing taste.&#8221;</p>
<p>It&#8217;s not a matter of taste.  If C had used 1-indexing, then a pointer to an array would have had to point to the element preceding the array &#8230; which would have been a different address depending on the type of the pointer (so, e.g., casting int* to char* would have required runtime arithmetic).  This obviously would have been insane.  Java is derived from and is supposed to resemble C, so it would obviously have been a very bad idea to switch from 0-indexing to 1-indexing, and of course interfacing with the OS or C extensions would have been error-prone.  These are just the most obvious reasons why 0-indexing is /objectively/ superior, for those languages at least.  (There are numerous other cases where it&#8217;s useful for &#8220;index of&#8221; and &#8220;offset to&#8221; to be the same thing.)
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: truth machine</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8441</link>
		<pubDate>Sun, 05 Aug 2007 01:42:35 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8441</guid>
					<description>Ack!  You have a length limit?  And throw the rest away?  What horrible horrible horrible engineering ... any concern about Minimalist vs. Humane pales in comparison.</description>
		<content:encoded><![CDATA[<p>Ack!  You have a length limit?  And throw the rest away?  What horrible horrible horrible engineering &#8230; any concern about Minimalist vs. Humane pales in comparison.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: truth machine</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8440</link>
		<pubDate>Sun, 05 Aug 2007 01:40:25 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-8440</guid>
					<description>This is one of the stupidest &quot;technical&quot; discussions, which took place over numerous blogs, written by some of the stupidest people (with a few exceptions), that I have ever read on the web.  Language theocracy, unsupported opinion being passed off as wisdom, insight, or logical argument, numerous factual errors about the classes being discussed, and a steady stream of shed-painting.  Which class library is designed correctly, Ruby's or Java's?  Neither -- they could both be improved.  Neither is completely Humane or Minimalist -- but no competent programmer or designer could want the latter; it's completely counter to good design principles, and seems to be based on the false dichotomy that what isn't minimal is bloated.  Of course what isn't minimal is unnecessarily redundant, but only in a very formal sense -- it isn't unnecessary to achieving goals of lower cost, higher production, greater robustness.  Even Sun figured this out, as it has added to Java quite a bit that was obviously missing (while numerous Java theocrats crafted sophistic rationalizations for why it was a /good/ thing that the language was crippled).

Ironically, in Ruby you can say array[-1], which, /for arrays/, has the same semantics as (is /defined/ as) array.last (but not so for other objects, which makes it non-redundant), whereas in Java you have to say array.get(array.size() - 1) (or getLength instead of size for ArrayList, sigh), which /is not/ defined as accessing the last element and isn't recognizable as such, since the /calculated/ index is an integer just like any other.  Aside from the fact that it takes slightly more space and time (the </description>
		<content:encoded><![CDATA[<p>This is one of the stupidest &#8220;technical&#8221; discussions, which took place over numerous blogs, written by some of the stupidest people (with a few exceptions), that I have ever read on the web.  Language theocracy, unsupported opinion being passed off as wisdom, insight, or logical argument, numerous factual errors about the classes being discussed, and a steady stream of shed-painting.  Which class library is designed correctly, Ruby&#8217;s or Java&#8217;s?  Neither &#8212; they could both be improved.  Neither is completely Humane or Minimalist &#8212; but no competent programmer or designer could want the latter; it&#8217;s completely counter to good design principles, and seems to be based on the false dichotomy that what isn&#8217;t minimal is bloated.  Of course what isn&#8217;t minimal is unnecessarily redundant, but only in a very formal sense &#8212; it isn&#8217;t unnecessary to achieving goals of lower cost, higher production, greater robustness.  Even Sun figured this out, as it has added to Java quite a bit that was obviously missing (while numerous Java theocrats crafted sophistic rationalizations for why it was a /good/ thing that the language was crippled).</p>
<p>Ironically, in Ruby you can say array[-1], which, /for arrays/, has the same semantics as (is /defined/ as) array.last (but not so for other objects, which makes it non-redundant), whereas in Java you have to say array.get(array.size() - 1) (or getLength instead of size for ArrayList, sigh), which /is not/ defined as accessing the last element and isn&#8217;t recognizable as such, since the /calculated/ index is an integer just like any other.  Aside from the fact that it takes slightly more space and time (the
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: cdegroot</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-56</link>
		<pubDate>Tue, 20 Dec 2005 11:00:11 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-56</guid>
					<description>I think that things like encapsulation, intention-revealing names and code duplication prevention should be the only deciding factors here - they decide what goes where, and then you end up with an interface.

Now, that interface might be larger than you'd wished for, especially if you are writing some code that you hope will be reused by others. In Smalltalk, then comes the final &quot;refactoring&quot;, categorizing the various parts of your interface. In theory, you could categorize your interface into &quot;basic&quot; and &quot;advanced&quot; (and &quot;private&quot;, of course) categories, but more often the categorization is more functional (&quot;accessing&quot;, &quot;updating&quot;, ...). In either case, this goes a long way towards making class interfaces more approachable to developers that aren't completely familiar with the class.</description>
		<content:encoded><![CDATA[<p>I think that things like encapsulation, intention-revealing names and code duplication prevention should be the only deciding factors here - they decide what goes where, and then you end up with an interface.</p>
<p>Now, that interface might be larger than you&#8217;d wished for, especially if you are writing some code that you hope will be reused by others. In Smalltalk, then comes the final &#8220;refactoring&#8221;, categorizing the various parts of your interface. In theory, you could categorize your interface into &#8220;basic&#8221; and &#8220;advanced&#8221; (and &#8220;private&#8221;, of course) categories, but more often the categorization is more functional (&#8221;accessing&#8221;, &#8220;updating&#8221;, &#8230;). In either case, this goes a long way towards making class interfaces more approachable to developers that aren&#8217;t completely familiar with the class.
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: Victor Volle</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-55</link>
		<pubDate>Tue, 20 Dec 2005 10:00:31 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-55</guid>
					<description>hm, perhaps there is rule of thumb that could be used to decide when to prefer &quot;humane&quot; over &quot;minimalist&quot; (and vice versa): a class that is very basic (like a List) and therefore used in many different ways should rather have a human interface. A class that is rather specialized, seldom used, should tend to have a minimalist interface. The reasoning is about weighing the learning curve (+minimalist) against code duplication (+humane).</description>
		<content:encoded><![CDATA[<p>hm, perhaps there is rule of thumb that could be used to decide when to prefer &#8220;humane&#8221; over &#8220;minimalist&#8221; (and vice versa): a class that is very basic (like a List) and therefore used in many different ways should rather have a human interface. A class that is rather specialized, seldom used, should tend to have a minimalist interface. The reasoning is about weighing the learning curve (+minimalist) against code duplication (+humane).
</p>
]]></content:encoded>
				</item>
	<item>
		<title>by: cdegroot</title>
		<link>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-47</link>
		<pubDate>Thu, 15 Dec 2005 20:51:52 +0000</pubDate>
		<guid>http://www.cdegroot.com/blog/2005/12/06/simplicity-rules-in-the-right-place/#comment-47</guid>
					<description>Robert, you're right, of course. I was barking up the wrong tree there. Can I defend myself with being under the influence of influenza when I wrote that?

In any case:
&lt;blockquote&gt;&lt;em&gt;This is not an issue of explsing the implementation. A List is a collection of objects, held in some defined order, which can be numbered 0 to n-1 for a List of size n.&lt;/em&gt;&lt;/blockquote&gt;
Or, as you say, as &lt;code&gt;1..n&lt;/code&gt;. Which is where you start getting the benefit of intention-revealing selectors--if you code a stack or a FIFO, just operating on the list by sending it &lt;code&gt;#first&lt;/code&gt;, &lt;code&gt;#removeLast&lt;/code&gt;, etcetera, you abstract away from the underlying implementation and towards the reader of your code, making clear what you intended (instead of what the author of the underlying library code you're using implemented).</description>
		<content:encoded><![CDATA[<p>Robert, you&#8217;re right, of course. I was barking up the wrong tree there. Can I defend myself with being under the influence of influenza when I wrote that?</p>
<p>In any case:</p>
<blockquote><p><em>This is not an issue of explsing the implementation. A List is a collection of objects, held in some defined order, which can be numbered 0 to n-1 for a List of size n.</em></p></blockquote>
<p>Or, as you say, as <code>1..n</code>. Which is where you start getting the benefit of intention-revealing selectors&#8211;if you code a stack or a FIFO, just operating on the list by sending it <code>#first</code>, <code>#removeLast</code>, etcetera, you abstract away from the underlying implementation and towards the reader of your code, making clear what you intended (instead of what the author of the underlying library code you&#8217;re using implemented).
</p>
]]></content:encoded>
				</item>
</channel>
</rss>
