<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx</link><description>People often quote Knuth's famous statement that premature optimization is the root of all evil. Boy, has that ever been the theme of my life these last few weeks as I've been banging my head against the compiler trying to figure out how we're going to</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#6791191</link><pubDate>Mon, 17 Dec 2007 20:29:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6791191</guid><dc:creator>Eric Lippert</dc:creator><description>&lt;p&gt;Here's something I've noticed over the last decade at Microsoft which surprised me at first, but now I'm totally used to it. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;When your decisions have as much impact on the industry as ours do, any time we do some action X, there will be people who complain that we did did X and did not do not-X. &amp;nbsp;That's unsurprising. The surprising bit is that frequently when we do X, there are people who complain that we really ought to do X. &lt;/p&gt;
&lt;p&gt;I am not sure what is up with these people; basically I've come to the conclusion that people are strange.&lt;/p&gt;
&lt;p&gt;Case in point: I am trying to decide whether to make a breaking change to the product, and if so, what breaking change. In the past we might have made a beta or a CTP and shipped it out to high-end customers to see what their feedback is. But for the Orcas release I decided, yes, we will keep doing that, but in addition I will document not just the putative breaking change, but the decision process that goes into it. I'll do this before the change is final, in a public forum with 10000+ readers in the community. That way I get feedback not just from high end customers, but from affected community members who have opinions one way or the other.&lt;/p&gt;
&lt;p&gt;In this specific case, I was initially leaning towards not making any breaking change at all. But based on further analysis and careful consideration of the feedback that I received on this and other posts, we decided to take a breaking change which affects overload resolution rules. This change is a real breaking change -- at least one customer has since reported the break. &amp;nbsp;But we decided that this particular premature optimization was holding us back from deeper optimizations and, more importantly, the ability to cleanly design and implement new language features like expression trees. So we took the community feedback and took the break.&lt;/p&gt;
&lt;p&gt;And for my trouble, I get accused by members of the very community that I'm attempting to serve of being at best insensitive, at worst disingenuous. &amp;nbsp;Claire Booth Luce was right.&lt;/p&gt;
&lt;p&gt;To address the concern of your last paragraph: what you are describing is called the &amp;quot;value proposition&amp;quot;. I am committed to producing a product with a compelling value proposition for C# developers, with an emphasis on pro devs working in corporate environments, but with attention to other market segments as well. This should not come as a surprise. &lt;/p&gt;
&lt;p&gt;My larger team is committed to providing a value proposition for not just C# developers, but for F#, JScript, VB, Python, Ruby, etc, developers, who have very different market segmentations. &lt;/p&gt;
&lt;p&gt;The developer division as a whole is committed to providing a value proposition for all developers on Windows-based platforms. &lt;/p&gt;
&lt;p&gt;It's up to you to decide whether the value proposition of the platform actually has net value to you. However, the argument that we are not driving the C# language forward adequately due to backwards compat issues strikes me as specious. We have just added query comprehensions, lambda expressions, extension methods, auto properties, object initializers, expression trees, collection initializers, local variable type inference, and method type inference into anonymous function bodies to the language. This does not strike me as the actions of a team that is afraid to take big bets, and I don't think you'll be seeing many of these features showing up in Java any time soon.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6791191" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#6773018</link><pubDate>Sat, 15 Dec 2007 01:37:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6773018</guid><dc:creator>David</dc:creator><description>&lt;p&gt;First of all, I appreciate you taking the time to respond intelligently to my scattershot comments all over your blog. Although you should probably know that your willingness to respond is what prompts me to continue posting, so if I'm keeping you from doing something more important... :)&lt;/p&gt;
&lt;p&gt;1. &amp;quot;If my pulling the curtain back and showing what factors go into these hard decisions decreases your trust level&amp;quot;&lt;/p&gt;
&lt;p&gt;It certainly does not. The decision itself is what concerns me; at least by explaining the reasoning behind it, I know that these decisions are not being made randomly by monkeys with typewriters :) In fact, I very much appreciate your willingness to be so transparent about the tough decisions that have to be made. Frankly its refreshing after what I have perceived to be a disturbing lack of transparency by all but a few members of the C#, CLR, and BCL development teams (Mads being one of the notable exceptions). In fact it is that transparency which has prompted me to respond so vigorously; I actually feel like at least someone is listening! I apologize if the flood of contrary opinions has given you the impression that I do not appreciate your honesty. Please, keep it up!&lt;/p&gt;
&lt;p&gt;2. &amp;quot;If you honestly believe that we do not take the costs you mention into account...&amp;quot;&lt;/p&gt;
&lt;p&gt;I suppose I don't really believe that. My previous comment was prompted by the fact that you did not mention the impedence mismatch between documentation and reality as a factor in your decision in the post itself. But then, I can't ask you to transcribe your entire train of thought about a particular issue over what I assume was at least a several week period for my perusal, can I? Point taken.&lt;/p&gt;
&lt;p&gt;3. &amp;quot;We constantly strive to be both consistent and correct, but it is not always possible to do both in an environment where well-meaning humans have produced erroneous code.&amp;quot;&lt;/p&gt;
&lt;p&gt;I understand this perfectly. I also understand that you are aware of the significant responsibility you have in developing a platform that is used by millions of developers, and that you accordingly hold yourself to a very high standard.&lt;/p&gt;
&lt;p&gt;4. &amp;quot;When faced with a situation in which consistency and correctness are opposites...[we] consult with the affected customers...&amp;quot;&lt;/p&gt;
&lt;p&gt;This to me is the crux of the problem. Of course you cannot possibly consult with all of the affected customers; that's ridiculous. So when you make this statement, you obviously mean &amp;quot;we consult with a sample of the affected customers we know about.&amp;quot; These customers are likely to be companies with which you have existing relationships (and probably support contracts). These, by definition, are likely to be large companies that you deal with repeatedly over a long period of time.&lt;/p&gt;
&lt;p&gt;But I don't work for one of those companies. Their needs are not my needs, nor are they the needs of the majority of developers who use this platform. As I have just finished commenting on another post, the needs of these companies will naturally lean toward maintaining legacy systems, which means they are more likely to value consistency (i.e. backward compatibility) over correctness than the average developer. But that does not mean that most users would make that decision, nor does it make it the right decision for the long term.&lt;/p&gt;
&lt;p&gt;Let me be clear: I don't for a moment believe that when you encounter a potential problem like this, you just call up your 10 biggest customers and ask &amp;quot;Would this break you?&amp;quot;, and base your decision off of their answer. I know you and your team put a lot of thought into this, and that you want to do the right thing. But it is becoming clear to me, through your posts, the posts of other MS bloggers, and my own observations of the decisions the various .NET teams have been making over the last several years, that the ratio of the value that Microsoft as a whole places on backward compatibility versus correctness and forward momentum is much larger than that of the majority of their users, regardless of where that influence is coming from. When I project that value system into the future, what can I conclude but that .NET as a platform will lag behind and become obsolete before its time? And seeing that, what compelling reason is there for me to stick with it, rather than start looking for a platform which will continue to serve me well far into the future?&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6773018" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#6772033</link><pubDate>Fri, 14 Dec 2007 22:46:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6772033</guid><dc:creator>Eric Lippert</dc:creator><description>&lt;p&gt;&amp;gt; how does it make sense to just do nothing?&lt;/p&gt;
&lt;p&gt;Ultimately we decided to take option 3. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;However, &amp;quot;just do nothing&amp;quot; is often the correct course of action when faced with a bug. I have fixed a great many specification violations in the last twelve years, and rolled back a number of those fixes when it turned out that fixing the violation broke an important customer's code. &lt;/p&gt;
&lt;p&gt;We constantly strive to be both consistent and correct, but it is not always possible to do both in an environment where well-meaning humans have produced erroneous code. When faced with a situation in which consistency and correctness are opposites, my team acts like professional engineers. We evaluate the specific situation, consult with the affected customers when possible and make the technical calls that we believe best serve the interests of our customers and therefore our business. &lt;/p&gt;
&lt;p&gt;If you honestly believe that we do not take the costs you mention into account, then frankly you're not reading this blog very carefully. &amp;nbsp;And frankly, there is probably no developer on this planet whose productivity is more deeply impacted by mismatches between the spec and the implementation than _me_. I understand that cost at a far more visceral level than the vast majority of users will ever need to, and thank goodness for that.&lt;/p&gt;
&lt;p&gt;If my pulling the curtain back and showing what factors go into these hard decisions decreases your trust level, that's unfortunate. I write this blog because I firmly believe that a lack of transparency has bred mistrust in the past. I'm seeking to remedy it in part by being brutally honest about our mistakes and the difficult situations which are their consequences. &lt;/p&gt;
&lt;p&gt;I am deeply committed to engineering a solid product that advances the state of the industry and adds value to the economy; being standards compliant is an important part of that commitment but it is far, far from the only part. Standards are a means to an end -- a tool. They're not an end in themselves. I am committed to making the &amp;quot;standard tool&amp;quot; a useful tool, but I am more committed to making the compiler itself a useful tool since that's what actually gets the customer's job done.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6772033" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#6771684</link><pubDate>Fri, 14 Dec 2007 21:46:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6771684</guid><dc:creator>David</dc:creator><description>&lt;p&gt;I understand the difficulties involved with changing the spec and with fixing the bug, but how does it make sense to just do nothing? If your attitude towards standards compliance (the C# spec is an ECMA standard, afterall) is &amp;quot;Being compliant is not as important as not pissing people off&amp;quot;, what do you think that does to my trust level in your commitment to standards compliance in the future?&lt;/p&gt;
&lt;p&gt;You mention the cost to ISV's of either not upgrading or having to fix their illegal code, but you fail to factor in the productivity cost when the implementation doesn't match the spec, and developers have to waste time finding the mismatch and determining what to do about it. As Stuart said, all we have is the spec; if its &amp;quot;wrong&amp;quot; (in the sense that it doesn't match reality), we're sunk. Granted, in this case, I don't see that being a big problem, but as a general issue, I think you are missing an important part of the equation.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6771684" width="1" height="1"&gt;</description></item><item><title>Chained user-defined explicit conversions in C#, Part Two</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#2177913</link><pubDate>Wed, 18 Apr 2007 20:23:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2177913</guid><dc:creator>Fabulous Adventures In Coding</dc:creator><description>&lt;p&gt;Reader Larry Lard asks a follow-up question regarding the subject of Monday’s blog entry . Why is it&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2177913" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#570385</link><pubDate>Fri, 07 Apr 2006 02:14:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:570385</guid><dc:creator>bmm6o</dc:creator><description>Thanks for clarifying... &amp;nbsp;My initial reaction to the post was &amp;quot;forget back-compat, that's a dumb thing to type&amp;quot;, but in context it's pretty reasonable. &amp;nbsp;I guess one lesson is that it's hard to spec out a syntax in the abstract - you have to decide on the legality of various constructs in a vacuum. &amp;nbsp;It's hard to argue that 0 | 0 | E.x should be illegal with such a reasonable code sample (and when such very similar things are legal). &amp;nbsp;And part of it is aesthetic (not wanting warts), which makes it even harder.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=570385" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#570083</link><pubDate>Thu, 06 Apr 2006 19:38:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:570083</guid><dc:creator>Eric Lippert</dc:creator><description>The context was a table mapping one kind of flag to another. &amp;nbsp;A particular set of flags had five &amp;quot;flavours&amp;quot;, and was mapped to a different set with four flavours, so to make it clear which mapped to which:&lt;br&gt;&lt;br&gt;PMtoAF[( int )( PM.F | PM.CF | &amp;nbsp; 0 &amp;nbsp; | &amp;nbsp; 0 &amp;nbsp; | &amp;nbsp; 0 &amp;nbsp; )] = &amp;nbsp;AF.CI | &amp;nbsp; 0 &amp;nbsp; | &amp;nbsp; 0 &amp;nbsp; | AF.NP ;&lt;br&gt;PMtoAF[( int )( &amp;nbsp; 0 &amp;nbsp;| PM.CF | &amp;nbsp; 0 &amp;nbsp; | PM.GF | &amp;nbsp; 0 &amp;nbsp; )] = &amp;nbsp;AF.CI | &amp;nbsp; 0 &amp;nbsp; | AF.IO | &amp;nbsp; 0 &amp;nbsp; ;&lt;br&gt;PMtoAF[( int )( &amp;nbsp; 0 &amp;nbsp;| PM.CF | &amp;nbsp; 0 &amp;nbsp; | &amp;nbsp; 0 &amp;nbsp; | &amp;nbsp; 0 &amp;nbsp; )] = &amp;nbsp;AF.CI | &amp;nbsp; 0 &amp;nbsp; | AF.IO | AF.NP ;&lt;br&gt;&lt;br&gt;etc. &amp;nbsp;One of these happened to have 0 | 0 | enumtype&lt;br&gt;&lt;br&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=570083" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#570026</link><pubDate>Thu, 06 Apr 2006 18:52:50 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:570026</guid><dc:creator>bmm6o</dc:creator><description>What was the context for &amp;quot;0 | 0 | E.X&amp;quot; appearing in code? &amp;nbsp;The first two are actual zero numeric literals? &amp;nbsp;It seems like a lot of extra typing for nothing.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=570026" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#568688</link><pubDate>Wed, 05 Apr 2006 09:29:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:568688</guid><dc:creator>Adam Glasgall</dc:creator><description>Eric, you know more than I do about compilers, being a pro at this and all while I'm a mere undergrad, but I've been writing a compiler for a small C-like language with type inference for my thesis, and I couldn't agree with you more. In fact, I'd take it farther and say that prematurely doing *anything* is the root of all evil - put off doing things as long as you can! &lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=568688" width="1" height="1"&gt;</description></item><item><title>re: The Root Of All Evil, Part One</title><link>http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx#565059</link><pubDate>Thu, 30 Mar 2006 20:35:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:565059</guid><dc:creator>Stuart Langridge</dc:creator><description>Good call, and I do completely and utterly agree with you about premature optimisation :-)&lt;br&gt;&lt;br&gt;I must have missed the earlier note about a breaking change. Thanks for the pointer!&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=565059" width="1" height="1"&gt;</description></item></channel></rss>