<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
	<title>Comments for Bertrand Meyer's technology blog</title>
	
	<link>http://bertrandmeyer.com</link>
	<description>Software and Technology</description>
	<lastBuildDate>Mon, 22 Feb 2010 17:03:17 +0100</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BertrandMeyer-comments" /><feedburner:info uri="bertrandmeyer-comments" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item>
		<title>Comment on Reflexivity, and other pillars of civilization by opacus</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-155</link>
		<dc:creator>opacus</dc:creator>
		<pubDate>Mon, 22 Feb 2010 17:03:17 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-155</guid>
		<description>It is important to separate two questions.  The first is whether we agree that, for all x, x = x.  Most people would want to agree, and that is what the mathematical precedent really supports.  The second question is whether we agree that the expression 'x = x' should always be evaluated as true.  Whether or not people would agree with that, there is in fact strong mathematical precedent for disagreement, depending on the type of expression we substitute for 'x'.  If 'x' is a definite description then it follows from the theory in Whitehead and Russell's Principia Mathematica, for instance, that 'x = x' may well be false.  An expression containing definite descriptions always gets expanded in primitive notation to one which does not contain them.  So 'the biggest integer is even' turns into something like 'for just one integer x, for all integers y, both x is as large as y and x is even'.  That is, of course, false but then so is 'the biggest integer is the biggest integer' since that becomes 'for just one x, for just one y, for all integers z, x is as large as z and y is as large as z and x = y'.  So, in terms of programming languages there is no a-priori reason why 'x = x' might not be evaluated as false if the expression substituted for 'x' is really some kind of definite description which might fail to apply to one and only one item.</description>
		<content:encoded><![CDATA[<p>It is important to separate two questions.  The first is whether we agree that, for all x, x = x.  Most people would want to agree, and that is what the mathematical precedent really supports.  The second question is whether we agree that the expression &#8216;x = x&#8217; should always be evaluated as true.  Whether or not people would agree with that, there is in fact strong mathematical precedent for disagreement, depending on the type of expression we substitute for &#8216;x&#8217;.  If &#8216;x&#8217; is a definite description then it follows from the theory in Whitehead and Russell&#8217;s Principia Mathematica, for instance, that &#8216;x = x&#8217; may well be false.  An expression containing definite descriptions always gets expanded in primitive notation to one which does not contain them.  So &#8216;the biggest integer is even&#8217; turns into something like &#8216;for just one integer x, for all integers y, both x is as large as y and x is even&#8217;.  That is, of course, false but then so is &#8216;the biggest integer is the biggest integer&#8217; since that becomes &#8216;for just one x, for just one y, for all integers z, x is as large as z and y is as large as z and x = y&#8217;.  So, in terms of programming languages there is no a-priori reason why &#8216;x = x&#8217; might not be evaluated as false if the expression substituted for &#8216;x&#8217; is really some kind of definite description which might fail to apply to one and only one item.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by dlebansais</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-151</link>
		<dc:creator>dlebansais</dc:creator>
		<pubDate>Mon, 08 Feb 2010 01:46:14 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-151</guid>
		<description>(My apologies for the reply spam)

There is also an interesting case of violated reflexivity in the Eiffel standard. Check ECMA-367 section 8.21.3

"The Boolean_expression e ~ f has value true if and only if the values of e and f are both attached and such that e.is_equal (f) holds."

In other word, with x: detachable ANY, x ~ x must yield False per the Eiffel standard.

Be reassured, under Eiffelstudio it yields True. :)</description>
		<content:encoded><![CDATA[<p>(My apologies for the reply spam)</p>
<p>There is also an interesting case of violated reflexivity in the Eiffel standard. Check ECMA-367 section 8.21.3</p>
<p>&#8220;The Boolean_expression e ~ f has value true if and only if the values of e and f are both attached and such that e.is_equal (f) holds.&#8221;</p>
<p>In other word, with x: detachable ANY, x ~ x must yield False per the Eiffel standard.</p>
<p>Be reassured, under Eiffelstudio it yields True. <img src='http://bertrandmeyer.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by dlebansais</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-150</link>
		<dc:creator>dlebansais</dc:creator>
		<pubDate>Mon, 08 Feb 2010 01:37:12 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-150</guid>
		<description>I forgot to mention that this definition of is_equal for REAL objects is likely to create havoc in the standard Eiffel libraries. I'll play with LIST[REAL] containing NaN when I have more time. Hopefully we don't end up with infinite loops and such oddities.</description>
		<content:encoded><![CDATA[<p>I forgot to mention that this definition of is_equal for REAL objects is likely to create havoc in the standard Eiffel libraries. I&#8217;ll play with LIST[REAL] containing NaN when I have more time. Hopefully we don&#8217;t end up with infinite loops and such oddities.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by dlebansais</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-149</link>
		<dc:creator>dlebansais</dc:creator>
		<pubDate>Mon, 08 Feb 2010 01:29:30 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-149</guid>
		<description>I think there are many topics related to this post and I'll try to summarize what each of them led me to think.

1. I don't have access to the standard as it seems the reference document is not free of charge. Why you must pay to know the standard is one topic but I'll leave it for another time. Wikipedia has a link to a recent draft (1.2.9) and I believe you're refering to section 7.11 that I will quote here:

"Comparisons are exact and never overflow or underflow. Four mutually exclusive relations are possible: less
than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN
shall compare unordered with everything, including itself. Comparisons shall ignore the sign of zero
(so +0 = −0). Infinite operands of the same sign shall compare equal.

Languages define how the result of a comparison shall be delivered, in one of two ways: either as a condition
code identifying one of the four relations listed above, or as a true-false response to a predicate that names the
specific comparison desired."

I didn't see anything else in this draft specifying that NaN comparison should yield false, however "Every NaN
shall compare unordered with everything, including itself" leaves no doubt about that since unordered is not equal.

Note that raising an exception would violate the standard, I believe, since comparing two numbers even if one is a NaN is a non-signaling operation.

2. I think the problem is that we want to maintain not two properties (equality is reflexive, and NaN /= NaN) but three, the third being that all objects can be compared. This is captured by the fact that is_equal is a feature of ANY, while other comparison features such as is_less come from specialized classes like COMPARABLE.

In a world with is_equal being a feature of an abstract class (EQUATABLE? It sounds ugly) the REAL class would not inherit this feature. Real numbers could not be compared with is_equal. They would be compared with a dedicated feature taking one of "less than", "equal", "greater than" and "unordered" as an argument, that could then safely return true or false as specified by the standard.

3. I've been confronted in the past with problems such as this one. Almost always, it comes from trying to mix orange and apples in a single value or concept. The way out is then to clearly separate the involved values and concepts in different entities. For instance, consider this definition of REAL:

class REAL
...
feature
value: ARRAY[INTEGER_8] -- The numeric value
meaningful: BOOLEAN     -- False if a NaN
...
end

Then the value of a number is separate from the boolean attribute that indicates if it has a meaning. The proper redefinition of is_equal becomes

is_equal (other: like Current): BOOLEAN
	do
		if meaningful and other.meaningful then
			result := value.is_equal(other.value)
		else
			result := False
		end
	end

This definition satisfies x /= x when x.meaningful is False.

4. You could argue that this is only an artificial trick to reconcile Eiffel contracts and the IEEE standard. I think it goes deeper than that. Equality in Eiffel, and probably all languages, is only an approximation of mathematical equality. If you asked, during a math course "does x = x?" then sure I'd answer yes. But during a computing course? I'd answer "depends...". Many aspects of computer languages are traductions of mathematical operations and properties that want to stay as close as the original concept, but never succeed that it.

There are well known examples. Take this function for instance:

identity_with_a_trick (n: INTEGER): INTEGER
	do
		result := n * 2
		result := result // 2
	ensure
		same_value: result = n
	end

It is naive to think that dividing or multiplying a number is harmless, it can raise an exception. The function above can raise a post-condition violation exception.

So to answer prof. Meyer's question "A programming language should support the venerable properties that equality is reflexive and that assignment yields equality (...) Do you agree?" I respectfully disagree in general, and fully agree when equality is defined for the objects being compared. IEEE 754 standard simply states it isn't.</description>
		<content:encoded><![CDATA[<p>I think there are many topics related to this post and I&#8217;ll try to summarize what each of them led me to think.</p>
<p>1. I don&#8217;t have access to the standard as it seems the reference document is not free of charge. Why you must pay to know the standard is one topic but I&#8217;ll leave it for another time. Wikipedia has a link to a recent draft (1.2.9) and I believe you&#8217;re refering to section 7.11 that I will quote here:</p>
<p>&#8220;Comparisons are exact and never overflow or underflow. Four mutually exclusive relations are possible: less<br />
than, equal, greater than, and unordered. The last case arises when at least one operand is NaN. Every NaN<br />
shall compare unordered with everything, including itself. Comparisons shall ignore the sign of zero<br />
(so +0 = −0). Infinite operands of the same sign shall compare equal.</p>
<p>Languages define how the result of a comparison shall be delivered, in one of two ways: either as a condition<br />
code identifying one of the four relations listed above, or as a true-false response to a predicate that names the<br />
specific comparison desired.&#8221;</p>
<p>I didn&#8217;t see anything else in this draft specifying that NaN comparison should yield false, however &#8220;Every NaN<br />
shall compare unordered with everything, including itself&#8221; leaves no doubt about that since unordered is not equal.</p>
<p>Note that raising an exception would violate the standard, I believe, since comparing two numbers even if one is a NaN is a non-signaling operation.</p>
<p>2. I think the problem is that we want to maintain not two properties (equality is reflexive, and NaN /= NaN) but three, the third being that all objects can be compared. This is captured by the fact that is_equal is a feature of ANY, while other comparison features such as is_less come from specialized classes like COMPARABLE.</p>
<p>In a world with is_equal being a feature of an abstract class (EQUATABLE? It sounds ugly) the REAL class would not inherit this feature. Real numbers could not be compared with is_equal. They would be compared with a dedicated feature taking one of &#8220;less than&#8221;, &#8220;equal&#8221;, &#8220;greater than&#8221; and &#8220;unordered&#8221; as an argument, that could then safely return true or false as specified by the standard.</p>
<p>3. I&#8217;ve been confronted in the past with problems such as this one. Almost always, it comes from trying to mix orange and apples in a single value or concept. The way out is then to clearly separate the involved values and concepts in different entities. For instance, consider this definition of REAL:</p>
<p>class REAL<br />
&#8230;<br />
feature<br />
value: ARRAY[INTEGER_8] &#8212; The numeric value<br />
meaningful: BOOLEAN     &#8212; False if a NaN<br />
&#8230;<br />
end</p>
<p>Then the value of a number is separate from the boolean attribute that indicates if it has a meaning. The proper redefinition of is_equal becomes</p>
<p>is_equal (other: like Current): BOOLEAN<br />
	do<br />
		if meaningful and other.meaningful then<br />
			result := value.is_equal(other.value)<br />
		else<br />
			result := False<br />
		end<br />
	end</p>
<p>This definition satisfies x /= x when x.meaningful is False.</p>
<p>4. You could argue that this is only an artificial trick to reconcile Eiffel contracts and the IEEE standard. I think it goes deeper than that. Equality in Eiffel, and probably all languages, is only an approximation of mathematical equality. If you asked, during a math course &#8220;does x = x?&#8221; then sure I&#8217;d answer yes. But during a computing course? I&#8217;d answer &#8220;depends&#8230;&#8221;. Many aspects of computer languages are traductions of mathematical operations and properties that want to stay as close as the original concept, but never succeed that it.</p>
<p>There are well known examples. Take this function for instance:</p>
<p>identity_with_a_trick (n: INTEGER): INTEGER<br />
	do<br />
		result := n * 2<br />
		result := result // 2<br />
	ensure<br />
		same_value: result = n<br />
	end</p>
<p>It is naive to think that dividing or multiplying a number is harmless, it can raise an exception. The function above can raise a post-condition violation exception.</p>
<p>So to answer prof. Meyer&#8217;s question &#8220;A programming language should support the venerable properties that equality is reflexive and that assignment yields equality (&#8230;) Do you agree?&#8221; I respectfully disagree in general, and fully agree when equality is defined for the objects being compared. IEEE 754 standard simply states it isn&#8217;t.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by Mattias Wikström</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-148</link>
		<dc:creator>Mattias Wikström</dc:creator>
		<pubDate>Sun, 07 Feb 2010 10:05:17 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-148</guid>
		<description>I think that regardless of whether you opt for NaN=NaN or NaN/=NaN there is good mathematics to back your decision. The full mathematical story is in any case much more complicated than what is captured by NaN's, and the responsibility for using them correctly must ultimately rest with the programmer.

If a1, a2, ... and b1, b2, ... are sequences of real numbers that both approach 0, then the sequence of quotients a1/b1, a2/b2, ... in general will not approach any real number, but will rather have a set of (extended) real numbers as its limit (the smallest of which is known as the inferior limit and the largest of which is known as the superior limit).

We can adopt the convention that an ordinary function applied to a set is equal to the set of function values, and we can then go on to calculate with sets of real numbers much as with real numbers (the first person to do this may have been Weierstrass). Let us now consider the question of equality between such sets. We know that {3, 4} and {4, 7} are different by ordinary set equality, but if we apply the equality function to the pairs (3, 4), (3, 7), (4, 4), and (4, 7) then the results will be False, False, True, and False, respectively, giving us the set {False, True}. In fact, we get the same result if we compare {3, 4} to itself.

How are we to interpret an equality that evaluates to {False, True}? If we interpret it as True then transitivity of equality will quickly lead to all real numbers allegedly being one and the same thing. I would say that what this really means is that there is a not-too-unnatural sense in which all real numbers are _equivalent_. If we interpret {False, True} as being False, then we allegedly have things/objects/entities which are not equal to themselves (or maybe I should say that we have a single thing/object/entity which is not equal to itself - without equality we have no standard for counting things.). Finally, we may prefer to restrict the domain of definition of our equality relation so that the cases that gave {False, True} are excluded from consideration.

Based on these three possibilities one might conclude that we cannot have NaN=NaN without getting x=y for any real numbers x and y (thus vindicating IEEE 754). However, we also have the set equality that makes {3, 4} distinct from {4, 7}, and we can use this type of equality to introduce yet another type of equality: We may consider all sets that contain more than one real number to be one and the same object, and we may call this object "NaN". In fact, there is mathematical research that supports treating NaN as a first-class object: See http://en.wikipedia.org/wiki/Wheel_theory .</description>
		<content:encoded><![CDATA[<p>I think that regardless of whether you opt for NaN=NaN or NaN/=NaN there is good mathematics to back your decision. The full mathematical story is in any case much more complicated than what is captured by NaN&#8217;s, and the responsibility for using them correctly must ultimately rest with the programmer.</p>
<p>If a1, a2, &#8230; and b1, b2, &#8230; are sequences of real numbers that both approach 0, then the sequence of quotients a1/b1, a2/b2, &#8230; in general will not approach any real number, but will rather have a set of (extended) real numbers as its limit (the smallest of which is known as the inferior limit and the largest of which is known as the superior limit).</p>
<p>We can adopt the convention that an ordinary function applied to a set is equal to the set of function values, and we can then go on to calculate with sets of real numbers much as with real numbers (the first person to do this may have been Weierstrass). Let us now consider the question of equality between such sets. We know that {3, 4} and {4, 7} are different by ordinary set equality, but if we apply the equality function to the pairs (3, 4), (3, 7), (4, 4), and (4, 7) then the results will be False, False, True, and False, respectively, giving us the set {False, True}. In fact, we get the same result if we compare {3, 4} to itself.</p>
<p>How are we to interpret an equality that evaluates to {False, True}? If we interpret it as True then transitivity of equality will quickly lead to all real numbers allegedly being one and the same thing. I would say that what this really means is that there is a not-too-unnatural sense in which all real numbers are _equivalent_. If we interpret {False, True} as being False, then we allegedly have things/objects/entities which are not equal to themselves (or maybe I should say that we have a single thing/object/entity which is not equal to itself &#8211; without equality we have no standard for counting things.). Finally, we may prefer to restrict the domain of definition of our equality relation so that the cases that gave {False, True} are excluded from consideration.</p>
<p>Based on these three possibilities one might conclude that we cannot have NaN=NaN without getting x=y for any real numbers x and y (thus vindicating IEEE 754). However, we also have the set equality that makes {3, 4} distinct from {4, 7}, and we can use this type of equality to introduce yet another type of equality: We may consider all sets that contain more than one real number to be one and the same object, and we may call this object &#8220;NaN&#8221;. In fact, there is mathematical research that supports treating NaN as a first-class object: See <a href="http://en.wikipedia.org/wiki/Wheel_theory" rel="nofollow">http://en.wikipedia.org/wiki/Wheel_theory</a> .</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by Bernd Schoeller</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-147</link>
		<dc:creator>Bernd Schoeller</dc:creator>
		<pubDate>Sun, 07 Feb 2010 08:51:55 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-147</guid>
		<description>This article is great and summarizes the problems with 754 very nicely.

Math is partial and there are different ways to handle this. Problems show when these ways are mixed, for example through the interactions between Boolean and Real.

One way is the use of NaN and any other 3-valued logic. But then, Boolean value should have a NaB. Another is the use of preconditions. That is what Eiffel uses. To be consistent, Eiffel should raise a precondition violation whenever an operation would produce a NaN.</description>
		<content:encoded><![CDATA[<p>This article is great and summarizes the problems with 754 very nicely.</p>
<p>Math is partial and there are different ways to handle this. Problems show when these ways are mixed, for example through the interactions between Boolean and Real.</p>
<p>One way is the use of NaN and any other 3-valued logic. But then, Boolean value should have a NaB. Another is the use of preconditions. That is what Eiffel uses. To be consistent, Eiffel should raise a precondition violation whenever an operation would produce a NaN.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Just another day at the office by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2010/01/15/just-another-day-at-the-office/comment-page-1/#comment-144</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Sat, 06 Feb 2010 18:58:19 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=899#comment-144</guid>
		<description>You are right, I had omitted to mention that point. I updated the relevant part of the article to mention the need to save and restore the cursors. Actually in such cases I now use the new "across" loop variant, which uses an external cursor and maintains this automatically, so that one does not need to worry about such issues any more.</description>
		<content:encoded><![CDATA[<p>You are right, I had omitted to mention that point. I updated the relevant part of the article to mention the need to save and restore the cursors. Actually in such cases I now use the new &#8220;across&#8221; loop variant, which uses an external cursor and maintains this automatically, so that one does not need to worry about such issues any more.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on A couple of loop examples by Bertrand Meyer's technology blog » Blog Archive » Just another day at the office</title>
		<link>http://bertrandmeyer.com/2010/01/28/a-couple-of-loop-examples/comment-page-1/#comment-143</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » Just another day at the office</dc:creator>
		<pubDate>Sat, 06 Feb 2010 18:57:10 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1025#comment-143</guid>
		<description>[...] about this point in a comment to this post. The new across loop variant described in  two later postings uses external cursors and manages them automatically, so this business of maintaining the cursor [...]</description>
		<content:encoded><![CDATA[<p>[...] about this point in a comment to this post. The new across loop variant described in  two later postings uses external cursors and manages them automatically, so this business of maintaining the cursor [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on More expressive loops for Eiffel by Bertrand Meyer's technology blog » Blog Archive » Just another day at the office</title>
		<link>http://bertrandmeyer.com/2010/01/26/more-expressive-loops-for-eiffel/comment-page-1/#comment-142</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » Just another day at the office</dc:creator>
		<pubDate>Sat, 06 Feb 2010 18:56:10 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=990#comment-142</guid>
		<description>[...] Thanks to Ian Warrington for raising that point. The new across loop variant described in  two later postings uses external cursors and manages them automatically, so this business of maintaining the [...]</description>
		<content:encoded><![CDATA[<p>[...] Thanks to Ian Warrington for raising that point. The new across loop variant described in  two later postings uses external cursors and manages them automatically, so this business of maintaining the [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Reflexivity, and other pillars of civilization by barrkel</title>
		<link>http://bertrandmeyer.com/2010/02/06/reflexivity-and-other-pillars-of-civilization/comment-page-1/#comment-141</link>
		<dc:creator>barrkel</dc:creator>
		<pubDate>Sat, 06 Feb 2010 17:58:47 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1054#comment-141</guid>
		<description>ISTM that either three-valued logic (i.e. SQL TRUE, FALSE and NULL behaviour) or signalling NaNs are preferable to silent NaNs. Signalling NaNs by default are preferable for practical reasons too; usually a NaN is caused by a programming mistake where an argument to an operation wasn't correctly bounds-checked.

Of course, floating-point numbers are imperfect substitutes for mathematical real-valued numbers - I think REAL is a poor choice of name for the type in a programming language, as it has the potential to mislead the mathematically minded - since many functions on floating-point values that a mathematician would expect to be identity functions will turn out to accumulate imprecision, resulting in similarly surprising x != x.</description>
		<content:encoded><![CDATA[<p>ISTM that either three-valued logic (i.e. SQL TRUE, FALSE and NULL behaviour) or signalling NaNs are preferable to silent NaNs. Signalling NaNs by default are preferable for practical reasons too; usually a NaN is caused by a programming mistake where an argument to an operation wasn&#8217;t correctly bounds-checked.</p>
<p>Of course, floating-point numbers are imperfect substitutes for mathematical real-valued numbers &#8211; I think REAL is a poor choice of name for the type in a programming language, as it has the potential to mislead the mathematically minded &#8211; since many functions on floating-point values that a mathematician would expect to be identity functions will turn out to accumulate imprecision, resulting in similarly surprising x != x.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Just another day at the office by Ian Warrington</title>
		<link>http://bertrandmeyer.com/2010/01/15/just-another-day-at-the-office/comment-page-1/#comment-135</link>
		<dc:creator>Ian Warrington</dc:creator>
		<pubDate>Sat, 06 Feb 2010 00:33:33 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=899#comment-135</guid>
		<description>Hi Bertrand, just wondering about your definition of is_equal with respect to command / query separation? By advancing through the collections, the value of "item" is changing for the current object as well as "other". Would you need to restore the original values of "item" so as to not produce any abstract side effects?

Kind regards,

Ian</description>
		<content:encoded><![CDATA[<p>Hi Bertrand, just wondering about your definition of is_equal with respect to command / query separation? By advancing through the collections, the value of &#8220;item&#8221; is changing for the current object as well as &#8220;other&#8221;. Would you need to restore the original values of &#8220;item&#8221; so as to not produce any abstract side effects?</p>
<p>Kind regards,</p>
<p>Ian</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on More expressive loops for Eiffel by bmeyer</title>
		<link>http://bertrandmeyer.com/2010/01/26/more-expressive-loops-for-eiffel/comment-page-1/#comment-134</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Thu, 04 Feb 2010 20:59:37 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=990#comment-134</guid>
		<description>The `across' variant is formally defined by an "unfolded form" that uses the `from' variant. In the case of a void structure it will produce the same effect, a "call on void target" exception.

In void-safe mode the compiler will reject the code (although I haven't checked this yet on an actual example).</description>
		<content:encoded><![CDATA[<p>The `across&#8217; variant is formally defined by an &#8220;unfolded form&#8221; that uses the `from&#8217; variant. In the case of a void structure it will produce the same effect, a &#8220;call on void target&#8221; exception.</p>
<p>In void-safe mode the compiler will reject the code (although I haven&#8217;t checked this yet on an actual example).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on More expressive loops for Eiffel by Peter Gummer</title>
		<link>http://bertrandmeyer.com/2010/01/26/more-expressive-loops-for-eiffel/comment-page-1/#comment-132</link>
		<dc:creator>Peter Gummer</dc:creator>
		<pubDate>Wed, 03 Feb 2010 22:06:40 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=990#comment-132</guid>
		<description>What happens if the structure is Void? Take your first example:

  across s as c loop print (c.item) end

If 's' is declared to be of a detachable type, and if it actually is Void at run time, does this 'across' loop raise a Void-target call exception? (This is what C# does if the structure supplied to a 'foreach' loop is null. I'm fixing one such NullReferenceException bug right now that has gone undetected for months in our C# code.) Or does 'across' recognise that the structure is Void, and treat it the same as if it were empty, performing zero iterations of the loop? (This is what I wish C# 'foreach' loops did; I wish it frequently, unfortunately.)

Or would the Void-safe Eiffel compiler reject the above code if 's' is detachable?</description>
		<content:encoded><![CDATA[<p>What happens if the structure is Void? Take your first example:</p>
<p>  across s as c loop print (c.item) end</p>
<p>If &#8217;s&#8217; is declared to be of a detachable type, and if it actually is Void at run time, does this &#8216;across&#8217; loop raise a Void-target call exception? (This is what C# does if the structure supplied to a &#8216;foreach&#8217; loop is null. I&#8217;m fixing one such NullReferenceException bug right now that has gone undetected for months in our C# code.) Or does &#8216;across&#8217; recognise that the structure is Void, and treat it the same as if it were empty, performing zero iterations of the loop? (This is what I wish C# &#8216;foreach&#8217; loops did; I wish it frequently, unfortunately.)</p>
<p>Or would the Void-safe Eiffel compiler reject the above code if &#8217;s&#8217; is detachable?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on More expressive loops for Eiffel by bmeyer</title>
		<link>http://bertrandmeyer.com/2010/01/26/more-expressive-loops-for-eiffel/comment-page-1/#comment-131</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Sun, 31 Jan 2010 22:47:08 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=990#comment-131</guid>
		<description>Both. It is very easy to make the `across...' loop applicable to any class:

- The simplest is to make the class a descendant of one of the existing descendants of the ITERABLE class, such as INDEXABLE (which is for example used as ancestor by all the list classes). Then you have nothing more to do; you get a standard cursor.

- If you want a more specific cursor, make the class a descendant of ITERABLE and write the specific cursor class as a descendant of ITERATION_CURSOR, effecting the queries `item' and `off'. This gives you finer control in case your structure has specific properties that should be accessible through the cursor. As an example, you can look at how this was done for HASH_TABLE in such a way that in a loop

   across my_hash_table as mht loop ... end

you can in a loop body access both mht.item, giving the current item in the hash table, and mht.key, giving its key.</description>
		<content:encoded><![CDATA[<p>Both. It is very easy to make the `across&#8230;&#8217; loop applicable to any class:</p>
<p>- The simplest is to make the class a descendant of one of the existing descendants of the ITERABLE class, such as INDEXABLE (which is for example used as ancestor by all the list classes). Then you have nothing more to do; you get a standard cursor.</p>
<p>- If you want a more specific cursor, make the class a descendant of ITERABLE and write the specific cursor class as a descendant of ITERATION_CURSOR, effecting the queries `item&#8217; and `off&#8217;. This gives you finer control in case your structure has specific properties that should be accessible through the cursor. As an example, you can look at how this was done for HASH_TABLE in such a way that in a loop</p>
<p>   across my_hash_table as mht loop &#8230; end</p>
<p>you can in a loop body access both mht.item, giving the current item in the hash table, and mht.key, giving its key.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on More expressive loops for Eiffel by Patrick Schoenbach</title>
		<link>http://bertrandmeyer.com/2010/01/26/more-expressive-loops-for-eiffel/comment-page-1/#comment-129</link>
		<dc:creator>Patrick Schoenbach</dc:creator>
		<pubDate>Sun, 31 Jan 2010 22:21:53 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=990#comment-129</guid>
		<description>Will these new loop constructs work with the standard EiffelBase containers only or will it be possible as well to make them work with any custom data structure?</description>
		<content:encoded><![CDATA[<p>Will these new loop constructs work with the standard EiffelBase containers only or will it be possible as well to make them work with any custom data structure?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The theory and calculus of aliasing by bmeyer</title>
		<link>http://bertrandmeyer.com/2010/01/21/the-theory-and-calculus-of-aliasing/comment-page-1/#comment-128</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Sat, 30 Jan 2010 01:00:06 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=935#comment-128</guid>
		<description>Thanks for the kind comments. Helmut Brandl has already pointed out the problem of routines called through dynamic binding. My comment that inheritance has little effect is too strong, but other than forcing the programmer to write "modifies clauses" there is no other path than taking into account all redeclarations. The next step of the work will take this into account.

I will release my current implementation as open source in a few weeks.</description>
		<content:encoded><![CDATA[<p>Thanks for the kind comments. Helmut Brandl has already pointed out the problem of routines called through dynamic binding. My comment that inheritance has little effect is too strong, but other than forcing the programmer to write &#8220;modifies clauses&#8221; there is no other path than taking into account all redeclarations. The next step of the work will take this into account.</p>
<p>I will release my current implementation as open source in a few weeks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The theory and calculus of aliasing by mate</title>
		<link>http://bertrandmeyer.com/2010/01/21/the-theory-and-calculus-of-aliasing/comment-page-1/#comment-127</link>
		<dc:creator>mate</dc:creator>
		<pubDate>Fri, 29 Jan 2010 20:21:51 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=935#comment-127</guid>
		<description>Hi Bertrand,

the calculus is very exciting. I'd be really interested in analyzing some larger code (e.g. different algorithms).
My questions:
- how does the calculus cope with virtual method calls? The paper says that the concepts of inheritance and genericity have only a marginal effect on aliasing, but it seems to me that you have to take into account the actual type of the object.
- do you have any open-source implementation of your analyzer? (Probably I need to implement my own, but having some working example would be very helpful.)

Thanks,
Mate</description>
		<content:encoded><![CDATA[<p>Hi Bertrand,</p>
<p>the calculus is very exciting. I&#8217;d be really interested in analyzing some larger code (e.g. different algorithms).<br />
My questions:<br />
- how does the calculus cope with virtual method calls? The paper says that the concepts of inheritance and genericity have only a marginal effect on aliasing, but it seems to me that you have to take into account the actual type of the object.<br />
- do you have any open-source implementation of your analyzer? (Probably I need to implement my own, but having some working example would be very helpful.)</p>
<p>Thanks,<br />
Mate</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The theory and calculus of aliasing by bmeyer</title>
		<link>http://bertrandmeyer.com/2010/01/21/the-theory-and-calculus-of-aliasing/comment-page-1/#comment-124</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Tue, 26 Jan 2010 19:19:55 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=935#comment-124</guid>
		<description>You are right about the desirability of circumscribing possible aliasings at the level of a deferred class. I hope to cover this in the forthcoming companion paper describing application to proving object-oriented software. Note that there are a few hints in section 2.1 of the present paper.

Even without dynamic binding, however, it is important to realize that aliasing is fundamentally non-compositional. as demonstrated at the beginning of section 3.4. The closest to a compositionality rule is the qualified call rule (/36/), which shows the dependence and influence on the environment.

It would be nice to be able to define the "alias relation induced by a routine r", say a (r), then, if a larger environment e includes calls to r, to define a (e) as a function of a (r) and a (x) for other components of e. Unfortunately that is not possible. As the paper shows, we can only defined the alias relation induced by r ___in reference to the alias relation that holds for a particular call to r___ (using the qualified call rule).

More precisely, if r always creates an aliasing between x and y, then any environment including calls to r may cause that aliasing. But the reverse property does not hold: if examination of r alone does not lead to identifying an aliasing between x and y, we can deduce no general property from this observation; a call could result in x and y becoming aliased. For example x and y could be respectively aliased to different formal arguments of r, and then a particular call might use actual arguments that are aliased to each other.

In fact, Mr. Brandl's post provides an excellent informal example of this. Looking at the present blog (in its state as I write this message), we can deduce that he did not make any comment related to a comment by Jules Jacobs. Now it turns out that Mr. Brandl posted his comment, identically, on both this blog and the "Lambda the Ultimate" blog.  If I mention here that "comments #1 and #13 on the first external blog referring to this topic are related" I  introduce an aliasing of sorts between the two authors, which is only visible when we consider the two blogs together. 

We have to reconcile ourselves with the realization that aliasing has some inevitably global aspects. Of course I agree with both comment authors that it is very desirable to make the solution as modular as possible for the programmers and appreciate the challenge to do so.</description>
		<content:encoded><![CDATA[<p>You are right about the desirability of circumscribing possible aliasings at the level of a deferred class. I hope to cover this in the forthcoming companion paper describing application to proving object-oriented software. Note that there are a few hints in section 2.1 of the present paper.</p>
<p>Even without dynamic binding, however, it is important to realize that aliasing is fundamentally non-compositional. as demonstrated at the beginning of section 3.4. The closest to a compositionality rule is the qualified call rule (/36/), which shows the dependence and influence on the environment.</p>
<p>It would be nice to be able to define the &#8220;alias relation induced by a routine r&#8221;, say a (r), then, if a larger environment e includes calls to r, to define a (e) as a function of a (r) and a (x) for other components of e. Unfortunately that is not possible. As the paper shows, we can only defined the alias relation induced by r ___in reference to the alias relation that holds for a particular call to r___ (using the qualified call rule).</p>
<p>More precisely, if r always creates an aliasing between x and y, then any environment including calls to r may cause that aliasing. But the reverse property does not hold: if examination of r alone does not lead to identifying an aliasing between x and y, we can deduce no general property from this observation; a call could result in x and y becoming aliased. For example x and y could be respectively aliased to different formal arguments of r, and then a particular call might use actual arguments that are aliased to each other.</p>
<p>In fact, Mr. Brandl&#8217;s post provides an excellent informal example of this. Looking at the present blog (in its state as I write this message), we can deduce that he did not make any comment related to a comment by Jules Jacobs. Now it turns out that Mr. Brandl posted his comment, identically, on both this blog and the &#8220;Lambda the Ultimate&#8221; blog.  If I mention here that &#8220;comments #1 and #13 on the first external blog referring to this topic are related&#8221; I  introduce an aliasing of sorts between the two authors, which is only visible when we consider the two blogs together. </p>
<p>We have to reconcile ourselves with the realization that aliasing has some inevitably global aspects. Of course I agree with both comment authors that it is very desirable to make the solution as modular as possible for the programmers and appreciate the challenge to do so.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The theory and calculus of aliasing by helmut.brandl</title>
		<link>http://bertrandmeyer.com/2010/01/21/the-theory-and-calculus-of-aliasing/comment-page-1/#comment-123</link>
		<dc:creator>helmut.brandl</dc:creator>
		<pubDate>Sat, 23 Jan 2010 14:25:08 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=935#comment-123</guid>
		<description>It is very interesting to introduce the "alias relation". With this relation a lot of reasoning can be done as you have demonstrated well in your draft paper "The theory and Calculus of Aliasing".

I like the fact, that no new notation is necessary in the program text. This is an advantage over dynamic frame contracts.

You build the alias relation bottom up, starting from elementary statements (i.e. the effect of the statements on the alias relation) to more complex statements.

But this might be also one of the weak points to solve the framing problem for OO Software. As far as I have understood your theory, it does (in its current state) not go well with dynamic binding and modular reasoning. Consider a parent class which introduces some deferred features (i.e. features with contracts only). A client using these features does not see the implementation.

How can you calculate the effect of a call to a deferred routine on the alias relation? If you do dynamic typeset calculation you can calculate the union of all effects. But then you leave modular reasoning. If you want to stick to modular reasoning, you certainly have to introduce some notation for deferred features to specify the effect on the alias relation which is binding for the descendants (like Bernd Schoeller did for his frame contracts).</description>
		<content:encoded><![CDATA[<p>It is very interesting to introduce the &#8220;alias relation&#8221;. With this relation a lot of reasoning can be done as you have demonstrated well in your draft paper &#8220;The theory and Calculus of Aliasing&#8221;.</p>
<p>I like the fact, that no new notation is necessary in the program text. This is an advantage over dynamic frame contracts.</p>
<p>You build the alias relation bottom up, starting from elementary statements (i.e. the effect of the statements on the alias relation) to more complex statements.</p>
<p>But this might be also one of the weak points to solve the framing problem for OO Software. As far as I have understood your theory, it does (in its current state) not go well with dynamic binding and modular reasoning. Consider a parent class which introduces some deferred features (i.e. features with contracts only). A client using these features does not see the implementation.</p>
<p>How can you calculate the effect of a call to a deferred routine on the alias relation? If you do dynamic typeset calculation you can calculate the union of all effects. But then you leave modular reasoning. If you want to stick to modular reasoning, you certainly have to introduce some notation for deferred features to specify the effect on the alias relation which is binding for the descendants (like Bernd Schoeller did for his frame contracts).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Touch of Class book page available by bmeyer</title>
		<link>http://bertrandmeyer.com/2009/12/19/touch-of-class-book-page-available/comment-page-1/#comment-121</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Thu, 21 Jan 2010 20:11:28 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=895#comment-121</guid>
		<description>On the third point: the two functions yield the same result when they are both defined (i.e. n &gt;= 1). This is implicit but in the next printing I will make it explicit to avoid any confusion.

I first thought you were referring to the loop invariant, but it is correct -- it mentions fibonacci (i-1), which is always defined, not fibonacci1. Of course it would make no sense for a loop invariant to use the enclosing function.</description>
		<content:encoded><![CDATA[<p>On the third point: the two functions yield the same result when they are both defined (i.e. n >= 1). This is implicit but in the next printing I will make it explicit to avoid any confusion.</p>
<p>I first thought you were referring to the loop invariant, but it is correct &#8212; it mentions fibonacci (i-1), which is always defined, not fibonacci1. Of course it would make no sense for a loop invariant to use the enclosing function.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Touch of Class book page available by joelneely</title>
		<link>http://bertrandmeyer.com/2009/12/19/touch-of-class-book-page-available/comment-page-1/#comment-119</link>
		<dc:creator>joelneely</dc:creator>
		<pubDate>Thu, 21 Jan 2010 13:06:01 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=895#comment-119</guid>
		<description>First, thanks for the link to the "do you really know Java?" discussion.

Second, thanks for the link to the sample chapter on recursion. I'm looking forward to studying it in detail.

Third, as someone who doesn't even qualify as a beginner in Eiffel, I was surprised by the statement on page 440 (of the sample chapter) that "The following function indeed yields the same result..." in one case. Is fibonacci1(0) actually allowed, given the requirement (n &gt;= 1)? Or is the problem my own ignorance of the meaning/usage of "require positive: n &gt;= 1"?</description>
		<content:encoded><![CDATA[<p>First, thanks for the link to the &#8220;do you really know Java?&#8221; discussion.</p>
<p>Second, thanks for the link to the sample chapter on recursion. I&#8217;m looking forward to studying it in detail.</p>
<p>Third, as someone who doesn&#8217;t even qualify as a beginner in Eiffel, I was surprised by the statement on page 440 (of the sample chapter) that &#8220;The following function indeed yields the same result&#8230;&#8221; in one case. Is fibonacci1(0) actually allowed, given the requirement (n &gt;= 1)? Or is the problem my own ignorance of the meaning/usage of &#8220;require positive: n &gt;= 1&#8243;?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Dwelling on the point by andreabaruzzo</title>
		<link>http://bertrandmeyer.com/2009/11/29/dwelling-on-the-point/comment-page-1/#comment-118</link>
		<dc:creator>andreabaruzzo</dc:creator>
		<pubDate>Fri, 15 Jan 2010 23:07:00 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=869#comment-118</guid>
		<description>Hi Bertrand,
I believe that our industry lacks a true professional attitude. To be honest, I don't know very well how the software development practice is undertaken in other countries; I know to some extent the situation in Italy, where I live and work. Here most software development initiatives, even in medium and large organizations, are still amateurish. Software is hand-crafted. And this is primarily due by a cultural gap. The practice of Software Engineering (SE) encompasses a wide range of skills, not all of which are (or must to be) very formal. But the "engineering attitude" of SE means that we should base our work also on formal models and methods, on a corpus of well-established body of knowledge, and on a robust software development environment. All together these elements help our deveolpment practice to reach the right level of maturity, allowing us to create reliable software systems. If we do not invest at least some part of our time to acquire the right culture, we cannot be able to produce software systems which are both of acceptable quality and still economically convenient.
I remember a personal anecdote provided by Steve Maguire that affected tremendously my perspective on what should be considered "good" software development. He (Steve) talked about a software bug reported by the tester team on a database management product for Apple II. At that time, Steve was one of the programmers assigned to that product. After several debugging and testing sessions, the bug seemed to be disappeared and the first reaction of Steve was to ignore it. Perhaps someone else fixed it in the meantime! or maybe the bug report was simply wrong. After further work, however, Steve realized that the bug was there all of the time. Simply it was hidden by some other behavior, and that the right thing to do in that case was not to ignore the bag at all but to further examine the program in order to better understand the bug's nature. Steve's final remark was that, as software professionals, we have to perform three separate steps in order to better tackle software bugs:
1. we must carefully investigate the root cause of *every* bug, understanding why it was introduced in the program in the first place; then 
2. we have to fix it, running regression testing suites (or any other verification strategy) in order to assure that the fix has not introduced new, unexpected side-effects in the program.
3. Finally, but not least important, we have to ask ourselves how we can *prevent* to reintroduce again the bug in our code. And his best suggestion is to translate this understanding into good assertions that will catch the bug automatically in the case it will be inadvertently reintroduced again.
If we would systematically reason in that way, I believe that there are good chances that our software products will be crafted better than now. Moreover, this attitude in the long term is also cost-effective because it reduces the effort required in maintenance. Ok, this of course is not a full-fledge methodology, it is only a good practice concerning bug removal. But in my experience it seems that this practice is not followed. 
I don't know if the development team working for the Poste Italiane tackled the issues reported in the article as Steve suggested; I only hope that our industry will eventually learn by his mistakes, e.g. starting by filling the software amateur cultural gap as soon as possible. 

Andrea</description>
		<content:encoded><![CDATA[<p>Hi Bertrand,<br />
I believe that our industry lacks a true professional attitude. To be honest, I don&#8217;t know very well how the software development practice is undertaken in other countries; I know to some extent the situation in Italy, where I live and work. Here most software development initiatives, even in medium and large organizations, are still amateurish. Software is hand-crafted. And this is primarily due by a cultural gap. The practice of Software Engineering (SE) encompasses a wide range of skills, not all of which are (or must to be) very formal. But the &#8220;engineering attitude&#8221; of SE means that we should base our work also on formal models and methods, on a corpus of well-established body of knowledge, and on a robust software development environment. All together these elements help our deveolpment practice to reach the right level of maturity, allowing us to create reliable software systems. If we do not invest at least some part of our time to acquire the right culture, we cannot be able to produce software systems which are both of acceptable quality and still economically convenient.<br />
I remember a personal anecdote provided by Steve Maguire that affected tremendously my perspective on what should be considered &#8220;good&#8221; software development. He (Steve) talked about a software bug reported by the tester team on a database management product for Apple II. At that time, Steve was one of the programmers assigned to that product. After several debugging and testing sessions, the bug seemed to be disappeared and the first reaction of Steve was to ignore it. Perhaps someone else fixed it in the meantime! or maybe the bug report was simply wrong. After further work, however, Steve realized that the bug was there all of the time. Simply it was hidden by some other behavior, and that the right thing to do in that case was not to ignore the bag at all but to further examine the program in order to better understand the bug&#8217;s nature. Steve&#8217;s final remark was that, as software professionals, we have to perform three separate steps in order to better tackle software bugs:<br />
1. we must carefully investigate the root cause of *every* bug, understanding why it was introduced in the program in the first place; then<br />
2. we have to fix it, running regression testing suites (or any other verification strategy) in order to assure that the fix has not introduced new, unexpected side-effects in the program.<br />
3. Finally, but not least important, we have to ask ourselves how we can *prevent* to reintroduce again the bug in our code. And his best suggestion is to translate this understanding into good assertions that will catch the bug automatically in the case it will be inadvertently reintroduced again.<br />
If we would systematically reason in that way, I believe that there are good chances that our software products will be crafted better than now. Moreover, this attitude in the long term is also cost-effective because it reduces the effort required in maintenance. Ok, this of course is not a full-fledge methodology, it is only a good practice concerning bug removal. But in my experience it seems that this practice is not followed.<br />
I don&#8217;t know if the development team working for the Poste Italiane tackled the issues reported in the article as Steve suggested; I only hope that our industry will eventually learn by his mistakes, e.g. starting by filling the software amateur cultural gap as soon as possible. </p>
<p>Andrea</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Dwelling on the point by Patrick Schoenbach</title>
		<link>http://bertrandmeyer.com/2009/11/29/dwelling-on-the-point/comment-page-1/#comment-113</link>
		<dc:creator>Patrick Schoenbach</dc:creator>
		<pubDate>Sun, 29 Nov 2009 14:07:38 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=869#comment-113</guid>
		<description>It seems that even many software experts do not fully realize yet that software errors may be much more dangerous than just, say, a crashing program window.</description>
		<content:encoded><![CDATA[<p>It seems that even many software experts do not fully realize yet that software errors may be much more dangerous than just, say, a crashing program window.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The one sure way to advance software engineering by Whither Software Engineering « Blogs are like opinions. Everybody has one…</title>
		<link>http://bertrandmeyer.com/2009/08/21/the-one-sure-way-to-advance-software-engineering/comment-page-1/#comment-111</link>
		<dc:creator>Whither Software Engineering « Blogs are like opinions. Everybody has one…</dc:creator>
		<pubDate>Thu, 26 Nov 2009 11:59:12 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=706#comment-111</guid>
		<description>[...] Meyer adds that the one sure way to advance software engineering is to “pass a law that requires extensive professional analysis of any large software [...]</description>
		<content:encoded><![CDATA[<p>[...] Meyer adds that the one sure way to advance software engineering is to &#8220;pass a law that requires extensive professional analysis of any large software [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by bmeyer</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-99</link>
		<dc:creator>bmeyer</dc:creator>
		<pubDate>Sun, 25 Oct 2009 13:00:08 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-99</guid>
		<description>Good guess. See the latest post.</description>
		<content:encoded><![CDATA[<p>Good guess. See the latest post.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by Iliyan Gochev</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-98</link>
		<dc:creator>Iliyan Gochev</dc:creator>
		<pubDate>Sat, 24 Oct 2009 21:52:24 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-98</guid>
		<description>If I'm reading the hints right you should focus on what Guillaume Apollinaire saw during one of his walks around Prague and inspired him to write a short story for the Wanderng Jew</description>
		<content:encoded><![CDATA[<p>If I&#8217;m reading the hints right you should focus on what Guillaume Apollinaire saw during one of his walks around Prague and inspired him to write a short story for the Wanderng Jew</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by The Case of the Handsome Couple: hints - 1# technology blog</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-96</link>
		<dc:creator>The Case of the Handsome Couple: hints - 1# technology blog</dc:creator>
		<pubDate>Sat, 24 Oct 2009 20:30:15 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-96</guid>
		<description>[...] The Case of the Handsome Couple: hints Oct 24 News  For the text of the puzzle see this earlier post. [...]</description>
		<content:encoded><![CDATA[<p>[...] The Case of the Handsome Couple: hints Oct 24 News  For the text of the puzzle see this earlier post. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by cipher1024</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-95</link>
		<dc:creator>cipher1024</dc:creator>
		<pubDate>Sat, 24 Oct 2009 18:33:16 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-95</guid>
		<description>Considering the hint, I would nonetheless rule out the existance of a particular building in Prague that allows such strange occurence since it is explicited that it is a normal city block and I would jump to the conclusion that there is a clock in Prague that does not turn in the negative sense of the plane (taking the normal vector pointing to the onlooker).  That it would mean that both poeple are turning clockwise for a different clock.

Asking wikipedia for the existance of such a clock, I found out about the astronomical clock in which the Zodiac signs are moving counter clockwise.  I guess that could be it.</description>
		<content:encoded><![CDATA[<p>Considering the hint, I would nonetheless rule out the existance of a particular building in Prague that allows such strange occurence since it is explicited that it is a normal city block and I would jump to the conclusion that there is a clock in Prague that does not turn in the negative sense of the plane (taking the normal vector pointing to the onlooker).  That it would mean that both poeple are turning clockwise for a different clock.</p>
<p>Asking wikipedia for the existance of such a clock, I found out about the astronomical clock in which the Zodiac signs are moving counter clockwise.  I guess that could be it.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by Jon Starr</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-91</link>
		<dc:creator>Jon Starr</dc:creator>
		<pubDate>Tue, 20 Oct 2009 20:32:51 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-91</guid>
		<description>Did they see each other's reflection through a mirror or a window?  Was it a really small block and they met see each other through windows?  Maybe one was walking backwards, and the other forwards and they walked at different rates?

There seem to be a number of solutions...  But interesting problem.

When will you post a solution?</description>
		<content:encoded><![CDATA[<p>Did they see each other&#8217;s reflection through a mirror or a window?  Was it a really small block and they met see each other through windows?  Maybe one was walking backwards, and the other forwards and they walked at different rates?</p>
<p>There seem to be a number of solutions&#8230;  But interesting problem.</p>
<p>When will you post a solution?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Case of the Handsome Couple by uberVU - social comments</title>
		<link>http://bertrandmeyer.com/2009/10/20/the-handsome-couple/comment-page-1/#comment-90</link>
		<dc:creator>uberVU - social comments</dc:creator>
		<pubDate>Tue, 20 Oct 2009 17:35:39 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=813#comment-90</guid>
		<description>&lt;strong&gt;Social comments and analytics for this post...&lt;/strong&gt;

This post was mentioned on Reddit by doomglobe: They were on opposite ends of adjoining city blocks? I didn't know iphones had service in prague! This story is a lie! They both had blackberries!...</description>
		<content:encoded><![CDATA[<p><strong>Social comments and analytics for this post&#8230;</strong></p>
<p>This post was mentioned on Reddit by doomglobe: They were on opposite ends of adjoining city blocks? I didn&#8217;t know iphones had service in prague! This story is a lie! They both had blackberries!&#8230;</p>
]]></content:encoded>
	</item>
</channel>
</rss><!-- Dynamic page generated in 2.533 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-02-23 20:57:03 -->
