<?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 engineering, programming methodology, programming  languages, software verification, general technology</description>
	<lastBuildDate>Tue, 17 Apr 2012 09:06:08 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<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 Domain Theory: precedents by profbernie</title>
		<link>http://bertrandmeyer.com/2012/04/17/domain-theory-precedents/comment-page-1/#comment-588</link>
		<dc:creator>profbernie</dc:creator>
		<pubDate>Tue, 17 Apr 2012 09:06:08 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2408#comment-588</guid>
		<description>A fundamental problem inhibiting the reuse of abstract formal specifications was illustrated 30 years ago by Margaret Hamilton and Saydean Zeldin of Higher Order Software. As part of their specification of the US Army's logistics system they needed an abstract data type for 'truck'. After completing this algebraic specification in HOS, they found that it was isomorphic to 'stack', since, as a delivery vehicle, what goes into a truck first comes out last. Of course, they had already a theory for'stack' in the library but they could not locate it by 'looking up' a theory with the properties of truck. The fundamental problem is that algebraic theories are not indexable as their cardinality exceeds that of the natural numbers.</description>
		<content:encoded><![CDATA[<p>A fundamental problem inhibiting the reuse of abstract formal specifications was illustrated 30 years ago by Margaret Hamilton and Saydean Zeldin of Higher Order Software. As part of their specification of the US Army&#8217;s logistics system they needed an abstract data type for &#8216;truck&#8217;. After completing this algebraic specification in HOS, they found that it was isomorphic to &#8216;stack&#8217;, since, as a delivery vehicle, what goes into a truck first comes out last. Of course, they had already a theory for&#8217;stack&#8217; in the library but they could not locate it by &#8216;looking up&#8217; a theory with the properties of truck. The fundamental problem is that algebraic theories are not indexable as their cardinality exceeds that of the natural numbers.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Domain Theory: the forgotten step in program verification by Bertrand Meyer's technology blog » Blog Archive » Domain Theory: precedents</title>
		<link>http://bertrandmeyer.com/2012/04/11/domain-theory-the-forgotten-step-in-program-verification/comment-page-1/#comment-587</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » Domain Theory: precedents</dc:creator>
		<pubDate>Tue, 17 Apr 2012 07:36:24 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2281#comment-587</guid>
		<description>[...] Earlier columns      « Domain Theory: the forgotten step in program verification [...]</description>
		<content:encoded><![CDATA[<p>[...] Earlier columns      &laquo; Domain Theory: the forgotten step in program verification [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Domain Theory: the forgotten step in program verification by Jim H.</title>
		<link>http://bertrandmeyer.com/2012/04/11/domain-theory-the-forgotten-step-in-program-verification/comment-page-1/#comment-585</link>
		<dc:creator>Jim H.</dc:creator>
		<pubDate>Sat, 14 Apr 2012 02:53:13 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2281#comment-585</guid>
		<description>I couldn't agree more.  The Larch Shared Language was really all about creating reusable domain theories, including theorems about the domains.  See, for example,

  John V. Guttag, James J. Horning: A Larch Shared Language Handbook. Sci. Comput. Program. 6(2): 135-157 (1986)

  John V. Guttag, James J. Horning, Jeannette M. Wing: Some Notes on Putting Formal Specifications to Productive Use. Sci. Comput. Program. 2(1): 53-68 (1982)</description>
		<content:encoded><![CDATA[<p>I couldn&#8217;t agree more.  The Larch Shared Language was really all about creating reusable domain theories, including theorems about the domains.  See, for example,</p>
<p>  John V. Guttag, James J. Horning: A Larch Shared Language Handbook. Sci. Comput. Program. 6(2): 135-157 (1986)</p>
<p>  John V. Guttag, James J. Horning, Jeannette M. Wing: Some Notes on Putting Formal Specifications to Productive Use. Sci. Comput. Program. 2(1): 53-68 (1982)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Never design a language by bahadir_konu</title>
		<link>http://bertrandmeyer.com/2012/01/31/never-design-a-language/comment-page-1/#comment-583</link>
		<dc:creator>bahadir_konu</dc:creator>
		<pubDate>Fri, 13 Apr 2012 06:55:10 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2151#comment-583</guid>
		<description>Hi Bertrand,
I agree that a Domain Model should be specified and then many different ways can be made available to manage that domain model: a DSL, a GUI, an API, web service API etc. 

I don't understand why you say "never design a language!". A team can talk about domain specific matters by using a DSL. That may help to form an "Ubiquitous Language". The team can later decide whether to actually implement the DSL or not. I dont say "always start with a DSL discussion", but this is just a tool on discussions of the domain.

It seems you mean this: Don't get lost in the details of implementing a DSL before actually specifying the essential business rules of the domain. I agree on this. But the sentence "Never design a language!" is not leading me to this conclusion. I prefer this: "Never get lost in the details of DSL construction before understanding the business rules in detail".  

You seem to advocate designing the API in detail before anything else. Someone from Bell Labs said: "Desiging an API is designing a language". So, in that sense, you are also designing a language while you are desinging an API.

Bahadır Konu
http://kurumsalyazilim.blogspot.com/</description>
		<content:encoded><![CDATA[<p>Hi Bertrand,<br />
I agree that a Domain Model should be specified and then many different ways can be made available to manage that domain model: a DSL, a GUI, an API, web service API etc. </p>
<p>I don&#8217;t understand why you say &#8220;never design a language!&#8221;. A team can talk about domain specific matters by using a DSL. That may help to form an &#8220;Ubiquitous Language&#8221;. The team can later decide whether to actually implement the DSL or not. I dont say &#8220;always start with a DSL discussion&#8221;, but this is just a tool on discussions of the domain.</p>
<p>It seems you mean this: Don&#8217;t get lost in the details of implementing a DSL before actually specifying the essential business rules of the domain. I agree on this. But the sentence &#8220;Never design a language!&#8221; is not leading me to this conclusion. I prefer this: &#8220;Never get lost in the details of DSL construction before understanding the business rules in detail&#8221;.  </p>
<p>You seem to advocate designing the API in detail before anything else. Someone from Bell Labs said: &#8220;Desiging an API is designing a language&#8221;. So, in that sense, you are also designing a language while you are desinging an API.</p>
<p>Bahadır Konu<br />
<a href="http://kurumsalyazilim.blogspot.com/" rel="nofollow">http://kurumsalyazilim.blogspot.com/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Seminar sessions in Saint Petersburg: CafeOBJ and the frame issue by Bertrand Meyer's technology blog » Blog Archive » Aliasing and framing: Saint Petersburg seminar next week</title>
		<link>http://bertrandmeyer.com/2012/03/29/seminar-sessions-in-saint-petersburg-cafeobj-and-the-frame-issue/comment-page-1/#comment-563</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » Aliasing and framing: Saint Petersburg seminar next week</dc:creator>
		<pubDate>Sat, 31 Mar 2012 15:43:46 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2255#comment-563</guid>
		<description>[...] Earlier columns      « Seminar sessions in Saint Petersburg: CafeOBJ and the frame issue [...]</description>
		<content:encoded><![CDATA[<p>[...] Earlier columns      &laquo; Seminar sessions in Saint Petersburg: CafeOBJ and the frame issue [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How to design software by Ian Joyner</title>
		<link>http://bertrandmeyer.com/2011/12/13/how-to-design-software/comment-page-1/#comment-556</link>
		<dc:creator>Ian Joyner</dc:creator>
		<pubDate>Tue, 20 Mar 2012 05:03:32 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2070#comment-556</guid>
		<description>I like the thought of faking it all the way down. So we are all fakes. I'm quite comfortable with that idea, but maybe a lot of programmers aren't which is why they like programming at low levels in low-level languages like C and C++. After all, C put back in bad stuff from FORTRAN and assembler which ALGOL had carefully discarded. Seems the whole history of programming is littered with this thinking.</description>
		<content:encoded><![CDATA[<p>I like the thought of faking it all the way down. So we are all fakes. I&#8217;m quite comfortable with that idea, but maybe a lot of programmers aren&#8217;t which is why they like programming at low levels in low-level languages like C and C++. After all, C put back in bad stuff from FORTRAN and assembler which ALGOL had carefully discarded. Seems the whole history of programming is littered with this thinking.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on A carefully designed Result by Peter Gummer</title>
		<link>http://bertrandmeyer.com/2012/03/19/a-carefully-designed-result/comment-page-1/#comment-555</link>
		<dc:creator>Peter Gummer</dc:creator>
		<pubDate>Tue, 20 Mar 2012 03:15:50 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2240#comment-555</guid>
		<description>You've also touched on something that is a constant irritant to me in languages other than Eiffel:
* The 'return' instruction "is an extreme form of goto, jumping out of a function from anywhere in its control structure."
* Eiffel has "One-entry, one-exit blocks; no goto in overt or covert form (break, continue etc.)."

I know this. I was taught this by reading Wirth in the mid-1980s, and with practice it became second nature to me to write structured code. But almost the only other programmers I have ever worked with who seemed to understand this were Eiffel programmers. Every one else believes that return, break and continue are okay, because although everybody knows that Dykstra considered 'goto' harmful they don't believe he was talking about these other jump instructions. Even Martin Fowler's otherwise excellent "Refactoring" book contains ten infuriating pages in which he sets up straw man examples of badly-written structured code which he then proceeds to "improve" by returning from the middle of routines. (The final versions are indeed clearer, but it's because he got rid of the code's other defects on the way to injecting a bit of spaghetti.) Needless to say, it is tedious to spend one's entire career reading code written by colleagues, many of whom are great programmers, but who don't understand that they shouldn't jump out of the middle of a routine or a loop. I've just started working on a new project where all of the code (in Java) was written by a really smart programmer, but ... (groan) ... I've already run into dozens of cases where he returns from the middle of routines. I've given up arguing the issue with people, because I've never managed to find an article on-line to support my conviction; and OOSC2 disappointingly glosses over the issue, apparently assuming that the issue was settled, once and for all, decades ago.

Is there a good explanation supporting our conviction that break and continue and return are just covert forms of goto?</description>
		<content:encoded><![CDATA[<p>You&#8217;ve also touched on something that is a constant irritant to me in languages other than Eiffel:<br />
* The &#8216;return&#8217; instruction &#8220;is an extreme form of goto, jumping out of a function from anywhere in its control structure.&#8221;<br />
* Eiffel has &#8220;One-entry, one-exit blocks; no goto in overt or covert form (break, continue etc.).&#8221;</p>
<p>I know this. I was taught this by reading Wirth in the mid-1980s, and with practice it became second nature to me to write structured code. But almost the only other programmers I have ever worked with who seemed to understand this were Eiffel programmers. Every one else believes that return, break and continue are okay, because although everybody knows that Dykstra considered &#8216;goto&#8217; harmful they don&#8217;t believe he was talking about these other jump instructions. Even Martin Fowler&#8217;s otherwise excellent &#8220;Refactoring&#8221; book contains ten infuriating pages in which he sets up straw man examples of badly-written structured code which he then proceeds to &#8220;improve&#8221; by returning from the middle of routines. (The final versions are indeed clearer, but it&#8217;s because he got rid of the code&#8217;s other defects on the way to injecting a bit of spaghetti.) Needless to say, it is tedious to spend one&#8217;s entire career reading code written by colleagues, many of whom are great programmers, but who don&#8217;t understand that they shouldn&#8217;t jump out of the middle of a routine or a loop. I&#8217;ve just started working on a new project where all of the code (in Java) was written by a really smart programmer, but &#8230; (groan) &#8230; I&#8217;ve already run into dozens of cases where he returns from the middle of routines. I&#8217;ve given up arguing the issue with people, because I&#8217;ve never managed to find an article on-line to support my conviction; and OOSC2 disappointingly glosses over the issue, apparently assuming that the issue was settled, once and for all, decades ago.</p>
<p>Is there a good explanation supporting our conviction that break and continue and return are just covert forms of goto?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on A carefully designed Result by Peter Gummer</title>
		<link>http://bertrandmeyer.com/2012/03/19/a-carefully-designed-result/comment-page-1/#comment-554</link>
		<dc:creator>Peter Gummer</dc:creator>
		<pubDate>Tue, 20 Mar 2012 00:48:02 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2240#comment-554</guid>
		<description>Delphi demonstrates that an automatically-declared Result variable does in fact work with nested functions. It relies, however, on the Pascal-style scoping rules for identifier names: 'Result' refers to the innermost scope. Eiffel eschews these scoping rules because they could cause confusion (though in my personal experience it was never a problem in Delphi). Eiffel's flat scoping rules wouldn't have allowed nested routines in combination with 'Result'.

Certainly there's little need for nested routines in an object-oriented language. In Delphi, I only ever used them in order to avoid polluting the class's interface with features that would be needed only by a single routine. Whenever I found myself writing such nested routines, however, it was a pretty clear indication that I ought to extract the implementation of that routine to a new class.

It's interesting that, in the 21st century, it is now possible in fact to write nested routines in Eiffel. We have in-line agents! Some people believe that adding in-line agents to Eiffel was a mistake because their services are unavailable to the rest of the world. Personally, I like in-line agents; I just wish that there was a more concise syntax for using them. For example, as the article notes, C#'s "Code Contracts" are a clunky emulation of Design by Contract (i.e., clunky compared to Eiffel, although compared to any other DbC emulator that I've ever used they are excellent). I find that "Code Contracts" are better than Eiffel's DbC in one respect, namely that I routinely find myself writing contracts that iterate over collections with ease. With Eiffel I rarely do so. This is because the syntax of C#'s lambda expressions is so convenient. Sure it looked like it came from Mars when I first saw it, but once I got the hang of it I suddenly felt free to write more complete contracts. The syntax of Eiffel's in-line agents is too verbose. If Eiffel had an operator to simplify in-line agents, then I think a lot more interesting contracts would get written.</description>
		<content:encoded><![CDATA[<p>Delphi demonstrates that an automatically-declared Result variable does in fact work with nested functions. It relies, however, on the Pascal-style scoping rules for identifier names: &#8216;Result&#8217; refers to the innermost scope. Eiffel eschews these scoping rules because they could cause confusion (though in my personal experience it was never a problem in Delphi). Eiffel&#8217;s flat scoping rules wouldn&#8217;t have allowed nested routines in combination with &#8216;Result&#8217;.</p>
<p>Certainly there&#8217;s little need for nested routines in an object-oriented language. In Delphi, I only ever used them in order to avoid polluting the class&#8217;s interface with features that would be needed only by a single routine. Whenever I found myself writing such nested routines, however, it was a pretty clear indication that I ought to extract the implementation of that routine to a new class.</p>
<p>It&#8217;s interesting that, in the 21st century, it is now possible in fact to write nested routines in Eiffel. We have in-line agents! Some people believe that adding in-line agents to Eiffel was a mistake because their services are unavailable to the rest of the world. Personally, I like in-line agents; I just wish that there was a more concise syntax for using them. For example, as the article notes, C#&#8217;s &#8220;Code Contracts&#8221; are a clunky emulation of Design by Contract (i.e., clunky compared to Eiffel, although compared to any other DbC emulator that I&#8217;ve ever used they are excellent). I find that &#8220;Code Contracts&#8221; are better than Eiffel&#8217;s DbC in one respect, namely that I routinely find myself writing contracts that iterate over collections with ease. With Eiffel I rarely do so. This is because the syntax of C#&#8217;s lambda expressions is so convenient. Sure it looked like it came from Mars when I first saw it, but once I got the hang of it I suddenly felt free to write more complete contracts. The syntax of Eiffel&#8217;s in-line agents is too verbose. If Eiffel had an operator to simplify in-line agents, then I think a lot more interesting contracts would get written.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on If I’m not pure, at least my functions are by Karlheinz Hug</title>
		<link>http://bertrandmeyer.com/2011/07/04/if-im-not-pure-at-least-my-functions-are/comment-page-1/#comment-552</link>
		<dc:creator>Karlheinz Hug</dc:creator>
		<pubDate>Mon, 19 Mar 2012 16:12:06 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1693#comment-552</guid>
		<description>My problem is similar to Helmut Brandl's first problem with "dependent queries". Bertrand says, "except possibly in the implementation, there is no notion of a query 'depending on' another". Why not?

Richard Mitchell, James McKim: Extending a method of devising software contracts. In: C. Mingins, B. Meyer (ed): Proc. TOOLS 32, IEEE (1999), give the guideline
"G2 Separate basic queries from derived queries (derived queries can be specified in terms of basic queries)" I find this guideline very useful. 

Let me explain my problem on a simple example that I used in my introductory CS course since 1999. Suppose the Implicit Framing Rule (IFR) holds in the following.

class RECTANGLE

feature
	width, height, area : REAL

invariant
	width &gt; 0
	height &gt; 0
	area = width * height

end -- class RECTANGLE

width and height are basic, area is derived (or "depending on" width and height). We could substitute the invariant

	area = width * height

by the postcondition:

	area : REAL
		ensure
			Result = old width * height

The semantics should be the same. In both variants, area is pure. The difference is with assertion checking on: The invariant is checked before and after each routine call,
the postcondition is only checked when area is called.

First, I add a setter for width:

	set_width (new_width : REAL)
		require
			new_width &gt; 0
		ensure
			width = new_width

The IFR says that only width changes and nothing else. This violates the invariant or the postcondition of area, because one of height and area must change too. I want set_width to keep height and change area. The IFR forces me to add a condition with area, maybe such:

	ensure
		width = new_width
		area = width * old height
	
It seems that I have to repeat the invariant or postcondition of area in a modified form. 

Second, I add a setter for area:

	set_area (new_area : REAL)
		require
			new_area &gt; 0
		ensure
			area = new_area

The IFR says that only area changes and nothing else. But if new_area /= area, this violates the invariant or the postcondition of area, because one of width and height or both must change too. I have at least three options. Each may be useful:

	set_area_keep_width (new_area : REAL)
		require
			new_area &gt; 0
		ensure
			area = new_area
			area = (old width) * height

	set_area_keep_height   -- similar

	set_area_keep_relation (new_area : REAL)
		require
			new_area &gt; 0
		ensure
			area = new_area
			width * (old height) = (old width) * height

Conclusion: Given a setter for a derived query, the IFR is okay: It forces the programmer to specify which of the basic queries should change.

Given a setter for a basic query, the IFR seems not to be the last word. We can see that if we add more derived queries like perimeter, diagonal and so on, which depend on width and height. A generalization:

class EXAMPLE

feature
	basic_1 : TYPE_B1
	...
	basic_m : TYPE_Bm

	derived_1 : TYPE_D1
	...
	derived_n : TYPE_Dn

	set_basic_i (new_basic_i : TYPE_Bi)
		ensure
			basic_i = new_basic_i
			derived_1 = function_1 (old basic_1,..., basic_i,..., old basic_m)
			...
			derived_n = function_n (old basic_1,..., basic_i,..., old basic_m)
			-- All basics with old except basic_i!

invariant
	derived_1 = function_1 (basic_1,..., basic_m)
	...
	derived_n = function_n (basic_1,..., basic_m)

end -- class EXAMPLE

The explosion of nochange-postconditions is back again. To me, the invariants do not look like theorems that follow logically from axioms. So I wonder whether the theorem-approach may help. With the discarded "only" construct the setter looks like this:

	set_basic_i (new_basic_i : TYPE_Bi)
		ensure
			basic_i = new_basic_i
			only derived_1,..., derived_n

With "only", there is no need to repeat the whole invariant formulas. So I do not see the advantage of the IFR in this case. I would prefer "only", although it is not ideal to repeat the names of the derived queries.

Am I missing some points?

What about "distinction of basic and derived queries + IFR-variant" with IFR-variant:

	"A routine may change the value of a basic query only if the basic query is specified in the routine's postcondition,
	and it may change the values of derived queries."

This leads to:

class EXAMPLE

basic query
	basic_1 : TYPE_B1
	...
	basic_m : TYPE_Bm

derived query
	derived_1 : TYPE_D1
	...
	derived_n : TYPE_Dn

command
	set_basic_i (new_basic_i : REAL)
		ensure
			basic_i = new_basic_i

invariant
	derived_1 = function_1 (basic_1,..., basic_m)
	...
	derived_n = function_n (basic_1,..., basic_m)

end -- class EXAMPLE

Can "derivedness" of a query be inferred from invariants and postconditions? Then there would be no need to distinguish derived queries at their declaration. 
"A query is basic, if it is not fully specified in terms of other queries. A query is derived, if it is fully specified in terms of basic queries."
Can a tool infer from

	diagonal * diagonal = width * width + height * height

that diagonal is derived from width and height?</description>
		<content:encoded><![CDATA[<p>My problem is similar to Helmut Brandl&#8217;s first problem with &#8220;dependent queries&#8221;. Bertrand says, &#8220;except possibly in the implementation, there is no notion of a query &#8216;depending on&#8217; another&#8221;. Why not?</p>
<p>Richard Mitchell, James McKim: Extending a method of devising software contracts. In: C. Mingins, B. Meyer (ed): Proc. TOOLS 32, IEEE (1999), give the guideline<br />
&#8220;G2 Separate basic queries from derived queries (derived queries can be specified in terms of basic queries)&#8221; I find this guideline very useful. </p>
<p>Let me explain my problem on a simple example that I used in my introductory CS course since 1999. Suppose the Implicit Framing Rule (IFR) holds in the following.</p>
<p>class RECTANGLE</p>
<p>feature<br />
	width, height, area : REAL</p>
<p>invariant<br />
	width &gt; 0<br />
	height &gt; 0<br />
	area = width * height</p>
<p>end &#8212; class RECTANGLE</p>
<p>width and height are basic, area is derived (or &#8220;depending on&#8221; width and height). We could substitute the invariant</p>
<p>	area = width * height</p>
<p>by the postcondition:</p>
<p>	area : REAL<br />
		ensure<br />
			Result = old width * height</p>
<p>The semantics should be the same. In both variants, area is pure. The difference is with assertion checking on: The invariant is checked before and after each routine call,<br />
the postcondition is only checked when area is called.</p>
<p>First, I add a setter for width:</p>
<p>	set_width (new_width : REAL)<br />
		require<br />
			new_width &gt; 0<br />
		ensure<br />
			width = new_width</p>
<p>The IFR says that only width changes and nothing else. This violates the invariant or the postcondition of area, because one of height and area must change too. I want set_width to keep height and change area. The IFR forces me to add a condition with area, maybe such:</p>
<p>	ensure<br />
		width = new_width<br />
		area = width * old height</p>
<p>It seems that I have to repeat the invariant or postcondition of area in a modified form. </p>
<p>Second, I add a setter for area:</p>
<p>	set_area (new_area : REAL)<br />
		require<br />
			new_area &gt; 0<br />
		ensure<br />
			area = new_area</p>
<p>The IFR says that only area changes and nothing else. But if new_area /= area, this violates the invariant or the postcondition of area, because one of width and height or both must change too. I have at least three options. Each may be useful:</p>
<p>	set_area_keep_width (new_area : REAL)<br />
		require<br />
			new_area &gt; 0<br />
		ensure<br />
			area = new_area<br />
			area = (old width) * height</p>
<p>	set_area_keep_height   &#8212; similar</p>
<p>	set_area_keep_relation (new_area : REAL)<br />
		require<br />
			new_area &gt; 0<br />
		ensure<br />
			area = new_area<br />
			width * (old height) = (old width) * height</p>
<p>Conclusion: Given a setter for a derived query, the IFR is okay: It forces the programmer to specify which of the basic queries should change.</p>
<p>Given a setter for a basic query, the IFR seems not to be the last word. We can see that if we add more derived queries like perimeter, diagonal and so on, which depend on width and height. A generalization:</p>
<p>class EXAMPLE</p>
<p>feature<br />
	basic_1 : TYPE_B1<br />
	&#8230;<br />
	basic_m : TYPE_Bm</p>
<p>	derived_1 : TYPE_D1<br />
	&#8230;<br />
	derived_n : TYPE_Dn</p>
<p>	set_basic_i (new_basic_i : TYPE_Bi)<br />
		ensure<br />
			basic_i = new_basic_i<br />
			derived_1 = function_1 (old basic_1,&#8230;, basic_i,&#8230;, old basic_m)<br />
			&#8230;<br />
			derived_n = function_n (old basic_1,&#8230;, basic_i,&#8230;, old basic_m)<br />
			&#8211; All basics with old except basic_i!</p>
<p>invariant<br />
	derived_1 = function_1 (basic_1,&#8230;, basic_m)<br />
	&#8230;<br />
	derived_n = function_n (basic_1,&#8230;, basic_m)</p>
<p>end &#8212; class EXAMPLE</p>
<p>The explosion of nochange-postconditions is back again. To me, the invariants do not look like theorems that follow logically from axioms. So I wonder whether the theorem-approach may help. With the discarded &#8220;only&#8221; construct the setter looks like this:</p>
<p>	set_basic_i (new_basic_i : TYPE_Bi)<br />
		ensure<br />
			basic_i = new_basic_i<br />
			only derived_1,&#8230;, derived_n</p>
<p>With &#8220;only&#8221;, there is no need to repeat the whole invariant formulas. So I do not see the advantage of the IFR in this case. I would prefer &#8220;only&#8221;, although it is not ideal to repeat the names of the derived queries.</p>
<p>Am I missing some points?</p>
<p>What about &#8220;distinction of basic and derived queries + IFR-variant&#8221; with IFR-variant:</p>
<p>	&#8220;A routine may change the value of a basic query only if the basic query is specified in the routine&#8217;s postcondition,<br />
	and it may change the values of derived queries.&#8221;</p>
<p>This leads to:</p>
<p>class EXAMPLE</p>
<p>basic query<br />
	basic_1 : TYPE_B1<br />
	&#8230;<br />
	basic_m : TYPE_Bm</p>
<p>derived query<br />
	derived_1 : TYPE_D1<br />
	&#8230;<br />
	derived_n : TYPE_Dn</p>
<p>command<br />
	set_basic_i (new_basic_i : REAL)<br />
		ensure<br />
			basic_i = new_basic_i</p>
<p>invariant<br />
	derived_1 = function_1 (basic_1,&#8230;, basic_m)<br />
	&#8230;<br />
	derived_n = function_n (basic_1,&#8230;, basic_m)</p>
<p>end &#8212; class EXAMPLE</p>
<p>Can &#8220;derivedness&#8221; of a query be inferred from invariants and postconditions? Then there would be no need to distinguish derived queries at their declaration.<br />
&#8220;A query is basic, if it is not fully specified in terms of other queries. A query is derived, if it is fully specified in terms of basic queries.&#8221;<br />
Can a tool infer from</p>
<p>	diagonal * diagonal = width * width + height * height</p>
<p>that diagonal is derived from width and height?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Concurrent programming is easy by eric.verhulst</title>
		<link>http://bertrandmeyer.com/2011/06/20/concurrent-programming-is-easy/comment-page-1/#comment-516</link>
		<dc:creator>eric.verhulst</dc:creator>
		<pubDate>Sat, 18 Feb 2012 18:31:55 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1605#comment-516</guid>
		<description>I couldn't agree more with the title "Concurrent programming is easy". Actually it is easier than "sequential" programming if most of us wouldn't have been brainwashed by an education that is driven by sequential programming. I call it the von Neumann syndrome. Because processors were driven by a sequential paradigm, programming languages (as an abstraction layer) have followed this approach. And while Object Oriented tried to do something about it, it is driven by a data-centric view, just like functional programming is driven by an algorithmic view (on data-structures). Often both have a subliminal shared memory view. Both are a step forward, but both lack the view that programming is really modelling and what we model is a real or virtual world. The world is concurrent by nature. So the right approach is to have a programming paradigm that reflects this reality. This might not always seem to get the best possible performance, but what the heck if context switches are now measured in microseconds or even less. The gain comes from the orthogonal and clean architecture and often offsets the dead code that other paradigms often bring with them. In IT type applications, the dead code content can reach 99%. 
Therefore I was first of all a bit astonished about the negative comments on CSP and its alikes. Granted pure CSP is too simple or rather too low level to model real-world behaviour, but that's why it is a mathematical concept. Programming takes a sound concept and then gives it a "useability" layer.
This is what we did and we called it the "Interacting Entities" paradigm. Almost anything can be modelled by it, especially if one allows the interactions to have some active content. Entities are by definition active hence they become the processes and tasks. They are sequential threads (or rather functions) with a private workspace (hence context), really sequential segments stiched together by interaction points. The interactions synchronise between the intities, often involving a synchronisation followed by a interaction specific action (like become active again or passing data or whatever needs to be done upon synchronisation). Their mathematical equivalents are called Guarded (atomic) Actions.
This approach solves the issues raised against the concurrency calculi and supports the "other mechanisms that a program uses". First of all, the sequential parts are what we had before. Hence any existing sequential code can be reused. But it introduces support as well for the other things like "database access, GUI, etc.,....) because it gives an easy way to integrate them. Just use the interaction (we call it a "hub") as an interface. The rest is defining a protocol that e.g. includes resource protection akka atomic access, if needed. The resulting system is more similar to a telecommunication system whereby protocols and packet switching provide seamless connectivity between concurrent users and servers.   
As we were driven by the needs of the embedded real-time world, this was (formally developed using TLA+) and implemented as a distributed RTOS. It even supports heterogeneous systems in a transparent way. Code size per node is about 5 KBytes and it ingrates legacy OS and sequential code. There is a python implemenation as well, although this one is a lot slower but it shows the generality of the concept.
see www.altreonic.com and the book  "Formal development of a network centric RTOS" http://www.amazon.com/Formal-Development-Network-Centric-RTOS-Engineering/dp/1441997350/ref=sr_1_1?ie=UTF8&amp;qid=1315420944&amp;sr=8-1 and see http://www.altreonic.com/content/book-opencomrtos-project-out-lessons-learned

PS.
Great web blog. I got the hint from http://www.dijkstrascry.com. Such website are important as they give insight and that's what students need more than ever these days.</description>
		<content:encoded><![CDATA[<p>I couldn&#8217;t agree more with the title &#8220;Concurrent programming is easy&#8221;. Actually it is easier than &#8220;sequential&#8221; programming if most of us wouldn&#8217;t have been brainwashed by an education that is driven by sequential programming. I call it the von Neumann syndrome. Because processors were driven by a sequential paradigm, programming languages (as an abstraction layer) have followed this approach. And while Object Oriented tried to do something about it, it is driven by a data-centric view, just like functional programming is driven by an algorithmic view (on data-structures). Often both have a subliminal shared memory view. Both are a step forward, but both lack the view that programming is really modelling and what we model is a real or virtual world. The world is concurrent by nature. So the right approach is to have a programming paradigm that reflects this reality. This might not always seem to get the best possible performance, but what the heck if context switches are now measured in microseconds or even less. The gain comes from the orthogonal and clean architecture and often offsets the dead code that other paradigms often bring with them. In IT type applications, the dead code content can reach 99%.<br />
Therefore I was first of all a bit astonished about the negative comments on CSP and its alikes. Granted pure CSP is too simple or rather too low level to model real-world behaviour, but that&#8217;s why it is a mathematical concept. Programming takes a sound concept and then gives it a &#8220;useability&#8221; layer.<br />
This is what we did and we called it the &#8220;Interacting Entities&#8221; paradigm. Almost anything can be modelled by it, especially if one allows the interactions to have some active content. Entities are by definition active hence they become the processes and tasks. They are sequential threads (or rather functions) with a private workspace (hence context), really sequential segments stiched together by interaction points. The interactions synchronise between the intities, often involving a synchronisation followed by a interaction specific action (like become active again or passing data or whatever needs to be done upon synchronisation). Their mathematical equivalents are called Guarded (atomic) Actions.<br />
This approach solves the issues raised against the concurrency calculi and supports the &#8220;other mechanisms that a program uses&#8221;. First of all, the sequential parts are what we had before. Hence any existing sequential code can be reused. But it introduces support as well for the other things like &#8220;database access, GUI, etc.,&#8230;.) because it gives an easy way to integrate them. Just use the interaction (we call it a &#8220;hub&#8221;) as an interface. The rest is defining a protocol that e.g. includes resource protection akka atomic access, if needed. The resulting system is more similar to a telecommunication system whereby protocols and packet switching provide seamless connectivity between concurrent users and servers.<br />
As we were driven by the needs of the embedded real-time world, this was (formally developed using TLA+) and implemented as a distributed RTOS. It even supports heterogeneous systems in a transparent way. Code size per node is about 5 KBytes and it ingrates legacy OS and sequential code. There is a python implemenation as well, although this one is a lot slower but it shows the generality of the concept.<br />
see <a href="http://www.altreonic.com" rel="nofollow">http://www.altreonic.com</a> and the book  &#8220;Formal development of a network centric RTOS&#8221; <a href="http://www.amazon.com/Formal-Development-Network-Centric-RTOS-Engineering/dp/1441997350/ref=sr_1_1?ie=UTF8&#038;qid=1315420944&#038;sr=8-1" rel="nofollow">http://www.amazon.com/Formal-Development-Network-Centric-RTOS-Engineering/dp/1441997350/ref=sr_1_1?ie=UTF8&#038;qid=1315420944&#038;sr=8-1</a> and see <a href="http://www.altreonic.com/content/book-opencomrtos-project-out-lessons-learned" rel="nofollow">http://www.altreonic.com/content/book-opencomrtos-project-out-lessons-learned</a></p>
<p>PS.<br />
Great web blog. I got the hint from <a href="http://www.dijkstrascry.com" rel="nofollow">http://www.dijkstrascry.com</a>. Such website are important as they give insight and that&#8217;s what students need more than ever these days.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Concurrent programming is easy by Bertrand Meyer's technology blog » Blog Archive » ERC Advanced Investigator Grant: Concurrency Made Easy</title>
		<link>http://bertrandmeyer.com/2011/06/20/concurrent-programming-is-easy/comment-page-1/#comment-515</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » ERC Advanced Investigator Grant: Concurrency Made Easy</dc:creator>
		<pubDate>Sun, 12 Feb 2012 19:01:10 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1605#comment-515</guid>
		<description>[...] [3] Concurrent Programming is Easy, article from this blog, available here. [...]</description>
		<content:encoded><![CDATA[<p>[...] [3] Concurrent Programming is Easy, article from this blog, available here. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Never design a language by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2012/01/31/never-design-a-language/comment-page-1/#comment-514</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Sat, 11 Feb 2012 22:58:36 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2151#comment-514</guid>
		<description>"Application Program Interface" is indeed the old expansion of the acronym. It goes back to old IBM mainframe terminology (from the 1960s I think) and the word "application" does not make much sense anymore. That's why I prefer to use the alternative expansion "Abstract". I discussed this small point in my introductory programming book "Touch of Class". Thanks for raising the point.</description>
		<content:encoded><![CDATA[<p>&#8220;Application Program Interface&#8221; is indeed the old expansion of the acronym. It goes back to old IBM mainframe terminology (from the 1960s I think) and the word &#8220;application&#8221; does not make much sense anymore. That&#8217;s why I prefer to use the alternative expansion &#8220;Abstract&#8221;. I discussed this small point in my introductory programming book &#8220;Touch of Class&#8221;. Thanks for raising the point.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Never design a language by sharov_am</title>
		<link>http://bertrandmeyer.com/2012/01/31/never-design-a-language/comment-page-1/#comment-513</link>
		<dc:creator>sharov_am</dc:creator>
		<pubDate>Fri, 03 Feb 2012 09:21:55 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2151#comment-513</guid>
		<description>Why A in API stands for Abstract but not for Applization?</description>
		<content:encoded><![CDATA[<p>Why A in API stands for Abstract but not for Applization?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Never design a language by thomas.beale</title>
		<link>http://bertrandmeyer.com/2012/01/31/never-design-a-language/comment-page-1/#comment-511</link>
		<dc:creator>thomas.beale</dc:creator>
		<pubDate>Thu, 02 Feb 2012 13:01:11 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2151#comment-511</guid>
		<description>Hi Bertrand,
you are of course right in the general thesis that writing a 'specialist' language for each new kind of business requirement is not useful. The problem with your solution however is that business rules are mutable, and often change at whim, or because of legislation. Such rules can't be encoded in software because they change so often - they have to be dynamically addable / changeable within a deployed information system. The only things that can be safely 'in the software' are things that are essentially invariant across the domain. Today, even the idea of a withdrawal needing to be less than the overdraft limit is not invariant - my bank's computers decided it was ok the other day. 

A better way to support this kind of business logic is a general purpose 'soft' computing layer, such as the one we are now using in health based on 'archetypes'. See for example this online model repository - http://www.openehr.org/knowledge/ . To make this work, a new language was required, but a very general one based on constraint logic - see http://www.openehr.org/wiki/pages/viewpage.action?pageId=196633

- thomas</description>
		<content:encoded><![CDATA[<p>Hi Bertrand,<br />
you are of course right in the general thesis that writing a &#8216;specialist&#8217; language for each new kind of business requirement is not useful. The problem with your solution however is that business rules are mutable, and often change at whim, or because of legislation. Such rules can&#8217;t be encoded in software because they change so often &#8211; they have to be dynamically addable / changeable within a deployed information system. The only things that can be safely &#8216;in the software&#8217; are things that are essentially invariant across the domain. Today, even the idea of a withdrawal needing to be less than the overdraft limit is not invariant &#8211; my bank&#8217;s computers decided it was ok the other day. </p>
<p>A better way to support this kind of business logic is a general purpose &#8216;soft&#8217; computing layer, such as the one we are now using in health based on &#8216;archetypes&#8217;. See for example this online model repository &#8211; <a href="http://www.openehr.org/knowledge/" rel="nofollow">http://www.openehr.org/knowledge/</a> . To make this work, a new language was required, but a very general one based on constraint logic &#8211; see <a href="http://www.openehr.org/wiki/pages/viewpage.action?pageId=196633" rel="nofollow">http://www.openehr.org/wiki/pages/viewpage.action?pageId=196633</a></p>
<p>- thomas</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Concurrency seminars by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2012/01/23/concurrency-seminars/comment-page-1/#comment-510</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Wed, 01 Feb 2012 20:18:41 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2171#comment-510</guid>
		<description>The concurrency seminars are not designed for internet broadcast. But we will continue broadcasting the ITMO research seminars.</description>
		<content:encoded><![CDATA[<p>The concurrency seminars are not designed for internet broadcast. But we will continue broadcasting the ITMO research seminars.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Never design a language by Creating DSLs, a word of caution | Modeling Languages</title>
		<link>http://bertrandmeyer.com/2012/01/31/never-design-a-language/comment-page-1/#comment-509</link>
		<dc:creator>Creating DSLs, a word of caution | Modeling Languages</dc:creator>
		<pubDate>Tue, 31 Jan 2012 13:26:22 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2151#comment-509</guid>
		<description>[...] Never design a language [...]</description>
		<content:encoded><![CDATA[<p>[...] Never design a language [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Dwelling on the point by Bertrand Meyer's technology blog » Blog Archive » Analyzing a software failure</title>
		<link>http://bertrandmeyer.com/2009/11/29/dwelling-on-the-point/comment-page-1/#comment-508</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » Analyzing a software failure</dc:creator>
		<pubDate>Tue, 31 Jan 2012 03:39:35 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=869#comment-508</guid>
		<description>[...] way to advance software engineering: this blog, see here. [2] Dwelling on the point: this blog, see here. [3] Dines Bjørner: The TSE Trading Rules, version 2, unpublished report, 22 February 2010, [...]</description>
		<content:encoded><![CDATA[<p>[...] way to advance software engineering: this blog, see here. [2] Dwelling on the point: this blog, see here. [3] Dines Bjørner: The TSE Trading Rules, version 2, unpublished report, 22 February 2010, [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Concurrency seminars by Larry</title>
		<link>http://bertrandmeyer.com/2012/01/23/concurrency-seminars/comment-page-1/#comment-505</link>
		<dc:creator>Larry</dc:creator>
		<pubDate>Tue, 24 Jan 2012 16:44:44 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2171#comment-505</guid>
		<description>Bertrand: Will the seminars be available over the net remotely? By the way, we remotely attended the loop invariant seminar you held recently in Russia and it was great. However, the camera was so far away from the screen that we could not read what was presented and had to go almost entirely from what you were saying. Perhaps the next camera man can get tighter on the screen and leave just a little space to see you once in awhile as you are talking. Anyway -- I would really like to participate in this SCOOP seminar if it can have a remote access feature. Thanks!</description>
		<content:encoded><![CDATA[<p>Bertrand: Will the seminars be available over the net remotely? By the way, we remotely attended the loop invariant seminar you held recently in Russia and it was great. However, the camera was so far away from the screen that we could not read what was presented and had to go almost entirely from what you were saying. Perhaps the next camera man can get tighter on the screen and leave just a little space to see you once in awhile as you are talking. Anyway &#8212; I would really like to participate in this SCOOP seminar if it can have a remote access feature. Thanks!</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on PhD position: concurrent programming (SCOOP) for robotics by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2011/10/12/phd-position-concurrent-programming-scoop-for-robotics/comment-page-1/#comment-497</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Wed, 21 Dec 2011 08:43:26 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1938#comment-497</guid>
		<description>The video is at &lt;a href="http://www.youtube.com/watch?v=LWkETPn5Fn8" rel="nofollow"&gt;www.youtube.com/watch?v=LWkETPn5Fn8&lt;/a&gt;. I have updated the text of the original post.</description>
		<content:encoded><![CDATA[<p>The video is at <a href="http://www.youtube.com/watch?v=LWkETPn5Fn8" rel="nofollow">http://www.youtube.com/watch?v=LWkETPn5Fn8</a>. I have updated the text of the original post.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on PhD position: concurrent programming (SCOOP) for robotics by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2011/10/12/phd-position-concurrent-programming-scoop-for-robotics/comment-page-1/#comment-494</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Wed, 21 Dec 2011 04:24:00 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1938#comment-494</guid>
		<description>Thanks for pointing this out; I don't know what happened but hope the video is restored later today.</description>
		<content:encoded><![CDATA[<p>Thanks for pointing this out; I don&#8217;t know what happened but hope the video is restored later today.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on How to design software by Complexity Aware Modelling II | Model Practice</title>
		<link>http://bertrandmeyer.com/2011/12/13/how-to-design-software/comment-page-1/#comment-488</link>
		<dc:creator>Complexity Aware Modelling II | Model Practice</dc:creator>
		<pubDate>Mon, 19 Dec 2011 09:29:01 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2070#comment-488</guid>
		<description>[...] is far from trivial, and is the actual mission of design, as nicely described by Bertrand Meyer here    LD_AddCustomAttr("AdOpt", "1"); LD_AddCustomAttr("Origin", "other"); [...]</description>
		<content:encoded><![CDATA[<p>[...] is far from trivial, and is the actual mission of design, as nicely described by Bertrand Meyer here    LD_AddCustomAttr(&quot;AdOpt&quot;, &quot;1&quot;); LD_AddCustomAttr(&quot;Origin&quot;, &quot;other&quot;); [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on PhD position: concurrent programming (SCOOP) for robotics by brieweb</title>
		<link>http://bertrandmeyer.com/2011/10/12/phd-position-concurrent-programming-scoop-for-robotics/comment-page-1/#comment-479</link>
		<dc:creator>brieweb</dc:creator>
		<pubDate>Wed, 14 Dec 2011 23:07:34 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1938#comment-479</guid>
		<description>It looks like the video was removed from YouTube. I would be curious to see it.
-brian</description>
		<content:encoded><![CDATA[<p>It looks like the video was removed from YouTube. I would be curious to see it.<br />
-brian</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Modes and Uses of Scientific Publication by ¿Por qué crees que los científicos publican artículos científicos?</title>
		<link>http://bertrandmeyer.com/2011/11/22/the-modes-and-uses-of-scientific-publication/comment-page-1/#comment-475</link>
		<dc:creator>¿Por qué crees que los científicos publican artículos científicos?</dc:creator>
		<pubDate>Mon, 12 Dec 2011 18:59:11 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2018#comment-475</guid>
		<description>[...] "CRITEO-300x250", 300, 250);         1 meneos    ¿Por qué crees que los científicos publican artículos científicos?     bertrandmeyer.com/2011/11/22/the-modes-and-uses-of-scient...  por equisdx hace [...]</description>
		<content:encoded><![CDATA[<p>[...] &quot;CRITEO-300&#215;250&quot;, 300, 250);         1 meneos    ¿Por qué crees que los científicos publican artículos científicos?     bertrandmeyer.com/2011/11/22/the-modes-and-uses-of-scient&#8230;&nbsp; por equisdx hace [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The Modes and Uses of Scientific Publication by Atención, pregunta: ¿Por qué crees que los científicos publican artículos científicos? « Francis (th)E mule Science's News</title>
		<link>http://bertrandmeyer.com/2011/11/22/the-modes-and-uses-of-scientific-publication/comment-page-1/#comment-472</link>
		<dc:creator>Atención, pregunta: ¿Por qué crees que los científicos publican artículos científicos? « Francis (th)E mule Science's News</dc:creator>
		<pubDate>Mon, 12 Dec 2011 07:49:25 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2018#comment-472</guid>
		<description>[...] las publicaciones, y (4) ritual, porque ser científico significa publicar. Nos lo contó en “The Modes and Uses of Scientific Publication,” Bertrand Meyer’s technology blog, 22 Nov. 2011. Para animarte a leer su entrada [...]</description>
		<content:encoded><![CDATA[<p>[...] las publicaciones, y (4) ritual, porque ser científico significa publicar. Nos lo contó en &#8220;The Modes and Uses of Scientific Publication,&#8221; Bertrand Meyer&#8217;s technology blog, 22 Nov. 2011. Para animarte a leer su entrada [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Averaging by Bertrand Meyer</title>
		<link>http://bertrandmeyer.com/2011/11/15/averaging/comment-page-1/#comment-451</link>
		<dc:creator>Bertrand Meyer</dc:creator>
		<pubDate>Sat, 26 Nov 2011 19:23:57 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2009#comment-451</guid>
		<description>Indeed, that's what the good PCs do (certainly the ones in which I participate). I wish they were the norm.

Thanks for the reference.</description>
		<content:encoded><![CDATA[<p>Indeed, that&#8217;s what the good PCs do (certainly the ones in which I participate). I wish they were the norm.</p>
<p>Thanks for the reference.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on Averaging by onierstrasz</title>
		<link>http://bertrandmeyer.com/2011/11/15/averaging/comment-page-1/#comment-442</link>
		<dc:creator>onierstrasz</dc:creator>
		<pubDate>Wed, 16 Nov 2011 18:55:48 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=2009#comment-442</guid>
		<description>Actually, in my experience, competent PCs do not accept papers based on averages but on who stands up for them. High and low scores don't cancel each other but rather generate discussion. See: http://scg.unibe.ch/download/champion/index.html#PATTERN5</description>
		<content:encoded><![CDATA[<p>Actually, in my experience, competent PCs do not accept papers based on averages but on who stands up for them. High and low scores don&#8217;t cancel each other but rather generate discussion. See: <a href="http://scg.unibe.ch/download/champion/index.html#PATTERN5" rel="nofollow">http://scg.unibe.ch/download/champion/index.html#PATTERN5</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on John McCarthy by Bertrand Meyer's technology blog » Blog Archive » John McCarthy</title>
		<link>http://bertrandmeyer.com/2011/11/07/john-mccarthy/comment-page-1/#comment-432</link>
		<dc:creator>Bertrand Meyer's technology blog » Blog Archive » John McCarthy</dc:creator>
		<pubDate>Mon, 07 Nov 2011 22:10:42 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1993#comment-432</guid>
		<description>[...] See the original article here: Bertrand Meyer's technology blog » Blog Archive » John McCarthy [...]</description>
		<content:encoded><![CDATA[<p>[...] See the original article here: Bertrand Meyer&#039;s technology blog » Blog Archive » John McCarthy [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The story of our field, in a few short words by La storia in un post « CollaBlog</title>
		<link>http://bertrandmeyer.com/2011/10/16/the-story-of-our-field-in-a-few-short-words/comment-page-1/#comment-408</link>
		<dc:creator>La storia in un post « CollaBlog</dc:creator>
		<pubDate>Sat, 29 Oct 2011 10:20:49 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1948#comment-408</guid>
		<description>[...] Provate a indovinare chi si cela dietro i nomi di battesimo. Buona lettura. The story of our field, in a few short words [...]</description>
		<content:encoded><![CDATA[<p>[...] Provate a indovinare chi si cela dietro i nomi di battesimo. Buona lettura. The story of our field, in a few short words [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on The story of our field, in a few short words by Larry</title>
		<link>http://bertrandmeyer.com/2011/10/16/the-story-of-our-field-in-a-few-short-words/comment-page-1/#comment-372</link>
		<dc:creator>Larry</dc:creator>
		<pubDate>Mon, 17 Oct 2011 17:20:53 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1948#comment-372</guid>
		<description>What appears as a common thread in each person written of above is a deep curiosity leading them out from the patterns of thought of the people around them. Thank you for writing and giving a view of the roots of our craft. I am personally and professionally happy Eiffel has been a benefactor of such thinking. Additionally, I hope other professionals will question their own inherited and adopted assumptions and engage their curiosity enough to ask: "Is this all there is or is there something more?"

While what is not broken does not require fixing, what is broken does. My father used to say, "If it hurts, don't do it." At 48, I feel a little liberty to now add a little to his statement:

"If it hurts, don't do it. If you don't know why, find out."

Have the courage to BE CURIOUS!

(Thanks Dad!)</description>
		<content:encoded><![CDATA[<p>What appears as a common thread in each person written of above is a deep curiosity leading them out from the patterns of thought of the people around them. Thank you for writing and giving a view of the roots of our craft. I am personally and professionally happy Eiffel has been a benefactor of such thinking. Additionally, I hope other professionals will question their own inherited and adopted assumptions and engage their curiosity enough to ask: &#8220;Is this all there is or is there something more?&#8221;</p>
<p>While what is not broken does not require fixing, what is broken does. My father used to say, &#8220;If it hurts, don&#8217;t do it.&#8221; At 48, I feel a little liberty to now add a little to his statement:</p>
<p>&#8220;If it hurts, don&#8217;t do it. If you don&#8217;t know why, find out.&#8221;</p>
<p>Have the courage to BE CURIOUS!</p>
<p>(Thanks Dad!)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Comment on A safe and stable solution by A safe and stable solution « Jocelyn Fiat</title>
		<link>http://bertrandmeyer.com/2011/08/02/a-safe-and-stable-solution/comment-page-1/#comment-368</link>
		<dc:creator>A safe and stable solution « Jocelyn Fiat</dc:creator>
		<pubDate>Wed, 12 Oct 2011 10:37:37 +0000</pubDate>
		<guid isPermaLink="false">http://bertrandmeyer.com/?p=1805#comment-368</guid>
		<description>[...] Bertrand Meyer's technology blog » Blog Archive » A safe and stable solution A safe and stable solution. 2 August 2011, 02:28. Reading about the latest hullabaloo around Android's usage of Java, and more generally following the incessant flow of news such as about X suing … [...]</description>
		<content:encoded><![CDATA[<p>[...] Bertrand Meyer&#039;s technology blog » Blog Archive » A safe and stable solution A safe and stable solution. 2 August 2011, 02:28. Reading about the latest hullabaloo around Android&#039;s usage of Java, and more generally following the incessant flow of news such as about X suing &#8230; [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

