<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: The Primary Law of Software Design</title>
	<atom:link href="http://www.codesimplicity.com/archives/17/feed" rel="self" type="application/rss+xml" />
	<link>http://www.codesimplicity.com/archives/17</link>
	<description></description>
	<pubDate>Mon, 08 Sep 2008 09:27:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
		<item>
		<title>By: Dawid Krysiak</title>
		<link>http://www.codesimplicity.com/archives/17#comment-319</link>
		<dc:creator>Dawid Krysiak</dc:creator>
		<pubDate>Tue, 03 Jun 2008 20:23:01 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-319</guid>
		<description>&lt;cite&gt;My personal experience in that area is that failing to design future-proof software makes it harder and harder to make shippable releases as time goes on, so they’re very much related.&lt;/cite&gt;
Hmmm. So as always it's a matter of trying to find a golden medium between both - it's very hard :-)</description>
		<content:encoded><![CDATA[<p><cite>My personal experience in that area is that failing to design future-proof software makes it harder and harder to make shippable releases as time goes on, so they’re very much related.</cite><br />
Hmmm. So as always it&#8217;s a matter of trying to find a golden medium between both - it&#8217;s very hard <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-135</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Mon, 25 Feb 2008 00:52:26 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-135</guid>
		<description>Hey Myk! Yes, actually I totally agree with you. :-) I'm pretty much in favor of "worse is better." Actually, as the articles go on, you'll see how I can derive a philosophy somewhat like that based on this principle. :-)

Thank you for saying it's a worthy investigation! :-) I hope that I can come up with some helpful things!

-Max</description>
		<content:encoded><![CDATA[<p>Hey Myk! Yes, actually I totally agree with you. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> I&#8217;m pretty much in favor of &#8220;worse is better.&#8221; Actually, as the articles go on, you&#8217;ll see how I can derive a philosophy somewhat like that based on this principle. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Thank you for saying it&#8217;s a worthy investigation! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> I hope that I can come up with some helpful things!</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Myk Melez</title>
		<link>http://www.codesimplicity.com/archives/17#comment-134</link>
		<dc:creator>Myk Melez</dc:creator>
		<pubDate>Sun, 24 Feb 2008 21:12:39 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-134</guid>
		<description>This would seem to contradict the principle of "worse is better", which Mozilla has used quite productively over its ten years (and whose negligence early on nearly doomed the project).  It also smacks of premature optimization.  There may well be times when it's better to design like this, but it seems less a law than a strategy whose utility depends upon circumstance.

Finding some principles to help guide developers in determining which situations call for which approaches would be super helpful, however, so it's a worthy investigation!</description>
		<content:encoded><![CDATA[<p>This would seem to contradict the principle of &#8220;worse is better&#8221;, which Mozilla has used quite productively over its ten years (and whose negligence early on nearly doomed the project).  It also smacks of premature optimization.  There may well be times when it&#8217;s better to design like this, but it seems less a law than a strategy whose utility depends upon circumstance.</p>
<p>Finding some principles to help guide developers in determining which situations call for which approaches would be super helpful, however, so it&#8217;s a worthy investigation!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-133</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Sun, 24 Feb 2008 13:02:17 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-133</guid>
		<description>Okay.

Well, if you'd rather pay attention to the present than the future, that is absolutely your choice.

-Max</description>
		<content:encoded><![CDATA[<p>Okay.</p>
<p>Well, if you&#8217;d rather pay attention to the present than the future, that is absolutely your choice.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kim Sullivan</title>
		<link>http://www.codesimplicity.com/archives/17#comment-132</link>
		<dc:creator>Kim Sullivan</dc:creator>
		<pubDate>Sun, 24 Feb 2008 12:25:56 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-132</guid>
		<description>&lt;blockquote&gt;Well, if we want to talk about it all this way, you did point out that all that needs to hold is G(x) &#60; = G(y), so if G(x) = G(y), then our condition is still true. It’s more of a statistical thing than an absolute–that&lt;/blockquote&gt;

Yes, but if G(x) and G(y) are equal for all x&#60;y, it would mean that there is only one "goodnes" of design, which is constant. That would mean that "all programs are designed equally good/bad, irrespective of the time they were made to exist", which doesn't help us to design or evaluate programs (and actually reinforces my assumption that all programs are used indefinitely).

As for the reverse - there are programs with an extremely bad design (even deliberate), and yet they will probably exist and be used indefinitely - if only for entertainment purposes. The &lt;a href="http://omg.worsethanfailure.com/" rel="nofollow"&gt;OMGFTF contest&lt;/a&gt; displays a host of abominations - and none of them will cease to exist unless the site goes down (or something else, but it will not be because of their bad design). Generally I think that &lt;a href="http://thedailywtf.com/" rel="nofollow"&gt;Worse Than Failure&lt;/a&gt; is a good site for finding about software that should probably never have been written, yet it continues to exist, be used and is the source of nightmares for users and developers alike. And I've come to believe that these "worse than failures" are actually the norm, rather than a statistical outlier (the worst stuff  doesn't happen in open source development).

But I think I'm getting a bit sidetrackeded, so back on topic.

I thought about the difference between software developments and architects and constructors. They have real physical quantitative measures. Will a house stand in 5 years or will it fall down? How much heat does it dissipate? If it rains, does it get wet inside? Those all are real, physical measurable things. Unfortunately, for a program, there is no way to verify anything. Is the program correct? We don't know, there is no algorithm that can solve this. Will it exist 5 years from now? Maybe yes, maybe no - but unless an equivalent of an earthquake happens, the program will indeed exist 5 years from now. Further - no 2 programs are the same. Architects have a big advantagehere - their experiments are repeatable. If they construct a single good house, they can construct it again the same way - and it will be a net gain. But if I succesfully write a hello world program, what's the point of writing the same program again?</description>
		<content:encoded><![CDATA[<blockquote><p>Well, if we want to talk about it all this way, you did point out that all that needs to hold is G(x) &lt; = G(y), so if G(x) = G(y), then our condition is still true. It’s more of a statistical thing than an absolute–that</p></blockquote>
<p>Yes, but if G(x) and G(y) are equal for all x&lt;y, it would mean that there is only one &#8220;goodnes&#8221; of design, which is constant. That would mean that &#8220;all programs are designed equally good/bad, irrespective of the time they were made to exist&#8221;, which doesn&#8217;t help us to design or evaluate programs (and actually reinforces my assumption that all programs are used indefinitely).</p>
<p>As for the reverse - there are programs with an extremely bad design (even deliberate), and yet they will probably exist and be used indefinitely - if only for entertainment purposes. The <a href="http://omg.worsethanfailure.com/" rel="nofollow">OMGFTF contest</a> displays a host of abominations - and none of them will cease to exist unless the site goes down (or something else, but it will not be because of their bad design). Generally I think that <a href="http://thedailywtf.com/" rel="nofollow">Worse Than Failure</a> is a good site for finding about software that should probably never have been written, yet it continues to exist, be used and is the source of nightmares for users and developers alike. And I&#8217;ve come to believe that these &#8220;worse than failures&#8221; are actually the norm, rather than a statistical outlier (the worst stuff  doesn&#8217;t happen in open source development).</p>
<p>But I think I&#8217;m getting a bit sidetrackeded, so back on topic.</p>
<p>I thought about the difference between software developments and architects and constructors. They have real physical quantitative measures. Will a house stand in 5 years or will it fall down? How much heat does it dissipate? If it rains, does it get wet inside? Those all are real, physical measurable things. Unfortunately, for a program, there is no way to verify anything. Is the program correct? We don&#8217;t know, there is no algorithm that can solve this. Will it exist 5 years from now? Maybe yes, maybe no - but unless an equivalent of an earthquake happens, the program will indeed exist 5 years from now. Further - no 2 programs are the same. Architects have a big advantagehere - their experiments are repeatable. If they construct a single good house, they can construct it again the same way - and it will be a net gain. But if I succesfully write a hello world program, what&#8217;s the point of writing the same program again?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-131</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Sat, 23 Feb 2008 21:17:31 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-131</guid>
		<description>Wow, I can see that you really put some thought into this!

Well, if we want to talk about it all this way, you did point out that all that needs to hold is G(x) &lt;= G(y), so if G(x) = G(y), then our condition is still true. It's more of a statistical thing than an absolute--that 

Perhaps what would be easier to prove is the reverse--that given a poor enough software design, you will have to rewrite or redesign your software after time t (or your software will no longer be able to continue to exist and be useful after time x).

As far as change goes, you're actually leaking right into my second law, and a few other things that I have in draft. :-) I think really one of the things you're running into here is that I haven't created a whole logical system yet with just this law, only a single statement without anything to compare it to.

As far as "the way of Microsoft", I'd ask where it's gotten them. I think IE5 &#038; IE6 drove them into quite a hole. The time it took to release Vista saw other technologies really impinge upon their market share.

By the way, everything you're saying is definitely making me think, and I've already got a new article that "steps back" a bit that will post on Monday.

-Max</description>
		<content:encoded><![CDATA[<p>Wow, I can see that you really put some thought into this!</p>
<p>Well, if we want to talk about it all this way, you did point out that all that needs to hold is G(x) < = G(y), so if G(x) = G(y), then our condition is still true. It&#8217;s more of a statistical thing than an absolute&#8211;that </p>
<p>Perhaps what would be easier to prove is the reverse&#8211;that given a poor enough software design, you will have to rewrite or redesign your software after time t (or your software will no longer be able to continue to exist and be useful after time x).</p>
<p>As far as change goes, you&#8217;re actually leaking right into my second law, and a few other things that I have in draft. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> I think really one of the things you&#8217;re running into here is that I haven&#8217;t created a whole logical system yet with just this law, only a single statement without anything to compare it to.</p>
<p>As far as &#8220;the way of Microsoft&#8221;, I&#8217;d ask where it&#8217;s gotten them. I think IE5 &#038; IE6 drove them into quite a hole. The time it took to release Vista saw other technologies really impinge upon their market share.</p>
<p>By the way, everything you&#8217;re saying is definitely making me think, and I&#8217;ve already got a new article that &#8220;steps back&#8221; a bit that will post on Monday.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kim Sullivan</title>
		<link>http://www.codesimplicity.com/archives/17#comment-130</link>
		<dc:creator>Kim Sullivan</dc:creator>
		<pubDate>Sat, 23 Feb 2008 15:06:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-130</guid>
		<description>I though some more about the assumption you made, and tried to apply some math and mathematical logic to it.
&lt;blockquote&gt;this tells us how good our software design needs to be–it needs to be exactly as good as there is future time in which our software must exist&lt;/blockquote&gt;.

So (if I understand it correctly) you're saying
If I want my software to exist for time &lt;i&gt;t&lt;/i&gt;, then the goodnes &lt;i&gt;g&lt;/i&gt; of the software's design needs to be (exactly) &lt;i&gt;G(t)&lt;/i&gt;.

I think we can reasonably assume that G() is monotonically rising, which means that for two times, x &#60; y it holds that G(x) &#60;= G(y). I myself have written programs, that I specifically designed for a single task that was bothering me at that time. So I wanted my software to exist for time t1, and it's "goodnes" was G(t1). After a few years (t2), I happened to need the program again - and lo and behold, I didn't delete it, and it was still there. I was even able to modify the program to fit my new needs. Had I originally wanted the program to be there in a few years (t2), I would have designed it to be G(t2) good. But since it would have been essentially the same program which would be around in t2, solving the single problem I had at that time, then apparently  G(t2) is no better than G(t1) and since G is monotonically rising, it follows that G(t1) = G(t2). Since we can't really say anything specific about t1 and t2 (what we can say would be only some statistical guesswork), this reasoning can be applied to all t1 &#60; t2, this means that G(t1) = G(t2) = const, which means that the goodnes of the design doesn't depend on the time I want it to exist.

So, I probably instinctively designed the program better than G(), and the original assumption should be "at least as good as &lt;i&gt;G(t)&lt;/i&gt;". Let's say that the actual goodnes of a program is therefore g = G(t) + p, where p is a goodnes factor by which a program was overdesigned (and which doesn't depend on the time I want it to exist). Unfortunately, we don't know anything about this factor (and the law about the future being more important than the present doesn't help us here, since the factor specifically doesn't depend on the future). It would be possible, for any two programs, to tweak their respective values of p so, that p &#62;&#62; G() which again makes the contribution of the time we want the program to exist be negligible.

What remains? Apparently, the goodnes function is not only dependent on the time we want the program to exist, but also on the program itself: G(p,t). But the program is dependent on it's design, which means that p = f(G()). So, to be able to evaluate the "goodnes" function for a program, we need the program - this doesn't help us with designing programs (the only thing this does is point to iterative software development methodologies - especially agile ones, that "embrace change" and accept the fact that no design is perfect).

So, no matter how I look at the assumption, it doesn't really work out (and the law from which it stems doesn't really have any influence on this, so it's not very scientific, at least in the "mathematics" sense). Besides, since it's an implication, it doesn't tell us anything about the situation when we don't want a program to exist for a specific future time. Neither does it help us in the quite common case where a programmer just supposes that the program will exist "forever" - which would mean that it's design needs to be "the best possible" - sup(G()).

I could make a different assumption about programs: a program will be used (or be useful) indefinitely (regardless of how good it was designed), unless the hardware changes, the operating system changes, the problem the program solves changes, or a "better" program that solves the same problem is made (or a bunch of other things that can "go wrong" - for example a web service that goes bankrupt). This is in direct contradiction with your original assumption, yet it cannot be disproved (or proved) simply by the fact that the future is more important than the present. Actually, this is "the way of the Microsoft" - they don't necessarily make the program itself better - sometimes it is enough that there isn't any competition (sometimes, this doesn't work out, such as in IE, and I'm not sure how Vista vs. XP fits in)

Using the "time we want the program to exist" is maybe the basis of a new software development mehtodology - "program lifetime expentancy centered design", but methodologies aren't science.</description>
		<content:encoded><![CDATA[<p>I though some more about the assumption you made, and tried to apply some math and mathematical logic to it.</p>
<blockquote><p>this tells us how good our software design needs to be–it needs to be exactly as good as there is future time in which our software must exist</p></blockquote>
<p>.</p>
<p>So (if I understand it correctly) you&#8217;re saying<br />
If I want my software to exist for time <i>t</i>, then the goodnes <i>g</i> of the software&#8217;s design needs to be (exactly) <i>G(t)</i>.</p>
<p>I think we can reasonably assume that G() is monotonically rising, which means that for two times, x &lt; y it holds that G(x) &lt;= G(y). I myself have written programs, that I specifically designed for a single task that was bothering me at that time. So I wanted my software to exist for time t1, and it&#8217;s &#8220;goodnes&#8221; was G(t1). After a few years (t2), I happened to need the program again - and lo and behold, I didn&#8217;t delete it, and it was still there. I was even able to modify the program to fit my new needs. Had I originally wanted the program to be there in a few years (t2), I would have designed it to be G(t2) good. But since it would have been essentially the same program which would be around in t2, solving the single problem I had at that time, then apparently  G(t2) is no better than G(t1) and since G is monotonically rising, it follows that G(t1) = G(t2). Since we can&#8217;t really say anything specific about t1 and t2 (what we can say would be only some statistical guesswork), this reasoning can be applied to all t1 &lt; t2, this means that G(t1) = G(t2) = const, which means that the goodnes of the design doesn&#8217;t depend on the time I want it to exist.</p>
<p>So, I probably instinctively designed the program better than G(), and the original assumption should be &#8220;at least as good as <i>G(t)</i>&#8220;. Let&#8217;s say that the actual goodnes of a program is therefore g = G(t) + p, where p is a goodnes factor by which a program was overdesigned (and which doesn&#8217;t depend on the time I want it to exist). Unfortunately, we don&#8217;t know anything about this factor (and the law about the future being more important than the present doesn&#8217;t help us here, since the factor specifically doesn&#8217;t depend on the future). It would be possible, for any two programs, to tweak their respective values of p so, that p &gt;&gt; G() which again makes the contribution of the time we want the program to exist be negligible.</p>
<p>What remains? Apparently, the goodnes function is not only dependent on the time we want the program to exist, but also on the program itself: G(p,t). But the program is dependent on it&#8217;s design, which means that p = f(G()). So, to be able to evaluate the &#8220;goodnes&#8221; function for a program, we need the program - this doesn&#8217;t help us with designing programs (the only thing this does is point to iterative software development methodologies - especially agile ones, that &#8220;embrace change&#8221; and accept the fact that no design is perfect).</p>
<p>So, no matter how I look at the assumption, it doesn&#8217;t really work out (and the law from which it stems doesn&#8217;t really have any influence on this, so it&#8217;s not very scientific, at least in the &#8220;mathematics&#8221; sense). Besides, since it&#8217;s an implication, it doesn&#8217;t tell us anything about the situation when we don&#8217;t want a program to exist for a specific future time. Neither does it help us in the quite common case where a programmer just supposes that the program will exist &#8220;forever&#8221; - which would mean that it&#8217;s design needs to be &#8220;the best possible&#8221; - sup(G()).</p>
<p>I could make a different assumption about programs: a program will be used (or be useful) indefinitely (regardless of how good it was designed), unless the hardware changes, the operating system changes, the problem the program solves changes, or a &#8220;better&#8221; program that solves the same problem is made (or a bunch of other things that can &#8220;go wrong&#8221; - for example a web service that goes bankrupt). This is in direct contradiction with your original assumption, yet it cannot be disproved (or proved) simply by the fact that the future is more important than the present. Actually, this is &#8220;the way of the Microsoft&#8221; - they don&#8217;t necessarily make the program itself better - sometimes it is enough that there isn&#8217;t any competition (sometimes, this doesn&#8217;t work out, such as in IE, and I&#8217;m not sure how Vista vs. XP fits in)</p>
<p>Using the &#8220;time we want the program to exist&#8221; is maybe the basis of a new software development mehtodology - &#8220;program lifetime expentancy centered design&#8221;, but methodologies aren&#8217;t science.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-127</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Fri, 22 Feb 2008 20:38:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-127</guid>
		<description>Hrm, I think 1 is an interesting proposition. I don't think you can actually separate out "1 minute in the future" and "1 minute 10 years from now", because time is linear. That is, "1 minute in the future 10 years from now" is actually always "10 years from now." You can't jump around in time, so it's not very useful to look at it in any non-linear fashion.

As far as 2 goes, you're definitely right! Probably what my laws are missing is "the purpose of software" underneath them, which would be something like "to help people." That would be the guiding principle, so obviously a piece of software that never ships isn't nearly as helpful as a piece of software that ships.

My personal experience in that area is that failing to design future-proof software makes it harder and harder to make shippable releases as time goes on, so they're very much related.

-Max</description>
		<content:encoded><![CDATA[<p>Hrm, I think 1 is an interesting proposition. I don&#8217;t think you can actually separate out &#8220;1 minute in the future&#8221; and &#8220;1 minute 10 years from now&#8221;, because time is linear. That is, &#8220;1 minute in the future 10 years from now&#8221; is actually always &#8220;10 years from now.&#8221; You can&#8217;t jump around in time, so it&#8217;s not very useful to look at it in any non-linear fashion.</p>
<p>As far as 2 goes, you&#8217;re definitely right! Probably what my laws are missing is &#8220;the purpose of software&#8221; underneath them, which would be something like &#8220;to help people.&#8221; That would be the guiding principle, so obviously a piece of software that never ships isn&#8217;t nearly as helpful as a piece of software that ships.</p>
<p>My personal experience in that area is that failing to design future-proof software makes it harder and harder to make shippable releases as time goes on, so they&#8217;re very much related.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-126</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Fri, 22 Feb 2008 20:32:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-126</guid>
		<description>Okay, I think you make a lot of good points, here! I will definitely take all of this into account. :-)

-Max</description>
		<content:encoded><![CDATA[<p>Okay, I think you make a lot of good points, here! I will definitely take all of this into account. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Maxo</title>
		<link>http://www.codesimplicity.com/archives/17#comment-125</link>
		<dc:creator>Maxo</dc:creator>
		<pubDate>Fri, 22 Feb 2008 15:08:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-125</guid>
		<description>But isn't that $200 only important now because of it's capabilities for the future?</description>
		<content:encoded><![CDATA[<p>But isn&#8217;t that $200 only important now because of it&#8217;s capabilities for the future?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Kaiser</title>
		<link>http://www.codesimplicity.com/archives/17#comment-124</link>
		<dc:creator>Robert Kaiser</dc:creator>
		<pubDate>Fri, 22 Feb 2008 13:32:27 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-124</guid>
		<description>1) One minute in the present is usually more important than one minute in the distant future - we should remember all those measurements are non-linear properties.

2) In software development, it doesn't help if your design is good for being understood and further modified in, say, 10 years if you never get to ship a stable release - see the Netscape 5 (or 6) story. [Well, the code is still out there and better than ever, but Netscape died from reworking Mozilla.] The hard things is figuring out a balance between future-proof software design and shippable releases. And that's a hard thing to get right in many cases.</description>
		<content:encoded><![CDATA[<p>1) One minute in the present is usually more important than one minute in the distant future - we should remember all those measurements are non-linear properties.</p>
<p>2) In software development, it doesn&#8217;t help if your design is good for being understood and further modified in, say, 10 years if you never get to ship a stable release - see the Netscape 5 (or 6) story. [Well, the code is still out there and better than ever, but Netscape died from reworking Mozilla.] The hard things is figuring out a balance between future-proof software design and shippable releases. And that&#8217;s a hard thing to get right in many cases.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kim Sullivan</title>
		<link>http://www.codesimplicity.com/archives/17#comment-123</link>
		<dc:creator>Kim Sullivan</dc:creator>
		<pubDate>Fri, 22 Feb 2008 11:04:16 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-123</guid>
		<description>Actually, "useful" is even harder to define than "in use". Is a program useful if it is useful to at least one person? What if only a part of a program is useful to a single person, but the other parts are not useful to anybody?

What I miss from this post probably most is a sound connection between the law and the assumptions you're making. I could rephrase the basic "law" in terms of numbers, and it would be still true:
There are more natural numbers larger than X than there are numbers with the value X.

The derivative would be:
Numbers larger than X are more important than X.

This is obviously nonsense. So, what is the reasoning for the future being more important than the present? Of course, you could state that "the future is more important than the present" is an axiom, not a derivative - but axioms don't really have to be always true. Just take the different non-eucleidian geometries. So you could build one theory based on the future being more important, and another one where the future is not more important.</description>
		<content:encoded><![CDATA[<p>Actually, &#8220;useful&#8221; is even harder to define than &#8220;in use&#8221;. Is a program useful if it is useful to at least one person? What if only a part of a program is useful to a single person, but the other parts are not useful to anybody?</p>
<p>What I miss from this post probably most is a sound connection between the law and the assumptions you&#8217;re making. I could rephrase the basic &#8220;law&#8221; in terms of numbers, and it would be still true:<br />
There are more natural numbers larger than X than there are numbers with the value X.</p>
<p>The derivative would be:<br />
Numbers larger than X are more important than X.</p>
<p>This is obviously nonsense. So, what is the reasoning for the future being more important than the present? Of course, you could state that &#8220;the future is more important than the present&#8221; is an axiom, not a derivative - but axioms don&#8217;t really have to be always true. Just take the different non-eucleidian geometries. So you could build one theory based on the future being more important, and another one where the future is not more important.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-122</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Fri, 22 Feb 2008 10:11:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-122</guid>
		<description>Reading your comment, however, makes me think that perhaps I should say "be useful" as opposed to "be used." I'm not sure either really gives us the specificity we'd like to see, but "be useful" might be slightly more descriptive. :-)

This is one reason I post these things as blogs--to get this sort of feedback! :-)

-Max</description>
		<content:encoded><![CDATA[<p>Reading your comment, however, makes me think that perhaps I should say &#8220;be useful&#8221; as opposed to &#8220;be used.&#8221; I&#8217;m not sure either really gives us the specificity we&#8217;d like to see, but &#8220;be useful&#8221; might be slightly more descriptive. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>This is one reason I post these things as blogs&#8211;to get this sort of feedback! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-121</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Fri, 22 Feb 2008 10:01:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-121</guid>
		<description>Sure, I think a scientific definition of terms is a good idea! :-) I'll think about that. :-)

You're right that I have not scientifically defined the term "software design" other than what it already means in the field of software engineering--the fashion in which your software is constructed.

Your analogy is slightly flawed in that "love" and "relationship" are not necessarily related, whereas "the design of my software" and "my software" are more clearly related.

"In use" means that it's "in use." A program that's not "in use" is not being used by &lt;em&gt;anybody&lt;/em&gt;, but...I think that sometimes I perhaps make assumptions that other people fundamentally think with systems of logic that are not widely known. For example, anything could be more or less "in use", just as anything could be more or less "good." To me that is obvious and doesn't need to be stated, but perhaps that's not the case for everybody.

Also note that I don't use any of those words in the laws themselves, only in my discussion of them. That is, the stuff that follows the laws is somewhat more "an application of this law to show you how it can be used" than "an extension of this law."

My criteria for a science are usually that it's applicable and embracive of the field it's applied to, and I think the law itself is good enough to meet that criteria. One reader, however, pointed out to me that I do need to define the word "important," which I might do by editing this blog or posting another one. Essentially, important means "deserves more attention than other things."

It's true that these &lt;em&gt;might not be&lt;/em&gt; the most fundamental laws, but this (and the others that will be coming in future blogs) are the closest that I have been able to get. If somebody evolves something better, I'd definitely be happy to see it.

-Max</description>
		<content:encoded><![CDATA[<p>Sure, I think a scientific definition of terms is a good idea! <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> I&#8217;ll think about that. <img src='http://www.codesimplicity.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>You&#8217;re right that I have not scientifically defined the term &#8220;software design&#8221; other than what it already means in the field of software engineering&#8211;the fashion in which your software is constructed.</p>
<p>Your analogy is slightly flawed in that &#8220;love&#8221; and &#8220;relationship&#8221; are not necessarily related, whereas &#8220;the design of my software&#8221; and &#8220;my software&#8221; are more clearly related.</p>
<p>&#8220;In use&#8221; means that it&#8217;s &#8220;in use.&#8221; A program that&#8217;s not &#8220;in use&#8221; is not being used by <em>anybody</em>, but&#8230;I think that sometimes I perhaps make assumptions that other people fundamentally think with systems of logic that are not widely known. For example, anything could be more or less &#8220;in use&#8221;, just as anything could be more or less &#8220;good.&#8221; To me that is obvious and doesn&#8217;t need to be stated, but perhaps that&#8217;s not the case for everybody.</p>
<p>Also note that I don&#8217;t use any of those words in the laws themselves, only in my discussion of them. That is, the stuff that follows the laws is somewhat more &#8220;an application of this law to show you how it can be used&#8221; than &#8220;an extension of this law.&#8221;</p>
<p>My criteria for a science are usually that it&#8217;s applicable and embracive of the field it&#8217;s applied to, and I think the law itself is good enough to meet that criteria. One reader, however, pointed out to me that I do need to define the word &#8220;important,&#8221; which I might do by editing this blog or posting another one. Essentially, important means &#8220;deserves more attention than other things.&#8221;</p>
<p>It&#8217;s true that these <em>might not be</em> the most fundamental laws, but this (and the others that will be coming in future blogs) are the closest that I have been able to get. If somebody evolves something better, I&#8217;d definitely be happy to see it.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kim Sullivan</title>
		<link>http://www.codesimplicity.com/archives/17#comment-120</link>
		<dc:creator>Kim Sullivan</dc:creator>
		<pubDate>Fri, 22 Feb 2008 09:32:16 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-120</guid>
		<description>To make a science, won't you need scientific definitions of terms? By making assumptions about software design, and not havingt a good, scientific, definition of what software design is, you're building on brittle foundations.

You even introduce a metric - the goodness of a software design (and postulate that it is in correlation with amount of future time a program "exists" and is "in use"). BTW, what does "in use" (even from a programmers standpoint) mean? How many people? How many companies?

While your articles are really interesting (and I'll be thinking about them a lot), I wouldn't call them science. You could easily substitute the goodnes of software design with "the strength of love" and program with "partnership" - the result is equally scientifically sound.

&lt;blockquote&gt;Well, in order to answer that question, we have to make one assumption: that you want your &lt;strike&gt;program&lt;/strike&gt; relationship to continue to exist &lt;strike&gt;and be used&lt;/strike&gt; in the future. If you only want it to exist for the next five minutes, then those are the most important. If you want it to continue to be around for 10 years, then those 10 years are the most important.

So all together, this tells us how &lt;strike&gt;good our software design&lt;/strike&gt; strong our love needs to be–it needs to be exactly as &lt;strike&gt;good&lt;/strike&gt; strong as there is future time in which our &lt;strike&gt;software&lt;/strike&gt; relationship must exist.&lt;/blockquote&gt;</description>
		<content:encoded><![CDATA[<p>To make a science, won&#8217;t you need scientific definitions of terms? By making assumptions about software design, and not havingt a good, scientific, definition of what software design is, you&#8217;re building on brittle foundations.</p>
<p>You even introduce a metric - the goodness of a software design (and postulate that it is in correlation with amount of future time a program &#8220;exists&#8221; and is &#8220;in use&#8221;). BTW, what does &#8220;in use&#8221; (even from a programmers standpoint) mean? How many people? How many companies?</p>
<p>While your articles are really interesting (and I&#8217;ll be thinking about them a lot), I wouldn&#8217;t call them science. You could easily substitute the goodnes of software design with &#8220;the strength of love&#8221; and program with &#8220;partnership&#8221; - the result is equally scientifically sound.</p>
<blockquote><p>Well, in order to answer that question, we have to make one assumption: that you want your <strike>program</strike> relationship to continue to exist <strike>and be used</strike> in the future. If you only want it to exist for the next five minutes, then those are the most important. If you want it to continue to be around for 10 years, then those 10 years are the most important.</p>
<p>So all together, this tells us how <strike>good our software design</strike> strong our love needs to be–it needs to be exactly as <strike>good</strike> strong as there is future time in which our <strike>software</strike> relationship must exist.</p></blockquote>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-117</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Thu, 21 Feb 2008 22:37:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-117</guid>
		<description>Well, sure, perhaps for reasons of market pressure, particularly for new organizations this tends to happen. The most valid time it happens is competitive pressure--being "the first kid on the scene" can have a big competitive advantage. Of course, I don't think that advantage justifies throwing away quality--the Sega Genesis came out before the Super Nintendo, but Sega went out of business and Nintendo is still quite alive.

However, it's also important to remember that &lt;em&gt;most startups fail&lt;/em&gt;. If there is a behavior common to most startups, it is &lt;em&gt;probably&lt;/em&gt; (though not definitely) a bad behavior.

And yes, it's true that there is pressure from the clients to "get that feature out." However, I'd say that continuously releasing a poorly-designed product is far more dangerous to an organization than holding off a feature until it's actually ready.

Granted, some engineers have too much perfection in their idea of "ready", and that has to be balanced by the economic reality of delivering a product. But in my experience, the thing that kills software in the long run is "no attention to the future."

There are examples quite in my favor, too, going back once again to the video game industry--Half Life 2 and Team Fortress 2 took quite a long time to get out, but their attention to detail made them very successful when they were released. They didn't release a half-done product just to "get something out there now", they really waited until they had something polished that would survive into the future.

-Max</description>
		<content:encoded><![CDATA[<p>Well, sure, perhaps for reasons of market pressure, particularly for new organizations this tends to happen. The most valid time it happens is competitive pressure&#8211;being &#8220;the first kid on the scene&#8221; can have a big competitive advantage. Of course, I don&#8217;t think that advantage justifies throwing away quality&#8211;the Sega Genesis came out before the Super Nintendo, but Sega went out of business and Nintendo is still quite alive.</p>
<p>However, it&#8217;s also important to remember that <em>most startups fail</em>. If there is a behavior common to most startups, it is <em>probably</em> (though not definitely) a bad behavior.</p>
<p>And yes, it&#8217;s true that there is pressure from the clients to &#8220;get that feature out.&#8221; However, I&#8217;d say that continuously releasing a poorly-designed product is far more dangerous to an organization than holding off a feature until it&#8217;s actually ready.</p>
<p>Granted, some engineers have too much perfection in their idea of &#8220;ready&#8221;, and that has to be balanced by the economic reality of delivering a product. But in my experience, the thing that kills software in the long run is &#8220;no attention to the future.&#8221;</p>
<p>There are examples quite in my favor, too, going back once again to the video game industry&#8211;Half Life 2 and Team Fortress 2 took quite a long time to get out, but their attention to detail made them very successful when they were released. They didn&#8217;t release a half-done product just to &#8220;get something out there now&#8221;, they really waited until they had something polished that would survive into the future.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Kanat-Alexander</title>
		<link>http://www.codesimplicity.com/archives/17#comment-116</link>
		<dc:creator>Max Kanat-Alexander</dc:creator>
		<pubDate>Thu, 21 Feb 2008 22:27:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-116</guid>
		<description>Yeah, I think that's an interesting point. There are definitely times when present investments make more sense, and that's basically the "next five minutes" scenario I went over. One makes an investment now because we take into consideration the future and realize that this is what will be more valuable in that future--an investment right now.

-Max</description>
		<content:encoded><![CDATA[<p>Yeah, I think that&#8217;s an interesting point. There are definitely times when present investments make more sense, and that&#8217;s basically the &#8220;next five minutes&#8221; scenario I went over. One makes an investment now because we take into consideration the future and realize that this is what will be more valuable in that future&#8211;an investment right now.</p>
<p>-Max</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nick</title>
		<link>http://www.codesimplicity.com/archives/17#comment-115</link>
		<dc:creator>Nick</dc:creator>
		<pubDate>Thu, 21 Feb 2008 22:04:08 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-115</guid>
		<description>I think that "the next five minutes" scenario happens more often than you give credence to.  Any start up has a limited amount of time to prove their worth or they lose their funding.  All vendors have a certain amount of time to get things right before the client goes in a different direction.</description>
		<content:encoded><![CDATA[<p>I think that &#8220;the next five minutes&#8221; scenario happens more often than you give credence to.  Any start up has a limited amount of time to prove their worth or they lose their funding.  All vendors have a certain amount of time to get things right before the client goes in a different direction.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jesse Ruderman</title>
		<link>http://www.codesimplicity.com/archives/17#comment-114</link>
		<dc:creator>Jesse Ruderman</dc:creator>
		<pubDate>Thu, 21 Feb 2008 21:53:07 +0000</pubDate>
		<guid isPermaLink="false">http://www.codesimplicity.com/archives/17#comment-114</guid>
		<description>Are you familiar with the concept of &lt;a href="http://en.wikipedia.org/wiki/Present_value" rel="nofollow"&gt;"present value"&lt;/a&gt; in economics?  It explains why $200 now might be worth more than $5 every year forever, depending on the interest rate.  This idea seems to conflict with your "axiomatic law" that the future is always more important than the present.</description>
		<content:encoded><![CDATA[<p>Are you familiar with the concept of <a href="http://en.wikipedia.org/wiki/Present_value" rel="nofollow">&#8220;present value&#8221;</a> in economics?  It explains why $200 now might be worth more than $5 every year forever, depending on the interest rate.  This idea seems to conflict with your &#8220;axiomatic law&#8221; that the future is always more important than the present.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
