<?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>Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx</link><description>Here's an inconvenient truth: just about every "public surface area" change you make to your code is a potential breaking change. First off, I should clarify what I mean by a "breaking change" for the purposes of this article. If you provide a component</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10343240</link><pubDate>Fri, 24 Aug 2012 11:12:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10343240</guid><dc:creator>Adam Ralph</dc:creator><description>&lt;p&gt;@Tim Copenhaver, I can&amp;#39;t help wondering what these two distinct &amp;quot;developer&amp;quot; and &amp;quot;architect&amp;quot; roles are?&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10343240" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10267497</link><pubDate>Tue, 14 Feb 2012 00:08:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10267497</guid><dc:creator>Joshua</dc:creator><description>&lt;p&gt;There&amp;#39;s a handful of places where reflection to access certain private members is so common that changing them qualifies as breaking.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10267497" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10257053</link><pubDate>Mon, 16 Jan 2012 10:06:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10257053</guid><dc:creator>Staffan Eketorp</dc:creator><description>&lt;p&gt;Sorry - I wrote @Tim - I meant @Brian&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10257053" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10256388</link><pubDate>Fri, 13 Jan 2012 17:21:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10256388</guid><dc:creator>Yelinna</dc:creator><description>&lt;p&gt;The problem I see here is Overloading Abuse!&lt;/p&gt;
&lt;p&gt;Too much Overloading is bad for your App&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10256388" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10255938</link><pubDate>Thu, 12 Jan 2012 14:11:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255938</guid><dc:creator>Brian</dc:creator><description>&lt;p&gt;@Staffan:&lt;/p&gt;
&lt;p&gt;1. &amp;nbsp;I really appreciate that when I upgraded my server from .Net 2.0 to .Net 4.0, I only had to fix a few things (aka, breaking changes) before my site would work. &amp;nbsp;I would have been hesitant to update if I believed this would not be the case.&lt;/p&gt;
&lt;p&gt;2. &amp;nbsp;Breaking changes that are easy to fix automatically can usually be made in a way that prevents them from being breaking changes (ignoring edge cases like this one), and such automation will usually fail in the same places as the change is breaking.&lt;/p&gt;
&lt;p&gt;3. &amp;nbsp;If you&amp;#39;re using a library you don&amp;#39;t own, having it break is horrible.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255938" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10255590</link><pubDate>Wed, 11 Jan 2012 16:24:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255590</guid><dc:creator>Gabe</dc:creator><description>&lt;p&gt;I would like to add that I&amp;#39;ve had code break simply from the *creation* of a public class!&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255590" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10255195</link><pubDate>Tue, 10 Jan 2012 18:01:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255195</guid><dc:creator>tobi</dc:creator><description>&lt;p&gt;The ultimate breaking change would be to flip a meaningless bit and break client code that checks the assemblies exact hash. I am sure this has happened.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255195" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10255002</link><pubDate>Tue, 10 Jan 2012 14:34:37 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10255002</guid><dc:creator>Tim Copenhaver</dc:creator><description>&lt;p&gt;I agree that this probably isn&amp;#39;t something most developers need to worry about, but it is absolutely something most architects should think about. In a perfect world, The unfortunate fact of the world is that people who consume library code don&amp;#39;t want to have to update their code just because you changed something. Library architects have to go out of their way to prevent breaking changes.&lt;/p&gt;
&lt;p&gt;Obviously the example here is a little contrived, but there are applications. For example, these problems are a lot more likely with fluent-style APIs due to the common method names. Architects should balance that risk with the potential improvement in usability before picking a pattern. Extension methods are another example - core, critical functionality should be placed directly on the class whenever possible to prevent accidental overrides by consumers. I&amp;#39;m sure there are other examples where these sorts of issues can drive important decisions in the real world. They shouldn&amp;#39;t just be ignored.&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10255002" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10254991</link><pubDate>Tue, 10 Jan 2012 14:09:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10254991</guid><dc:creator>Staffan Eketorp</dc:creator><description>&lt;p&gt;I believe a made a comment before but it seemed to disappear. &lt;/p&gt;
&lt;p&gt;Howevver, it seems to me that the breaking changes tradeoff always comes up. In an agile world this just doesn&amp;#39;t seem to fit my view of how things should be done. We promote constant refactoring and agile mehotds everywhere else. Isn&amp;#39;t it time for us developers to change perspective? Instead of trying to provide non-breaking changes - shouldn&amp;#39;t we deliver a tool that lets the consumer convert his code to the new specifications. Obviously this tool could be pedagogic, combine warnings presentations with errors etc. etc. We only need a good abstraction over C# code now! Oh wait...yeah Roslyn is on its way.&lt;/p&gt;
&lt;p&gt;However, this will naturally require time and effort. You can&amp;#39;t help but thinking that a programming language that includes a &amp;quot;transaction log&amp;quot; of the program would be beneficial, i.e. information on how methods have come and gone and changed name or so. But I know of no such language.&lt;/p&gt;
&lt;p&gt;Opinions, Eric?&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10254991" width="1" height="1"&gt;</description></item><item><title>re: Every public change is a breaking change</title><link>http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx#10254936</link><pubDate>Tue, 10 Jan 2012 10:23:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10254936</guid><dc:creator>Jeroen Mostert</dc:creator><description>&lt;p&gt;You know, all these examples make me think overload resolution is just too clever for its own good -- these kinds of algorithms are more the kind you&amp;#39;d expect in the optimizing part, where cleverness abounds, not in the basic semantic part.&lt;/p&gt;
&lt;p&gt;Clearly, the solution is to abolish overload resolution, assign every method an unambiguous canonical name (that&amp;#39;s stable in the face of changes) and force the developer to specify this name on every call. Alternatively, make overload resolution unnecessary by forbidding overloads. Not sure how to handle generics in such a world -- abolishing them seems too harsh.&lt;/p&gt;
&lt;p&gt;(Mandatory Internet disclaimer: the above is facetious, but slightly ha-ha-only-serious.)&lt;/p&gt;
&lt;div class="yellowbox"&gt;
&lt;p&gt;There are languages that do not have overload resolution. A .NET language could, for instance, specify the unique metadata token associated with the method definition. But in a world without overload resolution, how would you do query comprehensions? -- Eric&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10254936" width="1" height="1"&gt;</description></item></channel></rss>